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

Tento článok je o tom, ako nastaviť moderný poštový server.
Postfix + holubník. SPF + DKIM + rDNS. S IPv6.
S TSL šifrovaním. S podporou viacerých domén – časť so skutočným SSL certifikátom.
S antispamovou ochranou a vysokým antispamovým hodnotením z iných poštových serverov.
Podporuje viacero fyzických rozhraní.
S OpenVPN, ku ktorému je pripojenie cez IPv4 a ktoré poskytuje IPv6.

Ak sa nechcete učiť všetky tieto technológie, ale chcete si nastaviť takýto server, potom je tento článok určený práve vám.

Článok sa nesnaží vysvetliť každý detail. Vysvetlenie smeruje k tomu, čo nie je štandardne nakonfigurované alebo čo je dôležité z pohľadu spotrebiteľa.

Motivácia založiť si mail server bol mojím dlhoročným snom. Môže to znieť hlúpo, ale IMHO je to oveľa lepšie ako snívať o novom aute svojej obľúbenej značky.

Existujú dve motivácie pre nastavenie IPv6. IT špecialista sa musí neustále učiť nové technológie, aby prežil. Chcel by som skromne prispieť k boju proti cenzúre.

Motiváciou pre nastavenie OpenVPN je len spustenie IPv6 na lokálnom počítači.
Motiváciou pre nastavenie niekoľkých fyzických rozhraní je, že na mojom serveri mám jedno rozhranie „pomalé, ale neobmedzené“ a druhé „rýchle, ale s tarifou“.

Motiváciou pre nastavenie Bind settings je, že môj ISP poskytuje nestabilný DNS server a google tiež niekedy zlyhá. Chcem stabilný server DNS na osobné použitie.

Motivácia napísať článok – koncept som napísal pred 10 mesiacmi a už som si ho pozrel dvakrát. Aj keď to autor potrebuje pravidelne, je veľká pravdepodobnosť, že to budú potrebovať aj ostatní.

Neexistuje žiadne univerzálne riešenie pre poštový server. Ale pokúsim sa napísať niečo ako "urobte toto a potom, keď všetko funguje ako má, vyhoďte veci navyše."

Spoločnosť tech.ru má kolokačný server. Je možné porovnávať s OVH, Hetzner, AWS. Na vyriešenie tohto problému bude spolupráca s tech.ru oveľa efektívnejšia.

Na serveri je nainštalovaný Debian 9.

Server má 2 rozhrania „eno1“ a „eno2“. Prvý je neobmedzený a druhý je rýchly, resp.

K dispozícii sú 3 statické adresy IP, XX.XX.XX.X0 a XX.XX.XX.X1 a XX.XX.XX.X2 na rozhraní „eno1“ a XX.XX.XX.X5 na rozhraní „eno2“ .

Dostupné XXXX:XXXX:XXXX:XXXX::/64 fond IPv6 adries, ktoré sú priradené k rozhraniu `eno1` az neho XXXX:XXXX:XXXX:XXXX:1:2::/96 bol na moju žiadosť priradený `eno2`.

Existujú 3 domény `domain1.com`, `domain2.com`, `domain3.com`. Existuje certifikát SSL pre `domain1.com` a `domain3.com`.

Mám účet Google, s ktorým by som chcel prepojiť svoju poštovú schránku[chránené e-mailom]` (prijímanie pošty a odosielanie pošty priamo z rozhrania gmailu).
Musí tam byť poštová schránka."[chránené e-mailom]`, kópiu e-mailu, z ktorého chcem vidieť v mojom gmaile. A je zriedkavé, že môžete niečo poslať v mene „[chránené e-mailom]` cez webové rozhranie.

Musí tam byť poštová schránka."[chránené e-mailom]`, ktorý Ivanov použije zo svojho iPhonu.

Odoslané e-maily musia spĺňať všetky moderné požiadavky na antispam.
Vo verejných sieťach musí existovať najvyššia úroveň šifrovania.
Mala by existovať podpora IPv6 pre odosielanie aj prijímanie listov.
Mal by existovať SpamAssassin, ktorý nikdy nevymaže e-maily. A to buď odrazí, alebo preskočí alebo odošle do priečinka IMAP „Spam“.
Automatické učenie SpamAssassin musí byť nakonfigurované: ak presuniem písmeno do priečinka Spam, naučí sa z tohto; ak presuniem list z priečinka Spam, naučí sa z tohto. To, či list skončí v priečinku Spam, by mali ovplyvniť výsledky školenia SpamAssassin.
PHP skripty musia byť schopné odosielať poštu v mene akejkoľvek domény na danom serveri.
Mala by existovať služba openvpn s možnosťou používať IPv6 na klientovi, ktorý IPv6 nemá.

Najprv musíte nakonfigurovať rozhrania a smerovanie vrátane IPv6.
Potom budete musieť nakonfigurovať OpenVPN, ktorá sa pripojí cez IPv4 a poskytne klientovi staticko-reálnu IPv6 adresu. Tento klient bude mať prístup ku všetkým službám IPv6 na serveri a prístup ku všetkým zdrojom IPv6 na internete.
Potom budete musieť nakonfigurovať Postfix na odosielanie písmen + SPF + DKIM + rDNS a ďalšie podobné drobnosti.
Potom budete musieť nakonfigurovať Dovecot a nakonfigurovať Multidomain.
Potom budete musieť nakonfigurovať SpamAssassin a nakonfigurovať školenie.
Nakoniec nainštalujte Bind.

============= Viaceré rozhrania =============

Ak chcete nakonfigurovať rozhrania, musíte to napísať do „/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

Tieto nastavenia je možné použiť na akomkoľvek serveri na tech.ru (s trochou koordinácie s podporou) a okamžite to bude fungovať tak, ako má.

Ak máte skúsenosti s nastavením podobných vecí pre Hetzner, OVH, tam je to iné. Ťažšie.

eno1 je názov sieťovej karty #1 (pomalá, ale neobmedzená).
eno2 je názov sieťovej karty #2 (rýchla, ale s tarifou).
tun0 je názov virtuálnej sieťovej karty z OpenVPN.
XX.XX.XX.X0 – IPv4 #1 na eno1.
XX.XX.XX.X1 – IPv4 #2 na eno1.
XX.XX.XX.X2 – IPv4 #3 na eno1.
XX.XX.XX.X5 – IPv4 #1 na eno2.
XX.XX.XX.1 – brána IPv4.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 pre celý server.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 pre eno2, všetko ostatné zvonku ide do eno1.
XXXX:XXXX:XXXX:XXXX::1 — Brána IPv6 (stojí za zmienku, že to možno/malo by sa urobiť inak. Zadajte prepínač IPv6).
dns-nameservers - je označený 127.0.0.1 (pretože bind je nainštalovaný lokálne) a 213.248.1.6 (toto je z tech.ru).

„tabuľka eno1t“ a „tabuľka eno2t“ - význam týchto pravidiel trasy je taký, že doprava vchádzajúca cez eno1 -> by cez ňu odchádzala a doprava vchádzajúca cez eno2 -> by cez ňu odchádzala. A tiež spojenia iniciované serverom by prešli cez eno1.

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

Týmto príkazom špecifikujeme, že akákoľvek nezrozumiteľná prevádzka, ktorá spadá pod akékoľvek pravidlo označené „tabuľka eno1t“ -> bude odoslaná do rozhrania eno1.

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

Týmto príkazom určíme, že všetka prevádzka iniciovaná serverom by mala smerovať do rozhrania eno1.

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

Týmto príkazom nastavíme pravidlá pre označovanie premávky.

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

Tento blok špecifikuje druhú IPv4 pre rozhranie eno1.

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

Týmto príkazom nastavíme trasu z klientov OpenVPN do lokálneho IPv4 okrem XX.XX.XX.X0.
Stále nechápem, prečo tento príkaz stačí pre všetky IPv4.

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

Tu nastavujeme adresu pre samotné rozhranie. Server ju použije ako „odchádzajúcu“ adresu. Nebude opäť žiadnym spôsobom použitý.

Prečo je ":1:1::" také zložité? Aby OpenVPN fungovalo správne a len na toto. Viac o tom neskôr.

K téme brány - tak to funguje a to je v poriadku. Správny spôsob je však uviesť tu IPv6 prepínača, ku ktorému je server pripojený.

Z nejakého dôvodu však IPv6 prestane fungovať, ak to urobím. Toto je pravdepodobne nejaký problém tech.ru.

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

Toto je pridanie adresy IPv6 do rozhrania. Ak potrebujete sto adries, znamená to sto riadkov v tomto súbore.

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

Poznamenal som si adresy a podsiete všetkých rozhraní, aby to bolo jasné.
eno1 - musí byť "/64“ – pretože toto je celá naša skupina adries.
tun0 - podsieť musí byť väčšia ako eno1. V opačnom prípade nebude možné nakonfigurovať bránu IPv6 pre klientov OpenVPN.
eno2 - podsieť musí byť väčšia ako tun0. V opačnom prípade klienti OpenVPN nebudú mať prístup k lokálnym adresám IPv6.
Kvôli prehľadnosti som vybral krok podsiete 16, ale ak chcete, môžete dokonca urobiť krok „1“.
Preto 64+16 = 80 a 80+16 = 96.

Pre ešte väčšiu prehľadnosť:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY sú adresy, ktoré by mali byť priradené konkrétnym stránkam alebo službám na rozhraní eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY sú adresy, ktoré by mali byť priradené konkrétnym stránkam alebo službám na rozhraní eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY sú adresy, ktoré by mali byť priradené klientom OpenVPN alebo používané ako adresy služieb OpenVPN.

Na konfiguráciu siete by malo byť možné reštartovať server.
Zmeny IPv4 sa zaznamenajú pri spustení (nezabudnite ich zabaliť do obrazovky - inak tento príkaz jednoducho zrúti sieť na serveri):

/etc/init.d/networking restart

Pridajte na koniec súboru „/etc/iproute2/rt_tables“:

100 eno1t
101 eno2t

Bez toho nemôžete použiť vlastné tabuľky v súbore „/etc/network/interfaces“.
Čísla musia byť jedinečné a menšie ako 65535.

Zmeny protokolu IPv6 sa dajú ľahko zmeniť bez reštartu, ale na to sa musíte naučiť aspoň tri príkazy:

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

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

Toto sú nastavenia "sysctl" môjho servera. Dovoľte mi upozorniť na niečo dôležité.

net.ipv4.ip_forward = 1

Bez toho nebude OpenVPN fungovať vôbec.

net.ipv6.ip_nonlocal_bind = 1

Každý, kto sa pokúsi naviazať IPv6 (napríklad nginx) ihneď po spustení rozhrania, dostane chybu. Že táto adresa nie je dostupná.

Aby sa predišlo takejto situácii, vykoná sa takéto nastavenie.

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

Bez týchto nastavení IPv6 sa prevádzka z klienta OpenVPN nedostane do sveta.

Ostatné nastavenia buď nie sú relevantné, alebo si nepamätám, na čo slúžia.
Ale pre každý prípad to nechám „tak ako je“.

Aby sa zmeny v tomto súbore mohli prevziať bez reštartovania servera, musíte spustiť príkaz:

sysctl -p

Viac podrobností o pravidlách „tabuľky“: habr.com/post/108690

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

OpenVPN IPv4 nefunguje bez iptables.

Moje iptables sú pre VPN takéto:

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 je moja statická adresa IPv4 miestneho počítača.
10.8.0.0/24 – sieť IPv4 openvpn. IPv4 adresy pre klientov openvpn.
Dôležitá je konzistentnosť pravidiel.

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

Toto je obmedzenie, takže OpenVPN môžem používať iba ja zo svojej statickej IP.

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

Ak chcete posielať pakety IPv4 medzi klientmi OpenVPN a internetom, musíte zaregistrovať jeden z týchto príkazov.

Pre rôzne prípady jedna z možností nie je vhodná.
Oba príkazy sú vhodné pre môj prípad.
Po prečítaní dokumentácie som si vybral prvú možnosť, pretože využíva menej CPU.

Aby sa všetky nastavenia iptables vybrali po reštarte, musíte ich niekde uložiť.

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

Takéto mená neboli vybrané náhodou. Používa ich balík „iptables-persistent“.

apt-get install iptables-persistent

Inštalácia hlavného balíka OpenVPN:

apt-get install openvpn easy-rsa

Poďme nastaviť šablónu pre certifikáty (nahraďte svoje hodnoty):

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

Upravme nastavenia šablóny certifikátu:

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

Vytvorte certifikát servera:

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

Pripravme si možnosť vytvorenia finálnych súborov “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

Pripravme si skript, ktorý zlúči všetky súbory do jedného súboru 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

Vytvorenie prvého klienta OpenVPN:

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

Súbor „~/client-configs/files/client-name.ovpn“ sa odošle do zariadenia klienta.

Pre klientov iOS budete musieť urobiť nasledujúci trik:
Obsah tagu „tls-auth“ musí byť bez komentárov.
A tiež vložte „key-direction 1“ bezprostredne pred značku „tls-auth“.

Nakonfigurujeme konfiguráciu servera 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

Je to potrebné na nastavenie statickej adresy pre každého klienta (nie je potrebné, ale používam ju):

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

Najťažší a kľúčový detail.

Bohužiaľ, OpenVPN zatiaľ nevie, ako samostatne nakonfigurovať bránu IPv6 pre klientov.
Musíte to „ručne“ poslať pre každého klienta.

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

Súbor „/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

Súbor „/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

Oba skripty používajú súbor „/etc/openvpn/variables“:

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

Ťažko si pamätám, prečo je to takto napísané.

Netmask = 112 teraz vyzerá zvláštne (malo by tam byť 96).
A predpona je zvláštna, nezodpovedá sieti tun0.
Ale dobre, nechám to tak.

cipher DES-EDE3-CBC

Toto nie je pre každého – ja som zvolil tento spôsob šifrovania spojenia.

Prečítajte si viac o nastavení OpenVPN IPv4.

Prečítajte si viac o nastavení OpenVPN IPv6.

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

Inštalácia hlavného balíka:

apt-get install postfix

Pri inštalácii vyberte „internetová stránka“.

Môj "/etc/postfix/main.cf" vyzerá takto:

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

Pozrime sa na podrobnosti tejto konfigurácie.

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

Podľa obyvateľov Chabrovska tento blok obsahuje „dezinformácie a nesprávne tézy“.Až 8 rokov po začiatku mojej kariéry som začal chápať, ako SSL funguje.

Preto si dovolím popísať, ako používať SSL (bez odpovedí na otázky „Ako to funguje?“ a „Prečo to funguje?“).

Základom moderného šifrovania je vytvorenie páru kľúčov (dva veľmi dlhé reťazce znakov).

Jeden „kľúč“ je súkromný, druhý kľúč je „verejný“. Súkromný kľúč veľmi starostlivo tajíme. Verejný kľúč distribuujeme každému.

Pomocou verejného kľúča môžete zašifrovať reťazec textu tak, aby ho mohol dešifrovať iba vlastník súkromného kľúča.
No a to je celý základ technológie.

Krok č. 1 – https stránky.
Pri prístupe na stránku sa prehliadač z webového servera dozvie, že stránka je https, a preto požaduje verejný kľúč.
Webový server poskytne verejný kľúč. Prehliadač používa verejný kľúč na zašifrovanie http-požiadavky a jej odoslanie.
Obsah http-požiadavky môžu čítať len tí, ktorí majú súkromný kľúč, teda iba server, ktorému je požiadavka odoslaná.
Http-request obsahuje aspoň URI. Preto, ak sa krajina snaží obmedziť prístup nie na celú stránku, ale na konkrétnu stránku, potom to nie je možné pre stránky https.

Krok #2 - šifrovaná odpoveď.
Webový server poskytuje odpoveď, ktorú možno ľahko prečítať na cestách.
Riešenie je mimoriadne jednoduché – prehliadač lokálne generuje rovnaký pár súkromných a verejných kľúčov pre každú stránku https.
A spolu so žiadosťou o verejný kľúč stránky odošle aj svoj lokálny verejný kľúč.
Web server si ju zapamätá a pri odoslaní http-odpovede ju zašifruje verejným kľúčom konkrétneho klienta.
Teraz môže http-response dešifrovať iba vlastník súkromného kľúča prehliadača klienta (teda samotný klient).

Krok č. 3 - nadviazanie zabezpečeného spojenia cez verejný kanál.
V príklade č. 2 je zraniteľnosť - nič nebráni priaznivcom zachytiť http-požiadavku a upraviť informácie o verejnom kľúči.
Sprostredkovateľ tak jasne uvidí celý obsah odoslaných a prijatých správ, kým sa nezmení komunikačný kanál.
Riešenie je veľmi jednoduché – stačí poslať verejný kľúč prehliadača ako správu zašifrovanú verejným kľúčom webového servera.
Webový server potom najskôr odošle odpoveď ako „váš verejný kľúč je takýto“ a zašifruje túto správu rovnakým verejným kľúčom.
Prehliadač sa pozrie na odpoveď - ak dostane správu „váš verejný kľúč je takýto“ - potom je to 100% záruka, že tento komunikačný kanál je bezpečný.
Aké je to bezpečné?
Samotné vytvorenie takéhoto bezpečného komunikačného kanála prebieha rýchlosťou ping*2. Napríklad 20 ms.
Útočník musí mať vopred súkromný kľúč jednej zo strán. Alebo nájdite súkromný kľúč za pár milisekúnd.
Hacknutie jedného moderného súkromného kľúča bude na superpočítači trvať desaťročia.

Krok #4 - verejná databáza verejných kľúčov.
Je zrejmé, že v celom tomto príbehu je príležitosť pre útočníka sedieť na komunikačnom kanáli medzi klientom a serverom.
Klient môže predstierať, že je serverom, a server môže predstierať, že je klientom. A napodobniť pár kláves v oboch smeroch.
Potom útočník uvidí všetku návštevnosť a bude ju môcť „upraviť“.
Napríklad zmeňte adresu, kam sa majú posielať peniaze, alebo skopírujte heslo z online bankovníctva alebo zablokujte „nevhodný“ obsah.
Na boj s takýmito útočníkmi prišli s verejnou databázou s verejnými kľúčmi pre každú stránku https.
Každý prehliadač „vie“ o existencii asi 200 takýchto databáz. Toto je predinštalované v každom prehliadači.
„Znalosti“ sú podložené verejným kľúčom z každého certifikátu. To znamená, že spojenie s každou konkrétnou certifikačnou autoritou nemožno sfalšovať.

Teraz je jednoduché pochopiť, ako používať SSL pre https.
Ak použijete mozog, bude jasné, ako môžu špeciálne služby niečo v tejto štruktúre hacknúť. Bude ich to však stáť monštruózne úsilie.
A organizácie menšie ako NSA alebo CIA – je takmer nemožné hacknúť existujúcu úroveň ochrany, dokonca aj pre VIP.

Tiež pridám o ssh pripojeniach. Nie sú tam žiadne verejné kľúče, tak čo môžete robiť? Problém je vyriešený dvoma spôsobmi.
Možnosť ssh-by-heslo:
Pri prvom pripojení by mal ssh klient upozorniť, že máme nový verejný kľúč zo ssh servera.
A ak sa počas ďalších pripojení objaví varovanie „nový verejný kľúč zo servera ssh“, bude to znamenať, že sa vás snažia odpočúvať.
Alebo ste boli odpočúvaní pri prvom pripojení, ale teraz komunikujete so serverom bez sprostredkovateľov.
V skutočnosti, vzhľadom na to, že skutočnosť odpočúvania je ľahko, rýchlo a bez námahy odhalená, sa tento útok používa len v špeciálnych prípadoch pre konkrétneho klienta.

Možnosť ssh-by-key:
Vezmeme flash disk, napíšeme naň súkromný kľúč pre ssh server (na to sú podmienky a veľa dôležitých nuancií, ale píšem vzdelávací program, nie návod na použitie).
Verejný kľúč nechávame na stroji, kde bude ssh klient a tiež ho držíme v tajnosti.
Prinesieme flash disk na server, vložíme ho, skopírujeme súkromný kľúč, spálime flash disk a rozprášime popol do vetra (alebo ho aspoň naformátujeme nulami).
To je všetko - po takejto operácii nebude možné hacknúť takéto pripojenie ssh. Samozrejme, o 10 rokov bude možné sledovať prevádzku na superpočítači – ale to je iný príbeh.

Ospravedlňujem sa za offtopic.

Takže teraz, keď je teória známa. Poviem vám o postupe vytvárania certifikátu SSL.

Pomocou „openssl genrsa“ vytvoríme súkromný kľúč a „prázdne miesta“ pre verejný kľúč.
„Prírezy“ posielame spoločnosti tretej strany, ktorej zaplatíme približne 9 USD za najjednoduchší certifikát.

Po niekoľkých hodinách dostaneme náš „verejný“ kľúč a sadu niekoľkých verejných kľúčov od tejto spoločnosti tretej strany.

Prečo by mala spoločnosť tretej strany platiť za registráciu môjho verejného kľúča, je samostatná otázka, tu sa ňou nebudeme zaoberať.

Teraz je jasné, aký je význam nápisu:

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

Priečinok „/etc/ssl“ obsahuje všetky súbory pre problémy s ssl.
domain1.com — názov domény.
Rok 2018 je rokom tvorby kľúčov.
„kľúč“ - označenie, že súbor je súkromný kľúč.

A význam tohto súboru:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — názov domény.
Rok 2018 je rokom tvorby kľúčov.
reťazený - označenie, že existuje reťazec verejných kľúčov (prvý je náš verejný kľúč a zvyšok pochádza od spoločnosti, ktorá vydala verejný kľúč).
crt - označenie, že existuje hotový certifikát (verejný kľúč s technickými vysvetlivkami).

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

Toto nastavenie sa v tomto prípade nepoužíva, ale je napísané ako príklad.

Pretože chyba v tomto parametri povedie k odosielaniu spamu z vášho servera (bez vašej vôle).

Potom všetkým dokážte, že nie ste vinní.

recipient_delimiter = +

Mnoho ľudí možno nevie, ale toto je štandardný znak pre hodnotenie e-mailov a podporuje ho väčšina moderných poštových serverov.

Napríklad, ak máte poštovú schránku "[chránené e-mailom]"skúste poslať na"[chránené e-mailom]“- pozri, čo z toho vyplýva.

inet_protocols = ipv4

Môže to byť mätúce.

Ale nie je to len tak. Každá nová doména je štandardne len IPv4, potom zapínam IPv6 pre každú zvlášť.

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

Tu špecifikujeme, že všetka prichádzajúca pošta ide do holubníka.
A pravidlá pre doménu, schránku, alias - hľadaj v databáze.

/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

Teraz postfix vie, že pošta môže byť prijatá na ďalšie odosielanie iba po autorizácii holubníkom.

Naozaj nechápem, prečo sa to tu duplikuje. Už sme špecifikovali všetko, čo je potrebné vo „virtual_transport“.

Systém postfix je však veľmi starý - pravdepodobne je to návrat zo starých čias.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Toto môže byť nakonfigurované inak pre každý poštový server.

Mám k dispozícii 3 poštové servery a tieto nastavenia sú veľmi odlišné kvôli rôznym požiadavkám na používanie.

Musíte si to starostlivo nakonfigurovať – inak sa vám bude sypať spam, alebo čo je ešte horšie – bude sa z vás valiť spam.

# SPF
policyd-spf_time_limit = 3600

Nastavenie nejakého doplnku súvisiaceho s kontrolou SPF prichádzajúcich listov.

# 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

Nastavenie je také, že pri všetkých odchádzajúcich e-mailoch musíme poskytnúť podpis DKIM.

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

Toto je kľúčový detail v smerovaní listov pri odosielaní listov z PHP skriptov.

Súbor „/etc/postfix/sdd_transport.pcre“:

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

Vľavo sú regulárne výrazy. Na pravej strane je štítok, ktorý označuje písmeno.
Postfix v súlade s označením - bude brať do úvahy niekoľko ďalších konfiguračných riadkov pre konkrétne písmeno.

Ako presne bude postfix prekonfigurovaný pre konkrétne písmeno, bude uvedené v „master.cf“.

Riadky 4, 5, 6 sú hlavné. V mene ktorej domény list posielame, uvádzame tento štítok.
Pole „from“ však nie je vždy uvedené v skriptoch PHP v starom kóde. Potom príde na záchranu používateľské meno.

Článok je už rozsiahly – nechcel by som sa nechať rozptyľovať nastavením nginx+fpm.

Stručne povedané, pre každú stránku nastavíme jej vlastného vlastníka linux-user. A podľa toho aj váš fond fpm.

Fpm-pool používa akúkoľvek verziu php (je skvelé, keď na tom istom serveri môžete bez problémov používať rôzne verzie php a dokonca aj rôzne php.ini pre susedné stránky).

Takže konkrétny používateľ linuxu „www-domena2“ má webovú stránku domain2.com. Táto stránka obsahuje kód na odosielanie e-mailov bez zadania poľa od.

Takže aj v tomto prípade budú listy odoslané správne a nikdy neskončia v spame.

Môj "/etc/postfix/master.cf" vyzerá takto:

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

Súbor nie je poskytnutý celý - je už veľmi veľký.
Všimol som si len to, čo sa zmenilo.

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}

Toto sú nastavenia týkajúce sa spamassinu, o tom neskôr.

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

Umožňujeme vám pripojiť sa k poštovému serveru cez port 587.
Ak to chcete urobiť, musíte sa prihlásiť.

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

Povoliť kontrolu SPF.

apt-get install postfix-policyd-spf-python

Nainštalujte balík pre kontroly SPF vyššie.

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

A toto je najzaujímavejšie. Ide o možnosť posielať listy pre konkrétnu doménu z konkrétnej adresy IPv4/IPv6.

Toto sa robí kvôli rDNS. rDNS je proces prijímania reťazca podľa IP adresy.
A v prípade pošty sa táto funkcia používa na potvrdenie, že helo presne zodpovedá rDNS adresy, z ktorej bol e-mail odoslaný.

Ak sa helikoptéra nezhoduje s e-mailovou doménou, v mene ktorej bol list odoslaný, pridelia sa body za spam.

Helo sa nezhoduje s rDNS - udeľuje sa veľa spamových bodov.
V súlade s tým musí mať každá doména svoju vlastnú IP adresu.
Pre OVH - v konzole je možné špecifikovať rDNS.
Pre tech.ru - problém je vyriešený prostredníctvom podpory.
V prípade AWS je problém vyriešený prostredníctvom podpory.
„inet_protocols“ a „smtp_bind_address6“ – povoľujeme podporu IPv6.
Pre IPv6 je tiež potrebné zaregistrovať rDNS.
"syslog_name" - a to je pre uľahčenie čítania protokolov.

Kúpte si certifikáty Odporúčam tu.

Tu sa nastavuje odkaz postfix+dovecot.

Nastavenie SPF.

============= Holubník =============

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

Nastavenie mysql, inštalácia samotných balíkov.

Súbor "/etc/dovecot/conf.d/10-auth.conf"

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorizácia je iba šifrovaná.

Súbor „/etc/dovecot/conf.d/10-mail.conf“

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

Tu uvádzame miesto uloženia listov.

Chcem, aby boli uložené v súboroch a zoskupené podľa domény.

Súbor "/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 {
  }
}

Toto je hlavný konfiguračný súbor dovecot.
Tu zakážeme nezabezpečené pripojenia.
A povoľte zabezpečené pripojenia.

Súbor "/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
}

Nastavenie ssl. Označujeme, že sa vyžaduje ssl.
A samotný certifikát. A dôležitým detailom je „miestna“ smernica. Označuje, ktorý certifikát SSL sa má použiť pri pripájaní ku ktorému lokálnemu IPv4.

Mimochodom, IPv6 tu nie je nakonfigurovaný, toto vynechanie opravím neskôr.
XX.XX.XX.X5 (doména2) – žiadny certifikát. Ak chcete pripojiť klientov, musíte zadať doménu1.com.
XX.XX.XX.X2 (doména3) - existuje certifikát, na pripojenie klientov môžete zadať doménu1.com alebo doménu3.com.

Súbor "/etc/dovecot/conf.d/15-lda.conf"

protocol lda {
  mail_plugins = $mail_plugins sieve
}

To bude potrebné pre spamassassina v budúcnosti.

Súbor "/etc/dovecot/conf.d/20-imap.conf"

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Toto je antispamový doplnok. Potrebné na trénovanie spamassina v čase prenosu do/z priečinka „Spam“.

Súbor "/etc/dovecot/conf.d/20-pop3.conf"

protocol pop3 {
}

Existuje len taký súbor.

Súbor „/etc/dovecot/conf.d/20-lmtp.conf“

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

Nastavenie lmtp.

Súbor "/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
}

Nastavenia tréningu Spamassasin v čase prenosu do/z priečinka Spam.

Súbor "/etc/dovecot/conf.d/90-sieve.conf"

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

Súbor, ktorý určuje, čo sa má robiť s prichádzajúcimi listami.

Súbor "/var/lib/dovecot/sieve/default.sieve"

require ["fileinto", "mailbox"];

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

Musíte skompilovať súbor: “sievec default.sieve”.

Súbor "/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
}

Určenie súborov SQL na autorizáciu.
A samotný súbor sa používa ako spôsob autorizácie.

Súbor "/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';

To zodpovedá podobným nastaveniam pre postfix.

Súbor "/etc/dovecot/dovecot.conf"

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

Hlavný konfiguračný súbor.
Dôležité je, že tu uvádzame - pridajte protokoly.

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

apt-get install spamassassin spamc

Poďme nainštalovať balíčky.

adduser spamd --disabled-login

Pridajme používateľa, v mene ktorého.

systemctl enable spamassassin.service

Po načítaní umožňujeme automatické načítanie služby spamassassin.

Súbor "/etc/default/spamassassin":

CRON=1

Povolením automatickej aktualizácie pravidiel „v predvolenom nastavení“.

Súbor „/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

Potrebujete vytvoriť databázu „sa“ v mysql s používateľom „sa“ s heslom „password“ (nahradiť niečím adekvátnym).

report_safe – toto odošle hlásenie o spame namiesto listu.
use_bayes sú nastavenia strojového učenia spamassassinov.

Zostávajúce nastavenia spamassassina boli použité skôr v článku.

Všeobecné nastavenie „spamassassin“.
O presúvaní nových spamových e-mailov do priečinka IMAP „Spam“..
O jednoduchej kombinácii Dovecot + SpamAssassin.
Odporúčam prečítať si teóriu učenia spamassin pri presúvaní písmen v priečinkoch imap (a neodporúčam ju používať).

============= Odvolanie do komunity =============

Tiež by som rád vhodil do komunity nápad, ako zvýšiť úroveň bezpečnosti preposielaných listov. Keďže som tak hlboko ponorený do témy pošty.

Aby si používateľ mohol na svojom klientovi vytvoriť pár kľúčov (outlook, thunderbird, browser-plugin, ...). Verejné a súkromné. Verejné – odoslať do DNS. Súkromné ​​- ušetrite na klientovi. Poštové servery by mohli použiť verejný kľúč na odoslanie konkrétnemu príjemcovi.

A na ochranu pred spamom s takýmito listami (áno, poštový server nebude môcť zobraziť obsah) - budete musieť zaviesť 3 pravidlá:

  1. Povinný skutočný podpis DKIM, povinný SPF, povinný rDNS.
  2. Neurónová sieť na tému antispam školenia + databáza k nej na strane klienta.
  3. Šifrovací algoritmus musí byť taký, že odosielajúca strana musí minúť 100-krát viac výkonu CPU na šifrovanie ako prijímajúca strana.

Okrem verejných listov vytvorte štandardný návrhový list „na začatie bezpečnej korešpondencie“. Jeden z užívateľov (schránka) odošle list s prílohou do inej schránky. List obsahuje textový návrh na spustenie zabezpečeného komunikačného kanála pre korešpondenciu a verejný kľúč majiteľa poštovej schránky (so súkromným kľúčom na strane klienta).

Môžete dokonca vytvoriť niekoľko kľúčov špeciálne pre každú korešpondenciu. Príjemca môže túto ponuku prijať a poslať svoj verejný kľúč (vyrobený aj špeciálne pre túto korešpondenciu). Potom prvý užívateľ odošle servisný riadiaci list (zašifrovaný verejným kľúčom druhého užívateľa) - po prijatí ktorého môže druhý užívateľ považovať vytvorený komunikačný kanál za spoľahlivý. Potom druhý používateľ odošle kontrolný list – a prvý používateľ môže tiež považovať vytvorený kanál za bezpečný.

Na boj proti zachyteniu kľúčov na cestách musí protokol zabezpečiť možnosť prenosu aspoň jedného verejného kľúča pomocou jednotky flash.

A najdôležitejšie je, že to všetko funguje (otázka je „kto to zaplatí?“):
Zadajte poštové certifikáty začínajúce na 10 USD na 3 roky. Čo umožní odosielateľovi uviesť v DNS, že „moje verejné kľúče sú tam“. A dajú vám možnosť nadviazať bezpečné spojenie. Prijímanie takýchto spojení je zároveň bezplatné.
gmail konečne monetizuje svojich používateľov. Za 10 USD na 3 roky - právo na vytváranie bezpečných korešpondenčných kanálov.

============= Záver =============

Aby som otestoval celý článok, chystal som sa na mesiac prenajať dedikovaný server a kúpiť doménu s certifikátom SSL.

Ale životné okolnosti sa vyvinuli, takže tento problém sa ťahal 2 mesiace.
A tak, keď som mal opäť voľný čas, rozhodol som sa radšej zverejniť článok tak, ako je, než riskovať, že sa publikácia natiahne ešte o rok.

Ak je tu dosť veľa otázok typu „ale toto nie je popísané dostatočne podrobne“, tak asi bude sila zobrať dedikovaný server s novou doménou a novým SSL certifikátom a popísať ho ešte podrobnejšie a dôležité je identifikovať všetky chýbajúce dôležité detaily.

Tiež by som chcel získať spätnú väzbu na nápady týkajúce sa poštových certifikátov. Ak sa vám tento nápad páči, pokúsim sa nájsť silu na napísanie návrhu pre rfc.

Pri kopírovaní veľkých častí článku uveďte odkaz na tento článok.
Pri preklade do iného jazyka uveďte odkaz na tento článok.
Pokúsim sa to preložiť do angličtiny sám a zanechať krížové odkazy.


Zdroj: hab.com

Pridať komentár