Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Multi-interfacce + SpamAssassin-learn + Bind

Questu articulu hè nantu à cumu stabilisce un servitore di mail mudernu.
Postfix + Dovecot. SPF + DKIM + rDNS. Cù IPv6.
Cù crittografia TSL. Cù supportu per parechji domini - parte cù un veru certificatu SSL.
Cù prutezzione antispam è una alta valutazione antispam da altri servitori di mail.
Supporta parechje interfacce fisiche.
Cù OpenVPN, a cunnessione à quale hè via IPv4, è chì furnisce IPv6.

Se ùn vulete micca amparà tutte queste tecnulugii, ma vulete stallà un tali servitore, allora questu articulu hè per voi.

L'articulu ùn faci micca tentativu di spiegà ogni dettagliu. A spiegazione va à ciò chì ùn hè micca cunfiguratu cum'è standard o hè impurtante da u puntu di vista di u cunsumadore.

A mutivazione per stallà un servitore di mail hè statu un sognu longu di u mio. Questu pò pare stupidu, ma IMHO, hè assai megliu cà sunnià una nova vittura da a vostra marca preferita.

Ci hè duie motivazioni per a creazione di IPv6. Un specialista in l'informatica hà bisognu à amparà e tecnulugia novi constantemente per sopravvive. Vogliu fà a mo modesta cuntribuzione à a lotta contru a censura.

A motivazione per a creazione di OpenVPN hè solu per fà IPv6 chì travaglia nantu à a macchina locale.
A motivazione per a creazione di parechje interfacce fisiche hè chì in u mo servitore aghju una interfaccia "lenta ma illimitata" è una altra "rapida ma cù una tarifa".

A motivazione per a cunfigurazione di i paràmetri di Bind hè chì u mo ISP furnisce un servitore DNS inestable, è ancu Google à volte falla. Vogliu un servitore DNS stabile per usu persunale.

Motivazione per scrive un articulu - aghju scrittu un abbozzu 10 mesi fà, è l'aghju digià vistu duie volte. Ancu s'ellu l'autore hà bisognu regularmente, ci hè una alta probabilità chì l'altri anu ancu bisognu.

Ùn ci hè micca una suluzione universale per un servitore di mail. Ma pruvaraghju à scrive qualcosa cum'è "fate questu è dopu, quandu tuttu funziona cumu si deve, scaccià e cose extra".

A cumpagnia tech.ru hà un servitore Colocation. Hè pussibule paragunà cù OVH, Hetzner, AWS. Per risolve stu prublema, a cooperazione cù tech.ru serà assai più efficace.

Debian 9 hè stallatu nantu à u servitore.

U servitore hà 2 interfacce "eno1" è "eno2". U primu hè illimitatu, è u sicondu hè veloce, rispettivamente.

Ci sò 3 indirizzi IP statichi, XX.XX.XX.X0 è XX.XX.XX.X1 è XX.XX.XX.X2 nantu à l'interfaccia "eno1" è XX.XX.XX.X5 in l'interfaccia "eno2". .

Disponibile XXXX:XXXX:XXXX:XXXX::/64 un gruppu di indirizzi IPv6 chì sò assignati à l'interfaccia "eno1" è da questu XXXX:XXXX:XXXX:XXXX:1:2::/96 hè statu assignatu à "eno2" à a mo dumanda.

Ci sò 3 domini `domain1.com`, `domain2.com`, `domain3.com`. Ci hè un certificatu SSL per "domain1.com" è "domain3.com".

Aghju un contu Google chì mi piacerebbe ligà u mo mailbox[email prutettu]` (riceve mail è mandà mail direttamente da l'interfaccia gmail).
Ci deve esse una mailbox[email prutettu]`, una copia di l'email da quale vogliu vede in u mo gmail. È hè raru di pudè mandà qualcosa in nome di `[email prutettu]` via l'interfaccia web.

Ci deve esse una mailbox[email prutettu]`, chì Ivanov aduprà da u so iPhone.

L'email mandatu deve esse cumpletu cù tutti i requisiti antispam moderni.
Ci deve esse u più altu livellu di criptografia furnitu in e rete publiche.
Ci duverebbe esse supportu IPv6 per l'invià è a ricezione di lettere.
Ci deve esse un SpamAssassin chì ùn sguasserà mai e-mail. È saltarà o saltarà o mandarà à u cartulare IMAP "Spam".
SpamAssassin auto-learning deve esse cunfiguratu: se movu una lettera à u cartulare Spam, hà da amparà da questu; se movu una lettera da u cartulare Spam, ampararà da questu. I risultati di a furmazione di SpamAssassin deve influenzallu se a lettera finisci in u cartulare Spam.
I script PHP deve esse capace di mandà mail in nome di qualsiasi duminiu in un servitore determinatu.
Ci deve esse un serviziu openvpn, cù a capacità di utilizà IPv6 in un cliente chì ùn hà micca IPv6.

Prima avete bisognu di cunfigurà l'interfaccia è u routing, cumpresu IPv6.
Allora avete bisognu di cunfigurà OpenVPN, chì cunnetta via IPv4 è furnisce u cliente cù un indirizzu IPv6 static-reale. Stu cliente averà accessu à tutti i servizii IPv6 in u servitore è accessu à qualsiasi risorse IPv6 in Internet.
Allora vi tuccherà à cunfigurà Postfix per mandà lettere + SPF + DKIM + rDNS è altre cose simili.
Allora vi tuccherà à cunfigurà Dovecot è cunfigurà Multidomain.
Allora vi tuccherà à cunfigurà SpamAssassin è cunfigurà a furmazione.
Infine, installate Bind.

============== Interfacce multiple ==============

Per cunfigurà l'interfaccia, avete bisognu di scrive questu in "/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

Queste paràmetri ponu esse appiicati in ogni servitore in tech.ru (cù un pocu di coordinazione cù u supportu) è funziunarà immediatamente cumu si deve.

Sè vo avete spirienza di crià cose simili per Hetzner, OVH, hè differente quì. Più difficiule.

eno1 hè u nome di a carta di rete #1 (lenta ma illimitata).
eno2 hè u nome di a carta di rete #2 (rapida, ma cù una tarifa).
tun0 hè u nome di a carta di rete virtuale da OpenVPN.
XX.XX.XX.X0 - IPv4 #1 nantu à eno1.
XX.XX.XX.X1 - IPv4 #2 nantu à eno1.
XX.XX.XX.X2 - IPv4 #3 nantu à eno1.
XX.XX.XX.X5 - IPv4 #1 nantu à eno2.
XX.XX.XX.1 - Gateway IPv4.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 per tuttu u servitore.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 per eno2, tuttu u restu di l'esternu entra in eno1.
XXXX:XXXX:XXXX:XXXX::1 - IPv6 gateway (vale à nutà chì questu pò / deve esse fattu di manera diversa. Specificate u switch IPv6).
dns-nameservers - 127.0.0.1 hè indicatu (perchè bind hè stallatu in u locu) è 213.248.1.6 (questu hè da tech.ru).

"table eno1t" è "table eno2t" - u significatu di sti reguli di rotta hè chì u trafficu chì entra per eno1 -> abbandunarà da ellu, è u trafficu chì entra per eno2 -> lascià da ellu. È ancu e cunnessione iniziate da u servitore passanu per eno1.

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

Cù questu cumandimu spicificeghja chì ogni trafficu incomprensibile chì cade in ogni regula marcata "table eno1t" -> esse mandatu à l'interfaccia eno1.

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

Cù questu cumandimu spicificà chì ogni trafficu iniziatu da u servitore deve esse diretta à l'interfaccia eno1.

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

Cù stu cumandamentu avemu stabilitu e regule per u trafficu di marcatu.

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

Stu bloccu specifica un secondu IPv4 per l'interfaccia eno1.

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

Cù questu cumandimu avemu stabilitu a strada da i clienti OpenVPN à l'IPv4 lucale eccettu XX.XX.XX.X0.
Ùn aghju micca capitu perchè stu cumandamentu hè abbastanza per tutti l'IPv4.

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

Hè quì chì avemu stabilitu l'indirizzu per l'interfaccia stessu. U servitore l'utilizarà cum'è indirizzu "in uscita". Ùn serà micca usatu in ogni modu di novu.

Perchè ":1:1::" hè cusì complicatu? Allora chì OpenVPN funziona bè è solu per questu. Più nantu à questu dopu.

Nantu à u tema di a porta - hè cusì chì travaglia è hè bè. Ma a manera curretta hè di indicà quì l'IPv6 di u switch à quale u servitore hè cunnessu.

Tuttavia, per una certa ragione IPv6 ferma di travaglià se facciu questu. Questu hè probabilmente un tipu di prublema tech.ru.

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

Questu hè aghjunghje un indirizzu IPv6 à l'interfaccia. Sè avete bisognu di centu indirizzi, questu significa centu linee in questu schedariu.

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

Aghju nutatu l'indirizzi è i subnets di tutte l'interfacce per fà chjaru.
eno1 - deve esse "/64"- perchè questu hè tuttu u nostru gruppu di indirizzi.
tun0 - a subnet deve esse più grande di eno1. Altrimenti, ùn serà micca pussibule cunfigurà una porta IPv6 per i clienti OpenVPN.
eno2 - a subnet deve esse più grande di tun0. Altrimenti, i clienti OpenVPN ùn puderanu micca accede à l'indirizzi IPv6 lucali.
Per a chjarità, aghju sceltu un passu subnet di 16, ma se vulete, pudete ancu fà u passu "1".
Dunque, 64 + 16 = 80, è 80 + 16 = 96.

Per una chiarezza ancu più grande:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY sò indirizzi chì devenu esse attribuiti à siti o servizii specifichi nantu à l'interfaccia eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY sò indirizzi chì devenu esse attribuiti à siti o servizii specifichi nantu à l'interfaccia eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY sò indirizzi chì devenu esse assignati à i clienti OpenVPN o utilizati cum'è indirizzi di serviziu OpenVPN.

Per cunfigurà a reta, deve esse pussibule riavvia u servitore.
I cambiamenti IPv4 sò ripresi quandu sò eseguiti (assicuratevi di imbottigliallu in u screnu - altrimenti stu cumandimu simpricimenti crash the network on the server):

/etc/init.d/networking restart

Aghjunghjite à a fine di u schedariu "/etc/iproute2/rt_tables":

100 eno1t
101 eno2t

Senza questu, ùn pudete micca aduprà tavule persunalizati in u schedariu "/etc/network/interfaces".
I numeri devenu esse unichi è menu di 65535.

I cambiamenti IPv6 ponu esse cambiati facilmente senza rebooting, ma per fà questu avete bisognu di amparà almenu trè cumandamenti:

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

Impostazione "/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

Quessi sò i paràmetri "sysctl" di u mo servitore. Lasciami indicà qualcosa di impurtante.

net.ipv4.ip_forward = 1

Senza questu, OpenVPN ùn funziona micca.

net.ipv6.ip_nonlocal_bind = 1

Qualchidunu chì prova à ligà IPv6 (per esempiu nginx) immediatamente dopu chì l'interfaccia hè stata, riceverà un errore. Chì questu indirizzu ùn hè micca dispunibule.

Per evitari una tale situazione, un tali paràmetru hè fattu.

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

Senza questi paràmetri IPv6, u trafficu da u cliente OpenVPN ùn esce micca in u mondu.

L'altri paràmetri ùn sò micca pertinenti o ùn mi ricordu micca per ciò chì sò.
Ma in casu, l'aghju lasciatu "cum'è".

Per pudè piglià i cambiamenti à stu schedariu senza riavvià u servitore, avete bisognu di eseguisce u cumandimu:

sysctl -p

Più dettagli nantu à e regule "tavula": habr.com/post/108690

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

OpenVPN IPv4 ùn funziona micca senza iptables.

I mo iptables sò cusì per 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 hè u mo indirizzu IPv4 staticu di a macchina lucale.
10.8.0.0/24 - IPv4 rete openvpn. Indirizzi IPv4 per i clienti openvpn.
A cunsistenza di e regule hè impurtante.

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

Questa hè una limitazione per chì solu possu aduprà OpenVPN da a mo IP statica.

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

Per rinvià i pacchetti IPv4 trà i clienti OpenVPN è Internet, avete bisognu di registrà unu di sti cumandamenti.

Per diversi casi, una di l'opzioni ùn hè micca adattatu.
I dui cumandamenti sò adattati per u mo casu.
Dopu avè lettu a documentazione, aghju sceltu a prima opzione perchè usa menu CPU.

Per chì tutti i paràmetri di l'iptables ponu esse ripigliati dopu à u reboot, avete bisognu di salvà in un locu.

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

Tali nomi ùn sò micca stati scelti per casu. Sò usati da u pacchettu "iptables-persistent".

apt-get install iptables-persistent

Stallà u pacchettu OpenVPN principale:

apt-get install openvpn easy-rsa

Stabilitemu un mudellu per i certificati (sustituite i vostri valori):

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

Editemu i paràmetri di u mudellu di certificatu:

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"
...

Crea un certificatu di u servitore:

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

Preparamu l'abilità di creà i fugliali finali "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

Preparemu un script chì unisce tutti i schedari in un unicu file opvn.

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

Crià u primu cliente OpenVPN:

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

U schedariu "~/client-configs/files/client-name.ovpn" hè mandatu à u dispusitivu di u cliente.

Per i clienti iOS, avete bisognu di fà u truccu seguente:
U cuntenutu di u tag "tls-auth" deve esse senza cumenti.
È ancu mette "key-direction 1" immediatamente prima di u tag "tls-auth".

Cunfiguremu a cunfigurazione di u servitore 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

Questu hè necessariu per stabilisce un indirizzu staticu per ogni cliente (micca necessariu, ma l'aghju utilizatu):

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

U dettagliu più difficiule è chjave.

Sfortunatamente, OpenVPN ùn sapi ancu cumu cunfigurà indipindente una porta IPv6 per i clienti.
Avete da "manualmente" trasmette questu per ogni cliente.

# 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"

File "/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

File "/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

I dui script utilizanu u schedariu "/etc/openvpn/variables":

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

Mi hè difficiule di ricurdà perchè hè scrittu cusì.

Avà netmask = 112 pare stranu (duverebbe esse 96 quì).
È u prefissu hè stranu, ùn currisponde micca à a reta tun0.
Ma va bè, l'aghju lasciatu cum'è.

cipher DES-EDE3-CBC

Questu hè micca per tutti - aghju sceltu stu metudu di criptà a cunnessione.

Sapete più nantu à a configurazione di OpenVPN IPv4.

Sapete più nantu à a configurazione di OpenVPN IPv6.

============== Postfix ==============

Stallà u pacchettu principale:

apt-get install postfix

Quandu si stallanu, selezziunate "situ Internet".

U mo "/etc/postfix/main.cf" pare cusì:

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

Fighjemu i dettagli di sta cunfigurazione.

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

Sicondu i residenti di Khabrovsk, stu bloccu cuntene "disinformazione è tesi sbagliate".Solu 8 anni dopu à l'iniziu di a mo carriera, aghju cuminciatu à capisce cumu funziona SSL.

Dunque, piglieraghju a libertà di discrive cumu utilizà SSL (senza risponde à e dumande "Cumu funziona?" è "Perchè funziona?").

A basa di a criptografia muderna hè a creazione di una coppia di chjave (dui stringhe assai longu di caratteri).

Una "chjave" hè privata, l'altra chjave hè "pubblica". Mantenemu a chjave privata assai cun cura secreta. Distribuemu a chjave publica à tutti.

Utilizendu una chjave publica, pudete criptà una stringa di testu in modu chì solu u pruprietariu di a chjave privata pò decifrarla.
Ebbè, questu hè tutta a basa di a tecnulugia.

Passu #1 - siti https.
Quandu accede à un situ, u navigatore ampara da u servitore web chì u situ hè https è per quessa dumanda una chjave publica.
U servitore web dà a chjave publica. U navigatore usa a chjave publica per criptà a http-request è mandà.
U cuntenutu di una http-request pò esse lettu solu da quelli chì anu a chjave privata, vale à dì, solu u servitore à quale hè fatta a dumanda.
Http-request cuntene almenu un URI. Dunque, se un paese prova di limità l'accessu micca à u situ sanu, ma à una pagina specifica, questu hè impussibile di fà per i siti https.

Passu #2 - risposta criptata.
U servitore web furnisce una risposta chì pò esse facilmente leghje nantu à a strada.
A suluzione hè estremamente simplice - u navigatore genera localmente a stessa coppia di chjave privata-pubblica per ogni situ https.
È cù a dumanda di a chjave publica di u situ, manda a so chjave publica locale.
U servitore web s'arricorda è, quandu invià http-risposta, cripta cù a chjave publica di un cliente specificu.
Avà http-risposta pò esse decriptata solu da u pruprietariu di a chjave privata di u navigatore di u cliente (vale à dì, u cliente stessu).

Step No. 3 - stabilisce una cunnessione sicura via un canali publicu.
Ci hè una vulnerabilità in l'esempiu N ° 2 - nunda impedisce à i boni di l'intercepte una dumanda di http è editate infurmazioni nantu à a chjave publica.
Cusì, l'intermediariu vede chjaramente tuttu u cuntenutu di i missaghji mandati è ricevuti finu à chì u canali di cumunicazione cambia.
Trattamentu di questu hè estremamente simplice - basta à mandà a chjave publica di u navigatore cum'è un missaghju criptatu cù a chjave publica di u servitore web.
U servitore web poi manda prima una risposta cum'è "a vostra chjave publica hè cusì" è cripta stu missaghju cù a listessa chjave publica.
U navigatore guarda a risposta - se u missaghju "a vostra chjave publica hè cusì" hè ricevutu - allora questu hè una garanzia di 100% chì stu canali di cumunicazione hè sicuru.
Quantu hè sicuru?
A stessa creazione di un tali canali di cumunicazione sicura si trova à una velocità di ping * 2. Per esempiu, 20 ms.
L'attaccante deve avè a chjave privata di unu di i partiti in anticipu. O truvà una chjave privata in un paru di millisecondi.
Hacking una chjave privata moderna durarà decennii in un supercomputer.

Passu #4 - basa di dati publica di chjavi publichi.
Ovviamente, in questa storia sana, ci hè l'uppurtunità per un attaccu di pusà nantu à u canali di cumunicazione trà u cliente è u servitore.
U cliente pò finta di esse u servitore, è u servitore pò finta di esse u cliente. È emulate un paru di chjavi in ​​e duie direzzione.
Allora l'attaccante vede tuttu u trafficu è puderà "edità" u trafficu.
Per esempiu, cambiate l'indirizzu induve mandà soldi o copià a password da a banca in linea o bluccà u cuntenutu "objectionable".
Per cummattiri tali attaccanti, anu ghjuntu cù una basa di dati publica cù chjavi publichi per ogni situ https.
Ogni navigatore "sapi" di l'esistenza di circa 200 tali basa di dati. Questu vene preinstallatu in ogni navigatore.
"A cunniscenza" hè sustinutu da una chjave publica da ogni certificatu. Questu hè, a cunnessione à ogni autorità di certificazione specifica ùn pò micca esse falsificata.

Avà ci hè una comprensione simplice di cumu utilizà SSL per https.
Se utilizate u vostru cervellu, diventerà chjaru cumu i servizii speciali ponu pirate qualcosa in questa struttura. Ma li costarà sforzi mostruosi.
È l'urganisazione più chjuca di a NSA o CIA - hè quasi impussibile di pirate u livellu di prutezzione esistenti, ancu per i VIP.

Aghju aghjustatu ancu nantu à e cunnessione ssh. Ùn ci sò micca chjavi publichi, allora chì pudete fà? U prublema hè risolta in dui maneri.
Opzione ssh-by-password:
Durante a prima cunnessione, u cliente ssh deve avvistà chì avemu una nova chjave publica da u servitore ssh.
È durante più cunnessione, se l'avvertimentu "nova chjave publica da u servitore ssh" apparisce, significarà chì stanu pruvendu à spiegà.
O avete eavesdropped in a vostra prima cunnessione, ma avà cumunicà cù u servitore senza intermediari.
In verità, per via di u fattu chì u fattu di u telefuninu hè facilmente, rapidamente è senza sforzu revelatu, stu attaccu hè usatu solu in casi speciali per un cliente specificu.

Opzione ssh-by-key:
Pigliemu un flash drive, scrivite a chjave privata per u servitore ssh nantu à questu (ci sò termini è assai sfumature impurtanti per questu, ma scrivu un prugramma educativu, micca struzzioni per l'usu).
Lasciamu a chjave publica nantu à a macchina induve serà u cliente ssh è mantenemu ancu segretu.
Purtemu u flash drive à u servitore, inserisci, copià a chjave privata, è brusgiate u flash drive è sparghje e cendri à u ventu (o almenu furmatu cù zeri).
Hè tuttu - dopu una tale operazione serà impussibile di pirate una tale cunnessione ssh. Di sicuru, in 10 anni serà pussibule di vede u trafficu nantu à un supercomputer - ma hè una storia diversa.

Mi scusa per l'offtopic.

Allora avà chì a teoria hè cunnisciuta. Vi dicu u flussu di creà un certificatu SSL.

Utilizendu "openssl genrsa" creemu una chjave privata è "blanks" per a chjave publica.
Mandemu i "blanks" à una cumpagnia di terzu, à quale paghemu circa $ 9 per u certificatu più simplice.

Dopu un paru d'ore, ricevemu a nostra chjave "pubblica" è un inseme di parechje chjavi publichi da questa cumpagnia di terzu.

Perchè una cumpagnia di terzu paghe per a registrazione di a mo chjave publica hè una quistione separata, ùn avemu micca cunsideratu quì.

Avà hè chjaru chì u significatu di l'inscription hè:

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

U cartulare "/etc/ssl" cuntene tutti i fugliali per i prublemi ssl.
domain1.com - nome di duminiu.
2018 hè l'annu di creazione chjave.
"key" - designazione chì u schedariu hè una chjave privata.

È u significatu di stu schedariu:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com - nome di duminiu.
2018 hè l'annu di creazione chjave.
chained - designazione chì ci hè una catena di chjavi publichi (u primu hè a nostra chjave publica è u restu sò ciò chì hè vinutu da a cumpagnia chì emette a chjave publica).
crt - designazione chì ci hè un certificatu ready-made (chjave publica cù spiegazioni tecniche).

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

Stu paràmetru ùn hè micca usatu in questu casu, ma hè scrittu cum'è un esempiu.

Perchè un errore in stu paràmetru hà da esse mandatu u puzzicheghju da u vostru servitore (senza a vostra vuluntà).

Allora pruvà à tutti chì ùn site micca culpèvule.

recipient_delimiter = +

Parechje persone ùn pò micca sapè, ma questu hè un caratteru standard per e-mail ranking, è hè supportatu da a maiò parte di i servitori di mail moderni.

Per esempiu, sè vo avete un mailbox "[email prutettu]"prova à mandà à"[email prutettu]"- Fighjate ciò chì vene.

inet_protocols = ipv4

Questu pò esse cunfusu.

Ma ùn hè micca solu cusì. Ogni novu duminiu hè per difettu solu IPv4, allora aghju attivatu IPv6 per ognunu separatamente.

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

Quì avemu specificatu chì tutti i mail entranti và à dovecot.
È e regule per u duminiu, mailbox, alias - fighjate in a basa di dati.

/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

Avà u postfix sapi chì u mail pò esse accettatu per più invià solu dopu l'autorizazione cù dovecot.

Ùn aghju micca veramente capitu perchè questu hè duplicatu quì. Avemu digià specificatu tuttu ciò chì hè necessariu in "virtual_transport".

Ma u sistema di postfix hè assai anticu - prubabilmente hè un ritruvamentu di i vechji tempi.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Questu pò esse cunfiguratu in modu diversu per ogni servitore di mail.

Aghju 3 servitori di mail à a mo dispusizione è questi paràmetri sò assai diffirenti per via di e diverse esigenze d'usu.

Avete bisognu di cunfigurà cù cura - altrimenti u puzzicheghju vi verserà in voi, o ancu peggiu - u puzzicheghju vi sparterà da voi.

# SPF
policyd-spf_time_limit = 3600

Configurazione di qualchì plugin in relazione à a verificazione di u SPF di e lettere entrate.

# 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

U paràmetru hè chì duvemu furnisce una firma DKIM cù tutti i email in uscita.

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

Questu hè un ditagliu chjave in u routing di lettere quandu invià lettere da script PHP.

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

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

A manca sò espressioni regulari. À a diritta hè una etichetta chì marca a lettera.
Postfix in cunfurmità cù l'etichetta - piglià in contu uni pochi di più linii di cunfigurazione per una lettera specifica.

Cumu esattamente u postfix serà reconfiguratu per una lettera specifica serà indicatu in "master.cf".

Linee 4, 5, 6 sò i principali. In nome di quale duminiu avemu da mandà a lettera, mettemu sta etichetta.
Ma u campu "da" ùn hè micca sempre indicatu in script PHP in u vechju codice. Allora u nome d'utilizatore vene in salvezza.

L'articulu hè digià largu - ùn vogliu micca esse distrattu da a creazione di nginx + fpm.

In breve, per ogni situ avemu stabilitu u so propiu pruprietariu di linux-user. È cusì u vostru fpm-pool.

Fpm-pool usa ogni versione di php (hè bellu quandu in u stessu servitore pudete aduprà diverse versioni di php è ancu diverse php.ini per i siti vicini senza prublemi).

Dunque, un utilizatore specificu di Linux "www-domain2" hà un situ web domain2.com. Stu situ hà un codice per mandà email senza specificà u campu da.

Allora, ancu in questu casu, e lettere seranu mandate currettamente è ùn finiranu mai in spam.

U mo "/etc/postfix/master.cf" pare cusì:

...
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

U schedariu ùn hè micca furnitu in tuttu - hè digià assai grande.
Aghju nutatu solu ciò chì hè cambiatu.

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}

Quessi sò paràmetri ligati à spamassasin, più nantu à questu dopu.

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

Permettemu di cunnette à u servitore di mail via u portu 587.
Per fà questu, duvete login.

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

Habilita a verificazione SPF.

apt-get install postfix-policyd-spf-python

Stallà u pacchettu per i cuntrolli SPF sopra.

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

È questu hè u più interessante. Questa hè a capacità di mandà lettere per un duminiu specificu da un indirizzu IPv4 / IPv6 specificu.

Questu hè fattu per rDNS. rDNS hè u prucessu di riceve una stringa per indirizzu IP.
È per u mail, sta funzione hè aduprata per cunfirmà chì l'helo currisponde esattamente à l'rDNS di l'indirizzu da quale l'email hè statu mandatu.

Se u helo ùn currisponde micca à u duminiu di email in nome di quale a lettera hè stata mandata, i punti spam sò attribuiti.

Helo ùn currisponde à rDNS - assai punti di spam sò attribuiti.
Per quessa, ogni duminiu deve avè u so propiu indirizzu IP.
Per OVH - in a cunsola hè pussibule di specificà rDNS.
Per tech.ru - u prublema hè risolta da u supportu.
Per AWS, u prublema hè risolta da u supportu.
"inet_protocols" è "smtp_bind_address6" - attivemu u supportu IPv6.
Per IPv6 avete ancu bisognu di registrà rDNS.
"syslog_name" - è questu hè per facilità di leghje logs.

Cumprate certificati Vi cunsigliu quì.

Configurazione di u ligame postfix+dovecot quì.

Impostazione SPF.

============= Colombare ==============

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

Configurazione di mysql, installendu i pacchetti stessi.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

L'autorizazione hè solu criptata.

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

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

Quì indichemu u locu di almacenamiento per e lettere.

Vogliu esse guardatu in i schedari è raggruppati per duminiu.

File "/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 {
  }
}

Questu hè u schedariu principale di cunfigurazione di dovecot.
Quì disattivemu e cunnessione micca assicurate.
È attivà e cunnessione sicure.

File "/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
}

Configurazione di ssl. Indichemu chì ssl hè necessariu.
È u certificatu stessu. È un dettu impurtante hè a direttiva "lucale". Indica quale certificatu SSL à utilizà quandu si cunnessu à quale IPv4 locale.

Per via, IPv6 ùn hè micca cunfiguratu quì, correggeraghju sta omissione dopu.
XX.XX.XX.X5 (domain2) - senza certificatu. Per cunnette i clienti avete bisognu di specificà domain1.com.
XX.XX.XX.X2 (domain3) - ci hè un certificatu, pudete specificà domain1.com o domain3.com per cunnette i clienti.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Questu serà necessariu per spamassassin in u futuru.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Questu hè un plugin antispam. Necessariu per a furmazione di spamassasin à u mumentu di u trasferimentu à / da u cartulare "Spam".

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

protocol pop3 {
}

Ci hè solu un tali schedariu.

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

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

Configurazione di lmtp.

File "/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
}

Paràmetri di furmazione Spamassasin à u mumentu di u trasferimentu à / da u cartulare Spam.

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

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

Un schedariu chì specifica ciò chì deve fà cù e lettere entrate.

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

require ["fileinto", "mailbox"];

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

Avete bisognu di cumpilà u schedariu: "sievec default.sieve".

File "/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
}

Specificà i schedari sql per l'autorizazione.
È u schedariu stessu hè usatu cum'è un metudu d'autorizazione.

File "/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';

Questu currisponde à paràmetri simili per postfix.

File "/etc/dovecot/dovecot.conf"

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

File di cunfigurazione principale.
L'impurtante hè chì indichemu quì - aghjunghje protocols.

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

apt-get install spamassassin spamc

Stallà i pacchetti.

adduser spamd --disabled-login

Aghjunghjemu un utilizatore in nome di quale.

systemctl enable spamassassin.service

Attivà u serviziu di spamassassin di carica automatica dopu a carica.

File "/etc/default/spamassassin":

CRON=1

Per attivendu l'aghjurnamentu automaticu di e regule "per default".

File "/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

Avete bisognu di creà una basa di dati "sa" in mysql cù l'utilizatore "sa" cù a password "password" (sustituitu cù qualcosa adattatu).

report_safe - questu mandarà un rapportu di spam email invece di una lettera.
use_bayes sò paràmetri di apprendimentu di machine spamassassin.

I paràmetri di spamassassin restante sò stati utilizati prima in l'articulu.

Paràmetru generale "spamassassin".
Circa u muvimentu di novi email Spam à u cartulare IMAP "Spam"..
Circa una combinazione simplice di Dovecot + SpamAssassin.
Vi cunsigliu di leghje a teoria di l'apprendimentu di spamassasin quandu si move e lettere in cartelle imap (è ùn vi cunsigliu micca di aduprà).

============= Appellu à a cumunità ==============

Mi piacerebbe ancu lancià una idea in a cumunità nantu à cumu aumentà u livellu di sicurità di e lettere trasmesse. Siccomu sò tantu immersa in u tema di mail.

Cusì chì l'utilizatore pò creà un paru di chjave nantu à u so cliente (outlook, thunderbird, browser-plugin, ...). Publicu è privatu. Public - mandate à DNS. Privatu - salvà nantu à u cliente. I servitori di mail puderanu aduprà una chjave publica per mandà à un destinatariu specificu.

È per pruteggiri contra u puzzicheghju cù tali lettere (iè, u servitore di mail ùn serà micca capaci di vede u cuntenutu) - avete bisognu di introduci 3 regule:

  1. Firma DKIM reale obbligatoria, SPF obbligatoria, rDNS obbligatoria.
  2. Rete neurale nantu à u sughjettu di furmazione antispam + basa di dati per ellu nantu à u cliente.
  3. L'algoritmu di criptografia deve esse tale chì u latu di l'inviu deve spende 100 volte più putenza di CPU nantu à a criptografia di u latu di riceve.

In più di e lettere pubbliche, sviluppate una lettera di pruposta standard "per inizià a corrispondenza sicura". Unu di l'utilizatori (mailbox) manda una lettera cù un attache à un altru mailbox. A lettera cuntene una pruposta di testu per inizià un canale di cumunicazione sicuru per a currispundenza è a chjave publica di u pruprietariu di a mailbox (cù una chjave privata in u cliente).

Pudete ancu fà un coppiu di chjave specificamente per ogni currispundenza. L'utilizatore destinatariu pò accettà sta offerta è mandà a so chjave publica (fatta ancu apposta per questa currispundenza). In seguitu, u primu utilizatore manda una lettera di cuntrollu di serviziu (cifrata cù a chjave publica di u sicondu utilizatore) - dopu avè ricivutu chì u sicondu utilizatore pò cunsiderà u canali di cumunicazione furmatu affidabile. In seguitu, u sicondu utilizatore manda una lettera di cuntrollu - è dopu u primu utilizatore pò ancu cunsiderà u canali furmatu sicuru.

Per cumbatte l'intercepzione di e chjave in a strada, u protocolu deve furnisce a pussibilità di trasmette almenu una chjave publica cù un flash drive.

È u più impurtante hè chì tuttu funziona (a quistione hè "quale hà da pagà per questu?"):
Inserite certificati postali à partesi da $ 10 per 3 anni. Chì permetterà à u mittente di indicà in u dns chì "i mo chjavi publichi sò quì". È vi daranu l'uppurtunità di inizià una cunnessione sicura. À u listessu tempu, accettà tali cunnessione hè liberu.
gmail hè infine monetizing i so utilizatori. Per $ 10 per 3 anni - u dirittu di creà canali di currispundenza sicuri.

============== Conclusioni ==============

Per pruvà l'articulu sanu, andava à allughjà un servitore dedicatu per un mesi è cumprà un duminiu cù un certificatu SSL.

Ma e circustanze di a vita sò sviluppate cusì stu prublema si trascinò per 2 mesi.
È cusì, quandu aghju avutu u tempu liberu di novu, aghju decisu di pubblicà l'articulu cum'è, invece di risicà chì a publicazione trascinassi per un altru annu.

Se ci sò parechje dumande cum'è "ma questu ùn hè micca descrittu in abbastanza dettagliu", allora ci sarà prubabilmente forza per piglià un servitore dedicatu cù un novu duminiu è un novu certificatu SSL è discrìvilu in più dettagliu è, a maiò parte. impurtante, identificà tutti i dettagli impurtanti mancanti.

Mi piacerebbe ancu avè feedback nantu à idee nantu à i certificati postali. Se ti piace l'idea, pruvaraghju à truvà a forza per scrive un draft per rfc.

Quandu copià una grande parte di un articulu, furnisce un ligame à questu articulu.
Quandu traduce in qualsiasi altra lingua, furnisce un ligame à questu articulu.
Pruvaraghju di traduce in inglese me stessu è lascià riferimenti incruciati.


Source: www.habr.com

Add a comment