Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Multi-ndërfaqe + SpamAssassin-learn + Bind

Ky artikull ka të bëjë me mënyrën e konfigurimit të një serveri modern të postës.
Postfix + Pëllumbi. SPF + DKIM + rDNS. Me IPv6.
Me kriptim TSL. Me mbështetje për domene të shumta - pjesë me një certifikatë të vërtetë SSL.
Me mbrojtje antispam dhe një vlerësim të lartë antispam nga serverët e tjerë të postës.
Mbështet ndërfaqe të shumta fizike.
Me OpenVPN, lidhja me të cilën është përmes IPv4, dhe e cila siguron IPv6.

Nëse nuk doni 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 bën asnjë përpjekje për të shpjeguar çdo detaj. Shpjegimi shkon tek ajo që nuk është konfiguruar si standard ose është e rëndësishme nga këndvështrimi i konsumatorit.

Motivimi për të krijuar një server poste ka qenë një ëndërr e imja prej kohësh. Kjo mund të tingëllojë budallallëk, por IMHO, është shumë më mirë sesa të ëndërrosh një makinë të re nga marka jote e preferuar.

Ka dy motive për vendosjen e IPv6. Një specialist IT duhet të mësojë vazhdimisht teknologji të reja në mënyrë që të mbijetojë. Do të doja të jap kontributin tim modest në luftën kundër censurës.

Motivimi për konfigurimin e OpenVPN është thjesht që IPv6 të punojë në makinën lokale.
Motivimi për vendosjen e disa ndërfaqeve fizike është se në serverin tim kam një ndërfaqe "të ngadaltë por të pakufizuar" dhe një tjetër "të shpejtë por me tarifë".

Motivimi për konfigurimin e cilësimeve të Bind është se ISP-ja ime ofron një server DNS të paqëndrueshëm dhe google gjithashtu ndonjëherë dështon. Unë dua një server të qëndrueshëm DNS për përdorim personal.

Motivimi për të shkruar një artikull - Unë shkrova një draft 10 muaj më parë, dhe e kam parë tashmë dy herë. Edhe nëse autori ka nevojë rregullisht, ka një probabilitet të lartë që edhe të tjerëve t'u nevojiten.

Nuk ka zgjidhje universale për serverin e postës. Por unë do të përpiqem të shkruaj diçka të tillë si "bëje këtë dhe pastaj, kur gjithçka të funksionojë siç duhet, hidhi gjërat shtesë".

Kompania tech.ru ka një server Colocation. Është e mundur të krahasohet me OVH, Hetzner, AWS. Për të zgjidhur këtë problem, bashkëpunimi me tech.ru do të jetë shumë më efektiv.

Debian 9 është instaluar në server.

Serveri ka 2 ndërfaqe `eno1` dhe `eno2`. E para është e pakufizuar, dhe e dyta është e shpejtë, respektivisht.

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

Në dispozicion XXXX:XXXX:XXXX:XXXX::/64 një grup adresash IPv6 që janë caktuar në ndërfaqen `eno1` dhe prej saj XXXX:XXXX:XXXX:XXXX:1:2::/96 iu caktua `eno2` me kërkesën time.

Ka 3 domene "domain1.com", "domain2.com", "domain3.com". Ekziston një certifikatë SSL për "domain1.com" dhe "domain3.com".

Unë kam një llogari Google me të cilën dëshiroj të lidh kutinë time postare[email mbrojtur]` (marrja e postës dhe dërgimi i postës direkt nga ndërfaqja e gmail).
Duhet të ketë një kuti postare`[email mbrojtur]`, një kopje e emailit nga e cila dua të shoh në gmail-in tim. Dhe është e rrallë të jesh në gjendje të dërgosh diçka në emër të `[email mbrojtur]` nëpërmjet ndërfaqes së internetit.

Duhet të ketë një kuti postare`[email mbrojtur]`, të cilën Ivanov do ta përdor nga iPhone i tij.

Email-et e dërguara duhet të jenë në përputhje me të gjitha kërkesat moderne antispam.
Duhet të ketë nivelin më të lartë të enkriptimit të ofruar në rrjetet publike.
Duhet të ketë mbështetje IPv6 për dërgimin dhe marrjen e letrave.
Duhet të ketë një SpamAssassin që nuk do të fshijë kurrë emailet. Dhe ose do të kërcejë ose do të kapërcejë ose do të dërgohet në dosjen "Spam" IMAP.
Duhet të konfigurohet mësimi automatik i SpamAssassin: nëse lëviz një letër në dosjen Spam, ajo do të mësojë nga kjo; nëse lëviz një letër nga dosja Spam, ajo do të mësojë nga kjo. Rezultatet e trajnimit SpamAssassin duhet të ndikojnë nëse letra përfundon në dosjen Spam.
Skriptet PHP duhet të jenë në gjendje të dërgojnë postë në emër të çdo domeni në një server të caktuar.
Duhet të ketë një shërbim openvpn, me aftësinë për të përdorur IPv6 në një klient që nuk ka IPv6.

Së pari ju duhet të konfiguroni ndërfaqet dhe rrugëzimin, duke përfshirë IPv6.
Pastaj do t'ju duhet të konfiguroni OpenVPN, i cili do të lidhet përmes IPv4 dhe do t'i sigurojë klientit një adresë IPv6 statike-reale. Ky klient do të ketë akses në të gjitha shërbimet IPv6 në server dhe qasje në çdo burim IPv6 në internet.
Pastaj do t'ju duhet të konfiguroni Postfix për të dërguar letra + SPF + DKIM + rDNS dhe gjëra të tjera të vogla të ngjashme.
Pastaj do t'ju duhet të konfiguroni Dovecot dhe të konfiguroni Multidomain.
Pastaj do t'ju duhet të konfiguroni SpamAssassin dhe të konfiguroni trajnimin.
Së fundi, instaloni Bind.

============= Ndërfaqe të shumta ==============

Për të konfiguruar ndërfaqet, duhet ta shkruani këtë 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 cilësime mund të aplikohen në çdo server në tech.ru (me pak koordinim me mbështetjen) dhe menjëherë do të funksionojë ashtu siç duhet.

Nëse keni përvojë në vendosjen e gjërave të ngjashme për Hetzner, OVH, është ndryshe atje. Më i vështirë.

eno1 është emri i kartës së rrjetit #1 (i ngadalshëm por i pakufizuar).
eno2 është emri i kartës së rrjetit #2 (e shpejtë, por me tarifë).
tun0 është emri i kartës së rrjetit virtual 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, gjithçka tjetër nga jashtë shkon në eno1.
XXXX:XXXX:XXXX:XXXX::1 — Porta IPv6 (vlen të përmendet se kjo mund/duhet të bëhet ndryshe. Specifikoni ndërprerësin IPv6).
dns-nameservers - tregohet 127.0.0.1 (sepse bind është instaluar në nivel lokal) dhe 213.248.1.6 (kjo është nga tech.ru).

"Tabela eno1t" dhe "Tabela eno2t" - kuptimi i këtyre rregullave të rrugës është që trafiku që hyn përmes eno1 -> do të dilte përmes tij, dhe trafiku që hynte përmes eno2 -> do të dilte përmes tij. Dhe gjithashtu lidhjet e iniciuara nga serveri do të kalonin përmes eno1.

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

Me këtë komandë ne specifikojmë që çdo trafik i pakuptueshëm që bie nën ndonjë rregull të shënuar "tabelë eno1t" -> të dërgohet në ndërfaqen eno1.

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

Me këtë komandë ne specifikojmë që çdo trafik i inicuar nga serveri duhet të drejtohet në ndërfaqen 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ë vendosim rregullat për shënimin 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 specifikon një IPv4 të dytë për ndërfaqen eno1.

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

Me këtë komandë ne vendosim rrugën nga klientët OpenVPN në IPv4 lokale përveç XX.XX.XX.X0.
Unë ende nuk e kuptoj pse kjo komandë është e mjaftueshme për të gjithë IPv4.

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

Këtu vendosim adresën për vetë ndërfaqen. Serveri do ta përdorë atë si një adresë "dalëse". Nuk do të përdoret më në asnjë mënyrë.

Pse është ":1:1::" kaq e ndërlikuar? Kështu që OpenVPN të funksionojë saktë dhe vetëm për këtë. Më shumë për këtë më vonë.

Në temën e portës - kështu funksionon dhe kjo është në rregull. Por mënyra e duhur është të tregosh këtu IPv6 të çelësit me të cilin është lidhur serveri.

Megjithatë, për disa arsye IPv6 ndalon së punuari nëse e bëj këtë. Ky është ndoshta një lloj problemi tech.ru.

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

Kjo është duke shtuar një adresë IPv6 në ndërfaqe. Nëse keni nevojë për njëqind adresa, kjo do të thotë njëqind rreshta në këtë skedar.

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

Vura re adresat dhe nënrrjetat e të gjitha ndërfaqeve për ta bërë të qartë.
eno1 - duhet të jetë "/64" - sepse ky është i gjithë grupi ynë i adresave.
tun0 - nënrrjeti duhet të jetë më i madh se eno1. Përndryshe, nuk do të jetë e mundur të konfiguroni një portë IPv6 për klientët OpenVPN.
eno2 - nënrrjeti duhet të jetë më i madh se tun0. Përndryshe, klientët OpenVPN nuk do të jenë në gjendje të hyjnë në adresat lokale IPv6.
Për qartësi, zgjodha një hap të nënrrjetit prej 16, por nëse dëshironi, mund të bëni edhe hapin "1".
Prandaj, 64 + 16 = 80, dhe 80 + 16 = 96.

Për qartësi edhe më të madhe:
XXXX:XXX:XXXX:XXXX:1:1:YYYY:YYYY janë adresa që duhet t'u caktohen sajteve ose shërbimeve specifike në ndërfaqen eno1.
XXXX:XXX:XXXX:XXXX:1:2:YYYY:YYYY janë adresa që duhet t'u caktohen sajteve ose shërbimeve specifike në ndërfaqen eno2.
XXXX:XXX:XXXX:XXXX:1:3:YYYY:YYYY janë adresa që duhet t'u caktohen klientëve të OpenVPN ose të përdoren si adresa të shërbimit OpenVPN.

Për të konfiguruar rrjetin, duhet të jetë e mundur të rindizni serverin.
Ndryshimet IPv4 merren kur ekzekutohen (sigurohuni që ta mbyllni në ekran - përndryshe kjo komandë thjesht do të prishë rrjetin në server):

/etc/init.d/networking restart

Shtoni në fund të skedarit "/etc/iproute2/rt_tables":

100 eno1t
101 eno2t

Pa këtë, nuk mund të përdorni tabela të personalizuara në skedarin "/etc/network/interfaces".
Numrat duhet të jenë unikë dhe më pak se 65535.

Ndryshimet IPv6 mund të ndryshohen lehtësisht pa rindezje, por për ta bërë këtë ju duhet të mësoni të paktën tre komanda:

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

Vendosja e "/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ë cilësimet "sysctl" të serverit tim. Më lejoni të theksoj diçka të rëndësishme.

net.ipv4.ip_forward = 1

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

net.ipv6.ip_nonlocal_bind = 1

Kushdo që përpiqet të lidh IPv6 (për shembull nginx) menjëherë pasi ndërfaqja të jetë hapur, do të marrë një gabim. Se kjo adresë nuk është e disponueshme.

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

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

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

Cilësimet e tjera ose nuk janë relevante ose nuk mbaj mend se për çfarë janë.
Por për çdo rast, e lë "siç është".

Në mënyrë që ndryshimet në këtë skedar të merren pa rindezur serverin, duhet të ekzekutoni komandën:

sysctl -p

Më shumë detaje rreth rregullave të "tabelës": habr.com/post/108690

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

OpenVPN IPv4 nuk funksionon pa iptables.

Iptablet e mia janë si kjo 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 - rrjet IPv4 openvpn. Adresat IPv4 për klientët openvpn.
Konsistenca e rregullave është e rëndësishme.

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ë të mund të përdor OpenVPN nga IP-ja ime statike.

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

Për të përcjellë paketat IPv4 midis klientëve OpenVPN dhe Internetit, duhet të regjistroni një nga këto komanda.

Për raste të ndryshme, një nga opsionet nuk është i përshtatshëm.
Të dy komandat janë të përshtatshme për rastin tim.
Pasi lexova dokumentacionin, zgjodha opsionin e parë sepse përdor më pak CPU.

Në mënyrë që të gjitha cilësimet e iptables të merren pas rindezjes, duhet t'i ruani ato diku.

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

Emra të tillë nuk janë zgjedhur rastësisht. Ato përdoren nga paketa "iptables-persistent".

apt-get install iptables-persistent

Instalimi i paketës kryesore OpenVPN:

apt-get install openvpn easy-rsa

Le të vendosim një shabllon për certifikatat (të zëvendësojmë vlerat tuaja):

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

Le të modifikojmë cilësimet e shabllonit të certifikatës:

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

Krijo një certifikatë serveri:

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

Le të përgatisim aftësinë për të krijuar skedarët 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

Le të përgatisim një skript që do të bashkojë të gjithë skedarët në një skedar të vetëm opvn.

mcedit ~/client-configs/make_config.sh
chmod 700 ~/client-configs/make_config.sh

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} 
    <(echo -e '<ca>') 
    ${KEY_DIR}/ca.crt 
    <(echo -e '</ca>n<cert>') 
    ${KEY_DIR}/.crt 
    <(echo -e '</cert>n<key>') 
    ${KEY_DIR}/.key 
    <(echo -e '</key>n<tls-auth>') 
    ${KEY_DIR}/ta.key 
    <(echo -e '</tls-auth>') 
    > ${OUTPUT_DIR}/.ovpn

Krijimi i klientit të 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'ju duhet të bëni trukun e mëposhtëm:
Përmbajtja e etiketës "tls-auth" duhet të jetë pa komente.
Dhe gjithashtu vendosni "key-direction 1" menjëherë përpara etiketës "tls-auth".

Le të konfigurojmë 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ë vendosur një adresë statike për çdo klient (nuk është e nevojshme, por unë e përdor atë):

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

Detaji më i vështirë dhe kyç.

Fatkeqësisht, OpenVPN nuk di ende se si të konfigurojë në mënyrë të pavarur një portë IPv6 për klientët.
Ju duhet ta përcillni "manualisht" këtë për secilin 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 skriptet përdorin skedarin "/etc/openvpn/variables":

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

E kam të vështirë të kujtoj pse është shkruar kështu.

Tani netmask = 112 duket e çuditshme (duhet të jetë 96 pikërisht aty).
Dhe prefiksi është i çuditshëm, nuk përputhet me rrjetin tun0.
Por në rregull, do ta lë ashtu siç është.

cipher DES-EDE3-CBC

Kjo nuk është për të gjithë - zgjodha këtë metodë të kriptimit të lidhjes.

Mësoni më shumë rreth konfigurimit të OpenVPN IPv4.

Mësoni më shumë rreth konfigurimit të OpenVPN IPv6.

============= Postfiks ==============

Instalimi i paketës kryesore:

apt-get install postfix

Kur instaloni, zgjidhni "faqe interneti".

"/etc/postfix/main.cf" im duket kështu:

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

Le të shohim 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 banorëve të Khabrovsk, ky bllok përmban "dezinformata dhe teza të pasakta".Vetëm 8 vjet pas fillimit të karrierës sime fillova të kuptoj se si funksionon SSL.

Prandaj, unë do të marr guximin të përshkruaj se si të përdoret SSL (pa iu përgjigjur pyetjeve "Si funksionon?" dhe "Pse funksionon?").

Baza e kriptimit modern është krijimi i një çifti çelësash (dy vargje shumë të gjata karakteresh).

Njëri "çelës" është privat, çelësi tjetër është "publik". Ne e mbajmë të fshehtë çelësin privat me shumë kujdes. Ne shpërndajmë çelësin publik për të gjithë.

Duke përdorur një çelës publik, ju mund të kriptoni një varg teksti në mënyrë që vetëm pronari i çelësit privat të mund ta deshifrojë atë.
Epo, kjo është e gjithë baza e teknologjisë.

Hapi # 1 - faqet https.
Kur hyn në një sajt, shfletuesi mëson nga serveri i uebit se faqja është https dhe për këtë arsye kërkon një çelës publik.
Ueb serveri jep çelësin publik. Shfletuesi përdor çelësin publik për të enkriptuar kërkesën http dhe për ta dërguar atë.
Përmbajtja e një kërkese http mund të lexohet vetëm nga ata që kanë çelësin privat, domethënë vetëm serveri tek i cili është bërë kërkesa.
Kërkesa Http përmban të paktën një URI. Prandaj, nëse një vend po përpiqet të kufizojë aksesin jo në të gjithë sitin, por në një faqe specifike, atëherë kjo është e pamundur të bëhet për faqet https.

Hapi # 2 - përgjigje e koduar.
Ueb serveri ofron një përgjigje që mund të lexohet lehtësisht në rrugë.
Zgjidhja është jashtëzakonisht e thjeshtë - shfletuesi gjeneron në nivel lokal të njëjtin çift çelësash privat-publik për çdo sajt https.
Dhe së bashku me kërkesën për çelësin publik të faqes, ai dërgon çelësin e tij publik lokal.
Serveri i uebit e kujton atë dhe, kur dërgon përgjigjen http, e kodon atë me çelësin publik të një klienti specifik.
Tani përgjigja http mund të deshifrohet vetëm nga pronari i çelësit privat të shfletuesit të klientit (d.m.th., vetë klienti).

Hapi nr. 3 - krijimi i një lidhjeje të sigurt nëpërmjet një kanali publik.
Ekziston një dobësi në shembullin nr. 2 - asgjë nuk i pengon dashamirësit të përgjojnë një kërkesë http dhe të modifikojnë informacionin rreth çelësit publik.
Kështu, ndërmjetësi do të shohë qartë të gjithë përmbajtjen e mesazheve të dërguara dhe të marra derisa të ndryshojë kanali i komunikimit.
Përballja me këtë është jashtëzakonisht e thjeshtë - thjesht dërgoni çelësin publik të shfletuesit si një mesazh të koduar me çelësin publik të serverit në internet.
Serveri i uebit më pas dërgon fillimisht një përgjigje si "çelësi juaj publik është i tillë" dhe e kodon këtë mesazh me të njëjtin çelës publik.
Shfletuesi shikon përgjigjen - nëse merret mesazhi "çelësi juaj publik është i tillë" - atëherë kjo është një garanci 100% që ky kanal komunikimi është i sigurt.
Sa i sigurt është?
Vetë krijimi i një kanali kaq të sigurt komunikimi ndodh me një shpejtësi prej ping*2. Për shembull 20 ms.
Sulmuesi duhet të ketë paraprakisht çelësin privat të njërës prej palëve. Ose gjeni një çelës privat në disa milisekonda.
Hakerimi i një çelësi privat modern do të marrë dekada në një superkompjuter.

Hapi # 4 - baza e të dhënave publike e çelësave publikë.
Natyrisht, në të gjithë këtë histori ekziston një mundësi që një sulmues të ulet në kanalin e komunikimit midis klientit dhe serverit.
Klienti mund të pretendojë të jetë serveri, dhe serveri mund të pretendojë të jetë klienti. Dhe imitoni një palë çelësa në të dy drejtimet.
Atëherë sulmuesi do të shohë të gjithë trafikun dhe do të jetë në gjendje të "redaktojë" trafikun.
Për shembull, ndryshoni adresën ku të dërgoni para ose kopjoni fjalëkalimin nga bankingu në internet ose bllokoni përmbajtjen "e kundërshtueshme".
Për të luftuar sulmuesit e tillë, ata dolën me një bazë të dhënash publike me çelësa publikë për çdo faqe https.
Çdo shfletues "e di" për ekzistencën e rreth 200 bazave të të dhënave të tilla. Kjo vjen e para-instaluar në çdo shfletues.
"Njohuria" mbështetet nga një çelës publik nga çdo certifikatë. Kjo do të thotë, lidhja me çdo autoritet specifik certifikues nuk mund të falsifikohet.

Tani ka një kuptim të thjeshtë se si të përdoret SSL për https.
Nëse përdorni trurin tuaj, do të bëhet e qartë se si shërbimet speciale mund të hakojnë diçka në këtë strukturë. Por kjo do t'u kushtojë atyre përpjekje monstruoze.
Dhe organizatat më të vogla se NSA ose CIA - është pothuajse e pamundur të hakohet niveli ekzistues i mbrojtjes, madje edhe për VIP-at.

Do të shtoj gjithashtu për lidhjet ssh. Nuk ka çelësa publikë atje, kështu që çfarë mund të bëni? Çështja zgjidhet në dy mënyra.
Opsioni ssh-nga-password:
Gjatë lidhjes së parë, klienti ssh duhet të paralajmërojë se kemi një çelës të ri publik nga serveri ssh.
Dhe gjatë lidhjeve të mëtejshme, nëse shfaqet paralajmërimi "çelës i ri publik nga serveri ssh", do të thotë se ata po përpiqen t'ju përgjojnë.
Ose jeni përgjuar në lidhjen tuaj të parë, por tani komunikoni me serverin pa ndërmjetës.
Në fakt, për faktin se fakti i përgjimit zbulohet lehtësisht, shpejt dhe pa mundim, ky sulm përdoret vetëm në raste të veçanta për një klient specifik.

Opsioni ssh-pas-kyç:
Ne marrim një flash drive, shkruajmë çelësin privat për serverin ssh në të (ka terma dhe shumë nuanca të rëndësishme për këtë, por unë po shkruaj një program edukativ, jo udhëzime për përdorim).
Ne e lëmë çelësin publik në makinën ku do të jetë klienti ssh dhe gjithashtu e mbajmë sekret.
Ne e sjellim flash drive-in në server, e futim atë, kopjojmë çelësin privat dhe djegim flash drive-in dhe shpërndajmë hirin në erë (ose të paktën e formatojmë me zero).
Kjo është e gjitha - pas një operacioni të tillë do të jetë e pamundur të hakohet një lidhje e tillë ssh. Sigurisht, në 10 vjet do të jetë e mundur të shikosh trafikun në një superkompjuter - por kjo është një histori tjetër.

Kërkoj falje për offtopic.

Pra, tani që teoria është e njohur. Unë do t'ju tregoj për rrjedhën e krijimit të një certifikate SSL.

Duke përdorur "openssl genrsa" ne krijojmë një çelës privat dhe "boshllëqe" për çelësin publik.
Ne i dërgojmë "boshllëqet" te një kompani e palës së tretë, së cilës i paguajmë afërsisht 9 dollarë për certifikatën më të thjeshtë.

Pas disa orësh, marrim çelësin tonë "publik" dhe një grup çelësash publikë nga kjo kompani e palës së tretë.

Pse duhet të paguajë një kompani e palës së tretë për regjistrimin e çelësit tim publik është një pyetje më vete, ne nuk do ta shqyrtojmë këtu.

Tani është e qartë se cili është kuptimi i mbishkrimit:

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

Dosja “/etc/ssl” përmban të gjithë skedarët për çështjet ssl.
domain1.com — emri i domenit.
2018 është viti i krijimit të çelësave.
"Çelësi" - përcaktimi që skedari është një çelës privat.

Dhe kuptimi i këtij skedari:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — emri i domenit.
2018 është viti i krijimit të çelësave.
i lidhur me zinxhir - përcaktimi se ekziston një zinxhir çelësash publikë (i pari është çelësi ynë publik dhe pjesa tjetër janë ato që kanë ardhur nga kompania që ka lëshuar çelësin publik).
crt - përcaktimi se ekziston një certifikatë e gatshme (çelës publik me shpjegime teknike).

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

Ky cilësim nuk përdoret në këtë rast, por është shkruar si shembull.

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

Pastaj tregoju të gjithëve se nuk je fajtor.

recipient_delimiter = +

Shumë njerëz mund të mos e dinë, por ky është një karakter standard për renditjen e emaileve dhe mbështetet nga shumica e serverëve modernë të postës.

Për shembull, nëse keni një kuti postare "[email mbrojtur]"provo të dërgosh te"[email mbrojtur]"- shiko çfarë del prej saj.

inet_protocols = ipv4

Kjo mund të jetë konfuze.

Por nuk është vetëm kështu. Çdo domen i ri është si parazgjedhje vetëm IPv4, më pas unë aktivizoj IPv6 për secilën veç e veç.

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 specifikojmë se e gjithë posta hyrëse shkon në dovecot.
Dhe rregullat për domenin, kutinë postare, pseudonimin - shikoni në bazën e të dhënave.

/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 posta mund të pranohet për dërgim të mëtejshëm vetëm pas autorizimit me pëllumb.

Unë me të vërtetë nuk e kuptoj pse kjo është dublikuar këtu. Ne kemi specifikuar tashmë gjithçka që nevojitet në "virtual_transport".

Por sistemi postfix është shumë i vjetër - ndoshta është një rikthim nga kohët e vjetra.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Kjo mund të konfigurohet ndryshe për secilin server të postës.

Unë kam 3 serverë poste në dispozicion dhe këto cilësime janë shumë të ndryshme për shkak të kërkesave të ndryshme të përdorimit.

Duhet ta konfiguroni me kujdes - përndryshe spam-i do të derdhet tek ju, ose edhe më keq - do të derdhet nga ju.

# SPF
policyd-spf_time_limit = 3600

Konfigurimi i disa shtojcave që lidhen me kontrollimin e SPF-së së letrave hyrëse.

# 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

Cilësimi është që ne duhet të ofrojmë një nënshkrim DKIM me të gjitha emailet dalëse.

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

Ky është një detaj kyç në drejtimin e letrave kur dërgoni letra nga skriptet PHP.

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

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

Në të majtë janë shprehjet e rregullta. Në të djathtë është një etiketë që shënon shkronjën.
Postfix në përputhje me etiketën - do të marrë parasysh disa linja të tjera konfigurimi për një letër specifike.

Se si do të rikonfigurohet saktësisht postfix për një shkronjë specifike do të tregohet në "master.cf".

Linjat 4, 5, 6 janë ato kryesore. Në emër të cilit domen po dërgojmë letrën, vendosim këtë etiketë.
Por fusha "nga" nuk tregohet gjithmonë në skriptet PHP në kodin e vjetër. Pastaj emri i përdoruesit vjen në shpëtim.

Artikulli është tashmë i gjerë - nuk do të doja të shpërqehesha duke vendosur nginx+fpm.

Shkurtimisht, për çdo faqe ne kemi vendosur pronarin e vet të përdoruesit të linux. Dhe në përputhje me rrethanat fpm-pool tuaj.

Fpm-pool përdor çdo version të php (është mirë kur në të njëjtin server mund të përdorni versione të ndryshme të php dhe madje edhe php.ini të ndryshme për faqet fqinje pa probleme).

Pra, një përdorues specifik linux "www-domain2" ka një uebfaqe domain2.com. Kjo faqe ka një kod për dërgimin e emaileve pa specifikuar fushën nga.

Pra, edhe në këtë rast letrat do të dërgohen në mënyrë korrekte dhe nuk do të përfundojnë kurrë në spam.

"/etc/postfix/master.cf" im 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 ofrohet i plotë - tashmë është shumë i madh.
Vura re vetëm atë që ndryshoi.

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ë cilësime që lidhen me spamassasin, më shumë për këtë 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

Ne ju lejojmë të lidheni me serverin e postës përmes portit 587.
Për ta bërë këtë, duhet të identifikoheni.

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

Aktivizo kontrollin SPF.

apt-get install postfix-policyd-spf-python

Le të instalojmë paketën për kontrollet SPF më lart.

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ë gjëja më interesante. Kjo është aftësia për të dërguar letra për një domen specifik nga një adresë specifike IPv4/IPv6.

Kjo është bërë për hir të rDNS. rDNS është procesi i marrjes së një vargu sipas adresës IP.
Dhe për postën, kjo veçori përdoret për të konfirmuar që helo përputhet saktësisht me rDNS të adresës nga e cila është dërguar emaili.

Nëse helo nuk përputhet me domenin e postës elektronike në emër të të cilit është dërguar letra, jepen pikë spam.

Helo nuk përputhet me rDNS - jepen shumë pikë spam.
Prandaj, çdo domen duhet të ketë adresën e vet IP.
Për OVH - në tastierë është e mundur të specifikoni rDNS.
Për tech.ru - çështja zgjidhet përmes mbështetjes.
Për AWS, çështja zgjidhet përmes mbështetjes.
"inet_protocols" dhe "smtp_bind_address6" - ne aktivizojmë mbështetjen e IPv6.
Për IPv6 ju duhet gjithashtu të regjistroni rDNS.
"syslog_name" - dhe kjo është për lehtësinë e leximit të regjistrave.

Bleni certifikata Unë rekomandoj këtu.

Vendosja e lidhjes postfix+dovecot këtu.

Vendosja e SPF.

============= Pëllumbi ==============

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

Vendosja e mysql, instalimi i vetë paketave.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorizimi është vetëm i koduar.

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

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

Këtu tregojmë vendndodhjen e ruajtjes së letrave.

Unë dua që ato të ruhen në skedarë dhe të grupohen sipas domenit.

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 konfigurimit të pëllumbave.
Këtu ne çaktivizojmë lidhjet e pasigurta.
Dhe aktivizoni lidhje të sigurta.

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

Vendosja e ssl. Ne tregojmë se kërkohet ssl.
Dhe vetë certifikata. Dhe një detaj i rëndësishëm është direktiva “lokale”. Tregon se cilën çertifikatë SSL duhet përdorur kur lidhet me cilin IPv4 lokal.

Nga rruga, IPv6 nuk është konfiguruar këtu, unë do ta korrigjoj këtë lëshim më vonë.
XX.XX.XX.X5 (domain2) - nuk ka certifikatë. Për të lidhur klientët duhet të specifikoni domain1.com.
XX.XX.XX.X2 (domain3) - ekziston një certifikatë, mund të specifikoni domain1.com ose domain3.com për të lidhur klientët.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Kjo do të jetë e nevojshme për spamassasin në të ardhmen.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Kjo është një shtojcë antispam. Nevojitet për trajnimin e spamassasin në momentin e transferimit në/nga dosja "Spam".

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

protocol pop3 {
}

Ekziston vetëm një skedar i tillë.

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

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

Vendosja e 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
}

Cilësimet e trajnimit Spamassasin në momentin e transferimit në/nga dosja Spam.

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

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

Një skedar që specifikon se çfarë duhet bërë me letrat hyrëse.

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

require ["fileinto", "mailbox"];

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

Ju duhet të përpiloni 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
}

Specifikimi i skedarëve sql për autorizim.
Dhe vetë skedari përdoret si një metodë autorizimi.

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 cilësime të 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.
Gjëja e rëndësishme është që ne tregojmë këtu - shtoni protokolle.

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

apt-get install spamassassin spamc

Le të instalojmë paketat.

adduser spamd --disabled-login

Le të shtojmë një përdorues në emër të të cilit.

systemctl enable spamassassin.service

Ne aktivizojmë shërbimin e ngarkimit automatik të spamassassin pas ngarkimit.

Skedari "/etc/default/spamassassin":

CRON=1

Duke mundësuar përditësimin automatik të rregullave "sipas parazgjedhjes".

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

Ju duhet të krijoni një bazë të dhënash "sa" në mysql me përdoruesin "sa" me fjalëkalimin "password" (zëvendësoni me diçka adekuate).

report_safe - kjo do të dërgojë një raport të postës elektronike të padëshiruar në vend të një letre.
use_bayes janë cilësimet e mësimit të makinerive spamassassin.

Cilësimet e mbetura të spamassassin u përdorën më herët në artikull.

Vendosja e përgjithshme "Spamassassin".
Rreth zhvendosjes së email-eve të reja të padëshiruara në dosjen "Spam" IMAP.
Rreth një kombinimi të thjeshtë të Dovecot + SpamAssassin.
Unë rekomandoj të lexoni teorinë e mësimit të spamassasin kur lëvizni shkronja në dosjet e imazhit (dhe nuk e rekomandoj përdorimin e tij).

============= Apel komunitetit ==============

Do të doja gjithashtu të hedh një ide në komunitet se si të rritet niveli i sigurisë së letrave të dërguara. Meqenëse jam zhytur kaq thellë në temën e postës.

Kështu që përdoruesi mund të krijojë një palë çelësash në klientin e tij (outlook, thunderbird, shfletues-plugin, ...). Publike dhe private. Publike - dërgoni në DNS. Privat - kurseni te klienti. Serverët e postës do të jenë në gjendje të përdorin një çelës publik për t'ia dërguar një marrësi specifik.

Dhe për të mbrojtur kundër spamit me letra të tilla (po, serveri i postës nuk do të jetë në gjendje të shikojë përmbajtjen) - do t'ju duhet të prezantoni 3 rregulla:

  1. Nënshkrimi i vërtetë i detyrueshëm DKIM, SPF i detyrueshëm, rDNS i detyrueshëm.
  2. Një rrjet nervor mbi temën e trajnimit antispam + një bazë të dhënash për të në anën e klientit.
  3. Algoritmi i enkriptimit duhet të jetë i tillë që pala dërguese duhet të shpenzojë 100 herë më shumë fuqi të CPU-së në enkriptim sesa pala marrëse.

Përveç letrave publike, zhvilloni një letër standarde të propozimit "për të filluar korrespondencën e sigurt". Një nga përdoruesit (kutia postare) dërgon një letër me një bashkëngjitje në një kuti postare tjetër. Letra përmban një propozim teksti për të nisur një kanal të sigurt komunikimi për korrespondencën dhe çelësin publik të pronarit të kutisë postare (me një çelës privat në anën e klientit).

Ju madje mund të bëni disa çelësa posaçërisht për secilën korrespondencë. Përdoruesi marrës mund ta pranojë këtë ofertë dhe të dërgojë çelësin e tij publik (i krijuar gjithashtu posaçërisht për këtë korrespondencë). Më pas, përdoruesi i parë dërgon një letër kontrolli shërbimi (të koduar me çelësin publik të përdoruesit të dytë) - pas marrjes së së cilës përdoruesi i dytë mund ta konsiderojë kanalin e formuar të komunikimit të besueshëm. Më pas, përdoruesi i dytë dërgon një letër kontrolli - dhe më pas përdoruesi i parë gjithashtu mund ta konsiderojë kanalin e formuar të sigurt.

Për të luftuar përgjimin e çelësave në rrugë, protokolli duhet të parashikojë mundësinë e transmetimit të të paktën një çelës publik duke përdorur një flash drive.

Dhe gjëja më e rëndësishme është që gjithçka funksionon (pyetja është "kush do të paguajë për të?"):
Futni certifikatat postare duke filluar nga 10 dollarë për 3 vjet. E cila do t'i lejojë dërguesit të tregojë në dns se "çelësat e mi publikë janë atje". Dhe ata do t'ju japin mundësinë për të nisur një lidhje të sigurt. Në të njëjtën kohë, pranimi i lidhjeve të tilla është falas.
Gmail më në fund po fiton para nga përdoruesit e saj. Për 10 dollarë për 3 vjet - e drejta për të krijuar kanale të sigurta korrespondence.

============== Konkluzioni ==============

Për të testuar të gjithë artikullin, do të merrja me qira një server të dedikuar për një muaj dhe do të blija një domen me një certifikatë SSL.

Por rrethanat e jetës u zhvilluan kështu që kjo çështje u zvarrit për 2 muaj.
Dhe kështu, kur pata sërish kohë të lirë, vendosa ta botoj artikullin ashtu siç është, në vend që të rrezikoj që botimi të zvarritet edhe një vit.

Nëse ka mjaft pyetje si "por kjo nuk përshkruhet në detaje të mjaftueshme", atëherë me siguri do të ketë forcë për të marrë një server të dedikuar me një domen të ri dhe një certifikatë të re SSL dhe për ta përshkruar atë edhe më në detaje dhe, shumica. më e rëndësishmja, identifikoni të gjitha detajet e rëndësishme që mungojnë.

Do të doja gjithashtu të merrja komente mbi idetë rreth certifikatave postare. Nëse ju pëlqen ideja, do të përpiqem të gjej forcën për të shkruar një draft për rfc.

Kur kopjoni pjesë të mëdha të një artikulli, jepni një lidhje për këtë artikull.
Kur përktheni në ndonjë gjuhë tjetër, jepni një lidhje me këtë artikull.
Do të përpiqem ta përkthej vetë në anglisht dhe të lë referenca të kryqëzuara.


Burimi: www.habr.com

Shto një koment