Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Multi-interfețe + SpamAssassin-learn + Bind

Acest articol este despre cum să configurați un server de e-mail modern.
Postfix + Porumbel. SPF + DKIM + rDNS. Cu IPv6.
Cu criptare TSL. Cu suport pentru mai multe domenii - parte cu un certificat SSL real.
Cu protecție antispam și un rating ridicat antispam de la alte servere de e-mail.
Suporta mai multe interfețe fizice.
Cu OpenVPN, conexiunea la care se face prin IPv4 și care oferă IPv6.

Dacă nu doriți să învățați toate aceste tehnologii, dar doriți să configurați un astfel de server, atunci acest articol este pentru dvs.

Articolul nu încearcă să explice fiecare detaliu. Explicația merge la ceea ce nu este configurat ca standard sau este important din punctul de vedere al consumatorului.

Motivația de a înființa un server de e-mail a fost un vis de mult timp al meu. Acest lucru poate suna stupid, dar IMHO, este mult mai bine decât să visezi la o mașină nouă de la marca ta preferată.

Există două motive pentru configurarea IPv6. Un specialist IT trebuie să învețe noi tehnologii în mod constant pentru a supraviețui. Aș dori să aduc modesta mea contribuție la lupta împotriva cenzurii.

Motivația pentru configurarea OpenVPN este doar de a face ca IPv6 să funcționeze pe mașina locală.
Motivația pentru configurarea mai multor interfețe fizice este că pe serverul meu am o interfață „lentă dar nelimitată” și alta „rapidă dar cu tarif”.

Motivația pentru configurarea setărilor Bind este că ISP-ul meu oferă un server DNS instabil și, de asemenea, Google eșuează uneori. Vreau un server DNS stabil pentru uz personal.

Motivația de a scrie un articol - am scris o schiță acum 10 luni și m-am uitat deja la el de două ori. Chiar dacă autorul are nevoie în mod regulat de el, există o mare probabilitate ca și alții să aibă nevoie de el.

Nu există o soluție universală pentru un server de e-mail. Dar voi încerca să scriu ceva de genul „fă asta și apoi, când totul funcționează așa cum trebuie, aruncă lucrurile în plus”.

Compania tech.ru are un server de Colocare. Se poate compara cu OVH, Hetzner, AWS. Pentru a rezolva această problemă, cooperarea cu tech.ru va fi mult mai eficientă.

Debian 9 este instalat pe server.

Serverul are 2 interfețe `eno1` și `eno2`. Primul este nelimitat, iar al doilea este rapid, respectiv.

Există 3 adrese IP statice, XX.XX.XX.X0 și XX.XX.XX.X1 și XX.XX.XX.X2 pe interfața `eno1` și XX.XX.XX.X5 pe interfața `eno2` .

Disponibil XXXX:XXXX:XXXX:XXXX::/64 un grup de adrese IPv6 care sunt atribuite interfeței `eno1` și din aceasta XXXX:XXXX:XXXX:XXXX:1:2::/96 a fost atribuit lui `eno2` la cererea mea.

Există 3 domenii `domain1.com`, `domain2.com`, `domain3.com`. Există un certificat SSL pentru `domain1.com` și `domain3.com`.

Am un cont Google la care aș dori să-mi conectez căsuța poștală[e-mail protejat]` (primirea e-mailurilor și trimiterea e-mailurilor direct din interfața gmail).
Trebuie să existe o cutie poștală`[e-mail protejat]`, o copie a e-mailului din care vreau să-l văd în gmailul meu. Și este rar să poți trimite ceva în numele lui `[e-mail protejat]` prin interfața web.

Trebuie să existe o cutie poștală`[e-mail protejat]`, pe care Ivanov îl va folosi de pe iPhone-ul său.

E-mailurile trimise trebuie să respecte toate cerințele moderne antispam.
Trebuie să existe cel mai înalt nivel de criptare oferit în rețelele publice.
Ar trebui să existe suport IPv6 atât pentru trimiterea, cât și pentru primirea scrisorilor.
Ar trebui să existe un SpamAssassin care nu va șterge niciodată e-mailurile. Și va respinge sau va omite sau va trimite în folderul IMAP „Spam”.
Învățarea automată a SpamAssassin trebuie configurată: dacă mut o scrisoare în dosarul Spam, va învăța din asta; dacă mut o scrisoare din dosarul Spam, va învăța din asta. Rezultatele antrenamentului SpamAssassin ar trebui să influențeze dacă scrisoarea ajunge în dosarul Spam.
Scripturile PHP trebuie să poată trimite e-mailuri în numele oricărui domeniu de pe un anumit server.
Ar trebui să existe un serviciu openvpn, cu posibilitatea de a utiliza IPv6 pe un client care nu are IPv6.

Mai întâi trebuie să configurați interfețele și rutarea, inclusiv IPv6.
Apoi va trebui să configurați OpenVPN, care se va conecta prin IPv4 și va furniza clientului o adresă IPv6 static-reală. Acest client va avea acces la toate serviciile IPv6 de pe server și acces la orice resurse IPv6 de pe Internet.
Apoi va trebui să configurați Postfix pentru a trimite scrisori + SPF + DKIM + rDNS și alte lucruri mici similare.
Apoi va trebui să configurați Dovecot și să configurați Multidomain.
Apoi va trebui să configurați SpamAssassin și să configurați antrenamentul.
În cele din urmă, instalați Bind.

============= Multi-interfețe =============

Pentru a configura interfețele, trebuie să scrieți acest lucru în „/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

Aceste setări pot fi aplicate pe orice server din tech.ru (cu puțină coordonare cu suportul) și va funcționa imediat așa cum ar trebui.

Dacă aveți experiență în configurarea unor lucruri similare pentru Hetzner, OVH, acolo este diferit. Mai dificil.

eno1 este numele plăcii de rețea #1 (lent, dar nelimitat).
eno2 este numele plăcii de rețea #2 (rapidă, dar cu tarif).
tun0 este numele plăcii de rețea virtuală de la OpenVPN.
XX.XX.XX.X0 - IPv4 #1 pe eno1.
XX.XX.XX.X1 - IPv4 #2 pe eno1.
XX.XX.XX.X2 - IPv4 #3 pe eno1.
XX.XX.XX.X5 - IPv4 #1 pe eno2.
XX.XX.XX.1 - gateway IPv4.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 pentru întregul server.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 pentru eno2, orice altceva din exterior intră în eno1.
XXXX:XXXX:XXXX:XXXX::1 — gateway IPv6 (merită remarcat faptul că acest lucru poate/ar trebui făcut diferit. Specificați comutatorul IPv6).
dns-nameservers - este indicat 127.0.0.1 (deoarece bind este instalat local) și 213.248.1.6 (acesta este de la tech.ru).

„tabel eno1t” și „tabel eno2t” - sensul acestor reguli de rută este că traficul care intră prin eno1 -> ar ieși prin el, iar traficul care intră prin eno2 -> ar pleca prin el. Și, de asemenea, conexiunile inițiate de server ar trece prin eno1.

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

Cu această comandă specificăm că orice trafic de neînțeles care se încadrează sub orice regulă marcată „table eno1t” -> să fie trimis către interfața eno1.

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

Cu această comandă specificăm că orice trafic inițiat de server trebuie direcționat către interfața eno1.

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

Cu această comandă stabilim regulile de marcare a traficului.

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

Acest bloc specifică un al doilea IPv4 pentru interfața eno1.

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

Cu această comandă setăm ruta de la clienții OpenVPN la IPv4 local, cu excepția XX.XX.XX.X0.
Încă nu înțeleg de ce această comandă este suficientă pentru toate IPv4.

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

Aici setăm adresa interfeței în sine. Serverul o va folosi ca adresă „de ieșire”. Nu va mai fi folosit în niciun fel din nou.

De ce este „:1:1::” atât de complicat? Pentru ca OpenVPN să funcționeze corect și numai pentru asta. Mai multe despre asta mai târziu.

Pe tema gateway-ului - așa funcționează și este în regulă. Dar modalitatea corectă este să indicați aici IPv6-ul comutatorului la care este conectat serverul.

Cu toate acestea, din anumite motive, IPv6 nu mai funcționează dacă fac asta. Aceasta este probabil un fel de problemă tech.ru.

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

Aceasta înseamnă adăugarea unei adrese IPv6 la interfață. Dacă aveți nevoie de o sută de adrese, înseamnă o sută de rânduri în acest fișier.

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

Am notat adresele și subrețelele tuturor interfețelor pentru a fi clar.
eno1 - trebuie să fie "/64" - pentru că acesta este întregul nostru grup de adrese.
tun0 - subrețeaua trebuie să fie mai mare decât eno1. În caz contrar, nu va fi posibilă configurarea unui gateway IPv6 pentru clienții OpenVPN.
eno2 - subrețeaua trebuie să fie mai mare decât tun0. În caz contrar, clienții OpenVPN nu vor putea accesa adrese IPv6 locale.
Pentru claritate, am ales un pas de subrețea de 16, dar dacă doriți, puteți chiar să faceți pasul „1”.
În consecință, 64+16 = 80 și 80+16 = 96.

Pentru o claritate și mai mare:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY sunt adrese care ar trebui să fie atribuite anumitor site-uri sau servicii de pe interfața eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY sunt adrese care ar trebui să fie atribuite anumitor site-uri sau servicii de pe interfața eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY sunt adrese care ar trebui să fie atribuite clienților OpenVPN sau utilizate ca adrese de servicii OpenVPN.

Pentru a configura rețeaua, ar trebui să fie posibilă repornirea serverului.
Modificările IPv4 sunt preluate atunci când sunt executate (asigurați-vă că le includeți pe ecran - altfel această comandă va bloca rețeaua de pe server):

/etc/init.d/networking restart

Adăugați la sfârșitul fișierului „/etc/iproute2/rt_tables”:

100 eno1t
101 eno2t

Fără aceasta, nu puteți utiliza tabele personalizate în fișierul „/etc/network/interfaces”.
Numerele trebuie să fie unice și mai mici decât 65535.

Modificările IPv6 pot fi modificate cu ușurință fără a reporni, dar pentru a face acest lucru trebuie să învățați cel puțin trei comenzi:

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

Setarea „/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

Acestea sunt setările „sysctl” ale serverului meu. Permiteți-mi să subliniez ceva important.

net.ipv4.ip_forward = 1

Fără aceasta, OpenVPN nu va funcționa deloc.

net.ipv6.ip_nonlocal_bind = 1

Oricine încearcă să lege IPv6 (de exemplu nginx) imediat după ce interfața este activată va primi o eroare. Că această adresă nu este disponibilă.

Pentru a evita o astfel de situație, se face o astfel de setare.

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

Fără aceste setări IPv6, traficul de la clientul OpenVPN nu iese în lume.

Alte setări fie nu sunt relevante, fie nu-mi amintesc pentru ce sunt.
Dar pentru orice eventualitate, o las „ca atare”.

Pentru ca modificările aduse acestui fișier să fie preluate fără a reporni serverul, trebuie să rulați comanda:

sysctl -p

Mai multe detalii despre regulile „masei”: habr.com/post/108690

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

OpenVPN IPv4 nu funcționează fără iptables.

Iptable-urile mele sunt așa pentru 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 este adresa mea IPv4 statică a mașinii locale.
10.8.0.0/24 - Rețea IPv4 openvpn. Adrese IPv4 pentru clienții openvpn.
Consecvența regulilor este importantă.

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

Aceasta este o limitare, astfel încât numai eu să pot folosi OpenVPN de pe IP-ul meu static.

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

Pentru a redirecționa pachete IPv4 între clienții OpenVPN și Internet, trebuie să înregistrați una dintre aceste comenzi.

Pentru diferite cazuri, una dintre opțiuni nu este potrivită.
Ambele comenzi sunt potrivite pentru cazul meu.
După ce am citit documentația, am ales prima opțiune pentru că folosește mai puțin CPU.

Pentru ca toate setările iptables să fie preluate după repornire, trebuie să le salvați undeva.

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

Astfel de nume nu au fost alese întâmplător. Sunt folosite de pachetul „iptables-persistent”.

apt-get install iptables-persistent

Instalarea pachetului principal OpenVPN:

apt-get install openvpn easy-rsa

Să creăm un șablon pentru certificate (înlocuiți-vă valorile):

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

Să edităm setările șablonului de certificat:

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ți un certificat de server:

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

Să pregătim capacitatea de a crea fișierele finale „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

Să pregătim un script care va îmbina toate fișierele într-un singur fișier 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

Crearea primului client OpenVPN:

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

Fișierul „~/client-configs/files/client-name.ovpn” este trimis pe dispozitivul clientului.

Pentru clienții iOS va trebui să faceți următorul truc:
Conținutul etichetei „tls-auth” trebuie să fie fără comentarii.
Și, de asemenea, puneți „key-direction 1” imediat înainte de eticheta „tls-auth”.

Să configuram configurația serverului 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

Acest lucru este necesar pentru a seta o adresă statică pentru fiecare client (nu este necesar, dar o folosesc):

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

Cel mai dificil și cheie detaliu.

Din păcate, OpenVPN nu știe încă cum să configureze independent un gateway IPv6 pentru clienți.
Trebuie să transmiteți acest lucru „manual” pentru fiecare client.

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

Fișierul „/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

Fișierul „/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

Ambele scripturi folosesc fișierul „/etc/openvpn/variables”:

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

Îmi este greu să-mi amintesc de ce este scris așa.

Acum netmask = 112 arată ciudat (ar trebui să fie 96 chiar acolo).
Și prefixul este ciudat, nu se potrivește cu rețeaua tun0.
Dar bine, o las așa cum este.

cipher DES-EDE3-CBC

Acest lucru nu este pentru toată lumea - am ales această metodă de criptare a conexiunii.

Aflați mai multe despre configurarea OpenVPN IPv4.

Aflați mai multe despre configurarea OpenVPN IPv6.

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

Instalarea pachetului principal:

apt-get install postfix

Când instalați, selectați „site internet”.

„/etc/postfix/main.cf” meu arată astfel:

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

Să ne uităm la detaliile acestei configurații.

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

Potrivit locuitorilor din Khabrovsk, acest bloc conține „informații greșite și teze incorecte”.La doar 8 ani de la începutul carierei mele, am început să înțeleg cum funcționează SSL.

Prin urmare, îmi voi lua libertatea de a descrie modul de utilizare a SSL (fără a răspunde la întrebările „Cum funcționează?” și „De ce funcționează?”).

Baza criptării moderne este crearea unei perechi de chei (două șiruri foarte lungi de caractere).

O „cheie” este privată, cealaltă cheie este „publică”. Păstrăm secretă cu mare grijă cheia privată. Distribuim cheia publică tuturor.

Folosind o cheie publică, puteți cripta un șir de text, astfel încât numai proprietarul cheii private să o poată decripta.
Ei bine, asta este întreaga bază a tehnologiei.

Pasul #1 - site-uri https.
La accesarea unui site, browserul află de la serverul web că site-ul este https și, prin urmare, solicită o cheie publică.
Serverul web oferă cheia publică. Browserul folosește cheia publică pentru a cripta solicitarea http și pentru a o trimite.
Continutul unei http-request poate fi citit doar de cei care au cheia privata, adica doar serverul catre care se face cererea.
Http-request conține cel puțin un URI. Prin urmare, dacă o țară încearcă să restricționeze accesul nu la întregul site, ci la o anumită pagină, atunci acest lucru este imposibil de făcut pentru site-urile https.

Pasul #2 - răspuns criptat.
Serverul web oferă un răspuns care poate fi citit cu ușurință pe drum.
Soluția este extrem de simplă - browserul generează local aceeași pereche de chei private-publice pentru fiecare site https.
Și, împreună cu solicitarea pentru cheia publică a site-ului, trimite cheia publică locală.
Serverul web își amintește și, atunci când trimite răspunsul http, îl criptează cu cheia publică a unui anumit client.
Acum http-response poate fi decriptat numai de proprietarul cheii private de browser a clientului (adică clientul însuși).

Pasul nr. 3 - stabilirea unei conexiuni securizate printr-un canal public.
Există o vulnerabilitate în exemplul nr. 2 - nimic nu îi împiedică pe cei care doresc bine să intercepteze o solicitare http și să editeze informații despre cheia publică.
Astfel, intermediarul va vedea clar tot conținutul mesajelor trimise și primite până când canalul de comunicare se va schimba.
Gestionarea acestui lucru este extrem de simplă - trebuie doar să trimiteți cheia publică a browserului ca mesaj criptat cu cheia publică a serverului web.
Serverul web trimite mai întâi un răspuns de genul „cheia dumneavoastră publică este așa” și criptează acest mesaj cu aceeași cheie publică.
Browserul se uită la răspuns - dacă este primit mesajul „cheia dvs. publică este așa” - atunci aceasta este o garanție de 100% că acest canal de comunicare este sigur.
Cât de sigur este?
Însăși crearea unui astfel de canal de comunicație securizat are loc cu o viteză de ping*2. De exemplu 20 ms.
Atacatorul trebuie să aibă în prealabil cheia privată a uneia dintre părți. Sau găsiți o cheie privată în câteva milisecunde.
Hackerea unei chei private moderne va dura zeci de ani pe un supercomputer.

Pasul #4 - baza de date publică a cheilor publice.
Evident, în toată această poveste există posibilitatea ca un atacator să stea pe canalul de comunicare dintre client și server.
Clientul poate pretinde a fi serverul, iar serverul poate pretinde că este clientul. Și emulați o pereche de chei în ambele direcții.
Apoi atacatorul va vedea tot traficul și va putea „edita” traficul.
De exemplu, schimbați adresa la care să trimiteți bani sau copiați parola de la serviciile bancare online sau blocați conținutul „contestabil”.
Pentru a combate astfel de atacatori, au venit cu o bază de date publică cu chei publice pentru fiecare site https.
Fiecare browser „știe” despre existența a aproximativ 200 de astfel de baze de date. Acesta vine preinstalat în fiecare browser.
„Cunoașterea” este susținută de o cheie publică din fiecare certificat. Adică, conexiunea cu fiecare autoritate de certificare specifică nu poate fi falsificată.

Acum există o înțelegere simplă a modului de utilizare a SSL pentru https.
Dacă vă folosiți creierul, va deveni clar cum serviciile speciale pot sparge ceva în această structură. Dar le va costa eforturi monstruoase.
Și organizații mai mici decât NSA sau CIA - este aproape imposibil să piratați nivelul de protecție existent, chiar și pentru VIP-uri.

Voi adăuga și despre conexiunile ssh. Nu există chei publice acolo, așa că ce poți face? Problema este rezolvată în două moduri.
Opțiunea ssh-by-password:
În timpul primei conexiuni, clientul ssh ar trebui să avertizeze că avem o nouă cheie publică de la serverul ssh.
Și în timpul conexiunilor ulterioare, dacă apare avertismentul „nouă cheie publică de la serverul ssh”, va însemna că încearcă să vă asculte cu urechea.
Sau ai fost ascultat la prima conexiune, dar acum comunici cu serverul fără intermediari.
De fapt, datorită faptului că faptul de a intercepta telefoane este ușor, rapid și fără efort dezvăluit, acest atac este folosit doar în cazuri speciale pentru un anumit client.

Opțiunea ssh-by-key:
Luăm o unitate flash, scriem cheia privată pentru serverul ssh pe ea (există termeni și o mulțime de nuanțe importante pentru asta, dar scriu un program educațional, nu instrucțiuni de utilizare).
Lăsăm cheia publică pe mașina unde va fi clientul ssh și o păstrăm și secretă.
Aducem unitatea flash pe server, o introducem, copiam cheia privată și ardem unitatea flash și împrăștiem cenușa în vânt (sau cel puțin o formatăm cu zerouri).
Asta este tot - după o astfel de operație, va fi imposibil să piratați o astfel de conexiune ssh. Desigur, în 10 ani va fi posibil să vizualizați traficul pe un supercomputer - dar aceasta este o altă poveste.

Îmi cer scuze pentru offtopic.

Deci acum că teoria este cunoscută. Vă voi spune despre fluxul de creare a unui certificat SSL.

Folosind „openssl genrsa” creăm o cheie privată și „spații” pentru cheia publică.
Trimitem „spațiile” unei companii terțe, căreia îi plătim aproximativ 9 USD pentru cel mai simplu certificat.

După câteva ore, primim cheia noastră „publică” și un set de mai multe chei publice de la această companie terță parte.

De ce ar trebui să plătească o companie terță pentru înregistrarea cheii mele publice este o întrebare separată, nu o vom lua în considerare aici.

Acum este clar care este sensul inscripției:

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

Dosarul „/etc/ssl” conține toate fișierele pentru problemele ssl.
domain1.com — nume de domeniu.
2018 este anul creării cheilor.
„cheie” - desemnarea că fișierul este o cheie privată.

Și semnificația acestui fișier:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — nume de domeniu.
2018 este anul creării cheilor.
înlănțuit - desemnarea că există un lanț de chei publice (prima este cheia noastră publică, iar restul sunt cele provenite de la compania care a emis cheia publică).
crt - desemnarea că există un certificat gata făcut (cheie publică cu explicații tehnice).

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

Această setare nu este folosită în acest caz, dar este scrisă ca exemplu.

Deoarece o eroare în acest parametru va duce la trimiterea de spam de pe serverul dumneavoastră (fără voia dumneavoastră).

Atunci demonstrează tuturor că nu ești vinovat.

recipient_delimiter = +

Este posibil ca mulți oameni să nu știe, dar acesta este un caracter standard pentru clasarea e-mailurilor și este acceptat de majoritatea serverelor de e-mail moderne.

De exemplu, dacă aveți o cutie poștală "[e-mail protejat]"incearca sa trimiti la"[e-mail protejat]„- Uite ce rezultă din asta.

inet_protocols = ipv4

Acest lucru ar putea fi confuz.

Dar nu este doar așa. Fiecare domeniu nou este implicit doar IPv4, apoi pornesc IPv6 pentru fiecare separat.

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

Aici precizăm că toate e-mailurile primite merg la dovecot.
Și regulile pentru domeniu, cutie poștală, alias - caută în baza de date.

/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

Acum Postfix știe că e-mailul poate fi acceptat pentru trimitere ulterioară numai după autorizarea cu porumbel.

Chiar nu înțeleg de ce este duplicat aici. Am specificat deja tot ce este necesar în „transport_virtual”.

Dar sistemul postfix este foarte vechi - probabil că este o întoarcere din vremurile vechi.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Acesta poate fi configurat diferit pentru fiecare server de e-mail.

Am 3 servere de mail la dispoziție și aceste setări sunt foarte diferite din cauza cerințelor diferite de utilizare.

Trebuie să-l configurați cu atenție - în caz contrar, spam-ul se va revărsa la dvs. sau chiar mai rău - spam-ul se va revărsa de la dvs.

# SPF
policyd-spf_time_limit = 3600

Configurarea unui plugin legat de verificarea SPF-ului scrisorilor primite.

# 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

Setarea este că trebuie să furnizăm o semnătură DKIM cu toate e-mailurile trimise.

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

Acesta este un detaliu cheie în rutarea scrisorilor atunci când trimiteți scrisori din scripturi PHP.

Fișierul „/etc/postfix/sdd_transport.pcre”:

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

În stânga sunt expresii regulate. În dreapta este o etichetă care marchează litera.
Postfix în conformitate cu eticheta - va mai lua în considerare câteva linii de configurare pentru o anumită scrisoare.

Cum exact va fi reconfigurat postfixul pentru o anumită literă va fi indicat în „master.cf”.

Liniile 4, 5, 6 sunt principalele. În numele cărui domeniu trimitem scrisoarea, punem această etichetă.
Dar câmpul „de la” nu este întotdeauna indicat în scripturile PHP în vechiul cod. Apoi numele de utilizator vine în ajutor.

Articolul este deja amplu - nu aș vrea să fiu distras prin configurarea nginx+fpm.

Pe scurt, pentru fiecare site am stabilit propriul proprietar de utilizator linux. Și, în consecință, fpm-pool-ul tău.

Fpm-pool folosește orice versiune de php (este grozav când pe același server poți folosi diferite versiuni de php și chiar diferite php.ini pentru site-urile învecinate fără probleme).

Deci, un anumit utilizator Linux „www-domain2” are un site web domain2.com. Acest site are un cod pentru trimiterea de e-mailuri fără a specifica câmpul de la.

Deci, chiar și în acest caz, scrisorile vor fi trimise corect și nu vor ajunge niciodată în spam.

„/etc/postfix/master.cf” meu arată astfel:

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

Fișierul nu este furnizat în întregime - este deja foarte mare.
Am notat doar ce s-a schimbat.

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}

Acestea sunt setări legate de spamassasin, mai multe despre asta mai târziu.

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

Vă permitem să vă conectați la serverul de e-mail prin portul 587.
Pentru a face acest lucru, trebuie să vă conectați.

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

Activați verificarea SPF.

apt-get install postfix-policyd-spf-python

Să instalăm pachetul pentru verificările SPF de mai sus.

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

Și acesta este cel mai interesant lucru. Aceasta este capacitatea de a trimite scrisori pentru un anumit domeniu de la o anumită adresă IPv4/IPv6.

Acest lucru se face de dragul rDNS. rDNS este procesul de primire a unui șir după adresa IP.
Și pentru e-mail, această funcție este folosită pentru a confirma că helo se potrivește exact cu rDNS-ul adresei de la care a fost trimis e-mailul.

Dacă helo nu se potrivește cu domeniul de e-mail în numele căruia a fost trimisă scrisoarea, se acordă puncte de spam.

Helo nu se potrivește cu rDNS - se acordă o mulțime de puncte de spam.
În consecință, fiecare domeniu trebuie să aibă propria sa adresă IP.
Pentru OVH - în consolă este posibil să specificați rDNS.
Pentru tech.ru - problema este rezolvată prin suport.
Pentru AWS, problema este rezolvată prin asistență.
„inet_protocols” și „smtp_bind_address6” - activăm suportul IPv6.
Pentru IPv6 trebuie să înregistrați și rDNS.
„syslog_name” - și asta pentru ușurința citirii jurnalelor.

Cumpărați certificate Recomand aici.

Se configurează linkul postfix+dovecot aici.

Setarea SPF.

============= Porumbel =============

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

Configurarea mysql, instalarea pachetelor în sine.

Fișierul „/etc/dovecot/conf.d/10-auth.conf”

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorizarea este doar criptată.

Fișierul „/etc/dovecot/conf.d/10-mail.conf”

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

Aici indicăm locația de stocare a literelor.

Vreau să fie stocate în fișiere și grupate pe domenii.

Fișierul „/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 {
  }
}

Acesta este fișierul principal de configurare dovecot.
Aici dezactivăm conexiunile nesecurizate.
Și activați conexiuni sigure.

Fișierul „/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
}

Configurarea ssl. Indicăm că este necesar ssl.
Și certificatul în sine. Și un detaliu important este directiva „locală”. Indică ce certificat SSL să utilizați atunci când vă conectați la ce IPv4 local.

Apropo, IPv6 nu este configurat aici, voi corecta această omisiune mai târziu.
XX.XX.XX.X5 (domeniul2) - fără certificat. Pentru a conecta clienții trebuie să specificați domain1.com.
XX.XX.XX.X2 (domain3) - există un certificat, puteți specifica domain1.com sau domain3.com pentru a conecta clienții.

Fișierul „/etc/dovecot/conf.d/15-lda.conf”

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Acest lucru va fi necesar pentru spamassassin în viitor.

Fișierul „/etc/dovecot/conf.d/20-imap.conf”

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Acesta este un plugin antispam. Necesar pentru antrenamentul spamassasin în momentul transferului în/din folderul „Spam”.

Fișierul „/etc/dovecot/conf.d/20-pop3.conf”

protocol pop3 {
}

Există doar un astfel de fișier.

Fișierul „/etc/dovecot/conf.d/20-lmtp.conf”

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

Configurarea lmtp.

Fișierul „/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
}

Setările de antrenament Spamassasin la momentul transferului în/din dosarul Spam.

Fișierul „/etc/dovecot/conf.d/90-sieve.conf”

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

Un fișier care specifică ce trebuie făcut cu scrisorile primite.

Fișierul „/var/lib/dovecot/sieve/default.sieve”

require ["fileinto", "mailbox"];

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

Trebuie să compilați fișierul: „sievec default.sieve”.

Fișierul „/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
}

Specificarea fișierelor sql pentru autorizare.
Și fișierul în sine este folosit ca metodă de autorizare.

Fișierul „/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';

Aceasta corespunde setărilor similare pentru postfix.

Fișierul „/etc/dovecot/dovecot.conf”

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

Fișierul de configurare principal.
Important este că indicăm aici - adăugați protocoale.

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

apt-get install spamassassin spamc

Hai să instalăm pachetele.

adduser spamd --disabled-login

Să adăugăm un utilizator în numele căruia.

systemctl enable spamassassin.service

Activem serviciul spamassassin de încărcare automată la încărcare.

Fișierul „/etc/default/spamassassin”:

CRON=1

Prin activarea actualizării automate a regulilor „în mod implicit”.

Fișierul „/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

Trebuie să creați o bază de date „sa” în mysql cu utilizatorul „sa” cu parola „parolă” (înlocuiți cu ceva adecvat).

report_safe - aceasta va trimite un raport de e-mail spam în loc de o scrisoare.
use_bayes sunt setări de învățare automată pentru spamassassin.

Restul setărilor spamassassin au fost folosite mai devreme în articol.

Setare generală „Spamassassin”.
Despre mutarea noilor e-mailuri Spam în folderul IMAP „Spam”..
Despre o combinație simplă de Dovecot + SpamAssassin.
Recomand să citiți teoria învățării spamassasin atunci când mutați litere în folderele imap (și nu recomand să o folosiți).

============= Apel la comunitate =============

De asemenea, aș dori să arunc o idee comunității despre cum să creștem nivelul de securitate al scrisorilor transmise. Din moment ce sunt atât de adânc cufundat în subiectul corespondenței.

Astfel încât utilizatorul să poată crea o pereche de chei pe clientul său (outlook, thunderbird, browser-plugin, ...). Public și privat. Public - trimite la DNS. Privat - economisiți pe client. Serverele de e-mail ar putea folosi o cheie publică pentru a trimite unui anumit destinatar.

Și pentru a vă proteja împotriva spam-ului cu astfel de scrisori (da, serverul de e-mail nu va putea vizualiza conținutul) - va trebui să introduceți 3 reguli:

  1. Semnătură DKIM reală obligatorie, SPF obligatoriu, rDNS obligatoriu.
  2. O rețea neuronală pe tema instruirii antispam + o bază de date pentru aceasta pe partea clientului.
  3. Algoritmul de criptare trebuie să fie astfel încât partea de expediere să cheltuiască de 100 de ori mai multă putere CPU pentru criptare decât partea de recepție.

Pe lângă scrisorile publice, elaborați o scrisoare de propunere standard „pentru a începe o corespondență sigură”. Unul dintre utilizatori (căsuța poștală) trimite o scrisoare cu un atașament către o altă cutie poștală. Scrisoarea conține o propunere text pentru a începe un canal de comunicare securizat pentru corespondență și cheia publică a proprietarului căsuței poștale (cu o cheie privată pe partea clientului).

Puteți chiar să creați câteva chei special pentru fiecare corespondență. Utilizatorul destinatar poate accepta această ofertă și poate trimite cheia sa publică (de asemenea, făcută special pentru această corespondență). În continuare, primul utilizator trimite o scrisoare de control al serviciului (criptată cu cheia publică a celui de-al doilea utilizator) - la primirea căreia al doilea utilizator poate considera canalul de comunicare format de încredere. Apoi, al doilea utilizator trimite o scrisoare de control - și apoi primul utilizator poate considera și canalul format securizat.

Pentru a combate interceptarea cheilor pe drum, protocolul trebuie să prevadă posibilitatea transmiterii a cel puțin unei chei publice folosind o unitate flash.

Și cel mai important lucru este că totul funcționează (întrebarea este „cine va plăti pentru asta?”):
Introduceți certificate poștale începând de la 10 USD pentru 3 ani. Ceea ce va permite expeditorului să indice în dns că „cheile mele publice sunt acolo”. Și vă vor oferi posibilitatea de a începe o conexiune sigură. În același timp, acceptarea unor astfel de conexiuni este gratuită.
Gmail își monetizează în sfârșit utilizatorii. Pentru 10 USD pe 3 ani - dreptul de a crea canale de corespondență securizate.

============= Concluzie =============

Pentru a testa întregul articol, urma să închiriez un server dedicat pentru o lună și să cumpăr un domeniu cu certificat SSL.

Dar circumstanțele vieții s-au dezvoltat astfel încât această problemă a durat timp de 2 luni.
Așa că, când am avut din nou timp liber, m-am hotărât să public articolul așa cum este, în loc să risc ca publicația să se prelungească încă un an.

Dacă există destul de multe întrebări de genul „dar acest lucru nu este descris suficient de detaliat”, atunci probabil că va fi putere să luați un server dedicat cu un domeniu nou și un nou certificat SSL și să îl descrieți și mai detaliat și, cel mai mult important, identificați toate detaliile importante lipsă.

De asemenea, aș dori să primesc feedback despre idei despre certificatele poștale. Dacă vă place ideea, voi încerca să găsesc puterea de a scrie o schiță pentru rfc.

Când copiați părți mari dintr-un articol, furnizați un link către acest articol.
Când traduceți în orice altă limbă, furnizați un link către acest articol.
Voi încerca să îl traduc eu în engleză și voi lăsa referințe încrucișate.


Sursa: www.habr.com

Adauga un comentariu