Debian + Postfix + Dovecot + multidomeen + SSL + IPv6 + OpenVPN + mitu liidest + SpamAssassin-learn + sidumine

See artikkel räägib kaasaegse meiliserveri seadistamisest.
Postfix + Dovecot. SPF + DKIM + rDNS. IPv6-ga.
TSL-krüptimisega. Mitme domeeni toega – osa tõelise SSL-sertifikaadiga.
Rämpspostivastase kaitse ja kõrge rämpspostitõrje reitinguga teistelt meiliserveritelt.
Toetab mitut füüsilist liidest.
OpenVPN-iga, millega ühendus toimub IPv4 kaudu ja mis pakub IPv6.

Kui te ei soovi kõiki neid tehnoloogiaid õppida, kuid soovite sellise serveri seadistada, siis see artikkel on teie jaoks.

Artiklis ei püüta selgitada iga detaili. Seletus käib selle kohta, mis ei ole standardina konfigureeritud või on tarbija seisukohast oluline.

Motivatsioon meiliserveri püstitamiseks on olnud mu ammune unistus. See võib tunduda rumal, kuid IMHO, see on palju parem kui unistada oma lemmikmargi uuest autost.

IPv6 seadistamiseks on kaks põhjust. IT-spetsialist peab ellujäämiseks pidevalt uusi tehnoloogiaid õppima. Tahaksin anda oma tagasihoidliku panuse tsensuurivastasesse võitlusse.

OpenVPN-i seadistamise motivatsioon on lihtsalt IPv6 kohalikus masinas töötamine.
Mitme füüsilise liidese seadistamise ajendiks on see, et minu serveris on üks liides “aeglane, kuid piiramatu” ja teine ​​“kiire, kuid tariifiga”.

Bind-seadete seadistamise ajendiks on see, et mu Interneti-teenuse pakkuja pakub ebastabiilset DNS-serverit ja ka google ebaõnnestub mõnikord. Soovin stabiilset DNS-serverit isiklikuks kasutamiseks.

Motivatsioon artikli kirjutamiseks – kirjutasin mustandi 10 kuud tagasi ja olen seda juba kaks korda vaadanud. Isegi kui autoril on seda regulaarselt vaja, on suur tõenäosus, et seda läheb vaja ka teistel.

Meiliserveri jaoks pole universaalset lahendust. Aga ma proovin kirjutada midagi sellist nagu "tee seda ja siis, kui kõik töötab nii, nagu peab, visake üleliigne kraam välja."

Ettevõttel tech.ru on Colocation server. Võimalik võrrelda OVH, Hetzneri, AWS-iga. Selle probleemi lahendamiseks on koostöö tech.ru-ga palju tõhusam.

Debian 9 on serverisse installitud.

Serveril on 2 liidest "eno1" ja "eno2". Esimene on piiramatu ja teine ​​on vastavalt kiire.

eno3 liidesel on 0 staatilist IP-aadressi, XX.XX.XX.X1 ja XX.XX.XX.X2 ja XX.XX.XX.X1 ning eno5 liidesel XX.XX.XX.X2. .

Saadaval XXXX:XXXX:XXXX:XXXX::/64 IPv6-aadresside kogum, mis on määratud 'eno1' liidesele ja sellest XXXX:XXXX:XXXX:XXXX:1:2::/96 määrati minu palvel 'eno2'-le.

Seal on 3 domeeni „domain1.com”, „domain2.com”, „domain3.com”. Domeen1.com ja domain3.com jaoks on olemas SSL-sertifikaat.

Mul on Google'i konto, millega tahaksin oma postkasti linkida[meiliga kaitstud]` (kirjade vastuvõtmine ja kirjade saatmine otse gmaili liidesest).
Peab olema postkast`[meiliga kaitstud]`, koopia meilist, mida ma soovin oma Gmailis näha. Ja harva saab midagi ` nimel saata[meiliga kaitstud]` veebiliidese kaudu.

Peab olema postkast`[meiliga kaitstud]', mida Ivanov oma iPhone'ist kasutab.

Saadetud meilid peavad vastama kõigile kaasaegsetele rämpspostitõrje nõuetele.
Avalikes võrkudes peab olema krüpteerimise kõrgeim tase.
IPv6 tugi peaks olema nii kirjade saatmisel kui ka vastuvõtmisel.
Peaks olema SpamAssassin, mis kunagi kirju ei kustuta. Ja see kas põrkub või jäetakse vahele või saadetakse IMAP-i rämpsposti kausta.
SpamAssassini automaatne õppimine peab olema konfigureeritud: kui ma liigutan kirja rämpsposti kausta, õpib ta sellest; kui ma teisaldan kirja rämpsposti kaustast, õpib see sellest. SpamAssassini koolituse tulemused peaksid mõjutama seda, kas kiri jõuab rämpsposti kausta.
PHP-skriptid peavad suutma saata kirju antud serveri mis tahes domeeni nimel.
Peaks olema openvpn-teenus, mis võimaldaks kasutada IPv6-d kliendis, millel pole IPv6-d.

Kõigepealt peate konfigureerima liidesed ja marsruutimise, sealhulgas IPv6.
Seejärel peate konfigureerima OpenVPN-i, mis loob ühenduse IPv4 kaudu ja annab kliendile staatilise-reaalse IPv6-aadressi. Sellel kliendil on juurdepääs kõigile IPv6 teenustele serveris ja juurdepääs kõigile IPv6 ressurssidele Internetis.
Seejärel peate konfigureerima Postfixi, et saata kirju + SPF + DKIM + rDNS ja muid sarnaseid pisiasju.
Seejärel peate konfigureerima Dovecoti ja konfigureerima Multidomeeni.
Seejärel peate konfigureerima SpamAssassini ja konfigureerima koolituse.
Lõpuks installige Bind.

============= Mitu liidest ==============

Liideste konfigureerimiseks peate selle kirjutama kausta "/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

Neid sätteid saab rakendada saidi tech.ru mis tahes serveris (pisut kooskõlastatult toega) ja see töötab kohe nii, nagu peab.

Kui teil on kogemusi sarnaste asjade seadistamisega Hetzneri, OVH jaoks, on see seal erinev. Keerulisem.

eno1 on võrgukaardi nr 1 nimi (aeglane, kuid piiramatu).
eno2 on võrgukaardi nr 2 nimi (kiire, kuid tariifiga).
tun0 on OpenVPN-i virtuaalse võrgukaardi nimi.
XX.XX.XX.X0 – IPv4 nr 1 eno1-l.
XX.XX.XX.X1 – IPv4 nr 2 eno1-l.
XX.XX.XX.X2 – IPv4 nr 3 eno1-l.
XX.XX.XX.X5 – IPv4 nr 1 eno2-l.
XX.XX.XX.1 – IPv4 lüüs.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 kogu serveri jaoks.
XXXX:XXXX:XXXX:XXXX:1:2::/96 – IPv6 eno2 jaoks, kõik muu väljastpoolt läheb eno1-sse.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 lüüs (märkimist väärib, et seda saab/peab tegema teisiti. Määrake IPv6 lüliti).
dns-nimeserverid - on näidatud 127.0.0.1 (kuna sidumine on installitud kohapeal) ja 213.248.1.6 (see pärineb saidilt tech.ru).

"tabel eno1t" ja "tabel eno2t" - nende marsruudireeglite tähendus on see, et läbi eno1 -> sisenev liiklus lahkuks ja läbi eno2 -> sisenev liiklus lahkuks selle kaudu. Ja ka serveri poolt algatatud ühendused käiksid läbi eno1.

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

Selle käsuga täpsustame, et igasugune arusaamatu liiklus, mis kuulub mis tahes reegli alla, mis on tähistatud "tabel eno1t" ->, saadetakse eno1 liidesesse.

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

Selle käsuga täpsustame, et kogu serveri poolt algatatud liiklus tuleb suunata eno1 liidesele.

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

Selle käsuga paneme paika liikluse märgistamise reeglid.

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

See plokk määrab eno4 liidese jaoks teise IPv1.

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

Selle käsuga määrame marsruudi OpenVPN-i klientidelt kohalikule IPv4-le, välja arvatud XX.XX.XX.X0.
Ma ei saa ikka veel aru, miks sellest käsust piisab kogu IPv4 jaoks.

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

Siin määrame liidese enda aadressi. Server kasutab seda "väljamineva" aadressina. Ei kasutata enam mingil moel.

Miks on ":1:1::" nii keeruline? Nii et OpenVPN töötaks õigesti ja ainult selleks. Sellest lähemalt hiljem.

Lüüsi teemal - nii see töötab ja see on hea. Kuid õige viis on siin näidata selle lüliti IPv6, millega server on ühendatud.

Kuid mingil põhjusel lakkab IPv6 töötamast, kui ma seda teen. Tõenäoliselt on see mingi tech.ru probleem.

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

See lisab liidesele IPv6-aadressi. Kui teil on vaja sadat aadressi, tähendab see selles failis sadat rida.

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

Märkisin selgeks kõigi liideste aadressid ja alamvõrgud.
eno1 – peab olema "/64" - sest see on kogu meie aadresside kogum.
tun0 – alamvõrk peab olema suurem kui eno1. Vastasel juhul ei saa OpenVPN-i klientide jaoks IPv6-lüüsi konfigureerida.
eno2 – alamvõrk peab olema suurem kui tun0. Vastasel juhul ei pääse OpenVPN-i kliendid kohalikele IPv6-aadressidele juurde.
Selguse huvides valisin alamvõrgu sammuks 16, kuid soovi korral saate teha isegi "1" sammu.
Vastavalt sellele on 64+16 = 80 ja 80+16 = 96.

Veelgi suurema selguse huvides:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY on aadressid, mis tuleks määrata konkreetsetele saitidele või teenustele eno1 liideses.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY on aadressid, mis tuleks määrata konkreetsetele saitidele või teenustele eno2 liideses.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY on aadressid, mis tuleks määrata OpenVPN-i klientidele või kasutada neid OpenVPN-i teenuseaadressidena.

Võrgu seadistamiseks peaks olema võimalik serverit taaskäivitada.
IPv4 muudatused võetakse kasutusele käivitamisel (mähkige see kindlasti ekraanile - vastasel juhul ajab see käsk lihtsalt serveris võrgu kokku):

/etc/init.d/networking restart

Lisage faili lõppu “/etc/iproute2/rt_tables”:

100 eno1t
101 eno2t

Ilma selleta ei saa te failis „/etc/network/interfaces” kohandatud tabeleid kasutada.
Numbrid peavad olema kordumatud ja väiksemad kui 65535.

IPv6 muudatusi saab hõlpsasti muuta ilma taaskäivitamiseta, kuid selleks peate õppima vähemalt kolm käsku:

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

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

Need on minu serveri "sysctl" seaded. Lubage mul tuua välja midagi olulist.

net.ipv4.ip_forward = 1

Ilma selleta ei tööta OpenVPN üldse.

net.ipv6.ip_nonlocal_bind = 1

Kõik, kes proovivad siduda IPv6 (näiteks nginx) kohe pärast liidese loomist, saavad veateate. Et see aadress pole saadaval.

Sellise olukorra vältimiseks tehakse selline seadistus.

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

Ilma nende IPv6 seadeteta ei lähe OpenVPN-i kliendi liiklus maailmas välja.

Muud seaded ei ole asjakohased või ma ei mäleta, milleks need on mõeldud.
Aga igaks juhuks jätan selle "nagu on".

Selle faili muudatuste vastuvõtmiseks ilma serverit taaskäivitamata peate käivitama käsu:

sysctl -p

Lisateave "tabeli" reeglite kohta: habr.com/post/108690

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

OpenVPN IPv4 ei tööta ilma iptablesita.

Minu iptables on VPN-i jaoks selline:

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 on minu kohaliku masina staatiline IPv4-aadress.
10.8.0.0/24 – IPv4 openvpn-võrk. IPv4 aadressid openvpn klientidele.
Reeglite järjepidevus on oluline.

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

See on piirang, nii et ainult mina saan oma staatilisest IP-st OpenVPN-i kasutada.

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

IPv4 pakettide edastamiseks OpenVPN-i klientide ja Interneti vahel peate registreerima ühe neist käskudest.

Erinevatel juhtudel üks võimalustest ei sobi.
Minu jaoks sobivad mõlemad käsud.
Pärast dokumentatsiooni lugemist valisin esimese võimaluse, kuna see kasutab vähem protsessorit.

Selleks, et pärast taaskäivitamist kõik iptablesi sätted kätte saaks, tuleb need kuhugi salvestada.

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

Selliseid nimesid ei valitud juhuslikult. Neid kasutab pakett "iptables-persistent".

apt-get install iptables-persistent

Peamise OpenVPN-i paketi installimine:

apt-get install openvpn easy-rsa

Seadistame sertifikaatide jaoks malli (asendage oma väärtused):

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

Muudame sertifikaadi malli seadeid:

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

Looge serveri sertifikaat:

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

Valmistame ette võimaluse luua lõplikud “kliendinimi.opvn” failid:

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

Valmistame ette skripti, mis liidab kõik failid üheks opvn-failiks.

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

Esimese OpenVPN-i kliendi loomine:

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

Fail “~/client-configs/files/kliendi-nimi.ovpn” saadetakse kliendi seadmesse.

iOS-i klientide jaoks peate tegema järgmise triki.
Märgendi "tls-auth" sisu peab olema ilma kommentaarideta.
Ja pange ka "key-direction 1" vahetult märgendi "tls-auth" ette.

Konfigureerime OpenVPN-i serveri konfiguratsiooni:

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

Seda on vaja igale kliendile staatilise aadressi määramiseks (pole vajalik, aga ma kasutan seda):

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

Kõige keerulisem ja kõige olulisem detail.

Kahjuks ei tea OpenVPN veel, kuidas klientidele IPv6 lüüsi iseseisvalt konfigureerida.
Peate selle iga kliendi jaoks käsitsi edastama.

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

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

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

Mõlemad skriptid kasutavad faili "/etc/openvpn/variables":

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

Mul on raske meenutada, miks see niimoodi kirjutatud on.

Nüüd näeb võrgumask = 112 imelik välja (see peaks olema 96).
Ja eesliide on kummaline, see ei ühti tun0 võrguga.
Aga olgu, ma jätan selle nii nagu on.

cipher DES-EDE3-CBC

See pole kõigile mõeldud – valisin selle ühenduse krüptimise meetodi.

Lisateave OpenVPN IPv4 seadistamise kohta.

Lisateave OpenVPN IPv6 seadistamise kohta.

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

Põhipaketi installimine:

apt-get install postfix

Installimisel valige "Interneti sait".

Minu "/etc/postfix/main.cf" näeb välja selline:

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

Vaatame selle konfiguratsiooni üksikasju.

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

Habrovski elanike sõnul sisaldab see plokk "desinformatsiooni ja ebaõigeid teese".Alles 8 aastat pärast oma karjääri algust hakkasin mõistma, kuidas SSL töötab.

Seetõttu võtan endale vabaduse kirjeldada, kuidas SSL-i kasutada (ilma vastamata küsimustele "Kuidas see töötab?" ja "Miks see töötab?").

Kaasaegse krüptimise aluseks on võtmepaari (kaks väga pikka märgijada) loomine.

Üks “võti” on privaatne, teine ​​võti “avalik”. Hoiame privaatvõtit väga hoolikalt salajas. Jagame avalikku võtit kõigile.

Avaliku võtme abil saate tekstistringi krüpteerida nii, et ainult privaatvõtme omanik saab selle dekrüpteerida.
Noh, see on kogu tehnoloogia alus.

Samm nr 1 – https-saidid.
Saidile sisenedes saab brauser veebiserverist teada, et sait on https ja küsib seetõttu avalikku võtit.
Veebiserver annab avaliku võtme. Brauser kasutab http-päringu krüptimiseks ja saatmiseks avalikku võtit.
http-päringu sisu saavad lugeda ainult need, kellel on privaatvõti, st ainult server, kuhu päring on tehtud.
Http-päring sisaldab vähemalt URI-d. Seega, kui riik üritab piirata juurdepääsu mitte kogu saidile, vaid konkreetsele lehele, on seda https-saitide puhul võimatu teha.

Samm nr 2 – krüptitud vastus.
Veebiserver annab vastuse, mida saab hõlpsasti ka teel olles lugeda.
Lahendus on äärmiselt lihtne – brauser genereerib lokaalselt iga https saidi jaoks sama privaat-avaliku võtme paari.
Ja koos saidi avaliku võtme taotlusega saadab see ka kohaliku avaliku võtme.
Veebiserver jätab selle meelde ja http-vastuse saatmisel krüpteerib selle konkreetse kliendi avaliku võtmega.
Nüüd saab http-vastust dekrüpteerida ainult kliendi brauseri privaatvõtme omanik (st klient ise).

Samm nr 3 - turvalise ühenduse loomine avaliku kanali kaudu.
Näites nr 2 on haavatavus – miski ei takista heasoovijaid pealtkuulamast http-päringut ja redigeerimast teavet avaliku võtme kohta.
Seega näeb vahendaja selgelt kogu saadetud ja vastuvõetud sõnumite sisu kuni suhtluskanali muutumiseni.
Sellega tegelemine on äärmiselt lihtne – lihtsalt saatke brauseri avalik võti sõnumina, mis on krüpteeritud veebiserveri avaliku võtmega.
Seejärel saadab veebiserver esmalt vastuse nagu "teie avalik võti on selline" ja krüpteerib selle sõnumi sama avaliku võtmega.
Brauser vaatab vastust - kui saabub teade "teie avalik võti on selline" - siis on see 100% garantii, et see suhtluskanal on turvaline.
Kui turvaline see on?
Sellise turvalise sidekanali loomine toimub pingi*2 kiirusega. Näiteks 20 ms.
Ründajal peab eelnevalt olema ühe osapoole privaatvõti. Või leidke privaatvõti paari millisekundiga.
Ühe kaasaegse privaatvõtme häkkimine võtab superarvutis aastakümneid.

Samm #4 – avalike võtmete avalik andmebaas.
Ilmselgelt on kogu selles loos võimalus ka ründajal istuda kliendi ja serveri vahelisel suhtluskanalil.
Klient võib teeselda, et on server, ja server võib teeselda, et on klient. Ja jäljendage klahvipaari mõlemas suunas.
Siis näeb ründaja kogu liiklust ja saab liiklust "redigeerida".
Näiteks muutke raha saatmise aadressi või kopeerige parool Interneti-pangast või blokeerige vastumeelne sisu.
Selliste ründajate vastu võitlemiseks tulid nad välja avaliku andmebaasi avalike võtmetega iga https-saidi jaoks.
Iga brauser "teab" umbes 200 sellise andmebaasi olemasolust. See on igas brauseris eelinstallitud.
„Teadmised” on tagatud iga sertifikaadi avaliku võtmega. See tähendab, et ühendust iga konkreetse sertifitseerimisasutusega ei saa võltsida.

Nüüd on olemas lihtne arusaam, kuidas kasutada SSL-i https-i jaoks.
Kui kasutada oma aju, siis selgub, kuidas eriteenistused saavad selles struktuuris midagi häkkida. Kuid see maksab neile koletuid jõupingutusi.
Ja organisatsioonid, mis on väiksemad kui NSA või CIA - olemasolevat kaitsetaset on peaaegu võimatu häkkida isegi VIP-ide jaoks.

Lisan ka ssh-ühenduste kohta. Seal pole avalikke võtmeid, nii et mida saate teha? Probleem lahendatakse kahel viisil.
Valik ssh-by-password:
Esimese ühenduse ajal peaks ssh-klient hoiatama, et meil on ssh-serverist uus avalik võti.
Ja edasiste ühenduste ajal, kui kuvatakse hoiatus "SSH-serveri uus avalik võti", tähendab see, et nad üritavad teid pealt kuulata.
Või kuulati teid esimesel ühendusel pealt, kuid nüüd suhtlete serveriga ilma vahendajateta.
Kuna pealtkuulamise fakt selgub lihtsalt, kiiresti ja vaevata, kasutatakse seda rünnakut konkreetse kliendi puhul ainult erijuhtudel.

Valik ssh-by-key:
Võtame mälupulga, kirjutame sellele ssh-serveri privaatvõtme (selle jaoks on terminid ja palju olulisi nüansse, kuid ma kirjutan õppeprogrammi, mitte kasutusjuhendit).
Jätame avaliku võtme masinasse, kuhu ssh-klient asub ja hoiame seda ka salajas.
Toome mälupulga serverisse, sisestame, kopeerime privaatvõtme ja põletame mälupulga ning puistame tuha tuulde (või vormindame vähemalt nullidega).
See on kõik - pärast sellist toimingut on sellist ssh-ühendust võimatu häkkida. Muidugi on 10 aasta pärast võimalik liiklust vaadata ka superarvutis – aga see on hoopis teine ​​lugu.

Vabandan offtopicu pärast.

Nii et nüüd on teooria teada. Ma räägin teile SSL-sertifikaadi loomise protsessist.

Kasutades “openssl genrsa” loome avaliku võtme jaoks privaatvõtme ja “tühjad”.
Saadame “toorikud” kolmandale osapoolele ettevõttele, kellele maksame kõige lihtsama sertifikaadi eest ligikaudu 9 dollarit.

Paari tunni pärast saame sellelt kolmanda osapoole ettevõttelt meie avaliku võtme ja mitme avaliku võtme komplekti.

Miks peaks minu avaliku võtme registreerimise eest maksma kolmas osapool, on omaette küsimus, me seda siin ei käsitle.

Nüüd on selge, mis on pealdise tähendus:

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

Kaust „/etc/ssl” sisaldab kõiki ssl-probleemide faile.
domain1.com — domeeninimi.
2018. aasta on võtmeloome aasta.
“võti” – tähis, et fail on privaatvõti.

Ja selle faili tähendus:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — domeeninimi.
2018. aasta on võtmeloome aasta.
aheldatud - tähis, et on olemas avalike võtmete ahel (esimene on meie avalik võti ja ülejäänud on avaliku võtme väljastanud ettevõttelt).
crt - märge, et on olemas valmissertifikaat (avalik võti koos tehniliste selgitustega).

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

Seda sätet antud juhul ei kasutata, vaid see on kirjutatud näitena.

Kuna viga selles parameetris põhjustab teie serverist rämpsposti saatmise (ilma teie tahteta).

Seejärel tõesta kõigile, et sa pole süüdi.

recipient_delimiter = +

Paljud inimesed ei pruugi teada, kuid see on standardne märk e-kirjade järjestamiseks ja seda toetavad enamik kaasaegseid meiliservereid.

Näiteks kui teil on postkast "[meiliga kaitstud]"proovige saata aadressile"[meiliga kaitstud]"- vaata, mis sellest tuleb.

inet_protocols = ipv4

See võib olla segane.

Aga see pole lihtsalt nii. Iga uus domeen on vaikimisi ainult IPv4, siis lülitan IPv6 igale eraldi sisse.

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

Siin täpsustame, et kõik sissetulevad kirjad lähevad dovecot'i.
Ja domeeni, postkasti, aliase reeglid – vaata andmebaasist.

/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

Nüüd teab postfix, et kirju saab edasiseks saatmiseks vastu võtta ainult pärast tuvipuuga autoriseerimist.

Ma tõesti ei saa aru, miks seda siin dubleeritakse. Oleme "virtuaalses transpordis" kõik vajaliku juba täpsustanud.

Kuid postfix-süsteem on väga vana - tõenäoliselt on see vanade aegade tagasiminek.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Seda saab iga meiliserveri jaoks erinevalt konfigureerida.

Minu käsutuses on 3 meiliserverit ja need seaded on erinevate kasutusnõuete tõttu väga erinevad.

Peate selle hoolikalt konfigureerima – vastasel juhul valgub teieni rämpspost või mis veelgi hullem – teie seest valgub välja rämpspost.

# SPF
policyd-spf_time_limit = 3600

Mõne sissetulevate kirjade SPF-i kontrollimisega seotud pistikprogrammi seadistamine.

# 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

Seade on see, et peame andma kõikidele väljaminevatele meilidele DKIM-i allkirja.

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

See on PHP-skriptidest kirjade saatmisel kirjade marsruutimise põhidetail.

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

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

Vasakul on regulaaravaldised. Paremal on silt, mis tähistab tähte.
Postfix vastavalt sildile - võtab konkreetse tähe jaoks arvesse veel mõnda konfiguratsioonirida.

Kuidas täpselt postfix konkreetse kirja jaoks ümber konfigureeritakse, näidatakse failis "master.cf".

Peamised on read 4, 5, 6. Millise domeeni nimel me kirja saadame, paneme selle sildi.
Kuid vana koodi PHP-skriptides ei ole alati välja "alates". Siis tuleb kasutajanimi appi.

Artikkel on juba ulatuslik – ma ei tahaks, et nginx+fpm seadistamine mind segaks.

Lühidalt, iga saidi jaoks määrame oma Linuxi kasutaja omaniku. Ja vastavalt teie fpm-pool.

Fpm-pool kasutab mis tahes php versiooni (see on suurepärane, kui saate samas serveris ilma probleemideta kasutada php erinevaid versioone ja isegi erinevaid php.ini naabersaitide jaoks).

Seega on konkreetsel linuxi kasutajal “www-domain2” veebisait domain2.com. Sellel saidil on kood meilide saatmiseks ilma saatja välja määramata.

Nii et ka sel juhul saadetakse kirjad korrektselt ja ei satu kunagi rämpsposti.

Minu "/etc/postfix/master.cf" näeb välja selline:

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

Faili ei esitata täielikult – see on juba väga suur.
Märkasin ainult seda, mida muudeti.

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}

Need on spamassasiniga seotud seaded, sellest hiljem.

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Võimaldame meiliserveriga ühenduse luua pordi 587 kaudu.
Selleks tuleb sisse logida.

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

SPF-kontrolli lubamine.

apt-get install postfix-policyd-spf-python

Installime ülaltoodud SPF-kontrollide paketi.

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

Ja see on kõige huvitavam. See on võimalus saata konkreetse domeeni jaoks kirju konkreetselt IPv4/IPv6 aadressilt.

Seda tehakse rDNS-i huvides. rDNS on IP-aadressi järgi stringi vastuvõtmise protsess.
Ja posti puhul kasutatakse seda funktsiooni selleks, et kinnitada, et helo vastab täpselt selle aadressi rDNS-ile, millelt meil saadeti.

Kui helo ei vasta e-posti domeenile, kelle nimel kiri saadeti, antakse rämpsposti punkte.

Helo ei vasta rDNS-ile – antakse palju rämpspostipunkte.
Sellest lähtuvalt peab igal domeenil olema oma IP-aadress.
OVH jaoks - konsoolis on võimalik määrata rDNS.
tech.ru jaoks - probleem lahendatakse toe kaudu.
AWS-i puhul lahendatakse probleem toe kaudu.
“inet_protocols” ja “smtp_bind_address6” – lubame IPv6 toe.
IPv6 jaoks peate registreerima ka rDNS-i.
"syslog_name" – ja see on mõeldud logide lugemise hõlbustamiseks.

Osta sertifikaate Soovitan siin.

Postfix+dovecot lingi seadistamine siin.

SPF-i seadistamine.

============= Tuvist ==============

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

Mysql-i seadistamine, pakettide endi installimine.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autoriseerimine on ainult krüpteeritud.

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

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

Siin märgime kirjade hoiukoha.

Ma tahan, et need salvestataks failidesse ja rühmitataks domeeni järgi.

Fail "/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 {
  }
}

See on peamine tuvila konfiguratsioonifail.
Siin keelame turvamata ühendused.
Ja lubage turvalised ühendused.

Fail "/etc/dovecot/conf.d/10-ssl.conf"

ssl = required
ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt
ssl_key = </etc/nginx/ssl/domain1.com.2018.key
local XX.XX.XX.X5 {
  ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt
  ssl_key =  </etc/nginx/ssl/domain2.com.2018.key
}

ssl seadistamine. Märkame, et ssl on nõutav.
Ja sertifikaat ise. Ja oluline detail on "kohalik" direktiiv. Näitab, millist SSL-sertifikaati millise kohaliku IPv4-ga ühenduse loomisel kasutada.

Muide, IPv6 pole siin konfigureeritud, parandan selle väljajätmise hiljem.
XX.XX.XX.X5 (domeen2) – sertifikaat puudub. Klientide ühendamiseks peate määrama domeen1.com.
XX.XX.XX.X2 (domeen3) - sertifikaat on olemas, klientide ühendamiseks saate määrata domeeni1.com või domain3.com.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Seda läheb tulevikus spamassassini jaoks vaja.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

See on rämpspostivastane pistikprogramm. Vajalik spamassasini treenimiseks kausta “Rämpspost”/kausta teisaldamise ajal.

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

protocol pop3 {
}

Just selline fail on olemas.

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

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

Lmtp seadistamine.

Fail "/etc/dovecot/conf.d/90-antispam.conf"

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

Spamassasin treeningu seaded rämpsposti kausta/kausta teisaldamise ajal.

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

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

Fail, mis määrab, mida sissetulevate kirjadega teha.

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

require ["fileinto", "mailbox"];

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

Peate kompileerima faili: "sievec default.sieve".

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

Sql-failide määramine autoriseerimiseks.
Ja faili ennast kasutatakse autoriseerimismeetodina.

Fail "/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';

See vastab postfixi sarnastele sätetele.

Fail "/etc/dovecot/dovecot.conf"

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

Peamine konfiguratsioonifail.
Oluline on see, et me siin näitame - lisage protokollid.

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

apt-get install spamassassin spamc

Paigaldame paketid.

adduser spamd --disabled-login

Lisame kasutaja, kelle nimel.

systemctl enable spamassassin.service

Lubame laadimisel spamassassini automaatse laadimise teenuse.

Fail "/etc/default/spamassassin":

CRON=1

Lubades reeglite automaatse värskendamise “vaikimisi”.

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

Peate looma mysql-is andmebaasi “sa” kasutajaga “sa” parooliga “password” (asenda millegi sobivaga).

report_safe – see saadab kirja asemel teate rämpspostist.
use_bayes on spamassassini masinõppe seaded.

Ülejäänud spamassassini seadeid kasutati artiklis varem.

Üldseade "spamassassin".
Teave uute rämpsposti kirjade teisaldamise kohta IMAP-i rämpsposti kausta.
Dovecot + SpamAssassini lihtsa kombinatsiooni kohta.
Soovitan lugeda spamassasini õppimise teooriat tähtede teisaldamisel imap-kaustades (ja ma ei soovita seda kasutada).

============= Pöörduge kogukonna poole ==============

Ühtlasi tahaks kogukonda visata idee, kuidas tõsta edasi saadetavate kirjade turvataset. Kuna ma olen nii sügavalt posti teemasse sukeldunud.

Et kasutaja saaks luua oma kliendile võtmepaari (outlook, thunderbird, brauseri pistikprogramm, ...). Avalik ja privaatne. Avalik – saada DNS-ile. Privaatne – säästa kliendi arvelt. Meiliserverid saaksid konkreetsele adressaadile saatmiseks kasutada avalikku võtit.

Ja selliste kirjadega rämpsposti eest kaitsmiseks (jah, meiliserver ei saa sisu vaadata) - peate kehtestama 3 reeglit:

  1. Kohustuslik päris DKIM-allkiri, kohustuslik SPF, kohustuslik rDNS.
  2. Närvivõrk rämpspostivastase koolituse teemal + selle jaoks andmebaas kliendi poolel.
  3. Krüpteerimisalgoritm peab olema selline, et saatja pool peab kulutama krüptimisele 100 korda rohkem protsessori võimsust kui vastuvõttev pool.

Lisaks avalikele kirjadele koostage standardne pakkumiskiri "turvalise kirjavahetuse alustamiseks". Üks kasutajatest (postkast) saadab kirja koos manusega teise postkasti. Kirjas on tekstiline ettepanek turvalise sidekanali käivitamiseks kirjavahetuseks ja postkasti omaniku avalik võti (privaatvõtmega kliendi poolel).

Iga kirjavahetuse jaoks saate isegi teha paar võtit. Vastuvõtja kasutaja saab selle pakkumisega nõustuda ja saata oma avaliku võtme (mis on samuti spetsiaalselt selle kirjavahetuse jaoks loodud). Järgmisena saadab esimene kasutaja teenuse juhtkirja (krüpteeritud teise kasutaja avaliku võtmega) – selle saamisel saab teine ​​kasutaja pidada moodustatud sidekanalit usaldusväärseks. Järgmiseks saadab teine ​​kasutaja kontrollkirja – ja siis saab esimene kasutaja ka moodustatud kanali turvaliseks lugeda.

Võtmete pealtkuulamise vastu võitlemiseks peab protokoll ette nägema võimaluse edastada mälupulga abil vähemalt üks avalik võti.

Ja mis kõige tähtsam, see kõik toimib (küsimus on "kes selle eest maksab?"):
Sisestage postisertifikaadid alates 10 dollarist kolmeks aastaks. See võimaldab saatjal dns-is näidata, et "minu avalikud võtmed on seal". Ja need annavad teile võimaluse luua turvaline ühendus. Samas on selliste ühenduste vastuvõtmine tasuta.
gmail teeb lõpuks oma kasutajad rahaks. 10 dollari eest 3 aasta kohta - õigus luua turvalisi kirjavahetuskanaleid.

============= Järeldus ==============

Kogu artikli testimiseks kavatsesin rentida kuuks ajaks spetsiaalse serveri ja osta SSL-sertifikaadiga domeeni.

Kuid eluolud arenesid nii, et see probleem venis 2 kuud.
Ja kui mul jälle vaba aega tekkis, otsustasin avaldada artikli sellisena, nagu see on, mitte riskida, et avaldamine venib veel aastaks.

Kui on päris palju küsimusi nagu “aga seda pole piisavalt detailselt kirjeldatud”, siis ilmselt on jõudu võtta uue domeeni ja uue SSL-sertifikaadiga spetsiaalne server ning kirjeldada seda veelgi detailsemalt ja enamus kõige tähtsam on tuvastada kõik puuduvad olulised üksikasjad.

Samuti soovin saada tagasisidet ideede kohta postitõendite kohta. Kui teile idee meeldib, proovin leida jõudu rfc-le mustand kirjutamiseks.

Artikli suurte osade kopeerimisel lisage sellele artiklile link.
Mis tahes muusse keelde tõlkides lisage selle artikli link.
Püüan selle ise inglise keelde tõlkida ja ristviiteid jätta.


Allikas: www.habr.com

Lisa kommentaar