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

Kyky kjo artikulli për mënyrën se si të konfiguroni një server modern të postës elektronike.
Postfix + Dovecot. SPF + DKIM + rDNS. Me IPv6.
Me enkriptimin TSL. Me mbĂ«shtetje pĂ«r disa domain-e — pjesa me njĂ« certifikatĂ« SSL tĂ« vĂ«rtetĂ«.
Me mbrojtje nga spam dhe një indeks të lartë anti-spam me serverët e tjerë të postës.
Me mbështetje për disa interface fizike.
Me OpenVPN, lidhja e të cilit përmes IPv4, dhe që ofron IPv6.

NĂ«se nuk dĂ«shironi tĂ« mĂ«soni tĂ« gjitha kĂ«to teknologji, por dĂ«shironi tĂ« konfiguroni njĂ« server tĂ« tillĂ« — atĂ«herĂ« ky artikull Ă«shtĂ« pĂ«r ju.

Artikulli nuk përmban përpjekje për të shpjeguar çdo detaj. Shpjegimi shkon në atë që është konfiguruar jo standarde ose është e rëndësishme nga këndvështrimi i konsumatorit.

Motivimi pĂ«r tĂ« konfiguruar njĂ« server tĂ« postĂ«s elektronike — Ă«shtĂ« njĂ« Ă«ndĂ«rr e vjetĂ«r e imja. Mund tĂ« duket e çuditshme, por IMHO, Ă«shtĂ« shumĂ« mĂ« mirĂ« se sa tĂ« Ă«ndĂ«rosh pĂ«r njĂ« makinĂ« tĂ« re tĂ« markĂ«s sĂ« preferuar.

Motivimi pĂ«r tĂ« konfiguruar IPv6 — janĂ« dy. NjĂ« specialist IT duhet tĂ« mĂ«sojĂ« vazhdimisht teknologjitĂ« e reja pĂ«r tĂ« mbijetuar. DĂ«shira pĂ«r tĂ« kontribuar nĂ« luftĂ«n kundĂ«r censurĂ«s.

Motivimi pĂ«r tĂ« konfiguruar OpenVPN — vetĂ«m pĂ«r tĂ« siguruar qĂ« IPv6 tĂ« funksionojĂ« nĂ« makinĂ«n lokale.
Motivimi pĂ«r tĂ« konfiguruar disa interface fizike — kam njĂ« interface nĂ« serverin tim qĂ« Ă«shtĂ« 'i ngadalshĂ«m, por pa limit', dhe njĂ« tjetĂ«r 'i shpejtĂ«, por me njĂ« tarifĂ«'.

Motivimi pĂ«r tĂ« konfiguruar Bind — ofruesi im i internetit ofron njĂ« server DNS tĂ« paqĂ«ndrueshĂ«m, dhe Google ndonjĂ«herĂ« ka gjithashtu probleme. Dua njĂ« server DNS tĂ« qĂ«ndrueshĂ«m pĂ«r pĂ«rdorim personal.

Motivimi pĂ«r tĂ« shkruar artikullin — skica u shkrua 10 muaj mĂ« parĂ« dhe unĂ« e kam parĂ« atĂ« dy herĂ« tashmĂ«. NĂ«se edhe autori ka nevojĂ« pĂ«r tĂ«, ka njĂ« mundĂ«si tĂ« madhe qĂ« edhe tĂ« tjerĂ«t do ta duan.

Nuk ka njĂ« zgjidhje universale pĂ«r njĂ« server tĂ« postĂ«s elektronike. Por unĂ« do tĂ« pĂ«rpiqem tĂ« shkruaj diçka si 'bĂ«ni kĂ«shtu dhe mĂ« pas, kur gjithçka tĂ« funksionojĂ« si duhet — hiqni tĂ« tepĂ«rtĂ«n'.

Kam një server në Colocation me kompaninë tech.ru. Ka mundësi krahasimi me OVH, Hetzner, AWS. Për zgjidhjen e kësaj çështjeje, do të jetë shumë më efektive bashkëpunimi me tech.ru.

Në server është instaluar Debian 9.

Në server ka 2 interface `eno1` dhe `eno2`. E para është pa limit, ndërsa e dyta është e shpejtë përkatësisht.

Ka 3 adresa IP statike, XX.XX.XX.X0 dhe XX.XX.XX.X1 dhe XX.XX.XX.X2 në interface `eno1` dhe XX.XX.XX.X5 në interface `eno2`.

Ka një pool IPv6 adresash XXXX:XXXX:XXXX:XXXX::/64, të cilat janë caktuar në interface `eno1`, dhe nga ato XXXX:XXXX:XXXX:XXXX:1:2::/96 për kërkesën time janë caktuar në `eno2`.

Kam 3 domain-e `domain1.com`, `domain2.com`, `domain3.com`. Për `domain1.com` dhe `domain3.com` ka një certifikatë SSL.

Kam një llogari Google, të cilës dëshiroj t'i lidh një kuti postare `vasya.pupkin@domain1.com` (pranimi dhe dërgimi i postës direkt nga ndërfaqja e gmail).
Duhet të ketë një kuti postare `support@domain2.com`, kopjen e së cilës dëshiroj ta shoh në gmailin tim. Dhe ndonjëherë kam mundësinë të dërgoj diçka në emër të `support@domain2.com` përmes ndërfaqes në internet.

Duhet të ketë një kuti postare `ivanov@domain3.com`, të cilën do ta përdorë Ivanov nga iPhone-i i tij.

E-mail-at e dërguara duhet të përmbushin të gjitha kërkesat moderne për anti-spam.
Duhet të ketë nivelin më të lartë të enkriptimit të parashikuar në rrjetet publike.
Duhet të ketë mbështetje për IPv6 për dërgimin dhe marrjen e e-mail-eve.
Duhet të ketë SpamAssassin, i cili kurrë nuk do të fshijë e-mailet. Por do të bëjë ose bounce, ose do t'i kalojë ose do t'i dërgojë në dosjen IMAP 'Spam'.
Duhet tĂ« jetĂ« e konfiguruar auto-mĂ«simi i SpamAssassin: nĂ«se e lĂ« tĂ« mailin nĂ« dosjen 'Spam' — do tĂ« mĂ«sojĂ« prej saj; nĂ«se e lĂ« nĂ« dosjen 'Spam' — do tĂ« mĂ«sojĂ« prej saj. Rezultatet e mĂ«simit tĂ« SpamAssassin duhet tĂ« ndikojnĂ« nĂ« arritjen e e-mailit nĂ« dosjen 'Spam'.
Skriptet php duhet të jenë në gjendje të dërgojnë e-mail nga çdo domain në këtë server.
Duhet të ketë një shërbim openvpn, me mundësinë për të përdorur IPv6 në klientin, që nuk ka IPv6.

Së pari duhet të konfigurohen interface dhe routimi, duke përfshirë IPv6.
Pastaj duhet të konfigurohet OpenVPN, i cili do të lidhet përmes IPv4 dhe do të ofrojë një adresë IPv6 statike dhe reale për klientin. Ky klient do të ketë qasje në të gjitha shërbimet IPv6 në server dhe në çdo burim IPv6 në internet.
Pastaj duhet të konfigurohet Postfix për dërgimin e e-mail-eve + SPF + DKIM + rDNS dhe gjëra të tjera të tilla.
Pastaj duhet të konfigurohet Dovecot dhe të vendoset Multidomain.
Pastaj duhet të konfigurohet SpamAssassin dhe mësimi.
Në përfundim, instalo Bind.

============= Multi-interface =============

Për të konfiguruar interface duhet të shkruani diçka të tillë në '/etc/network/interfaces'.

# The loopback network interface
auto lo
iface lo inet loopback

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

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

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

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

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

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

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

Këto konfigurime mund të aplikohen në çdo server tek tech.ru (me një miratim të vogël nga suporti) dhe do të funksionojë menjëherë siç duhet.

NĂ«se keni pĂ«rvojĂ« nĂ« konfigurimin e gjĂ«rave tĂ« ngjashme pĂ«r Hetzner, OVH — Ă«shtĂ« ndryshe. MĂ« e komplikuar.

eno1 — Ă«shtĂ« emri i kartĂ«s rrjetit #1 (i ngadalshĂ«m, por pa limit).
eno2 — Ă«shtĂ« emri i kartĂ«s rrjetit #2 (i shpejtĂ«, por me tarifĂ«).
tun0 — emri i kartĂ«s virtuale rrjetit nga OpenVPN.
XX.XX.XX.X0 — IPv4 #1 nĂ« eno1.
XX.XX.XX.X1 — IPv4 #2 nĂ« eno1.
XX.XX.XX.X2 — IPv4 #3 nĂ« eno1.
XX.XX.XX.X5 — IPv4 #1 nĂ« eno2.
XX.XX.XX.1 — porta IPv4.
XXXX:XXXX:XXXX:XXXX::/64 — IPv6 pĂ«r tĂ« gjithĂ« serverin.
XXXX:XXXX:XXXX:XXXX:1:2::/96 — IPv6 pĂ«r eno2, e gjithĂ« e tjera hyn nĂ« eno1.
XXXX:XXXX:XXXX:XXXX::1 — porta e IPv6 (duhet e theksuar, se kĂ«tu mund/duhet bĂ«rĂ« ndryshe. TĂ« jepni IPv6 tĂ« switch-it).
dns-nameservers — tĂ« ndara 127.0.0.1 (pĂ«r shkak se bind Ă«shtĂ« instaluar lokalisht) dhe 213.248.1.6 (kĂ«to janĂ« nga tech.ru).

«table eno1t» dhe «table eno2t» — kuptimi i kĂ«tyre rregullave tĂ« rrugĂ«s Ă«shtĂ« se trafiku i hyrĂ« pĂ«rmes eno1 -> do tĂ« dalĂ« pĂ«rmes tĂ« njĂ«jtit, ndĂ«rsa trafiku i hyrĂ« pĂ«rmes eno2 -> do tĂ« dalĂ« pĂ«rmes tĂ« njĂ«jtit. Po ashtu, lidhjet nga iniciativa e serverit do tĂ« dalin pĂ«rmes eno1.

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

Me këtë komandë ne përcaktojmë se çdo trafik i paqartë, që bie nën çdo rregull të cilit i është caktuar «table eno1t» -> të orientohet në interfacin eno1.

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

Me këtë komandë ne përcaktojmë që çdo trafik nga iniciativa e serverit të orientohet në interfacin eno1.

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

Me këtë komandë ne përcaktojmë rregullat për etiketimin e trafikut.

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

Ky bllok përcakton një IPv4 të dytë për interfacin eno1.

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

Me këtë komandë ne përcaktojmë rrugën nga klientët OpenVPN deri në IPv4 lokale përveç XX.XX.XX.X0.
Pse kjo komandĂ« Ă«shtĂ« e mjaftueshme pĂ«r tĂ« gjithĂ« IPv4 — ende nuk e kuptoj.

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

KĂ«tu ne pĂ«rcaktojmĂ« adresĂ«n pĂ«r vetĂ« interfacin. Serveri do ta pĂ«rdorĂ« si adresĂ« ‘dalĂ«se’. Nuk do tĂ« pĂ«rdoret ndryshe.

Pse është e dhënë «:1:1::» kaq e komplikuar? Për që OpenVPN të funksionojë saktë dhe vetëm për këtë. Rreth kësaj do të flasim më vonë.

PĂ«r sa i pĂ«rket gateway — kĂ«shtu funksionon dhe mjafton. Por nĂ« mĂ«nyrĂ« tĂ« saktĂ« — kĂ«tu duhe tĂ« jepet IPv6 i switch-it ku Ă«shtĂ« i lidhur serveri.

Megjithatë për ndonjë arsye IPv6 ndalon së funksionuari, nëse e bëj kështu. Ndoshta janë ndonjë problematikë nga tech.ru.

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

Kjo Ă«shtĂ« shtimi i adresĂ«s IPv6 nĂ« interfacin. NĂ«se duhen njĂ«qind adresa — atĂ«here do tĂ« thotĂ« njĂ«qind rreshta nĂ« kĂ«tĂ« skedĂ«.

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

Kam shënuar adresat dhe subnet-et e të gjithë interfecave, për t'u paraqitur qartë.
eno1 — duhet tĂ« jetĂ« patjetĂ«r «/64» — sepse Ă«shtĂ« e gjithĂ« pool-i ynĂ« i adresave.
tun0 — subnet-i duhet tĂ« jetĂ« patjetĂ«r mĂ« i madhe se eno1. NĂ« tĂ« kundĂ«rt, nuk do tĂ« jetĂ« e mundur tĂ« konfigurohet gateway IPv6 pĂ«r klientĂ«t OpenVPN.
eno2 — subnet-i duhet tĂ« jetĂ« patjetĂ«r mĂ« i madh se tun0. Ndryshe klientĂ«t OpenVPN nuk do tĂ« kenĂ« akses nĂ« adresat lokale IPv6.
Për qartësi unë kam zgjedhur hapësirën e subnet-it 16, por nëse dëshirohet, mund të bëhet edhe hapësira «1».
Për rrjedhojë 64+16 = 80, dhe 80+16 = 96.

Për më shumë qartësi:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY — kĂ«to janĂ« adresat qĂ« duhet t’i caktohen faqeve tĂ« caktuara ose shĂ«rbimeve nĂ« interfacin eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY — kĂ«to janĂ« adresat qĂ« duhet t’i caktohen faqeve tĂ« caktuara ose shĂ«rbimeve nĂ« interfacin eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY — kĂ«to janĂ« adresat qĂ« duhet t’i caktohen klientĂ«ve OpenVPN ose tĂ« pĂ«rdoren si adresa shĂ«rbyese tĂ« OpenVPN.

PĂ«r konfigurimin e rrjetit — duhet tĂ« ketĂ« mundĂ«si pĂ«r tĂ« rindezur serverin.
Ndryshimet IPv4 kapen gjatĂ« ekzekutimit (patjetĂ«r tĂ« hiqen nĂ« screen — ndryshe kjo komandĂ« thjesht do ta dĂ«mtojĂ« rrjetin nĂ« server):

/etc/init.d/networking restart

Në skedën «/etc/iproute2/rt_tables» shto në fund:

100 eno1t
101 eno2t

Pa këtë, nuk është e mundur të përdoren tabela të personalizuara në skedën «/etc/network/interfaces».
Numrat duhet të jenë unikë dhe më pak se 65535.

Ndryshimet IPv6 ndryshohen lehtësisht pa rindezur, por për këtë duhet të mësosh të pakten tre komanda:

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

Konfigurimi «/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

KĂ«to janĂ« rregullat e ‘sysctl’ tĂ« serverit tim. Do tĂ« theksoj tĂ« rĂ«ndĂ«sishmen.

net.ipv4.ip_forward = 1

Pa këtë OpenVPN nuk do të funksionojë fare.

net.ipv6.ip_nonlocal_bind = 1

Cdo kush qĂ« do tĂ« tentojĂ« tĂ« bĂ«jĂ« bind IPv6 (p.sh. nginx) menjĂ«herĂ« pasi interfaci Ă«shtĂ« pĂ«rditĂ«suar — do tĂ« marrĂ« njĂ« gabim. Se njĂ« adresĂ« e tillĂ« nuk Ă«shtĂ« e aksesueshme.

Për të shmangur një situatë të tillë, bëhet një konfigurim i tillë.

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

Pa këto rregulla, trafiku IPv6 nga klienti OpenVPN nuk del në botë.

Rregulla të tjera ose nuk kanë të bëjnë me temën ose nuk i mbaj mend pse janë.
Por për çdo rast po i lë «siç janë».

PĂ«r tĂ« bĂ«rĂ« qĂ« ndryshimet e kĂ«tij skedĂ« tĂ« kapen pa rindezur serverin — duhen ekzekutuar komandĂ«n:

sysctl -p

Më shumë në detaje rreth rregullave të «tables»: habr.com/post/108690

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

OpenVPN IPv4 nuk funksionon pa iptables.

Unë kam iptables të tillë për 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 — Ă«shtĂ« adresa ime statike IPv4 e makinĂ«s lokale.
10.8.0.0/24 — rrjeti IPv4 openvpn. Adresat IPv4 pĂ«r klientĂ«t openvpn.
Rendi i rregullave është i rëndësishëm.

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

Ky është një kufizim, në mënyrë që vetëm unë nga adresa ime statike IP mund të përdor OpenVPN.

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

PĂ«r tĂ« kaluar paketat IPv4 ndĂ«rmjet klientĂ«ve OpenVPN dhe internetit — nevojitet tĂ« shkruhet njĂ« nga kĂ«to komanda.

Për raste të ndryshme, një nga opsionet nuk është e përshtatshme.
Për rastin tim, të dy komandat janë të përshtatshme.
Pasi lexova dokumentacionin, kam zgjedhur opsionin e parë, sepse konsumon më pak CPU.

PĂ«r tĂ« siguruar qĂ« tĂ« gjitha konfigurimet e iptables tĂ« zbatohen pas rinisjes — duhet t'i ruajmĂ« diku.

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

Këto emra nuk janë zgjedhur rastësisht. Përdoren nga paketa «iptables-persistent».

apt-get install iptables-persistent

Instalimi i paketës kryesore OpenVPN:

apt-get install openvpn easy-rsa

Do të configuroni një shabllon për certifikatat (zëvendësoni vlerat tuaja):

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

Do të redaktojmë konfigurimet e shabllonit të certifikatave:

mcedit vars

...
# Këto janë vlerat e paracaktuar për fushat
# të cilat do të vendosen në certifikatën.
# Mos e lini asnjërën nga këto fusha bosh.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Krasnodar"
export KEY_CITY="Dinskaya"
export KEY_ORG="Own"
export KEY_EMAIL="admin@domain1.com"
export KEY_OU="VPN"

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

Krijojmë certifikatën e serverit:

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

Të përgatisim mundësinë e krijimit të skedarëve përfundimtarë «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

Dofrim një skriptë që do të bashkojë të gjitha skedarët në një skedar 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}/${1}.crt 
    <(echo -e '</cert>n<key>') 
    ${KEY_DIR}/${1}.key 
    <(echo -e '</key>n<tls-auth>') 
    ${KEY_DIR}/ta.key 
    <(echo -e '</tls-auth>') 
    > ${OUTPUT_DIR}/${1}.ovpn

Krijojmë klientin e parë OpenVPN:

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

Skedari «~/client-configs/files/client-name.ovpn» dërgohet në pajisjen e klientit.

Për klientët iOS, do të nevojitet një hile:
Përmbajtja e tagut «tls-auth» duhet të jetë pa komente.
Po ashtu duhet vendosur «key-direction 1» menjëherë përpara tagut «tls-auth».

Do të konfiguroni konfigurimin e serverit 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

Kjo është e nevojshme për të caktuar një adresë statike për çdo klient (nuk është e domosdoshme, por unë e përdor):

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

Detajet më të komplikuara dhe të rëndësishme.

Fatkeqësisht OpenVPN ende nuk di të konfigurojë automatikisht gateway IPv6 për klientët.
Duhet 'duke kaluar dorazi' këtë për çdo klient.

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

Skedari «/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

Skedari «/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

Të dy skriptat përdorin skedarin «/etc/openvpn/variables»:

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

Pse është shkruar kështu, kam vështirësi ta kujtoj.

Tani duket çuditshëm netmask = 112 (këtu duhet të jetë 96).
Dhe prefix është çuditshëm, nuk përputhet me rrjetin tun0.
Por mirë, e lë «si është».

cipher DES-EDE3-CBC

Kjo Ă«shtĂ« pĂ«r ata qĂ« e pĂ«lqejnĂ« — kam zgjedhur kĂ«tĂ« mĂ«nyrĂ« enkriptimi pĂ«r lidhjen.

Më shumë detaje mbi konfigurimin OpenVPN IPv4.

Më shumë detaje mbi konfigurimin OpenVPN IPv6.

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

Instalimi i paketës kryesore:

apt-get install postfix

Gjatë instalimit zgjidhni «internet-site».

Skedari im «/etc/postfix/main.cf» duket kështu:

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

# shtimi i .domain është detyra e MUA-së.
append_dot_mydomain = no

readme_directory = no

# Shihni http://www.postfix.org/COMPATIBILITY_README.html -- parazgjedhja është 2 në
# instalime të reja.
compatibility_level = 2

# Parametrat TLS
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

# Lloji i ruajtjes
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

# Cilësimet SMTP-Auth
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

# Adresa IP për secilën domene
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Le të shqyrtojmë detajet e këtij konfigurimi.

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

Sipas mendimit të anëtarëve të Habr, ky bllok përmban `dezinformim dhe teza të gabuara`.Vetëm pas 8 vjetësh pas fillimit të karrierës sime, fillova të kuptoj se si funksionon SSL.

Prandaj do të marr guximin të përshkruaj se si të përdorim SSL (pa iu përgjigjur pyetjeve 'Si funksionon?' dhe 'Pse funksionon?').

Baza e enkriptimit modern është krijimi i një çifti çelësh (dy mënyra shumë të gjata karakteresh).

NjĂ« 'çelĂ«s' Ă«shtĂ« privat, çelĂ«si tjetĂ«r 'publik'. ÇelĂ«si privat ruhet nĂ« mĂ«nyrĂ« tĂ« kujdesshme nĂ« sekret. ÇelĂ«si publik i shpĂ«rndahet tĂ« gjithĂ«ve qĂ« e dĂ«shirojnĂ«.

Me ndihmën e çelësit publik mund të enkriptohet një varg teksti që vetëm pronari i çelësit privat mund ta dekriptojë.
Kjo është baza e teknologjisë.

Hapi #1 — faqet https.
Brouzeri, kur lidhet me një faqe, merr vesh nga serveri i internetit se faqja është https dhe prandaj kërkon çelësin publik.
Serveri i internetit jep çelësin publik. Brouzeri, duke përdorur çelësin publik, enkripton http-requestin dhe e dërgon atë.
Përmbajtja e http-requestit mund të lexohet vetëm nga ai që ka çelësin privat, pra vetëm nga serveri që ndodhet në adresën e kërkuar.
Http-requesti pĂ«rmban tĂ« paktĂ«n URI. Prandaj, nĂ«se njĂ« vend pĂ«rpiqet tĂ« kufizojĂ« qasjen jo nĂ« tĂ« gjithĂ« faqen, por nĂ« njĂ« faqe tĂ« caktuar — atĂ«herĂ« pĂ«r faqet https, kjo Ă«shtĂ« e pamundur.

Hapi #2 — pĂ«rgjigja e enkriptuar.
Serveri i internetit jep një përgjigje që është e lehtë për t'u lexuar gjatë rrugës.
Zgjidhja Ă«shtĂ« e thjeshtĂ« — brouzeri krijon lokal njĂ« çift tĂ« ngjashĂ«m çelĂ«si privat-publik pĂ«r çdo faqe https.
Dhe së bashku me kërkesën për çelësin publik të faqes, dërgon çelësin e tij publik lokal.
Serveri i internetit e mban mend atë dhe kur dërgon http-response, e enkripton me këtë çelës publik të klientit.
Tani http-response mund të dekriptohet vetëm nga poseduesi i çelësit privat të brouzerit të klientit (pra vetëm klienti vetë).

Hapi #3 — vendosja e njĂ« lidhjeje tĂ« sigurt mbi njĂ« kanal publik.
NĂ« shembullin nr. 2 ka njĂ« dobĂ«si — asgjĂ« nuk e pengon ndonjĂ« palĂ« tĂ« treta tĂ« kapĂ« http-requestin dhe tĂ« modifikojĂ« informacionin mbi çelĂ«sin publik.
Kështu, ndërmjetësi do të jetë në gjendje të shohë të gjithë përmbajtjen e mesazheve të dërguara-marrë derisa kanali i lidhjes të ndryshojë.
TĂ« luftosh kĂ«tĂ« Ă«shtĂ« shumĂ« e thjeshtĂ« — mjafton tĂ« dĂ«rgosh çelĂ«sin publik tĂ« brouzerit si njĂ« mesazh tĂ« enkriptuar me çelĂ«sin publik tĂ« serverit.
Serveri i internetit atëherë në radhë të parë dërgon një përgjigje të tipit 'çelësi yt publik është ky', dhe e enkripton këtë mesazh me këtë çelës publik.
Brouzeri shikon pĂ«rgjigjen — nĂ«se mesazhi 'çelĂ«si yt publik Ă«shtĂ« ky' ka ardhur — kjo Ă«shtĂ« 100% garanci se ky kanal lidhjeje Ă«shtĂ« i sigurt.
Sa i sigurta është?
Krijimi i një kanali të tillë të sigurt ndodh me shpejtësi ping*2. Për shembull 20ms.
Një keqbërës duhet ose të ketë paraprakisht çelësin privat të njërës nga palët, ose të gjejë çelësin privat brenda disa milisekondave.
Kërcënimi i një çelësi privat modern do të marrë një dekadë në një superkompjuter.

Hapi #4 — njĂ« bazĂ« tĂ« dhĂ«nash publike pĂ«r çelĂ«sat publikĂ«.
E qartë është se në të gjithë këtë histori ekziston mundësia për një keqbërës që është në kanalin e komunikimit mes klientit dhe serverit.
Mundësia për klientin të paraqitet si server dhe serverit të paraqitet si klient. Dhe të simulojë një çift çelësash në të dyja drejtimet.
Atëherë sulmuesi do të shohë gjithë trafikun dhe do të ketë mundësinë ta "rregullojë" trafikun.
Për shembull, të ndryshojë adresën ku dërgojnë paratë ose të kopjojë fjalëkalimin nga banka online, ose të bllokojë përmbajtje "të padëshiruar".
Për të luftuar këta sulmues, është krijuar një DB publik me çelësa publikë për çdo faqe https.
Çdo shfletues "e di" pĂ«r ekzistencĂ«n e rreth 200 kĂ«tyre DB-ve. Kjo Ă«shtĂ« e instaluar nĂ« çdo shfletues.
"Dija" mbështetet në çelësin publik nga çdo certifikatë. Kjo do të thotë se lidhja me çdo qendër të certifikimit të veçantë është e pamundur për t'u falsifikuar.

Tani ka një kuptim të thjeshtë se si të përdorim SSL për https.
Nëse mendoni pak, do të bëhet e qartë se si shërbimet speciale mund të hyjnë në këtë strukturë. Por kjo do t'u kushtojë atyre një sforcim të jashtëzakonshëm.
Për organizatat më pak se NSA ose CIA, është praktikisht e pamundur të thyehet niveli aktual i mbrojtjes, edhe për VIP.

Dhe gjithashtu do të shtoj për lidhjet ssh. Atje nuk ka asnjë çelës publik, çfarë të bëjmë. Problemi zgjidhet në dy mënyra.
Opcioni ssh me fjalëkalim:
Gjatë lidhjes së parë, klienti ssh duhet të paralajmërojë se këtu kemi një çelës publik të ri nga serveri ssh.
Dhe gjatĂ« lidhjeve tĂ« mĂ«tejshme, nĂ«se shfaqet paralajmĂ«rimi "çelĂ«si publik i ri nga serveri ssh" — do tĂ« thotĂ« se po pĂ«rpiqen t'ju dĂ«gjojnĂ«.
Ose gjatë lidhjes së parë ju kanë dëgjuar, dhe tani po komunikoni me serverin pa ndërmjetës.
Fakti se dëgjimi është i lehtë, i shpejtë dhe pa përpjekje zbulohet, bën që kjo sulm të përdoret vetëm në raste të veçanta për klientë të caktuar.

Opcioni ssh me çelës:
Marrim një flash drive, e regjistrojmë çelësin privat për serverin ssh (për këtë ka terma dhe një grua nuances të rëndësishme, por po bëj edukatë dhe jo një udhëzim për përdorim).
ÇelĂ«si publik e lĂ«mĂ« nĂ« makinĂ«n ku do tĂ« jetĂ« klienti ssh dhe gjithashtu e mbajmĂ« atĂ« nĂ« sekrete.
E sjellim flash drive në server, e futim, kopjojmë çelësin privat, dhe e djegim flash drive-n dhe përhapim pluhurin në erë (ose të paktën e formatizojmë duke e mbushur me zero).
Kjo Ă«shtĂ« gjithçka — pas njĂ« operacioni tĂ« tillĂ«, do tĂ« jetĂ« e pamundur tĂ« thyehet njĂ« lidhje ssh e tillĂ«. Natyrisht, pas 10 vitesh nĂ« njĂ« superkompjuter mund tĂ« shikoni trafikun — por kjo Ă«shtĂ« njĂ« histori tjetĂ«r.

Më falni për off-topic.

Tani, kur teoria është e njohur. Do të flas për rrjedhën e krijimit të certifikatës ssl.

Me ndihmën e "openssl genrsa" ne krijojmë çelësin privat dhe "provat" për çelësin publik.
"Provat" i dërgojmë një kompania të jashtme, të cilës i paguajmë rreth $9 për certifikatën më të thjeshtë.

Pas disa orëve marrim nga kjo kompani çelësin tonë "publik" dhe disa çelësa të tjerë publikë.

Pse duhet t'i paguajmĂ« njĂ« kompanie tĂ« jashtme pĂ«r tĂ« pĂ«rgatitur çelĂ«sin tim publik — Ă«shtĂ« njĂ« pyetje e veçantĂ«, kĂ«tu nuk do ta shqyrtojmĂ«.

Tani është e qartë se çfarë do të thotë mbishkrimi:

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

Në folderin "/etc/ssl" janë ndërlikuar të gjitha skedarët për çështjet ssl.
domain1.com — emri i domenit.
2018 — viti i krijimit tĂ« çelĂ«save.
"key" — treguesi qĂ« skedari Ă«shtĂ« çelĂ«si privat.

Dhe kuptimi i këtij skedari:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — emri i domenit.
2018 — viti i krijimit tĂ« çelĂ«save.
chained — treguesi qĂ« kĂ«tu Ă«shtĂ« njĂ« zinxhir çelĂ«sash publikĂ« (i pari — çelĂ«si ynĂ« publik dhe tĂ« tjerĂ«t — çfarĂ« u dĂ«rgua nga kompania qĂ« pĂ«rgatiti çelĂ«sin publik).
crt — treguesi qĂ« kĂ«tu Ă«shtĂ« njĂ« certifikatĂ« e gatshme (çelĂ«si publik me shpjegime teknike).

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

Ky vendim në këtë rast nuk përdoret, por shkruhet si shembull.

Sepse një gabim në këtë parametër do të çojë në dërgimin e spam nga serveri juaj (pa vullnetin tuaj).

Më pas provoni të dëshmoni të gjithëve se nuk jeni fajtor.

recipient_delimiter = +

Mund të mos e dinin shumë, por ky është simbol standard për klasifikimin e pasem, dhe mbështetet nga shumica e serverëve modernë të postës.

PĂ«r shembull, nĂ«se keni njĂ« kutinĂ« postare "username@gmail.com", provoni tĂ« dĂ«rgoni nĂ« "username+spam@gmail.com" — shihni se çfarĂ« do tĂ« ndodhte.

inet_protocols = ipv4

Kjo mund të jetë e ndërlikuar.

Por nuk Ă«shtĂ« pa arsye. Çdo domain i ri — fillimisht vetĂ«m IPv4, pastaj aktivizoj IPv6 pĂ«r secilin veçmas.

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

Këtu ne përcaktojmë se gjithë posta e ardhshme shkon në dovecot.
Dhe rregullat pĂ«r domain, mailbox, alias — shihni nĂ« DB.

/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

Tani postfix e di se çfarë duhet bërë si një shërbim për të pranuar email për dërgim përmes autorizimit me dovecot.

Më vërtet nuk kuptoj shumë pse po e përsërisim këtë. Ne tashmë e kemi specifikuar në «virtual_transport» gjithçka që na nevojitet.

Por sistemi postfix Ă«shtĂ« shumĂ« i vjetĂ«r — ndoshta janĂ« mbetjesa nga kohĂ«t e vjetra.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Kjo duhet konfiguruar për çdo server email ndaras.

Kam 3 servera emaili dhe këto konfigurime janë shumë të ndryshme për shkak të kërkesave të ndryshme të përdorimit.

Duhet tĂ« konfiguroni me kujdes — pĂ«rndryshe, spam do tĂ« pĂ«rmbytur aty apo mĂ« keq — spam do tĂ« dalĂ« nga ju.

# SPF
policyd-spf_time_limit = 3600

Konfigurimi për ndonjë plugin të lidhur me verifikimin e SPF për emailat hyrës.

# 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

Konfigurimi që të gjitha emailat dalëse duhet të kenë një DKIM nënshkrim.

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

Ky është një detaj kyç në ruterizimin e emailave gjatë dërgimit nga skriptet PHP.

Skedari «/etc/postfix/sdd_transport.pcre»:

/^www-domain1@domain1.com$/ domain1:
/^www-domain2@domain1.com$/ domain2:
/^www-domain3@domain1.com$/ domain3:
/@domain1.com$/             domain1:
/@domain2.com$/             domain2:
/@domain3.com$/             domain3:

Nga e majta — shprehje tĂ« rregullta. Nga e djathta — etiketĂ«, me tĂ« cilĂ«n shĂ«nohet emaili.
Postfix, nĂ« pĂ«rputhje me etiketĂ«n — do tĂ« marrĂ« parasysh disa rreshta tĂ« tjera tĂ« konfigurimit pĂ«r emailin e caktuar.

Si do tĂ« ri-konfigurohet postfix pĂ«r njĂ« email tĂ« veçantĂ« — do tĂ« tregojĂ« nĂ« «master.cf».

Rreshtat 4, 5, 6 — ata janĂ« kryesorĂ«t. NĂ« emrin e cilit domen e dĂ«rgojmĂ« emailin — atij i vendosim etiketĂ«n.
Por, nuk është gjithmonë që në skriptet PHP në kodin e vjetër specifikohet fusha «from». Atëherë ndihmon emri i përdoruesit.

Artikulli Ă«shtĂ« tashmĂ« shumĂ« i gjerĂ« — nuk do tĂ« doja tĂ« shmangem nĂ« konfigurimin e nginx+fpm.

NĂ« mĂ«nyrĂ« tĂ« pĂ«rmbledhur — pĂ«r çdo website caktojmĂ« pronarin e vet linux-user. Dhe pĂ«rkatĂ«sisht fpm-pool-in e vet.

Fpm-pool përdor çdo version PHP (kjo është e shkëlqyer kur në një server pa probleme për faqet fqinjësore mund të përdoren versione të ndryshme PHP dhe madje edhe php.ini të ndryshme).

Pra, konkretisht për linux-user «www-domain2» ekziston website domain2.com. Në këtë website ka kod për dërgimin e emailave pa specifikuar fushën from.

Pra, edhe në këtë rast emailat do të shkojnë në mënyrë korrekte dhe kurrë nuk do të përfundojnë në spam.

Skedari im «/etc/postfix/master.cf» duket kështu:

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

Skedari nuk Ă«shtĂ« paraqitur nĂ« tĂ«rĂ«si — Ă«shtĂ« shumĂ« i madh.
Kam shënuar vetëm atë që është ndryshuar.

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}

Këto janë konfigurime të lidhura me spamassassin, për të cilin do të flasim më vonë.

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

Lejojmë lidhen me serverin e emailit përmes portës 587.
Për këtë është e nevojshme të autorizohesh.

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

Aktivizojmë verifikimin SPF.

apt-get install postfix-policyd-spf-python

Do të instalojmë paketën për verifikimet SPF më sipër.

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

Dhe kjo është pjesa më interesante. Kjo është mundësia për të dërguar emaila për një domen të veçantë nga një adresë të veçantë IPv4/IPv6.

Kjo bĂ«het pĂ«r shkak tĂ« rDNS. rDNS — Ă«shtĂ« marrja e ndonjĂ« stringu pĂ«rmes adresĂ«s IP.
Dhe për emailin, kjo mundësi përdoret për të konfirmuar se helo përputhet me rDNS të adresës nga e cila u dërgua emaili.

NĂ«se helo nuk pĂ«rputhet me domenin e emailit, emri i tĂ« cilit dĂ«rguar emailin — ne grumbullojmĂ« pikĂ«t e spam.

Helo nuk pĂ«rputhet me rDNS — grumbullohen shumĂ« pikĂ« spam.
Prandaj, për çdo domen duhet të ketë adresë IP të vet.
PĂ«r OVH — nĂ« konsolĂ« ka mundĂ«sinĂ« pĂ«r tĂ« specifikuar rDNS.
PĂ«r tech.ru — kjo zgjidhet pĂ«rmes suportit.
PĂ«r AWS — kjo zgjidhet pĂ«rmes suportit.
«inet_protocols» dhe «smtp_bind_address6» — kĂ«to aktivizojnĂ« mbĂ«shtetje pĂ«r IPv6.
Për IPv6 gjithashtu duhet të shkruhet rDNS.
«syslog_name» — dhe kjo Ă«shtĂ« pĂ«r lehtĂ«sinĂ« e leximit tĂ« logeve.

Të blini certifikata e rekomandoj këtu.

Konfigurimi i kombinimit postfix+dovecot këtu.

Konfigurimi SPF.

============= Dovecot =============

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

Konfigurimi i mysql, instalojmë vetë paketat.

Skedari «/etc/dovecot/conf.d/10-auth.conf»

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorizimi vetëm në mënyrë të enkriptuar.

Skedari «/etc/dovecot/conf.d/10-mail.conf»

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

Këtu do të ceket vendi i ruajtjes së mesazheve.

Dua që ato të ruhen në skedarë dhe të grumbullohen sipas domain-eve.

Skedari «/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 {
  }
}

Ky është skedari kryesor i konfigurimeve të dovecot.
Këtu ne çaktivizojmë lidhjet e paprotektuara.
Dhe aktivizojmë lidhjet e mbrojtura.

Skedari «/etc/dovecot/conf.d/10-ssl.conf»

ssl = e domosdhe
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
}

Ne pohtojmë ssl. Tregojmë se ssl është e detyrueshme.
Dhe vetë çertifikata. Një detaj i rëndësishëm është direktiva "local". Tregon se për lidhjen me cilin IPv4 lokal, cili certifikatë ssl të përdoret.

Dhe, përsa i përket IPv6, kjo nuk është konfiguruar, do ta rregulloj këtë mungesë ndonjëherë më vonë.
XX.XX.XX.X5 (domain2) - nuk ka certifikatë. Për lidhjen e klientëve duhet të tetë domain1.com.
XX.XX.XX.X2 (domain3) - ka certifikatë, për lidhjen e klientëve mund të jepni domain1.com ose domain3.com.

Skedari “/etc/dovecot/conf.d/15-lda.conf”

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Kjo do të nevojitet për spamassassin më vonë.

Skedari “/etc/dovecot/conf.d/20-imap.conf”

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Ky është plugini antispam. Nevojitet për trajnimin e spamassassin gjatë transferimit në/nga dosjen "Spam".

Skedari “/etc/dovecot/conf.d/20-pop3.conf”

protocol pop3 {
}

Thjesht ka një skedar të tillë.

Skedari “/etc/dovecot/conf.d/20-lmtp.conf”

protocol lmtp {
  mail_plugins = $mail_plugins sieve
  postmaster_address = admin@domain1.com
}

Konfigurimi i lmtp.

Skedari “/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
}

Konfigurimet e trajnimit të spamassassin gjatë transferimit në/nga dosjen "Spam".

Skedari “/etc/dovecot/conf.d/90-sieve.conf”

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

Skedari në të cilin tregohet se çfarë të bëhet me email-et e ardhura.

Skedari “/var/lib/dovecot/sieve/default.sieve”

require ["fileinto", "mailbox"];

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

Duhet të kompiloni skedarin: "sievec default.sieve".

Skedari “/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
}

Tregimi i skedave sql për autorizim.
Dhe skedari vetë - si një mënyrë për autorizim.

Skedari “/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';

Kjo korrespondon me konfigurimet e ngjashme për postfix.

Skedari “/etc/dovecot/dovecot.conf”

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

Skedari kryesor i konfigurimit.
E rëndësishme është që këtu po tregojmë-shtojmë protokollet.

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

apt-get install spamassassin spamc

Le të instalojmë paketat.

adduser spamd --disabled-login

Do të shtojmë përdoruesin në emrin e të cilit.

systemctl enable spamassassin.service

Aktivizojmë automatikisht ngarkimin e shërbimit spamassassin gjatë ngarkimit.

Skedari “/etc/default/spamassassin”:

CRON=1

Aktivizojmë përditësimin automatik të rregullave "default".

Skedari “/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

Duhet të krijoni një DB në mysql "sa" me përdoruesin "sa" dhe fjalëkalimin "password" (zëvendësoni me diçka të arsyeshme).

report_safe - në vend të email-it do të dërgohet një raport rreth email-it spam.
use_bayes - këto janë parametrat e mësimit të makinerisë për spamassassin.

Parametrat e tjerë të spamassassin u aplikuan më parë sipas artikullit.

Konfigurimi i përgjithshëm të "spamassassin".
Rreth transferimit të email-eve të reja të Spam në dosjen IMAP "Spam".
Rreth lidhjes së thjeshtë Dovecot + SpamAssassin.
Rekomandoj të lexoni teorinë e trajnimit të spamassassin gjatë lëvizjes së email-eve në dosjet imap (dhe nuk rekomandoj ta përdorni).

============= Kontakt me komunitetin =============

Do të doja të hedh një ide në komunitet për të rritur nivelin e sigurisë së email-eve të dërguara. Ndërsa kam thelluar shumë në temën e postës.

QĂ« pĂ«rdoruesi tĂ« mund tĂ« krijojĂ« njĂ« çift çelĂ«sash nĂ« klientin e tij (outlook, thunderbird, browser-plugin, ...) njĂ« çelĂ«s publik dhe njĂ« privat. ÇelĂ«si publik - tĂ« dĂ«rgohet nĂ« DNS. Privat - tĂ« ruhet nĂ« klientin. ServerĂ«t e emails do tĂ« dinĂ« tĂ« pĂ«rdorin çelĂ«sin publik pĂ«r tĂ« dĂ«rguar te adresat specifike.

Dhe për të mbrojtur nga spam-i në këtë lloj e-maile (po, serveri i postës nuk do të mund të shikojë përmbajtjen) - do të nevojitet të futen 3 rregulla:

  1. Nënshkrimi i vërtetë DKIM i detyrueshëm, SPF i detyrueshëm, rDNS i detyrueshëm.
  2. Një rrjet nervor për të mësuar mbi anti-spam dhe një bazë të dhënash mbi të në anën e klientit.
  3. Algoritmi i enkriptimit duhet të jetë i tillë që ana dërguese të shpenzojë 100 herë më shumë burime CPU për enkriptimin sesa ana marrëse.

Përveç e-maileve publike - zhvilloni një standard të e-mailit ofertë "të filloni një bisedë të sigurt". Një nga përdoruesit (llogaria e postës) i dërgon një e-mail llogarisë tjetër me një bashkëngjitje. Në e-mail është teksti-ofertë për të filluar një kanal të sigurt të komunikimit dhe çelësi publik i pronarit të llogarisë së postës (ndërkohë që çelësi privat është në anën e klientit).

Mund të krijohen madje disa çelësa në mënyrë të veçantë për çdo bisedë. Përdoruesi-pranues mund të pranojë këtë ofertë dhe të dërgojë çelësin e tij publik (po ashtu i bërë veçmas për këtë bisedë). Më pas, përdoruesi i parë dërgon një e-mail kontrolli (të enkriptuar me çelësin publik të përdoruesit të dytë) - kur e merr, përdoruesi i dytë mund të përfundojë se kanali i komunikimit është i besueshëm. Më pas, përdoruesi i dytë dërgon një e-mail kontrolli - dhe atëherë përdoruesi i parë gjithashtu mund të përfundojë se kanali i formuar është i sigurt.

Për të luftuar kapjen e çelësave në rrugë - duhet parashikuar mundësia për të dërguar të paktën një çelës publik përmes një flash drive në protokoll.

Dhe më e rëndësishmja - që gjithë kjo të funksionojë (pyetja "kush do ta paguajë këtë?"):
Të futen çertifikatat e postës me kosto nga 10$ për 3 vjet. Të cilat do të lejojnë dërguesin të tregojë në dns, që "çelësat e mi publikë janë aty." Dhe do të ofrojnë mundësinë për të filluar një lidhje të sigurt. Në të njëjtën kohë - të pranosh këto lidhje falas.
gmail përfundimisht monetizon përdoruesit e tij. Për 10$ në 3 vjet - e drejta për të krijuar kanale të sigurt komunikimi.

============= Përfundim =============

Për të testuar të gjithë artikullin doja të merrja një server të dedikuar për një muaj dhe të blija një domain me çertifikatë ssl.

Por rrethanat e jetës u krijuan në mënyrë që ky çështje u zgjat për 2 muaj.
Dhe ja kur më u lirua sërish koha - vendosa të publikoj artikullin siç është, e jo të rrezikoj që publikimi të zgjatet edhe për një vit.

Nëse do të ketë mjaft pyetje si "a është kjo pjesë mjaft e detajuar" - ndoshta do të gjenden forca për të marrë një server të dedikuar me një domen të ri dhe me një çertifikatë të re SSL dhe të përshkruaj më në detaje, dhe më e rëndësishmja - të zbuloj të gjitha detajet e rëndësishme që mund të kenë munguar.

Gjithashtu do të doja të merrja mendime mbi idenë e çertifikatave të postës. Nëse ideja pëlqehet - do të përpiqem të gjej forcat për të shkruar një draft për rfc.

Kur kopjoni pjesë të mëdha të artikullit - tregoni lidhjen në këtë artikull.
Kur përkthehet në çdo gjuhë tjetër - tregoni lidhjen në këtë artikull.
Në anglisht do të përpiqem vetë ta përkthej dhe do të lë lidhje të kryqëzuara.


Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster