Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + kelių sąsajų + SpamAssassin-learn + Bind

Šis straipsnis yra apie tai, kaip nustatyti modernų pašto serverį.
Postfix + Dovecot. SPF + DKIM + rDNS. Su IPv6.
Su TSL šifravimu. Su kelių domenų palaikymu – pasidalykite tikru SSL sertifikatu.
Su apsauga nuo brukalo ir aukštu antispam įvertinimu iš kitų pašto serverių.
Palaiko kelias fizines sąsajas.
Su „OpenVPN“, prie kurio prisijungiama per IPv4 ir kuris teikia IPv6.

Jei nenorite mokytis visų šių technologijų, bet norite sukurti tokį serverį, šis straipsnis skirtas jums.

Straipsnyje nesistengiama paaiškinti kiekvienos detalės. Paaiškinimas pateikiamas dėl to, kas nėra sukonfigūruota standartiškai arba yra svarbu vartotojo požiūriu.

Motyvacija sukurti pašto serverį buvo sena mano svajonė. Tai gali atrodyti kvailai, bet IMHO, tai daug geriau nei svajoti apie naują mėgstamos markės automobilį.

Nustatyti IPv6 yra dvi priežastys. IT specialistas, norėdamas išgyventi, turi nuolat mokytis naujų technologijų. Norėčiau savo kuklų indėlį įnešti į kovą su cenzūra.

„OpenVPN“ nustatymo motyvacija yra tik tai, kad IPv6 veiktų vietiniame kompiuteryje.
Motyvacija nustatyti kelias fizines sąsajas yra ta, kad savo serveryje turiu vieną sąsają „lėta, bet neribota“ ir kitą „greita, bet su tarifu“.

Motyvacija nustatyti „Bind“ nustatymus yra ta, kad mano IPT teikia nestabilų DNS serverį, o „Google“ taip pat kartais sugenda. Noriu stabilaus DNS serverio asmeniniam naudojimui.

Motyvacija rašyti straipsnį – juodraštį parašiau prieš 10 mėnesių ir jau du kartus peržvelgiau jį. Net jei autoriui to reikia nuolat, didelė tikimybė, kad to prireiks ir kitiems.

Nėra universalaus sprendimo pašto serveriui. Bet pabandysiu parašyti kažką panašaus į „padaryk tai ir, kai viskas veiks taip, kaip turėtų, išmesk papildomus daiktus“.

Įmonė tech.ru turi Colocation serverį. Galima lyginti su OVH, Hetzner, AWS. Norint išspręsti šią problemą, bendradarbiavimas su tech.ru bus daug efektyvesnis.

Serveryje įdiegta Debian 9.

Serveris turi 2 sąsajas „eno1“ ir „eno2“. Pirmasis yra neribotas, o antrasis - atitinkamai greitas.

Yra 3 statiniai IP adresai: XX.XX.XX.X0 ir XX.XX.XX.X1 ir XX.XX.XX.X2 „eno1“ sąsajoje ir XX.XX.XX.X5 „eno2“ sąsajoje .

Galima XXXX:XXXX:XXXX:XXXX::/64 IPv6 adresų rinkinys, priskirtas „eno1“ sąsajai ir iš jos XXXX:XXXX:XXXX:XXXX:1:2::/96 mano prašymu buvo priskirtas „eno2“.

Yra 3 domenai „domain1.com“, „domain2.com“, „domain3.com“. Yra „domain1.com“ ir „domain3.com“ SSL sertifikatas.

Turiu Google paskyrą, su kuria norėčiau susieti savo pašto dėžutę[apsaugotas el. paštu]` (laiškų gavimas ir siuntimas tiesiai iš gmail sąsajos).
Turi būti pašto dėžutė“.[apsaugotas el. paštu]el. laiško, iš kurio noriu matyti savo „Gmail“, kopiją. Ir retai kada pavyksta ką nors išsiųsti ` vardu[apsaugotas el. paštu]` per žiniatinklio sąsają.

Turi būti pašto dėžutė“.[apsaugotas el. paštu]“, kurį Ivanovas naudos iš savo „iPhone“.

Siunčiami el. laiškai turi atitikti visus šiuolaikinius antispam reikalavimus.
Viešuosiuose tinkluose turi būti teikiamas aukščiausio lygio šifravimas.
Turėtų būti IPv6 palaikymas ir laiškų siuntimui, ir gavimui.
Turėtų būti SpamAssassin, kuris niekada neištrins el. Ir jis bus atšoktas, praleistas arba išsiųstas į IMAP „Šlamšto“ aplanką.
„SpamAssassin“ automatinis mokymasis turi būti sukonfigūruotas: jei perkelsiu laišką į „Spam“ aplanką, jis iš to pasimokys; jei perkelsiu laišką iš aplanko Šlamštas, jis iš to pasimokys. SpamAssassin mokymo rezultatai turėtų turėti įtakos, ar laiškas atsidurs šlamšto aplanke.
PHP scenarijai turi turėti galimybę siųsti laiškus bet kurio domeno vardu duotame serveryje.
Turėtų būti openvpn paslauga su galimybe naudoti IPv6 kliente, kuriame nėra IPv6.

Pirmiausia turite sukonfigūruoti sąsajas ir maršrutą, įskaitant IPv6.
Tada turėsite sukonfigūruoti OpenVPN, kuris prisijungs per IPv4 ir suteiks klientui statinį-realų IPv6 adresą. Šis klientas turės prieigą prie visų IPv6 paslaugų serveryje ir prieigą prie bet kokių IPv6 išteklių internete.
Tada turėsite sukonfigūruoti Postfix, kad būtų išsiųsti laiškai + SPF + DKIM + rDNS ir kitos panašios smulkmenos.
Tada turėsite sukonfigūruoti „Dovecot“ ir „Multidomain“.
Tada turėsite sukonfigūruoti SpamAssassin ir sukonfigūruoti mokymą.
Galiausiai įdiekite Bind.

============= Kelios sąsajos ==============

Norėdami sukonfigūruoti sąsajas, turite tai įrašyti į „/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

Šiuos nustatymus galima pritaikyti bet kuriame tech.ru serveryje (šiek tiek derinant su palaikymu) ir jis iškart veiks taip, kaip turėtų.

Jei turite patirties nustatydami panašius dalykus Hetzner, OVH, ten viskas kitaip. Sunkiau.

eno1 yra tinklo plokštės #1 pavadinimas (lėta, bet neribota).
eno2 yra tinklo plokštės #2 pavadinimas (greita, bet su tarifu).
tun0 yra virtualios tinklo plokštės iš OpenVPN pavadinimas.
XX.XX.XX.X0 – „eno4“ IPv1 Nr. 1.
XX.XX.XX.X1 – „eno4“ IPv2 Nr. 1.
XX.XX.XX.X2 – „eno4“ IPv3 Nr. 1.
XX.XX.XX.X5 – „eno4“ IPv1 Nr. 2.
XX.XX.XX.1 – IPv4 šliuzas.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 visam serveriui.
XXXX:XXXX:XXXX:XXXX:1:2::/96 – IPv6, skirtas eno2, visa kita iš išorės patenka į eno1.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 šliuzas (verta atkreipti dėmesį, kad tai galima/reikia daryti kitaip. Nurodykite IPv6 jungiklį).
dns-nameservers - nurodytas 127.0.0.1 (nes bind įdiegtas lokaliai) ir 213.248.1.6 (tai iš tech.ru).

"lentelė eno1t" ir "lentelė eno2t" - šių maršruto taisyklių reikšmė yra ta, kad eismas, įvažiuojantis per eno1 -> išvažiuotų per ją, o eismas įvažiuojantis per eno2 -> išvažiuotų per ją. Taip pat serverio inicijuoti ryšiai vyktų per eno1.

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

Šia komanda nurodome, kad bet koks nesuprantamas srautas, kuris patenka į bet kurią taisyklę, pažymėtą "table eno1t" ->, būtų siunčiamas į eno1 sąsają.

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

Šia komanda nurodome, kad bet koks serverio inicijuotas srautas turi būti nukreiptas į eno1 sąsają.

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

Su šia komanda nustatome eismo žymėjimo taisykles.

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

Šis blokas nurodo antrąjį IPv4 eno1 sąsajai.

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

Su šia komanda nustatome maršrutą iš OpenVPN klientų į vietinį IPv4, išskyrus XX.XX.XX.X0.
Vis dar nesuprantu, kodėl šios komandos pakanka visiems IPv4.

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

Čia nustatome pačios sąsajos adresą. Serveris naudos jį kaip „išeinantį“ adresą. Daugiau jokiu būdu nebus naudojamas.

Kodėl „:1:1::“ toks sudėtingas? Kad OpenVPN veiktų tinkamai ir tik tam. Daugiau apie tai vėliau.

Vartų tema – štai kaip tai veikia ir viskas gerai. Tačiau teisingas būdas yra čia nurodyti jungiklio, prie kurio prijungtas serveris, IPv6.

Tačiau dėl tam tikrų priežasčių IPv6 nustoja veikti, jei tai darau. Tai tikriausiai yra tech.ru problema.

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

Taip prie sąsajos pridedamas IPv6 adresas. Jei jums reikia šimto adresų, tai reiškia šimtą eilučių šiame faile.

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

Pasižymėjau visų sąsajų adresus ir potinklius, kad būtų aišku.
eno1 - turi būti "/64“ – nes tai yra visas mūsų adresų rinkinys.
tun0 – potinklis turi būti didesnis nei eno1. Priešingu atveju nebus galima sukonfigūruoti IPv6 šliuzo OpenVPN klientams.
eno2 – potinklis turi būti didesnis nei tun0. Priešingu atveju „OpenVPN“ klientai negalės pasiekti vietinių IPv6 adresų.
Aiškumo dėlei pasirinkau 16 potinklio žingsnį, bet jei norite, galite atlikti net „1“ veiksmą.
Atitinkamai, 64+16 = 80 ir 80+16 = 96.

Dar didesniam aiškumui:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY yra adresai, kurie turėtų būti priskirti konkrečioms svetainėms arba paslaugoms eno1 sąsajoje.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY yra adresai, kurie turėtų būti priskirti konkrečioms svetainėms arba paslaugoms eno2 sąsajoje.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY yra adresai, kurie turėtų būti priskirti OpenVPN klientams arba naudojami kaip OpenVPN paslaugų adresai.

Norint sukonfigūruoti tinklą, turi būti įmanoma iš naujo paleisti serverį.
IPv4 pakeitimai paimami, kai jie vykdomi (būtinai apvyniokite juos ekrane - kitaip ši komanda tiesiog sugadins tinklą serveryje):

/etc/init.d/networking restart

Pridėkite prie failo pabaigos „/etc/iproute2/rt_tables“:

100 eno1t
101 eno2t

Be to negalėsite naudoti pasirinktinių lentelių „/etc/network/interfaces“ faile.
Skaičiai turi būti unikalūs ir mažesni nei 65535.

IPv6 pakeitimus galima lengvai pakeisti neperkraunant, tačiau norėdami tai padaryti, turite išmokti bent tris komandas:

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

„/etc/sysctl.conf“ nustatymas

# 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

Tai yra mano serverio „sysctl“ nustatymai. Leiskite pabrėžti kai ką svarbaus.

net.ipv4.ip_forward = 1

Be to „OpenVPN“ iš viso neveiks.

net.ipv6.ip_nonlocal_bind = 1

Kiekvienas, kuris bandys susieti IPv6 (pavyzdžiui, nginx) iškart po to, kai sąsaja bus sukurta, gaus klaidą. Kad šis adresas nepasiekiamas.

Norint išvengti tokios situacijos, toks nustatymas atliekamas.

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

Be šių IPv6 nustatymų srautas iš OpenVPN kliento nepatenka į pasaulį.

Kiti nustatymai nėra svarbūs arba neatsimenu, kam jie skirti.
Bet tik tuo atveju palieku „kaip yra“.

Kad šio failo pakeitimai būtų paimti neperkraunant serverio, turite paleisti komandą:

sysctl -p

Daugiau informacijos apie stalo taisykles: habr.com/post/108690

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

„OpenVPN IPv4“ neveikia be „iptables“.

Mano iptables yra tokios, skirtos 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 yra mano statinis vietinio įrenginio IPv4 adresas.
10.8.0.0/24 – IPv4 openvpn tinklas. IPv4 adresai openvpn klientams.
Svarbus taisyklių nuoseklumas.

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

Tai yra apribojimas, todėl tik aš galiu naudoti „OpenVPN“ iš savo statinio 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

Norėdami persiųsti IPv4 paketus tarp OpenVPN klientų ir interneto, turite užregistruoti vieną iš šių komandų.

Skirtingiems atvejams vienas iš variantų netinka.
Abi komandos tinka mano atveju.
Perskaičius dokumentaciją, pasirinkau pirmą variantą, nes jis naudoja mažiau procesoriaus.

Kad visi iptables nustatymai būtų paimti po perkrovimo, turite juos kažkur išsaugoti.

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

Tokie vardai pasirinkti neatsitiktinai. Juos naudoja paketas „iptables-persistent“.

apt-get install iptables-persistent

Pagrindinio OpenVPN paketo diegimas:

apt-get install openvpn easy-rsa

Nustatykime sertifikatų šabloną (pakeiskite savo vertes):

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

Redaguojame sertifikato šablono nustatymus:

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

Sukurkite serverio sertifikatą:

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

Paruoškime galimybę sukurti galutinius „kliento vardas.opvn“ failus:

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

Paruoškime scenarijų, kuris sujungs visus failus į vieną opvn failą.

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

Pirmojo OpenVPN kliento sukūrimas:

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

Failas „~/client-configs/files/client-name.ovpn“ siunčiamas į kliento įrenginį.

„iOS“ klientams turėsite atlikti šį triuką:
Žymos „tls-auth“ turinys turi būti be komentarų.
Taip pat prieš pat žymą „tls-auth“ įdėkite „key-direction 1“.

Sukonfigūruokime OpenVPN serverio konfigūraciją:

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

Tai reikalinga norint kiekvienam klientui nustatyti statinį adresą (nebūtina, bet aš jį naudoju):

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

Sunkiausia ir svarbiausia detalė.

Deja, OpenVPN dar nežino, kaip savarankiškai sukonfigūruoti IPv6 šliuzą klientams.
Turite tai „rankiniu būdu“ persiųsti kiekvienam klientui.

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

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

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

Abu scenarijai naudoja failą „/etc/openvpn/variables“:

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

Man sunku prisiminti, kodėl taip parašyta.

Dabar tinklo kaukė = 112 atrodo keistai (čia turėtų būti 96).
Ir priešdėlis yra keistas, jis neatitinka tun0 tinklo.
Bet gerai, paliksiu kaip yra.

cipher DES-EDE3-CBC

Tai tinka ne visiems – pasirinkau tokį ryšio šifravimo būdą.

Sužinokite daugiau apie OpenVPN IPv4 nustatymą.

Sužinokite daugiau apie OpenVPN IPv6 nustatymą.

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

Pagrindinio paketo diegimas:

apt-get install postfix

Diegdami pasirinkite „interneto svetainė“.

Mano „/etc/postfix/main.cf“ atrodo taip:

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

Pažvelkime į šios konfigūracijos detales.

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

Chabrovsko gyventojų teigimu, šiame bloke yra „dezinformacijos ir neteisingų tezių“.Tik praėjus 8 metams nuo savo karjeros pradžios pradėjau suprasti, kaip veikia SSL.

Todėl pasiimsiu laisvę aprašyti, kaip naudoti SSL (neatsakydamas į klausimus „Kaip tai veikia?“ ir „Kodėl tai veikia?“).

Šiuolaikinio šifravimo pagrindas yra raktų poros (dvi labai ilgos simbolių eilutės) sukūrimas.

Vienas „raktas“ yra privatus, kitas – „viešasis“. Privatųjį raktą labai atsargiai laikome paslaptyje. Visiems platiname viešąjį raktą.

Naudodami viešąjį raktą galite užšifruoti teksto eilutę, kad tik privataus rakto savininkas galėtų ją iššifruoti.
Na, tai yra visas technologijos pagrindas.

1 veiksmas – https svetainės.
Prisijungdama prie svetainės, naršyklė iš žiniatinklio serverio sužino, kad svetainė yra https ir todėl prašo viešojo rakto.
Žiniatinklio serveris suteikia viešąjį raktą. Naršyklė naudoja viešąjį raktą http užklausai užšifruoti ir išsiųsti.
http užklausos turinį gali skaityti tik tie, kurie turi privatųjį raktą, ty tik serveris, kuriam pateikta užklausa.
Http užklausoje yra bent URI. Todėl, jei šalis bando apriboti prieigą ne prie visos svetainės, o prie konkretaus puslapio, tada https svetainėms to padaryti neįmanoma.

2 veiksmas – užšifruotas atsakymas.
Žiniatinklio serveris pateikia atsakymą, kurį galima lengvai perskaityti kelyje.
Sprendimas itin paprastas – naršyklė kiekvienai https svetainei lokaliai generuoja tą pačią privataus-viešojo raktų porą.
Kartu su svetainės viešojo rakto užklausa ji siunčia ir vietinį viešąjį raktą.
Žiniatinklio serveris jį įsimena ir, siųsdamas http-atsakymą, užšifruoja jį konkretaus kliento viešuoju raktu.
Dabar http-atsakymą gali iššifruoti tik kliento naršyklės privataus rakto savininkas (tai yra pats klientas).

3 veiksmas – saugaus ryšio užmezgimas viešuoju kanalu.
2 pavyzdyje yra pažeidžiamumas – niekas netrukdo geradariams perimti http užklausą ir redaguoti informaciją apie viešąjį raktą.
Taigi tarpininkas aiškiai matys visą išsiųstų ir gautų pranešimų turinį, kol nepasikeis ryšio kanalas.
Tai padaryti labai paprasta – tiesiog išsiųskite naršyklės viešąjį raktą kaip pranešimą, užšifruotą žiniatinklio serverio viešuoju raktu.
Tada žiniatinklio serveris pirmiausia išsiunčia atsakymą, pavyzdžiui, „jūsų viešasis raktas yra toks“ ir užšifruoja šį pranešimą tuo pačiu viešuoju raktu.
Naršyklė žiūri į atsakymą – jei gaunamas pranešimas „jūsų viešasis raktas toks“ – tai 100% garantija, kad šis ryšio kanalas yra saugus.
Kiek tai saugu?
Pats tokio saugaus ryšio kanalo sukūrimas vyksta ping*2 greičiu. Pavyzdžiui, 20 ms.
Užpuolikas turi iš anksto turėti vienos iš šalių privatųjį raktą. Arba per kelias milisekundes raskite privatų raktą.
Vieno modernaus privataus rakto įsilaužimas superkompiuteryje užtruks dešimtmečius.

4 veiksmas – vieša viešųjų raktų duomenų bazė.
Akivaizdu, kad visoje šioje istorijoje yra galimybė užpuolikui sėdėti komunikacijos kanale tarp kliento ir serverio.
Klientas gali apsimesti serveriu, o serveris gali apsimesti klientu. Ir imituokite raktų porą abiem kryptimis.
Tada užpuolikas matys visą srautą ir galės „redaguoti“ srautą.
Pavyzdžiui, pakeiskite adresą, kur siųsti pinigus, nukopijuokite slaptažodį iš internetinės bankininkystės arba užblokuokite „prieštingą“ turinį.
Norėdami kovoti su tokiais užpuolikais, jie sukūrė viešą duomenų bazę su viešaisiais raktais kiekvienai https svetainei.
Kiekviena naršyklė „žino“ apie 200 tokių duomenų bazių. Tai iš anksto įdiegta kiekvienoje naršyklėje.
„Žinios“ palaikomos viešuoju raktu iš kiekvieno sertifikato. Tai reiškia, kad ryšys su kiekviena konkrečia sertifikavimo institucija negali būti suklastotas.

Dabar yra paprastas supratimas, kaip naudoti SSL https.
Jei pasinaudosite savo smegenimis, paaiškės, kaip specialiosios tarnybos gali ką nors nulaužti šioje struktūroje. Tačiau tai jiems kainuos milžiniškas pastangas.
O organizacijos, mažesnės nei NSA ar CŽV – beveik neįmanoma nulaužti esamo apsaugos lygio net ir VIP asmenims.

Taip pat pridėsiu apie ssh ryšius. Ten nėra viešųjų raktų, tad ką daryti? Problema sprendžiama dviem būdais.
Parinktis ssh-by-slaptažodis:
Pirmojo prisijungimo metu ssh klientas turėtų įspėti, kad turime naują viešąjį raktą iš ssh serverio.
O tolesnių ryšių metu, jei pasirodys įspėjimas „naujas viešasis raktas iš ssh serverio“, tai reikš, kad jie bando jus pasiklausyti.
Arba buvote pasiklausytas pirmojo prisijungimo metu, bet dabar su serveriu bendraujate be tarpininkų.
Tiesą sakant, dėl to, kad pasiklausymo faktas yra lengvai, greitai ir be pastangų atskleidžiamas, ši ataka naudojama tik ypatingais atvejais konkrečiam klientui.

Parinktis ssh-by-key:
Paimame „flash“ diską, parašome jame privatų ssh serverio raktą (tam yra terminų ir daug svarbių niuansų, bet aš rašau edukacinę programą, o ne naudojimo instrukcijas).
Viešąjį raktą paliekame mašinoje, kurioje bus ssh klientas, taip pat laikome jį paslaptyje.
Atnešame „flash“ diską į serverį, įdedame, nukopijuojame privatų raktą, o „flash“ diską sudeginame ir pelenus išbarstome vėjui (ar bent suformatuojame su nuliais).
Tai viskas – po tokios operacijos nulaužti tokį ssh ryšį bus neįmanoma. Žinoma, po 10 metų bus galima stebėti srautą superkompiuteryje – bet tai jau kita istorija.

Atsiprasau uz offtopic.

Taigi dabar, kai teorija žinoma. Papasakosiu apie SSL sertifikato kūrimo eigą.

Naudodami „openssl genrsa“ sukuriame privatų raktą ir „tuščius“ viešajam raktui.
„Ruošinius“ siunčiame trečiosios šalies įmonei, kuriai už paprasčiausią sertifikatą sumokame apie 9 USD.

Po poros valandų iš šios trečiosios šalies įmonės gauname savo „viešąjį“ raktą ir kelių viešųjų raktų rinkinį.

Kodėl trečiosios šalies įmonė turėtų mokėti už mano viešojo rakto registraciją, yra atskiras klausimas, mes čia to nenagrinėsime.

Dabar aišku, ką reiškia užrašas:

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

Aplanke „/etc/ssl“ yra visi ssl problemų failai.
domain1.com – domeno vardas.
2018-ieji – raktų kūrimo metai.
„raktas“ – žymėjimas, kad failas yra privatus raktas.

Ir šio failo prasmė:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com – domeno vardas.
2018-ieji – raktų kūrimo metai.
grandininis - žymėjimas, kad yra viešųjų raktų grandinė (pirmasis yra mūsų viešasis raktas, o likusieji yra iš įmonės, išleidusios viešąjį raktą).
crt - nurodymas, kad yra paruoštas sertifikatas (viešasis raktas su techniniais paaiškinimais).

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

Šis nustatymas šiuo atveju nenaudojamas, bet parašytas kaip pavyzdys.

Kadangi dėl šio parametro klaidos iš jūsų serverio bus siunčiamas šlamštas (be jūsų valios).

Tada įrodyk visiems, kad nesi kaltas.

recipient_delimiter = +

Daugelis žmonių gali nežinoti, bet tai yra standartinis el. laiškų reitingavimo simbolis, kurį palaiko dauguma šiuolaikinių pašto serverių.

Pavyzdžiui, jei turite pašto dėžutę "[apsaugotas el. paštu]"bandyk siųsti į"[apsaugotas el. paštu]“ – žiūrėk, kas iš to išeis.

inet_protocols = ipv4

Tai gali būti painu.

Bet tai ne tik taip. Kiekvienas naujas domenas pagal nutylėjimą yra tik IPv4, tada įjungiu IPv6 kiekvienam atskirai.

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

Čia nurodome, kad visi gaunami laiškai keliauja į dovecot.
O domeno, pašto dėžutės, slapyvardžių taisyklės – ieškokite duomenų bazėje.

/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

Dabar postfix žino, kad paštas gali būti priimtas tolesniam siuntimui tik gavus leidimą su dovecot.

Tikrai nelabai suprantu, kodėl čia tai dubliuojama. Mes jau nurodėme viską, ko reikia „virtual_transport“.

Tačiau „postfix“ sistema yra labai sena – tikriausiai tai senų laikų grįžimas.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Tai gali būti sukonfigūruota skirtingai kiekvienam pašto serveriui.

Turiu 3 pašto serverius ir šie nustatymai labai skiriasi dėl skirtingų naudojimo reikalavimų.

Turite jį kruopščiai sukonfigūruoti – kitaip šlamštas pasipils pas jus, o dar blogiau – iš jūsų pasilies šlamštas.

# SPF
policyd-spf_time_limit = 3600

Kai kurių įskiepių, susijusių su gaunamų laiškų SPF tikrinimu, nustatymas.

# 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

Nustatymas yra toks, kad su visais siunčiamais el. laiškais turime pateikti DKIM parašą.

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

Tai yra pagrindinė raidžių nukreipimo detalė siunčiant laiškus iš PHP scenarijų.

Failas „/etc/postfix/sdd_transport.pcre“:

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

Kairėje yra reguliarios išraiškos. Dešinėje yra etiketė, žyminti raidę.
Postfix pagal etiketę – bus atsižvelgta į dar kelias konkrečios raidės konfigūracijos eilutes.

Kaip tiksliai bus perkonfigūruotas „postfix“ konkrečiai raidei, bus nurodyta „master.cf“.

4, 5, 6 eilutės yra pagrindinės. Kurio domeno vardu siunčiame laišką, klijuojame šią etiketę.
Tačiau senojo kodo PHP scenarijuose laukas „nuo“ ne visada nurodomas. Tada vartotojo vardas ateina į pagalbą.

Straipsnis jau platus – nenorėčiau blaškytis nustatydamas nginx+fpm.

Trumpai tariant, kiekvienai svetainei nustatome savo Linux naudotojo savininką. Ir atitinkamai jūsų fpm-pool.

Fpm-pool naudoja bet kurią php versiją (puiku, kai tame pačiame serveryje be problemų galite naudoti skirtingas php versijas ir net skirtingas php.ini kaimyninėse svetainėse).

Taigi, konkretus „Linux“ vartotojas „www-domain2“ turi svetainę domain2.com. Šioje svetainėje yra kodas el. laiškų siuntimui nenurodant lauko.

Taigi, net ir tokiu atveju laiškai bus išsiųsti teisingai ir niekada nepateks į šiukšlių dėžę.

Mano „/etc/postfix/master.cf“ atrodo taip:

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

Failas pateiktas ne visas – jis jau labai didelis.
Pažymėjau tik tai, kas pasikeitė.

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}

Tai nustatymai, susiję su spamassasin, daugiau apie tai vėliau.

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

Leidžiame prisijungti prie pašto serverio per 587 prievadą.
Norėdami tai padaryti, turite prisijungti.

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

Įgalinti SPF patikrą.

apt-get install postfix-policyd-spf-python

Įdiegkime aukščiau pateiktą SPF patikrų paketą.

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

Ir tai yra įdomiausias dalykas. Tai galimybė siųsti laiškus konkrečiam domenui iš konkretaus IPv4/IPv6 adreso.

Tai daroma rDNS labui. rDNS yra eilutės gavimo pagal IP adresą procesas.
O paštui ši funkcija naudojama norint patvirtinti, kad „helo“ tiksliai atitinka adreso, iš kurio buvo išsiųstas laiškas, rDNS.

Jei el. pašto domenas neatitinka el. pašto domeno, kurio vardu buvo išsiųstas laiškas, skiriami šiukšlių taškai.

Helo neatitinka rDNS – skiriama daug šiukšlių taškų.
Atitinkamai, kiekvienas domenas turi turėti savo IP adresą.
OVH - konsolėje galima nurodyti rDNS.
Dėl tech.ru - problema išspręsta naudojant palaikymą.
AWS problema išspręsta naudojant palaikymą.
„inet_protocols“ ir „smtp_bind_address6“ – įjungiame IPv6 palaikymą.
IPv6 taip pat turite užregistruoti rDNS.
„syslog_name“ – tai palengvina žurnalų skaitymą.

Pirkite sertifikatus Rekomenduoju čia.

Čia nustatome postfix+dovecot nuorodą.

SPF nustatymas.

============= Balandėlis ==============

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

Mysql nustatymas, pačių paketų įdiegimas.

Failas „/etc/dovecot/conf.d/10-auth.conf“

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorizacija tik užšifruota.

Failas „/etc/dovecot/conf.d/10-mail.conf“

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

Čia nurodome laiškų saugojimo vietą.

Noriu, kad jie būtų saugomi failuose ir sugrupuoti pagal domeną.

Failas „/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 {
  }
}

Tai yra pagrindinis balandėlių konfigūracijos failas.
Čia išjungiame nesaugius ryšius.
Ir įgalinkite saugius ryšius.

Failas „/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
}

ssl nustatymas. Nurodome, kad reikalingas ssl.
Ir pats sertifikatas. Ir svarbi detalė yra „vietinė“ direktyva. Nurodo, kurį SSL sertifikatą naudoti jungiantis prie kurio vietinio IPv4.

Beje, IPv6 čia nesukonfigūruotas, vėliau ištaisysiu šį praleidimą.
XX.XX.XX.X5 (domenas2) – nėra sertifikato. Norėdami prijungti klientus, turite nurodyti domain1.com.
XX.XX.XX.X2 (domenas3) - yra sertifikatas, galite nurodyti domenas1.com arba domain3.com, kad prijungtumėte klientus.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Ateityje to prireiks spamassassin.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Tai antispam įskiepis. Reikalingas spamassasin treniruotėms perkeliant į/iš aplanko „Šlamštas“.

Failas „/etc/dovecot/conf.d/20-pop3.conf“

protocol pop3 {
}

Tiesiog yra toks failas.

Failas „/etc/dovecot/conf.d/20-lmtp.conf“

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

lmtp nustatymas.

Failas „/etc/dovecot/conf.d/90-antispam.conf“

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

„Spamassasin“ treniruočių nustatymai perkėlimo į/iš „Spam“ aplanko metu.

Failas „/etc/dovecot/conf.d/90-sieve.conf“

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

Failas, nurodantis, ką daryti su gaunamais laiškais.

Failas „/var/lib/dovecot/sieve/default.sieve“

require ["fileinto", "mailbox"];

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

Turite sukompiliuoti failą: "sievec default.sieve".

Failas „/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
}

Nurodomi sql failai autorizuoti.
O pats failas naudojamas kaip autorizacijos metodas.

Failas „/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';

Tai atitinka panašius postfix nustatymus.

Failas "/etc/dovecot/dovecot.conf"

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

Pagrindinis konfigūracijos failas.
Svarbu tai, kad mes čia nurodome – pridėkite protokolus.

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

apt-get install spamassassin spamc

Įdiegkime paketus.

adduser spamd --disabled-login

Pridėkime naudotoją, kurio vardu.

systemctl enable spamassassin.service

Pakrovimo metu įjungiame automatinio įkėlimo spamassassin paslaugą.

Failas "/etc/default/spamassassin":

CRON=1

Įjungus automatinį taisyklių atnaujinimą „pagal numatytuosius nustatymus“.

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

Turite sukurti duomenų bazę "sa" mysql su vartotoju "sa" su slaptažodžiu "password" (pakeiskite tinkamu).

report_safe – vietoj laiško bus atsiųstas pranešimas apie el. pašto šiukšles.
use_bayes yra spamassassin mašininio mokymosi nustatymai.

Likę spamassassin nustatymai buvo naudojami anksčiau straipsnyje.

Bendras nustatymas "spamassassin".
Apie naujų šlamšto laiškų perkėlimą į IMAP aplanką „Šlamštas“..
Apie paprastą Dovecot + SpamAssassin derinį.
Perkeliant raides imap aplankuose rekomenduoju perskaityti spamassasin mokymosi teoriją (ir jos naudoti nerekomenduoju).

============= Kreipkitės į bendruomenę ==============

Taip pat norėčiau išmesti bendruomenei idėją, kaip padidinti siunčiamų laiškų saugumo lygį. Kadangi esu taip giliai pasinėrusi į pašto temą.

Kad vartotojas galėtų sukurti savo kliento raktų porą (outlook, thunderbird, naršyklės papildinys, ...). Viešas ir privatus. Vieša – siųsti į DNS. Privatus – sutaupykite ant kliento. Pašto serveriai galėtų naudoti viešąjį raktą, kad išsiųstų konkrečiam gavėjui.

O apsisaugoti nuo šiukšlių su tokiais laiškais (taip, pašto serveris negalės peržiūrėti turinio) – reikės įvesti 3 taisykles:

  1. Privalomas tikrasis DKIM parašas, privalomas SPF, privalomas rDNS.
  2. Neuroninis tinklas apie antispam mokymą + jo duomenų bazė kliento pusėje.
  3. Šifravimo algoritmas turi būti toks, kad siunčiančioji pusė šifravimui sunaudotų 100 kartų daugiau procesoriaus galios nei priimančioji.

Be viešų laiškų, sukurkite standartinį pasiūlymo laišką „pradėti saugią korespondenciją“. Vienas iš vartotojų (pašto dėžutė) siunčia laišką su priedu į kitą pašto dėžutę. Laiške yra tekstinis pasiūlymas paleisti saugų susirašinėjimo ryšio kanalą ir pašto dėžutės savininko viešasis raktas (su privačiu raktu kliento pusėje).

Kiekvienai korespondencijai galite sukurti net kelis raktus. Vartotojas gavėjas gali priimti šį pasiūlymą ir atsiųsti savo viešąjį raktą (taip pat sukurtą specialiai šiai korespondencijai). Toliau pirmasis vartotojas išsiunčia paslaugos valdymo laišką (užšifruotą antrojo vartotojo viešuoju raktu) – jį gavęs antrasis vartotojas gali laikyti suformuotą ryšio kanalą patikimu. Tada antrasis vartotojas išsiunčia kontrolinį laišką – tada pirmasis vartotojas suformuotą kanalą taip pat gali laikyti saugiu.

Siekiant kovoti su raktų perėmimu kelyje, protokole turi būti numatyta galimybė perduoti bent vieną viešąjį raktą naudojant „flash drive“.

O svarbiausia, kad viskas veiktų (klausimas „kas už tai sumokės?“):
Įveskite pašto sertifikatus nuo 10 USD 3 metams. Tai leis siuntėjui dns nurodyti, kad „mano viešieji raktai yra ten“. Ir jie suteiks jums galimybę užmegzti saugų ryšį. Tuo pačiu metu tokių ryšių priėmimas yra nemokamas.
„Gmail“ pagaliau užsidirba pinigų iš savo vartotojų. Už 10 USD per 3 metus – teisė kurti saugius susirašinėjimo kanalus.

============= Išvada ==============

Norėdami išbandyti visą straipsnį, ketinau mėnesiui išsinuomoti dedikuotą serverį ir nusipirkti domeną su SSL sertifikatu.

Tačiau gyvenimo aplinkybės susiklostė, todėl ši problema užsitęsė 2 mėnesius.
Taigi, kai vėl turėjau laisvo laiko, nusprendžiau publikuoti straipsnį tokį, koks jis yra, o ne rizikuoti, kad publikacija užsitęs dar metus.

Jei kyla gana daug klausimų, tokių kaip „bet tai nėra pakankamai išsamiai aprašyta“, tikriausiai bus jėgų paimti dedikuotą serverį su nauju domenu ir nauju SSL sertifikatu ir jį aprašyti dar išsamiau ir dažniausiai. svarbiausia – nustatyti visas trūkstamas svarbias detales.

Taip pat norėčiau gauti atsiliepimų apie idėjas apie pašto sertifikatus. Jei jums patinka idėja, pabandysiu rasti jėgų parašyti juodraštį rfc.

Kopijuodami dideles straipsnio dalis pateikite nuorodą į šį straipsnį.
Versdami į bet kurią kitą kalbą pateikite nuorodą į šį straipsnį.
Pabandysiu pati išversti į anglų kalbą ir palikti kryžmines nuorodas.


Šaltinis: www.habr.com

Добавить комментарий