Debian + Postfix + Dovecot + Plurdomajno + SSL + IPv6 + OpenVPN + Plurinterfacoj + SpamAssassin-lernu + Bind

Ĉi tiu artikolo temas pri kiel agordi modernan poŝtservilon.
Postfikso + Kolombejo. SPF + DKIM + rDNS. Kun IPv6.
Kun TSL-ĉifrado. Kun subteno por pluraj domajnoj - parto kun vera SSL-atestilo.
Kun kontraŭspama protekto kaj alta kontraŭspama takso de aliaj poŝtserviloj.
Subtenas plurajn fizikajn interfacojn.
Kun OpenVPN, la konekto al kiu estas per IPv4, kaj kiu provizas IPv6.

Se vi ne volas lerni ĉiujn ĉi tiujn teknologiojn, sed volas agordi tian servilon, tiam ĉi tiu artikolo estas por vi.

La artikolo ne klopodas klarigi ĉiun detalon. La klarigo iras al tio, kio ne estas agordita kiel normo aŭ gravas el la vidpunkto de la konsumanto.

La instigo starigi poŝtservilon estis longtempa revo de mia. Ĉi tio povas soni stulte, sed MIHO, ĝi estas multe pli bona ol sonĝi pri nova aŭto de via plej ŝatata marko.

Estas du motivoj por agordi IPv6. IT-specialisto bezonas konstante lerni novajn teknologiojn por pluvivi. Mi ŝatus fari mian modestan kontribuon al la batalo kontraŭ cenzuro.

La instigo por agordi OpenVPN estas nur igi IPv6 funkcii sur la loka maŝino.
La instigo por agordi plurajn fizikajn interfacojn estas, ke en mia servilo mi havas unu interfacon "malrapida sed senlima" kaj alia "rapida sed kun tarifo".

La instigo por agordi Bind-agordojn estas, ke mia ISP provizas malstabilan DNS-servilon, kaj Guglo ankaŭ foje malsukcesas. Mi volas stabilan DNS-servilon por persona uzo.

Instigo verki artikolon - mi skribis malneton antaŭ 10 monatoj, kaj mi jam rigardis ĝin dufoje. Eĉ se la aŭtoro regule bezonas ĝin, estas alta probableco, ke ankaŭ aliaj bezonos ĝin.

Ne ekzistas universala solvo por poŝtservilo. Sed mi provos skribi ion kiel "faru tion kaj tiam, kiam ĉio funkcios kiel ĝi devus, forĵetu la kromaĵojn."

La firmao tech.ru havas Colocation-servilon. Eblas kompari kun OVH, Hetzner, AWS. Por solvi ĉi tiun problemon, kunlaboro kun tech.ru estos multe pli efika.

Debian 9 estas instalita sur la servilo.

La servilo havas 2 interfacojn `eno1` kaj `eno2`. La unua estas senlima, kaj la dua estas rapida, respektive.

Estas 3 senmovaj IP-adresoj, XX.XX.XX.X0 kaj XX.XX.XX.X1 kaj XX.XX.XX.X2 sur la interfaco `eno1` kaj XX.XX.XX.X5 sur la interfaco `eno2` .

Havebla XXXX:XXXX:XXXX:XXXX::/64 grupo de IPv6-adresoj kiuj estas asignitaj al la interfaco `eno1` kaj de ĝi XXXX:XXXX:XXXX:XXXX:1:2::/96 estis asignita al `eno2` laŭ mia peto.

Estas 3 domajnoj `domain1.com`, `domain2.com`, `domain3.com`. Estas SSL-atestilo por `domain1.com` kaj `domain3.com`.

Mi havas Google-konton al kiu mi ŝatus ligi mian leterkeston[retpoŝte protektita]` (ricevante poŝton kaj sendi retpoŝton rekte de la gmail-interfaco).
Devas esti leterkesto`[retpoŝte protektita]`, kopion de la retpoŝto el kiu mi volas vidi en mia gmail. Kaj estas malofte povi sendi ion nome de `[retpoŝte protektita]` per la TTT-interfaco.

Devas esti leterkesto`[retpoŝte protektita]`, kiun Ivanov uzos de sia iPhone.

Senditaj retpoŝtoj devas plenumi ĉiujn modernajn kontraŭspamajn postulojn.
Devas ekzisti la plej alta nivelo de ĉifrado provizita en publikaj retoj.
Devus ekzisti IPv6-subteno por kaj sendi kaj ricevi leterojn.
Devus ekzisti SpamAssassin, kiu neniam forigos retpoŝtojn. Kaj ĝi aŭ resaltos aŭ preterlasos aŭ sendos al la dosierujo IMAP "Spamo".
SpamAssassin-aŭtomata lernado devas esti agordita: se mi movas leteron al la Spam-dosierujo, ĝi lernos de ĉi tio; se mi movas leteron el la Spamo-dosierujo, ĝi lernos de ĉi tio. La rezultoj de SpamAssassin-trejnado devus influi ĉu la letero finiĝas en la Spam-dosierujo.
PHP-skriptoj devas povi sendi poŝton nome de iu ajn domajno sur difinita servilo.
Devus ekzisti servo openvpn, kun la kapablo uzi IPv6 sur kliento kiu ne havas IPv6.

Unue vi devas agordi interfacojn kaj vojigon, inkluzive de IPv6.
Tiam vi devos agordi OpenVPN, kiu konektos per IPv4 kaj provizos la klienton per statika-reala IPv6-adreso. Ĉi tiu kliento havos aliron al ĉiuj IPv6-servoj en la servilo kaj aliron al iuj IPv6-resursoj en la Interreto.
Tiam vi devos agordi Postfix por sendi leterojn + SPF + DKIM + rDNS kaj aliajn similajn malgrandajn aferojn.
Tiam vi devos agordi Dovecot kaj agordi Multidomajnon.
Tiam vi devos agordi SpamAssassin kaj agordi trejnadon.
Fine, instalu Bind.

============= Multi-interfacoj =============

Por agordi interfacojn, vi devas skribi ĉi tion en "/etc/network/interfaces".

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eno1
iface eno1 inet static
        address XX.XX.XX.X0/24
        gateway XX.XX.XX.1
        dns-nameservers 127.0.0.1 213.248.1.6
        post-up ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t
        post-up ip route add default via XX.XX.XX.1 table eno1t
        post-up ip rule add table eno1t from XX.XX.XX.X0
        post-up ip rule add table eno1t to XX.XX.XX.X0

auto eno1:1
iface eno1:1 inet static
address XX.XX.XX.X1
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X1
        post-up ip rule add table eno1t to XX.XX.XX.X1
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t

auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X2
        post-up ip rule add table eno1t to XX.XX.XX.X2

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
        gateway XXXX:XXXX:XXXX:XXXX::1
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE

# The secondary network interface
allow-hotplug eno2
iface eno2 inet static
        address XX.XX.XX.X5
        netmask 255.255.255.0
        post-up   ip route add XX.XX.XX.0/24 dev eno2 src XX.XX.XX.X5 table eno2t
        post-up   ip route add default via XX.XX.XX.1 table eno2t
        post-up   ip rule add table eno2t from XX.XX.XX.X5
        post-up   ip rule add table eno2t to XX.XX.XX.X5
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t

iface eno2 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:2::/96
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE

# OpenVPN network
iface tun0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:3::/80

Ĉi tiuj agordoj povas esti aplikataj sur iu ajn servilo en tech.ru (kun iom da kunordigo kun subteno) kaj ĝi tuj funkcios kiel ĝi devus.

Se vi havas sperton pri agordo de similaj aferoj por Hetzner, OVH, tie estas malsama. Pli malfacila.

eno1 estas la nomo de retkarto numero 1 (malrapida sed senlima).
eno2 estas la nomo de retkarto #2 (rapida, sed kun tarifo).
tun0 estas la nomo de la virtuala retkarto de OpenVPN.
XX.XX.XX.X0 - IPv4 #1 sur eno1.
XX.XX.XX.X1 - IPv4 #2 sur eno1.
XX.XX.XX.X2 - IPv4 #3 sur eno1.
XX.XX.XX.X5 - IPv4 #1 sur eno2.
XX.XX.XX.1 - IPv4-enirejo.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 por la tuta servilo.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 por eno2, ĉio alia de ekstere eniras eno1.
XXXX:XXXX:XXXX:XXXX::1 — IPv6-enirejo (indas rimarki, ke tio povas/devas esti farita alimaniere. Specifi la IPv6-ŝaltilon).
dns-nameservers - 127.0.0.1 estas indikita (ĉar bind estas instalita loke) kaj 213.248.1.6 (ĉi tio estas de tech.ru).

“table eno1t” kaj “table eno2t” - la signifo de ĉi tiuj itinero-reguloj estas ke trafiko eniranta tra eno1 -> elirus tra ĝi, kaj trafiko eniranta tra eno2 -> forirus tra ĝi. Kaj ankaŭ konektoj komencitaj de la servilo trairus eno1.

ip route add default via XX.XX.XX.1 table eno1t

Per ĉi tiu komando ni precizigas, ke ĉiu nekomprenebla trafiko, kiu kategoriiĝas sub ia regulo markita "table eno1t" -> estu sendita al la eno1-interfaco.

ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t

Per ĉi tiu komando ni specifas, ke ajna trafiko komencita de la servilo estu direktita al la interfaco eno1.

ip rule add table eno1t from XX.XX.XX.X0
ip rule add table eno1t to XX.XX.XX.X0

Per ĉi tiu komando ni starigas la regulojn por marki trafikon.

auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X2
        post-up ip rule add table eno1t to XX.XX.XX.X2

Ĉi tiu bloko specifas duan IPv4 por la interfaco eno1.

ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t

Per ĉi tiu komando ni fiksas la itineron de OpenVPN-klientoj al loka IPv4 krom XX.XX.XX.X0.
Mi ankoraŭ ne komprenas kial ĉi tiu komando sufiĉas por ĉiuj IPv4.

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
        gateway XXXX:XXXX:XXXX:XXXX::1

Ĉi tie ni fiksas la adreson por la interfaco mem. La servilo uzos ĝin kiel "elira" adreso. Ne estos uzata iel denove.

Kial ":1:1::" estas tiel komplika? Por ke OpenVPN funkcias ĝuste kaj nur por ĉi tio. Pli pri tio poste.

Pri la temo de enirejo - tiel ĝi funkcias kaj tio estas bone. Sed la ĝusta maniero estas indiki ĉi tie la IPv6 de la ŝaltilo al kiu la servilo estas konektita.

Tamen, ial IPv6 ĉesas funkcii se mi faras tion. Ĉi tio verŝajne estas ia problemo de tech.ru.

ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE

Ĉi tio aldonas IPv6-adreson al la interfaco. Se vi bezonas cent adresojn, tio signifas cent liniojn en ĉi tiu dosiero.

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
...
iface eno2 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:2::/96
...
iface tun0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:3::/80

Mi notis la adresojn kaj subretojn de ĉiuj interfacoj por klarigi ĝin.
eno1 - devas esti "/64"- ĉar ĉi tio estas nia tuta aro da adresoj.
tun0 - la subreto devas esti pli granda ol eno1. Alie, ne eblos agordi IPv6-enirejon por OpenVPN-klientoj.
eno2 - la subreto devas esti pli granda ol tun0. Alie, OpenVPN-klientoj ne povos aliri lokajn IPv6-adresojn.
Por klareco, mi elektis subretan paŝon de 16, sed se vi deziras, vi eĉ povas fari "1" paŝon.
Sekve, 64+16 = 80, kaj 80+16 = 96.

Por eĉ pli klareco:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY estas adresoj kiuj devus esti asignitaj al specifaj retejoj aŭ servoj sur la eno1-interfaco.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY estas adresoj kiuj devus esti asignitaj al specifaj retejoj aŭ servoj sur la eno2-interfaco.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY estas adresoj, kiuj devus esti asignitaj al OpenVPN-klientoj aŭ uzataj kiel OpenVPN-servadresoj.

Por agordi la reton, devus esti eble rekomenci la servilon.
IPv4-ŝanĝoj estas prenitaj kiam ekzekutitaj (nepre envolvi ĝin en ekrano - alie ĉi tiu komando simple kraŝos la reton sur la servilo):

/etc/init.d/networking restart

Aldonu al la fino de la dosiero "/etc/iproute2/rt_tables":

100 eno1t
101 eno2t

Sen ĉi tio, vi ne povas uzi kutimajn tabelojn en la dosiero "/etc/network/interfaces".
La nombroj devas esti unikaj kaj malpli ol 65535.

IPv6-ŝanĝoj povas esti ŝanĝitaj facile sen rekomenco, sed por fari tion vi devas lerni almenaŭ tri komandojn:

ip -6 addr ...
ip -6 route ...
ip -6 neigh ...

Agordante "/etc/sysctl.conf"

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward = 1

# Do not accept ICMP redirects (prevent MITM attacks)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0

# For receiving ARP replies
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.arp_filter = 0

# For sending ARP
net.ipv4.conf.all.arp_announce = 0
net.ipv4.conf.default.arp_announce = 0

# Enable IPv6
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0

# IPv6 configuration
net.ipv6.conf.all.autoconf = 1
net.ipv6.conf.all.accept_ra = 0

# For OpenVPN
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

# For nginx on boot
net.ipv6.ip_nonlocal_bind = 1

Ĉi tiuj estas la "sysctl" agordoj de mia servilo. Mi atentigu ion gravan.

net.ipv4.ip_forward = 1

Sen ĉi tio, OpenVPN tute ne funkcios.

net.ipv6.ip_nonlocal_bind = 1

Ĉiu, kiu provas ligi IPv6 (ekzemple nginx) tuj post kiam la interfaco estas ekfunkciigita, ricevos eraron. Ke ĉi tiu adreso ne estas disponebla.

Por eviti tian situacion, tia agordo estas farita.

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

Sen ĉi tiuj IPv6-agordoj, trafiko de la OpenVPN-kliento ne eliras en la mondon.

Aliaj agordoj aŭ ne rilatas aŭ mi ne memoras por kio ili estas.
Sed ĉiaokaze, mi lasas ĝin "kiel estas".

Por ke ŝanĝoj al ĉi tiu dosiero estu prenitaj sen rekomenci la servilon, vi devas ruli la komandon:

sysctl -p

Pliaj detaloj pri "tablo" reguloj: habr.com/post/108690

============= OpenVPN =============

OpenVPN IPv4 ne funkcias sen iptables.

Miaj iptables estas tiel por VPN:

iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
##iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j DROP
iptables -A FORWARD -p udp --dport 1194 -j DROP

YY.YY.YY.YY estas mia senmova IPv4-adreso de la loka maŝino.
10.8.0.0/24 - IPv4 openvpn reto. IPv4-adresoj por openvpn-klientoj.
La konsistenco de la reguloj estas grava.

iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT
...
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j DROP
iptables -A FORWARD -p udp --dport 1194 -j DROP

Ĉi tio estas limigo por ke nur mi povu uzi OpenVPN de mia senmova IP.

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
  -- или --
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE

Por plusendi IPv4-pakojn inter OpenVPN-klientoj kaj Interreto, vi devas registri unu el ĉi tiuj komandoj.

Por malsamaj kazoj, unu el la opcioj ne taŭgas.
Ambaŭ komandoj taŭgas por mia kazo.
Post legi la dokumentadon, mi elektis la unuan opcion ĉar ĝi uzas malpli da CPU.

Por ke ĉiuj agordoj de iptables estu prenitaj post rekomenco, vi devas konservi ilin ie.

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Tiaj nomoj ne estis elektitaj hazarde. Ili estas uzataj de la pako "iptables-persistent".

apt-get install iptables-persistent

Instalante la ĉefan OpenVPN-pakaĵon:

apt-get install openvpn easy-rsa

Ni starigu ŝablonon por atestiloj (anstataŭigu viajn valorojn):

make-cadir ~/openvpn-ca
cd ~/openvpn-ca
ln -s openssl-1.0.0.cnf openssl.cnf

Ni redaktu la agordojn de la atestila ŝablono:

mcedit vars

...
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Krasnodar"
export KEY_CITY="Dinskaya"
export KEY_ORG="Own"
export KEY_EMAIL="[email protected]"
export KEY_OU="VPN"

# X509 Subject Field
export KEY_NAME="server"
...

Kreu servilan atestilon:

cd ~/openvpn-ca
source vars
./clean-all
./build-ca
./build-key-server server
./build-dh
openvpn --genkey --secret keys/ta.key

Ni preparu la kapablon krei la finajn dosierojn "client-name.opvn":

mkdir -p ~/client-configs/files
chmod 700 ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
mcedit ~/client-configs/base.conf

# Client mode
client

# Interface tunnel type
dev tun

# TCP protocol
proto tcp-client

# Address/Port of VPN server
remote XX.XX.XX.X0 1194

# Don't bind to local port/address
nobind

# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun

# Remote peer must have a signed certificate
remote-cert-tls server
ns-cert-type server

# Enable compression
comp-lzo

# Custom
ns-cert-type server
tls-auth ta.key 1
cipher DES-EDE3-CBC

Ni preparu skripton, kiu kunfandos ĉiujn dosierojn en ununuran opvn-dosieron.

mcedit ~/client-configs/make_config.sh
chmod 700 ~/client-configs/make_config.sh

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} 
    <(echo -e '<ca>') 
    ${KEY_DIR}/ca.crt 
    <(echo -e '</ca>n<cert>') 
    ${KEY_DIR}/.crt 
    <(echo -e '</cert>n<key>') 
    ${KEY_DIR}/.key 
    <(echo -e '</key>n<tls-auth>') 
    ${KEY_DIR}/ta.key 
    <(echo -e '</tls-auth>') 
    > ${OUTPUT_DIR}/.ovpn

Kreante la unuan OpenVPN-klienton:

cd ~/openvpn-ca
source vars
./build-key client-name
cd ~/client-configs
./make_config.sh client-name

La dosiero "~/client-configs/files/client-name.ovpn" estas sendita al la aparato de la kliento.

Por iOS-klientoj vi devos fari la sekvan lertaĵon:
La enhavo de la etikedo "tls-auth" devas esti sen komentoj.
Kaj ankaŭ metu "ŝlosildirekton 1" tuj antaŭ la etikedo "tls-auth".

Ni agordu la agordon de la servilo OpenVPN:

cd ~/openvpn-ca/keys
cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | tee /etc/openvpn/server.conf
mcedit /etc/openvpn/server.conf

# Listen port
port 1194

# Protocol
proto tcp-server

# IP tunnel
dev tun0
tun-ipv6
push tun-ipv6

# Master certificate
ca ca.crt

# Server certificate
cert server.crt

# Server private key
key server.key

# Diffie-Hellman parameters
dh dh2048.pem

# Allow clients to communicate with each other
client-to-client

# Client config dir
client-config-dir /etc/openvpn/ccd

# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"

# Server mode and client subnets
server 10.8.0.0 255.255.255.0
server-ipv6 XXXX:XXXX:XXXX:XXXX:1:3::/80
topology subnet

# IPv6 routes
push "route-ipv6 XXXX:XXXX:XXXX:XXXX::/64"
push "route-ipv6 2000::/3"

# DNS (for Windows)
# These are OpenDNS
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

# Configure all clients to redirect their default network gateway through the VPN
push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway ipv6" #For iOS

# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun

# Ping every 10s. Timeout of 120s.
keepalive 10 120

# Enable compression
comp-lzo

# User and group
user vpn
group vpn

# Log a short status
status openvpn-status.log

# Logging verbosity
##verb 4

# Custom config
tls-auth ta.key 0
cipher DES-EDE3-CBC

Ĉi tio necesas por agordi statikan adreson por ĉiu kliento (ne necesas, sed mi uzas ĝin):

# Client config dir
client-config-dir /etc/openvpn/ccd

La plej malfacila kaj ŝlosila detalo.

Bedaŭrinde, OpenVPN ankoraŭ ne scias kiel sendepende agordi IPv6-enirejon por klientoj.
Vi devas "mane" plusendi ĉi tion por ĉiu kliento.

# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"

Dosiero "/etc/openvpn/server-clientconnect.sh":

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
        echo $ipv6
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev eno1

Dosiero "/etc/openvpn/server-clientdisconnect.sh":

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Delete proxy rule
/sbin/ip -6 neigh del proxy $ipv6 dev eno1

Ambaŭ skriptoj uzas la dosieron "/etc/openvpn/variables":

# Subnet
prefix=XXXX:XXXX:XXXX:XXXX:2:
# netmask
prefixlen=112

Mi malfacilas memori kial ĝi estas skribita tiel.

Nun retmasko = 112 aspektas strange (ĝi devus esti 96 ĝuste tie).
Kaj la prefikso estas stranga, ĝi ne kongruas kun la reto tun0.
Sed bone, mi lasos ĝin tia.

cipher DES-EDE3-CBC

Ĉi tio ne estas por ĉiuj - mi elektis ĉi tiun metodon por ĉifri la konekton.

Lernu pli pri agordo de OpenVPN IPv4.

Lernu pli pri agordo de OpenVPN IPv6.

============= Postfikso =============

Instalante la ĉefan pakaĵon:

apt-get install postfix

Kiam vi instalas, elektu "interreta retejo".

Mia "/etc/postfix/main.cf" aspektas jene:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1

smtp_tls_security_level = may
smtp_tls_ciphers = export
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_loglevel = 1

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = domain1.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = domain1.com
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

internal_mail_filter_classes = bounce

# Storage type
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        #reject_invalid_hostname,
        #reject_unknown_recipient_domain,
        reject_unauth_destination,
        reject_rbl_client sbl.spamhaus.org,
        check_policy_service unix:private/policyd-spf

smtpd_helo_restrictions =
        #reject_invalid_helo_hostname,
        #reject_non_fqdn_helo_hostname,
        reject_unknown_helo_hostname

smtpd_client_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_helo_hostname,
        permit

# SPF
policyd-spf_time_limit = 3600

# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock

# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Ni rigardu la detalojn de ĉi tiu agordo.

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key

Laŭ Ĥabrovskaj loĝantoj, ĉi tiu bloko enhavas "misinformojn kaj malĝustajn tezojn."Nur 8 jarojn post la komenco de mia kariero mi ekkomprenis kiel SSL funkcias.

Tial, mi prenos la liberecon priskribi kiel uzi SSL (sen respondi la demandojn "Kiel ĝi funkcias?" kaj "Kial ĝi funkcias?").

La bazo de moderna ĉifrado estas la kreado de ŝlosilparo (du tre longaj signoj).

Unu "ŝlosilo" estas privata, la alia ŝlosilo estas "publika". Ni konservas la privatan ŝlosilon tre zorge sekreta. Ni distribuas la publikan ŝlosilon al ĉiuj.

Uzante publikan ŝlosilon, vi povas ĉifri tekston por ke nur la posedanto de la privata ŝlosilo povu deĉifri ĝin.
Nu, tio estas la tuta bazo de la teknologio.

Paŝo #1 - https-ejoj.
Alirante retejon, la retumilo ekscias de la retservilo, ke la retejo estas https kaj tial petas publikan ŝlosilon.
La retservilo donas la publikan ŝlosilon. La retumilo uzas la publikan ŝlosilon por ĉifri la http-peton kaj sendi ĝin.
La enhavon de http-peto povas legi nur tiuj, kiuj havas la privatan ŝlosilon, tio estas, nur la servilo al kiu la peto estas farita.
Http-peto enhavas almenaŭ URI. Tial, se lando provas limigi aliron ne al la tuta retejo, sed al specifa paĝo, tiam ĉi tio estas neeble fari por https-ejoj.

Paŝo #2 - ĉifrita respondo.
La retservilo provizas respondon facile legeblan survoje.
La solvo estas ekstreme simpla - la retumilo loke generas la saman privatan-publikan ŝlosilparon por ĉiu https retejo.
Kaj kune kun la peto por la publika ŝlosilo de la retejo, ĝi sendas sian lokan publikan ŝlosilon.
La retservilo memoras ĝin kaj, sendante http-respondon, ĉifras ĝin per la publika ŝlosilo de specifa kliento.
Nun http-respondo nur povas esti malĉifrita de la posedanto de la privata ŝlosilo de la retumilo de la kliento (tio estas, la kliento mem).

Paŝo n-ro 3 - establi sekuran konekton per publika kanalo.
Estas vundebleco en la ekzemplo n-ro 2 - nenio malhelpas bondezirantojn kapti http-peton kaj redakti informojn pri la publika ŝlosilo.
Tiel, la peranto klare vidos la tutan enhavon de senditaj kaj ricevitaj mesaĝoj ĝis la komunika kanalo ŝanĝiĝos.
Trakti ĉi tion estas ege simpla - simple sendu la publikan ŝlosilon de la retumilo kiel mesaĝon ĉifritan per la publika ŝlosilo de la retservilo.
La retservilo tiam unue sendas respondon kiel "via publika ŝlosilo estas tia" kaj ĉifras ĉi tiun mesaĝon per la sama publika ŝlosilo.
La retumilo rigardas la respondon - se la mesaĝo "via publika ŝlosilo estas tia" estas ricevita - tiam ĉi tio estas garantio 100%, ke ĉi tiu komunika kanalo estas sekura.
Kiom sekura ĝi estas?
La kreo mem de tia sekura komunika kanalo okazas kun rapido de ping*2. Ekzemple 20ms.
La atakanto devas havi la privatan ŝlosilon de unu el la partioj anticipe. Aŭ trovu privatan ŝlosilon en kelkaj milisekundoj.
Haki unu modernan privatan ŝlosilon daŭros jardekojn sur superkomputilo.

Paŝo #4 - publika datumbazo de publikaj ŝlosiloj.
Evidente, en ĉi tiu tuta rakonto estas ŝanco por atakanto sidi sur la komunika kanalo inter la kliento kaj la servilo.
La kliento povas ŝajnigi esti la servilo, kaj la servilo povas ŝajnigi esti la kliento. Kaj kopiu paron da klavoj ambaŭdirekte.
Tiam la atakanto vidos la tutan trafikon kaj povos "redakti" la trafikon.
Ekzemple, ŝanĝu la adreson kie sendi monon aŭ kopiu la pasvorton de interreta bankado aŭ bloku "obĵetan" enhavon.
Por kontraŭbatali tiajn atakantojn, ili elpensis publikan datumbazon kun publikaj ŝlosiloj por ĉiu https-ejo.
Ĉiu retumilo "scias" pri la ekzisto de ĉirkaŭ 200 tiaj datumbazoj. Ĉi tio venas antaŭinstalita en ĉiu retumilo.
"Scio" estas subtenata de publika ŝlosilo de ĉiu atestilo. Tio estas, la ligo al ĉiu specifa atestadaŭtoritato ne povas esti falsita.

Nun estas simpla kompreno pri kiel uzi SSL por https.
Se vi uzas vian cerbon, evidentiĝos kiel la specialaj servoj povas haki ion en ĉi tiu strukturo. Sed ĝi kostos al ili monstrajn klopodojn.
Kaj organizoj pli malgrandaj ol la NSA aŭ CIA - estas preskaŭ neeble haki la ekzistantan nivelon de protekto, eĉ por VIP-uloj.

Mi ankaŭ aldonos pri ssh-konektoj. Ne estas publikaj ŝlosiloj tie, do kion vi povas fari? La afero estas solvita en du manieroj.
Opcio ssh-by-password:
Dum la unua konekto, la ssh-kliento devas averti, ke ni havas novan publikan ŝlosilon de la ssh-servilo.
Kaj dum pluaj konektoj, se aperas la averto "nova publika ŝlosilo de la ssh-servilo", tio signifos, ke ili provas subaŭskulti vin.
Aŭ vi subaŭskultis vian unuan konekton, sed nun vi komunikas kun la servilo sen perantoj.
Efektive, pro la fakto, ke la fakto de aŭskultado estas facile, rapide kaj senpene malkaŝita, ĉi tiu atako estas uzata nur en specialaj kazoj por specifa kliento.

Opcio ssh-per-klavo:
Ni prenas poŝmemorilon, skribas la privatan ŝlosilon por la ssh-servilo sur ĝi (estas terminoj kaj multaj gravaj nuancoj por ĉi tio, sed mi skribas edukan programon, ne instrukciojn por uzo).
Ni lasas la publikan ŝlosilon sur la maŝino kie la ssh-kliento estos kaj ni ankaŭ konservas ĝin sekreta.
Ni alportas la flash drive al la servilo, enmetas ĝin, kopias la privatan ŝlosilon, kaj bruligas la flash drive kaj disĵetas la cindron al la vento (aŭ almenaŭ formatas ĝin per nuloj).
Jen ĉio - post tia operacio estos neeble haki tian ssh-konekton. Kompreneble, post 10 jaroj eblos vidi trafikon sur superkomputilo - sed tio estas alia historio.

Mi pardonpetas pro la ekstertemo.

Do nun ke la teorio estas konata. Mi rakontos al vi pri la fluo de kreado de SSL-atestilo.

Uzante "openssl genrsa" ni kreas privatan ŝlosilon kaj "blankojn" por la publika ŝlosilo.
Ni sendas la "blankojn" al tria kompanio, al kiu ni pagas proksimume $9 por la plej simpla atestilo.

Post kelkaj horoj, ni ricevas nian "publikan" ŝlosilon kaj aron da pluraj publikaj ŝlosiloj de ĉi tiu tria kompanio.

Kial tria kompanio pagu por la registrado de mia publika ŝlosilo estas aparta demando, ni ne konsideros ĝin ĉi tie.

Nun estas klare, kio estas la signifo de la surskribo:

smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key

La dosierujo "/etc/ssl" enhavas ĉiujn dosierojn por ssl-problemoj.
domain1.com — domajna nomo.
2018 estas la jaro de kreado de ŝlosiloj.
"ŝlosilo" - nomo ke la dosiero estas privata ŝlosilo.

Kaj la signifo de ĉi tiu dosiero:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — domajna nomo.
2018 estas la jaro de kreado de ŝlosiloj.
ĉenita - nomo ke ekzistas ĉeno de publikaj ŝlosiloj (la unua estas nia publika ŝlosilo kaj la ceteraj estas kio venis de la firmao kiu eldonis la publikan ŝlosilon).
crt - nomo, ke ekzistas preta atestilo (publika ŝlosilo kun teknikaj klarigoj).

smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1

Ĉi tiu agordo ne estas uzata en ĉi tiu kazo, sed estas skribita kiel ekzemplo.

Ĉar eraro en ĉi tiu parametro kondukos, ke spamo estos sendita de via servilo (sen via volo).

Tiam pruvu al ĉiuj, ke vi ne estas kulpa.

recipient_delimiter = +

Multaj homoj eble ne scias, sed ĉi tio estas norma signo por rangigi retpoŝtojn, kaj ĝi estas subtenata de plej modernaj poŝtserviloj.

Ekzemple, se vi havas leterkeston "[retpoŝte protektita]"provu sendi al"[retpoŝte protektita]"- rigardu, kio venas el ĝi.

inet_protocols = ipv4

Ĉi tio povus esti konfuza.

Sed ĝi ne estas nur tiel. Ĉiu nova domajno estas defaŭlte nur IPv4, tiam mi ŝaltas IPv6 por ĉiu aparte.

virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Ĉi tie ni precizigas, ke ĉiuj enirantaj poŝtoj iras al kolombejo.
Kaj la reguloj por domajno, leterkesto, kaŝnomo - rigardu en la datumbazo.

/etc/postfix/mysql-virtual-mailbox-domains.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

/etc/postfix/mysql-virtual-mailbox-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'

/etc/postfix/mysql-virtual-alias-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

Nun postfikso scias, ke poŝto povas esti akceptita por plua sendo nur post rajtigo kun kolombejo.

Mi vere ne vere komprenas kial ĉi tio estas duobligita ĉi tie. Ni jam precizigis ĉion, kio necesas en "virtuala_transporto".

Sed la postfiksa sistemo estas tre malnova - verŝajne ĝi estas retrovo de la malnova tempo.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Ĉi tio povas esti agordita malsame por ĉiu poŝtservilo.

Mi havas 3 poŝtservilojn je mia dispono kaj ĉi tiuj agordoj estas tre malsamaj pro malsamaj uzpostuloj.

Vi devas zorge agordi ĝin - alie spamo enfluos al vi, aŭ eĉ pli malbone - spamo elfluos de vi.

# SPF
policyd-spf_time_limit = 3600

Agordo por iu kromaĵo rilata al kontrolado de la SPF de envenantaj leteroj.

# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock

La agordo estas, ke ni devas provizi DKIM subskribon kun ĉiuj eksiĝintaj retpoŝtoj.

# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Ĉi tio estas ŝlosila detalo en letervojigo dum sendado de leteroj de PHP-skriptoj.

Dosiero "/etc/postfix/sdd_transport.pcre":

/^[email protected]$/ domain1:
/^[email protected]$/ domain2:
/^[email protected]$/ domain3:
/@domain1.com$/             domain1:
/@domain2.com$/             domain2:
/@domain3.com$/             domain3:

Maldekstre estas regulaj esprimoj. Dekstre estas etikedo kiu markas la literon.
Postfikso laŭ la etikedo - konsideros kelkajn pliajn agordajn liniojn por specifa letero.

Kiel precize postfikso estos reagordita por specifa letero, estos indikita en "master.cf".

Linioj 4, 5, 6 estas la ĉefaj. En la nomo de kiu domajno ni sendas la leteron, ni metas ĉi tiun etikedon.
Sed la kampo "de" ne ĉiam estas indikita en PHP-skriptoj en la malnova kodo. Tiam la uzantnomo venas al la savo.

La artikolo jam estas ampleksa - mi ne dezirus distriĝi per agordo de nginx+fpm.

Mallonge, por ĉiu retejo ni starigas sian propran linuksan posedanton. Kaj sekve via fpm-pool.

Fpm-pool uzas ajnan version de php (estas bonege kiam en la sama servilo vi povas uzi malsamajn versiojn de php kaj eĉ malsamajn php.ini por najbaraj retejoj sen problemoj).

Do, specifa linukso-uzanto "www-domain2" havas retejon domain2.com. Ĉi tiu retejo havas kodon por sendi retpoŝtojn sen specifi la kampon de.

Do, eĉ en ĉi tiu kazo, la leteroj estos ĝuste senditaj kaj neniam finiĝos en spamo.

Mia "/etc/postfix/master.cf" aspektas jene:

...
smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin
...
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
...
policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

spamassassin unix -     n       n       -       -       pipe
    user=spamd argv=/usr/bin/spamc -f -e
    /usr/sbin/sendmail -oi -f ${sender} ${recipient}
...
domain1  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X1
   -o smtp_helo_name=domain1.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
   -o syslog_name=postfix-domain1

domain2  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X5
   -o smtp_helo_name=domain2.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:2:1:1
   -o syslog_name=postfix-domain2

domain3  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X2
   -o smtp_helo_name=domain3
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:5:1
   -o syslog_name=postfix-domain3

La dosiero ne estas plene provizita - ĝi jam estas tre granda.
Mi nur notis tion, kio estis ŝanĝita.

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin
...
spamassassin unix -     n       n       -       -       pipe
    user=spamd argv=/usr/bin/spamc -f -e
    /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Ĉi tiuj estas agordoj rilataj al spamassin, pli pri tio poste.

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Ni permesas vin konekti al la poŝtservilo per haveno 587.
Por fari tion, vi devas ensaluti.

policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

Ebligu SPF-kontrolon.

apt-get install postfix-policyd-spf-python

Ni instalu la pakaĵon por SPF-kontroloj supre.

domain1  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X1
   -o smtp_helo_name=domain1.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
   -o syslog_name=postfix-domain1

Kaj ĉi tio estas la plej interesa afero. Ĉi tio estas la kapablo sendi leterojn por specifa domajno de specifa IPv4/IPv6 adreso.

Ĉi tio estas farita pro rDNS. rDNS estas la procezo ricevi ĉenon per IP-adreso.
Kaj por poŝto, ĉi tiu funkcio estas uzata por konfirmi, ke la helo ĝuste kongruas kun la rDNS de la adreso de kiu la retpoŝto estis sendita.

Se la helo ne kongruas kun la retpoŝta domajno nome de kiu la letero estis sendita, spampunktoj estas aljuĝitaj.

Helo ne kongruas kun rDNS - multaj spampoentoj estas aljuĝitaj.
Sekve, ĉiu domajno devas havi sian propran IP-adreson.
Por OVH - en la konzolo eblas specifi rDNS.
Por tech.ru - la problemo estas solvita per subteno.
Por AWS, la problemo estas solvita per subteno.
"inet_protocols" kaj "smtp_bind_address6" - ni ebligas IPv6-subtenon.
Por IPv6 vi ankaŭ devas registri rDNS.
"syslog_name" - kaj ĉi tio estas por facile legado de protokoloj.

Aĉetu atestilojn Mi rekomendas ĉi tie.

Agordi postfiksan+kolomban ligon ĉi tie.

Agordi SPF.

============= Kolombejo =============

apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispam

Agordante mysql, instalante la pakaĵojn mem.

Dosiero "/etc/dovecot/conf.d/10-auth.conf"

disable_plaintext_auth = yes
auth_mechanisms = plain login

Rajtigo estas nur ĉifrita.

Dosiero "/etc/dovecot/conf.d/10-mail.conf"

mail_location = maildir:/var/mail/vhosts/%d/%n

Ĉi tie ni indikas la konservejon por la leteroj.

Mi volas, ke ili estu konservitaj en dosieroj kaj grupigitaj laŭ domajno.

Dosiero "/etc/dovecot/conf.d/10-master.conf"

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 995
    ssl = yes
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}
service imap {
}
service pop3 {
}
service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  user = dovecot
}
service auth-worker {
  user = vmail
}
service dict {
  unix_listener dict {
  }
}

Ĉi tiu estas la ĉefa agorda dosiero de kolombejo.
Ĉi tie ni malŝaltas nesekurigitajn konektojn.
Kaj ebligu sekurajn konektojn.

Dosiero "/etc/dovecot/conf.d/10-ssl.conf"

ssl = required
ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt
ssl_key = </etc/nginx/ssl/domain1.com.2018.key
local XX.XX.XX.X5 {
  ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt
  ssl_key =  </etc/nginx/ssl/domain2.com.2018.key
}

Agordi ssl. Ni indikas, ke ssl estas postulata.
Kaj la atestilo mem. Kaj grava detalo estas la "loka" direktivo. Indikas kiun SSL-atestilon uzi kiam vi konektas al kiu loka IPv4.

Cetere, IPv6 ne estas agordita ĉi tie, mi korektos ĉi tiun preterlason poste.
XX.XX.XX.X5 (domajno2) - neniu atestilo. Por konekti klientojn vi devas specifi domain1.com.
XX.XX.XX.X2 (domain3) - estas atestilo, vi povas specifi domain1.com aŭ domain3.com por konekti klientojn.

Dosiero "/etc/dovecot/conf.d/15-lda.conf"

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Ĉi tio estos bezonata por spammurdisto estonte.

Dosiero "/etc/dovecot/conf.d/20-imap.conf"

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Ĉi tio estas kontraŭspama kromaĵo. Bezonata por trejnado de spamasasin en la momento de translokigo al/de la dosierujo "Spamo".

Dosiero "/etc/dovecot/conf.d/20-pop3.conf"

protocol pop3 {
}

Estas ĝuste tia dosiero.

Dosiero "/etc/dovecot/conf.d/20-lmtp.conf"

protocol lmtp {
  mail_plugins = $mail_plugins sieve
  postmaster_address = [email protected]
}

Agordi lmtp.

Dosiero "/etc/dovecot/conf.d/90-antispam.conf"

plugin {
  antispam_backend = pipe
  antispam_trash = Trash;trash
  antispam_spam = Junk;Spam;SPAM
  antispam_pipe_program_spam_arg = --spam
  antispam_pipe_program_notspam_arg = --ham
  antispam_pipe_program = /usr/bin/sa-learn
  antispam_pipe_program_args = --username=%Lu
}

Spamassasin trejnagordoj en la momento de translokigo al/de la Spam-dosierujo.

Dosiero "/etc/dovecot/conf.d/90-sieve.conf"

plugin {
  sieve = ~/.dovecot.sieve
  sieve_dir = ~/sieve
  sieve_after = /var/lib/dovecot/sieve/default.sieve
}

Dosiero kiu specifas kion fari kun alvenantaj leteroj.

Dosiero "/var/lib/dovecot/sieve/default.sieve"

require ["fileinto", "mailbox"];

if header :contains "X-Spam-Flag" "YES" {
        fileinto :create "Spam";
}

Vi devas kompili la dosieron: "sievec default.sieve".

Dosiero "/etc/dovecot/conf.d/auth-sql.conf.ext"

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Specifante sql-dosierojn por rajtigo.
Kaj la dosiero mem estas uzata kiel metodo de rajtigo.

Dosiero "/etc/dovecot/dovecot-sql.conf.ext"

driver = mysql
connect = host=127.0.0.1 dbname=servermail user=usermail password=password
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Ĉi tio respondas al similaj agordoj por postfikso.

Dosiero "/etc/dovecot/dovecot.conf"

protocols = imap lmtp pop3
listen = *, ::
dict {
}
!include conf.d/*.conf
!include_try local.conf

Ĉefa agorda dosiero.
La grava afero estas, ke ni indikas ĉi tie - aldonu protokolojn.

============= SpamAssassin ==============

apt-get install spamassassin spamc

Ni instalu la pakaĵojn.

adduser spamd --disabled-login

Ni aldonu uzanton en kies nomo.

systemctl enable spamassassin.service

Ni ebligas aŭtomatan ŝarĝan spamassassin-servon post ŝarĝo.

Dosiero "/etc/default/spamassassin":

CRON=1

Ebligante aŭtomatan ĝisdatigon de reguloj "defaŭlte".

Dosiero "/etc/spamassassin/local.cf":

report_safe 0

use_bayes          1
bayes_auto_learn   1
bayes_auto_expire  1
bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
bayes_sql_dsn      DBI:mysql:sa:localhost:3306
bayes_sql_username sa
bayes_sql_password password

Vi devas krei datumbazon "sa" en mysql kun la uzanto "sa" kun la pasvorto "pasvorto" (anstataŭigi per io taŭga).

report_safe - ĉi tio sendos raporton pri spama retpoŝto anstataŭ letero.
use_bayes estas spamassassin maŝinlernado agordojn.

La ceteraj spammurdistoj estis uzataj pli frue en la artikolo.

Ĝenerala agordo "spammurdisto".
Pri movo de novaj Spamaj retpoŝtoj al la dosierujo IMAP "Spamo"..
Pri simpla kombinaĵo de Dovecot + SpamAssassin.
Mi rekomendas legi la lernteorion de spamassin kiam oni movas literojn en imap-dosierujojn (kaj mi ne rekomendas uzi ĝin).

============= Alvoko al la komunumo =============

Mi ankaŭ ŝatus ĵeti ideon en la komunumon pri kiel pliigi la nivelon de sekureco de plusenditaj leteroj. Ĉar mi estas tiel profunde mergita en la temo de poŝto.

Por ke la uzanto povu krei paron da ŝlosiloj sur sia kliento (outlook, thunderbird, retumilo-kromaĵo, ...). Publika kaj privata. Publika - sendu al DNS. Privata - ŝparu ĉe la kliento. Poŝtserviloj povus uzi publikan ŝlosilon por sendi al specifa ricevanto.

Kaj por protekti kontraŭ spamado per tiaj leteroj (jes, la poŝtservilo ne povos vidi la enhavon) - vi devos enkonduki 3 regulojn:

  1. Deviga reala DKIM-signaturo, deviga SPF, deviga rDNS.
  2. Neŭrala reto pri la temo de trejnado pri kontraŭspamo + datumbazo por ĝi ĉe la klienta flanko.
  3. La ĉifrada algoritmo devas esti tia, ke la senda flanko devas elspezi 100 fojojn pli da CPU-potenco por ĉifrado ol la ricevanta flanko.

Krom publikaj leteroj, evoluigu norman proponleteron "por komenci sekuran korespondadon". Unu el la uzantoj (leterkesto) sendas leteron kun aldonaĵo al alia leterkesto. La letero enhavas tekstan proponon por komenci sekuran komunikadkanalon por korespondado kaj la publikan ŝlosilon de la posedanto de la leterkesto (kun privata ŝlosilo ĉe la klienta flanko).

Vi eĉ povas fari kelkajn ŝlosilojn specife por ĉiu korespondado. La ricevanto-uzanto povas akcepti ĉi tiun oferton kaj sendi sian publikan ŝlosilon (ankaŭ faritan specife por ĉi tiu korespondado). Poste, la unua uzanto sendas servan kontrolleteron (ĉifritan per la publika ŝlosilo de la dua uzanto) - post ricevo de kiu la dua uzanto povas konsideri la formitan komunikadkanalon fidinda. Poste, la dua uzanto sendas kontrolleteron - kaj tiam la unua uzanto ankaŭ povas konsideri la formitan kanalon sekura.

Por kontraŭbatali la interkapton de ŝlosiloj sur la vojo, la protokolo devas antaŭvidi la eblecon transdoni almenaŭ unu publikan ŝlosilon per poŝmemoro.

Kaj la plej grava afero estas, ke ĉio funkcias (la demando estas "kiu pagos por ĝi?"):
Enigu poŝtajn atestojn ekde $10 por 3 jaroj. Kio permesos al la sendinto indiki en la dns ke "miaj publikaj ŝlosiloj estas tie." Kaj ili donos al vi la ŝancon komenci sekuran konekton. Samtempe, akcepti tiajn ligojn estas senpaga.
gmail finfine monetigas siajn uzantojn. Por $10 por 3 jaroj - la rajto krei sekurajn korespondajn kanalojn.

============= Konkludo ==============

Por testi la tutan artikolon, mi estis lui diligentan servilon por monato kaj aĉeti domajnon kun SSL-atestilo.

Sed la vivcirkonstancoj disvolviĝis, do ĉi tiu afero daŭris dum 2 monatoj.
Kaj do, kiam mi denove havis liberan tempon, mi decidis publikigi la artikolon kiel estas, prefere ol riski, ke la publikigo daŭru ankoraŭ unu jaron.

Se estas sufiĉe multaj demandoj kiel "sed ĉi tio ne estas priskribita sufiĉe detale", tiam verŝajne estos forto preni dediĉitan servilon kun nova domajno kaj nova SSL-atestilo kaj priskribi ĝin eĉ pli detale kaj, plej grave, identigu ĉiujn mankantajn gravajn detalojn.

Mi ankaŭ ŝatus ricevi komentojn pri ideoj pri poŝtaj atestiloj. Se vi ŝatas la ideon, mi provos trovi la forton por skribi malneton por rfc.

Kiam vi kopias grandajn partojn de artikolo, donu ligon al ĉi tiu artikolo.
Kiam vi tradukas al iu ajn alia lingvo, donu ligilon al ĉi tiu artikolo.
Mi mem provos traduki ĝin en la anglan kaj lasos krucreferencojn.


fonto: www.habr.com

Aldoni komenton