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

Ta članek govori o tem, kako nastaviti sodoben poštni strežnik.
Postfix + Dovecot. SPF + DKIM + rDNS. Z IPv6.
S šifriranjem TSL. S podporo za več domen - del s pravim SSL certifikatom.
Z zaščito pred neželeno pošto in visoko oceno drugih poštnih strežnikov.
Podpira več fizičnih vmesnikov.
Z OpenVPN, s katerim je povezava prek IPv4 in ki zagotavlja IPv6.

Če se ne želite naučiti vseh teh tehnologij, vendar želite postaviti tak strežnik, potem je ta članek za vas.

Članek ne poskuša pojasniti vsake podrobnosti. Razlaga gre za tisto, kar ni standardno konfigurirano ali je pomembno z vidika potrošnika.

Motivacija za postavitev poštnega strežnika so bile moje dolgoletne sanje. To se morda sliši neumno, a IMHO je veliko bolje kot sanjati o novem avtomobilu vaše najljubše znamke.

Obstajata dva razloga za nastavitev IPv6. Informatik se mora nenehno učiti novih tehnologij, da lahko preživi. Rad bi dal svoj skromen prispevek k boju proti cenzuri.

Motivacija za nastavitev OpenVPN je le omogočiti delovanje IPv6 na lokalnem računalniku.
Motivacija za vzpostavitev več fizičnih vmesnikov je ta, da imam na svojem strežniku en vmesnik “počasen a neomejen” in drugi “hiter a tarifni”.

Motivacija za nastavitev povezovalnih nastavitev je, da moj ponudnik internetnih storitev ponuja nestabilen strežnik DNS, google pa včasih tudi odpove. Želim stabilen strežnik DNS za osebno uporabo.

Motivacija za pisanje članka - osnutek sem napisal pred 10 meseci in sem si ga že dvakrat ogledal. Tudi če jo avtor redno potrebuje, je velika verjetnost, da jo bodo potrebovali tudi drugi.

Univerzalne rešitve za poštni strežnik ni. Vendar bom poskušal napisati nekaj takega, kot je "naredite to in potem, ko bo vse delovalo, kot mora, zavrzite dodatne stvari."

Podjetje tech.ru ima strežnik za kolokacijo. Možno je primerjati z OVH, Hetzner, AWS. Za rešitev te težave bo sodelovanje s tech.ru veliko učinkovitejše.

Debian 9 je nameščen na strežniku.

Strežnik ima 2 vmesnika `eno1` in `eno2`. Prvi je neomejen, drugi pa hiter.

Obstajajo 3 statični naslovi IP, XX.XX.XX.X0 in XX.XX.XX.X1 ter XX.XX.XX.X2 na vmesniku `eno1` in XX.XX.XX.X5 na vmesniku `eno2` .

Na voljo XXXX:XXXX:XXXX:XXXX::/64 zbirka naslovov IPv6, ki so dodeljeni vmesniku `eno1` in iz njega XXXX:XXXX:XXXX:XXXX:1:2::/96 je bilo na mojo zahtevo dodeljeno `eno2`.

Obstajajo 3 domene `domena1.com`, `domena2.com`, `domena3.com`. Obstaja potrdilo SSL za `domain1.com` in `domain3.com`.

Imam Google Račun, s katerim bi rad povezal svoj nabiralnik[e-pošta zaščitena]` (prejemanje in pošiljanje pošte neposredno iz vmesnika gmail).
Mora biti poštni predal`[e-pošta zaščitena]`, kopijo e-pošte, ki jo želim videti v svojem gmailu. In redko je mogoče poslati nekaj v imenu `[e-pošta zaščitena]` prek spletnega vmesnika.

Mora biti poštni predal`[e-pošta zaščitena]`, ki ga bo Ivanov uporabljal iz svojega iPhona.

Poslana e-poštna sporočila morajo ustrezati vsem sodobnim zahtevam za zaščito pred neželeno pošto.
V javnih omrežjih mora biti zagotovljena najvišja raven šifriranja.
IPv6 mora biti podprt tako za pošiljanje kot za prejemanje pisem.
Moral bi obstajati SpamAssassin, ki ne bo nikoli izbrisal e-pošte. In bo bodisi zavrnil ali preskočil ali poslal v mapo »Spam« IMAP.
Samodejno učenje SpamAssassin mora biti konfigurirano: če premaknem pismo v mapo z vsiljeno pošto, se bo učil iz tega; če premaknem pismo iz mape z vsiljeno pošto, se bo iz tega naučilo. Rezultati usposabljanja SpamAssassin bi morali vplivati ​​na to, ali pismo konča v mapi z vsiljeno pošto.
Skripti PHP morajo imeti možnost pošiljanja pošte v imenu katere koli domene na danem strežniku.
Obstajati mora storitev openvpn z možnostjo uporabe IPv6 na odjemalcu, ki nima IPv6.

Najprej morate konfigurirati vmesnike in usmerjanje, vključno z IPv6.
Nato boste morali konfigurirati OpenVPN, ki se bo povezal prek IPv4 in odjemalcu zagotovil statično-pravi naslov IPv6. Ta odjemalec bo imel dostop do vseh storitev IPv6 na strežniku in dostop do vseh virov IPv6 v internetu.
Potem boste morali konfigurirati Postfix za pošiljanje pisem + SPF + DKIM + rDNS in drugih podobnih malenkosti.
Nato boste morali konfigurirati Dovecot in Multidomain.
Potem boste morali konfigurirati SpamAssassin in konfigurirati usposabljanje.
Nazadnje namestite Bind.

============= Več vmesnikov =============

Če želite konfigurirati vmesnike, morate to napisati v “/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

Te nastavitve je mogoče uporabiti na katerem koli strežniku v tech.ru (z malo usklajevanja s podporo) in takoj bo deloval, kot bi moral.

Če imate izkušnje z vzpostavljanjem podobnih stvari za Hetzner, OVH, je tam drugače. Težje.

eno1 je ime omrežne kartice #1 (počasna, a neomejena).
eno2 je ime omrežne kartice #2 (hitra, vendar s tarifo).
tun0 je ime virtualne omrežne kartice iz OpenVPN.
XX.XX.XX.X0 - IPv4 #1 na eno1.
XX.XX.XX.X1 - IPv4 #2 na eno1.
XX.XX.XX.X2 - IPv4 #3 na eno1.
XX.XX.XX.X5 - IPv4 #1 na eno2.
XX.XX.XX.1 - prehod IPv4.
XXXX:XXXX:XXXX:XXXX ::/64 - IPv6 za celoten strežnik.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 za eno2, vse ostalo od zunaj gre v eno1.
XXXX:XXXX:XXXX:XXXX::1 — prehod IPv6 (omeniti je treba, da je to mogoče/treba narediti drugače. Določite stikalo IPv6).
dns-nameservers - navedeno je 127.0.0.1 (ker je bind nameščen lokalno) in 213.248.1.6 (to je iz tech.ru).

“tabela eno1t” in “tabela eno2t” - pomen teh pravil poti je, da bi promet, ki vstopa skozi eno1 ->, zapeljal skozenj, promet, ki vstopa skozi eno2 ->, pa bi zapeljal skozenj. In tudi povezave, ki jih sproži strežnik, bi šle prek eno1.

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

S tem ukazom določimo, da se vsak nerazumljiv promet, ki spada pod katero koli pravilo z oznako “table eno1t” ->, pošlje vmesniku eno1.

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

S tem ukazom določimo, da mora biti vsak promet, ki ga sproži strežnik, usmerjen na vmesnik eno1.

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

S tem ukazom nastavimo pravila za označevanje prometa.

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

Ta blok določa drugi IPv4 za vmesnik eno1.

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

S tem ukazom nastavimo pot od odjemalcev OpenVPN do lokalnega IPv4 razen XX.XX.XX.X0.
Še vedno ne razumem, zakaj je ta ukaz dovolj za vse IPv4.

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

Tukaj nastavimo naslov za sam vmesnik. Strežnik ga bo uporabil kot »odhodni« naslov. Ne bo več uporabljen na noben način.

Zakaj je ":1:1::" tako zapleteno? Tako, da OpenVPN deluje pravilno in samo za to. Več o tem pozneje.

Na temo prehoda - tako deluje in je v redu. Toda pravilen način je, da tukaj navedete IPv6 stikala, na katerega je strežnik povezan.

Vendar IPv6 iz nekega razloga preneha delovati, če to storim. To je verjetno nekakšna težava tech.ru.

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

To vmesniku doda naslov IPv6. Če potrebujete sto naslovov, to pomeni sto vrstic v tej datoteki.

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

Zabeležil sem si naslove in podomrežja vseh vmesnikov, da bi bilo jasno.
eno1 - mora biti "/64" - ker je to naš celoten nabor naslovov.
tun0 - podomrežje mora biti večje od eno1. V nasprotnem primeru ne bo mogoče konfigurirati prehoda IPv6 za odjemalce OpenVPN.
eno2 - podomrežje mora biti večje od tun0. V nasprotnem primeru odjemalci OpenVPN ne bodo mogli dostopati do lokalnih naslovov IPv6.
Zaradi jasnosti sem izbral korak podomrežja 16, če pa želite, lahko naredite celo korak "1".
V skladu s tem je 64+16 = 80 in 80+16 = 96.

Za še večjo jasnost:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY so naslovi, ki jih je treba dodeliti določenim mestom ali storitvam na vmesniku eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY so naslovi, ki jih je treba dodeliti določenim mestom ali storitvam na vmesniku eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY so naslovi, ki jih je treba dodeliti odjemalcem OpenVPN ali uporabiti kot naslove storitve OpenVPN.

Za konfiguracijo omrežja mora biti mogoče znova zagnati strežnik.
Spremembe IPv4 se prevzamejo, ko se izvedejo (prepričajte se, da ste jih zavili v zaslon - drugače bo ta ukaz preprosto zrušil omrežje na strežniku):

/etc/init.d/networking restart

Dodajte na konec datoteke “/etc/iproute2/rt_tables”:

100 eno1t
101 eno2t

Brez tega ne morete uporabljati tabel po meri v datoteki »/etc/network/interfaces«.
Številke morajo biti edinstvene in manjše od 65535.

Spremembe IPv6 je mogoče preprosto spremeniti brez ponovnega zagona, vendar se morate za to naučiti vsaj treh ukazov:

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

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

To so nastavitve "sysctl" mojega strežnika. Naj izpostavim nekaj pomembnega.

net.ipv4.ip_forward = 1

Brez tega OpenVPN sploh ne bo deloval.

net.ipv6.ip_nonlocal_bind = 1

Vsakdo, ki poskuša povezati IPv6 (na primer nginx) takoj po vzpostavitvi vmesnika, bo prejel napako. Da ta naslov ni dosegljiv.

Da bi se izognili takšni situaciji, je narejena taka nastavitev.

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

Brez teh nastavitev IPv6 promet iz odjemalca OpenVPN ne gre v svet.

Druge nastavitve niso pomembne ali pa se ne spomnim, čemu so namenjene.
Toda za vsak slučaj ga pustim "kot je."

Če želite, da se spremembe te datoteke poberejo brez ponovnega zagona strežnika, morate zagnati ukaz:

sysctl -p

Več podrobnosti o pravilih »table«: habr.com/post/108690

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

OpenVPN IPv4 ne deluje brez iptables.

Moje iptables so takšne za 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 je moj statični naslov IPv4 lokalnega računalnika.
10.8.0.0/24 - Omrežje IPv4 openvpn. Naslovi IPv4 za odjemalce openvpn.
Pomembna je doslednost pravil.

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

To je omejitev, tako da lahko samo jaz uporabljam OpenVPN s svojega statičnega IP-ja.

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

Če želite posredovati pakete IPv4 med odjemalci OpenVPN in internetom, morate registrirati enega od teh ukazov.

Za različne primere ena od možnosti ni primerna.
Oba ukaza sta primerna za moj primer.
Po branju dokumentacije sem izbral prvo možnost, ker porabi manj procesorja.

Da se vse nastavitve iptables prevzamejo po ponovnem zagonu, jih morate nekam shraniti.

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

Takšna imena niso bila izbrana naključno. Uporablja jih paket "iptables-persistent".

apt-get install iptables-persistent

Namestitev glavnega paketa OpenVPN:

apt-get install openvpn easy-rsa

Nastavimo predlogo za potrdila (nadomestite svoje vrednosti):

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

Uredimo nastavitve predloge potrdila:

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

Ustvarite potrdilo strežnika:

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

Pripravimo zmožnost ustvarjanja končnih datotek »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

Pripravimo skript, ki bo združil vse datoteke v eno datoteko 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

Ustvarjanje prvega odjemalca OpenVPN:

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

Datoteka »~/client-configs/files/client-name.ovpn« se pošlje v odjemalčevo napravo.

Za odjemalce iOS boste morali narediti naslednji trik:
Vsebina oznake "tls-auth" mora biti brez komentarjev.
Prav tako postavite "key-direction 1" neposredno pred oznako "tl-auth".

Konfigurirajmo konfiguracijo strežnika 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

To je potrebno za nastavitev statičnega naslova za vsakega odjemalca (ni potrebno, vendar ga uporabljam):

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

Najtežja in ključna podrobnost.

Na žalost OpenVPN še ne zna samostojno konfigurirati prehoda IPv6 za odjemalce.
To morate "ročno" posredovati za vsako stranko.

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

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

Datoteka »/etc/openvpn/server-clientdisconnect.sh«:

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Delete proxy rule
/sbin/ip -6 neigh del proxy $ipv6 dev eno1

Oba skripta uporabljata datoteko “/etc/openvpn/variables”:

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

Težko se spomnim, zakaj je tako napisano.

Zdaj je omrežna maska ​​= 112 videti čudno (tam bi morala biti 96).
In predpona je čudna, ne ustreza omrežju tun0.
Ampak v redu, pustil bom, kot je.

cipher DES-EDE3-CBC

To ni za vsakogar - izbral sem ta način šifriranja povezave.

Izvedite več o nastavitvi OpenVPN IPv4.

Izvedite več o nastavitvi OpenVPN IPv6.

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

Namestitev glavnega paketa:

apt-get install postfix

Pri namestitvi izberite »internetna stran«.

Moj "/etc/postfix/main.cf" izgleda takole:

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

Oglejmo si podrobnosti te konfiguracije.

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

Po mnenju prebivalcev Khabrovsk ta blok vsebuje "dezinformacije in napačne teze."Šele 8 let po začetku kariere sem začel razumeti, kako deluje SSL.

Zato si bom dovolil opisati, kako uporabljati SSL (brez odgovorov na vprašanja "Kako deluje?" in "Zakaj deluje?").

Osnova sodobnega šifriranja je izdelava para ključev (dva zelo dolga niza znakov).

En "ključ" je zaseben, drugi ključ je "javni". Zasebni ključ hranimo zelo skrbno tajno. Javni ključ razdelimo vsem.

Z javnim ključem lahko šifrirate niz besedila, tako da ga lahko dešifrira le lastnik zasebnega ključa.
No, to je celotna osnova tehnologije.

1. korak – spletna mesta https.
Ko dostopa do spletnega mesta, brskalnik od spletnega strežnika izve, da je spletno mesto https in zato zahteva javni ključ.
Spletni strežnik daje javni ključ. Brskalnik uporablja javni ključ za šifriranje http-zahteve in njeno pošiljanje.
Vsebino http-zahteve lahko berejo samo tisti, ki imajo zasebni ključ, torej samo strežnik, na katerega je zahteva poslana.
Http-zahteva vsebuje vsaj URI. Torej, če država poskuša omejiti dostop ne do celotnega spletnega mesta, ampak do določene strani, potem to ni mogoče storiti za spletna mesta https.

2. korak - šifriran odgovor.
Spletni strežnik ponuja odgovor, ki ga zlahka preberete na poti.
Rešitev je izjemno preprosta – brskalnik lokalno generira isti par zasebnih in javnih ključev za vsako spletno mesto https.
In skupaj z zahtevo po javnem ključu spletnega mesta pošlje svoj lokalni javni ključ.
Spletni strežnik si ga zapomni in ga ob pošiljanju http-odgovora šifrira z javnim ključem določenega odjemalca.
Zdaj lahko http-odziv dešifrira le lastnik zasebnega ključa brskalnika odjemalca (to je odjemalec sam).

3. korak - vzpostavitev varne povezave preko javnega kanala.
V primeru št. 2 obstaja ranljivost - dobronamernikom nič ne preprečuje, da bi prestregli http-zahtevo in uredili informacije o javnem ključu.
Tako bo posrednik jasno videl vso vsebino poslanih in prejetih sporočil, dokler se komunikacijski kanal ne spremeni.
Ukvarjanje s tem je zelo preprosto - preprosto pošljite javni ključ brskalnika kot sporočilo, šifrirano z javnim ključem spletnega strežnika.
Spletni strežnik nato najprej pošlje odgovor, kot je "vaš javni ključ je tak" in to sporočilo šifrira z istim javnim ključem.
Brskalnik pogleda odgovor - če prejme sporočilo "vaš javni ključ je tak" - je to 100-odstotno zagotovilo, da je ta komunikacijski kanal varen.
Kako varno je?
Sama izdelava takšnega varnega komunikacijskega kanala poteka s hitrostjo ping*2. Na primer 20ms.
Napadalec mora vnaprej imeti zasebni ključ ene od strank. Ali poiščite zasebni ključ v nekaj milisekundah.
Vdor v en sodoben zasebni ključ bo na superračunalniku trajal desetletja.

Korak #4 - javna baza javnih ključev.
Očitno je v vsej tej zgodbi priložnost, da se napadalec usede na komunikacijski kanal med odjemalcem in strežnikom.
Odjemalec se lahko pretvarja, da je strežnik, in strežnik se lahko pretvarja, da je odjemalec. In posnemajte par ključev v obe smeri.
Nato bo napadalec videl ves promet in bo lahko "urejal" promet.
Na primer, spremenite naslov, kamor želite poslati denar, ali kopirate geslo iz spletnega bančništva ali blokirate »sporno« vsebino.
Za boj proti takšnim napadalcem so pripravili javno zbirko podatkov z javnimi ključi za vsako spletno mesto https.
Vsak brskalnik »ve« za obstoj približno 200 takih baz podatkov. To je vnaprej nameščeno v vsakem brskalniku.
»Znanje« je podprto z javnim ključem iz vsakega certifikata. To pomeni, da povezave do posameznega overitelja potrdil ni mogoče ponarediti.

Zdaj obstaja preprosto razumevanje uporabe SSL za https.
Če uporabite svoje možgane, bo postalo jasno, kako lahko posebne službe vdrejo v nekaj v tej strukturi. Toda to jih bo stalo pošastnih naporov.
In organizacije, manjše od NSA ali CIA - skoraj nemogoče je vdreti v obstoječo raven zaščite, tudi za VIP osebe.

Dodal bom tudi o ssh povezavah. Tam ni javnih ključev, kaj lahko storite? Zadeva se rešuje na dva načina.
Možnost ssh-by-password:
Pri prvi povezavi bi moral odjemalec ssh opozoriti, da imamo nov javni ključ ssh strežnika.
In če se med nadaljnjimi povezavami pojavi opozorilo “nov javni ključ iz ssh strežnika”, bo to pomenilo, da vam poskušajo prisluškovati.
Ali pa so vam pri prvi povezavi prisluškovali, zdaj pa s strežnikom komunicirate brez posrednikov.
Pravzaprav se zaradi dejstva, da se dejstvo prisluškovanja razkrije enostavno, hitro in brez napora, ta napad uporablja le v posebnih primerih za določeno stranko.

Možnost ssh po ključu:
Vzamemo bliskovni pogon, nanj napišemo zasebni ključ za strežnik ssh (za to obstajajo izrazi in veliko pomembnih odtenkov, vendar pišem izobraževalni program, ne navodil za uporabo).
Javni ključ pustimo na stroju, kjer bo odjemalec ssh in ga tudi tajimo.
Flash disk prinesemo na strežnik, ga vstavimo, skopiramo zasebni ključ in flash disk zažgemo ter raztresemo pepel v veter (ali ga vsaj formatiramo z ničlami).
To je vse - po taki operaciji bo nemogoče vdreti v takšno ssh povezavo. Seveda si bo čez 10 let mogoče ogledati promet na superračunalniku - a to je druga zgodba.

Se opravičujem za offtopic.

Zdaj, ko je teorija znana. Povedal vam bom o poteku ustvarjanja SSL certifikata.

Z uporabo “openssl genrsa” ustvarimo zasebni ključ in “prazne” za javni ključ.
"Prazne" pošljemo tretjemu podjetju, ki mu za najpreprostejše potrdilo plačamo približno 9 USD.

Po nekaj urah prejmemo naš "javni" ključ in niz več javnih ključev od tega tretjega podjetja.

Zakaj bi tretja oseba morala plačati registracijo mojega javnega ključa, je ločeno vprašanje, tukaj ga ne bomo obravnavali.

Zdaj je jasno, kaj pomeni napis:

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

Mapa »/etc/ssl« vsebuje vse datoteke za težave s ssl.
domain1.com — ime domene.
2018 je leto ključnega ustvarjanja.
“ključ” - oznaka, da je datoteka zasebni ključ.

In pomen te datoteke:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — ime domene.
2018 je leto ključnega ustvarjanja.
verižno - oznaka, da obstaja veriga javnih ključev (prvi je naš javni ključ, ostali pa tisti, ki so prišli od podjetja, ki je javni ključ izdalo).
crt - oznaka, da obstaja že pripravljen certifikat (javni ključ s tehničnimi pojasnili).

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

Ta nastavitev se v tem primeru ne uporablja, ampak je napisana kot primer.

Ker bo napaka v tem parametru povzročila pošiljanje neželene pošte z vašega strežnika (brez vaše volje).

Potem pa vsem dokaži, da nisi kriv.

recipient_delimiter = +

Marsikdo morda ne ve, vendar je to standardni znak za razvrščanje e-poštnih sporočil in ga podpira večina sodobnih poštnih strežnikov.

Na primer, če imate nabiralnik "[e-pošta zaščitena]"poskusite poslati"[e-pošta zaščitena]"- poglej, kaj nastane iz tega.

inet_protocols = ipv4

To je lahko zmedeno.

A ni kar tako. Vsaka nova domena je privzeto samo IPv4, potem IPv6 vklopim za vsako posebej.

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

Tukaj določimo, da gre vsa dohodna pošta v dovecot.
Pa pravila za domeno, nabiralnik, vzdevek - poglej v bazo.

/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

Zdaj postfix ve, da je pošto mogoče sprejeti za nadaljnje pošiljanje šele po avtorizaciji z dovecot.

Res ne razumem, zakaj se to tukaj podvaja. Vse, kar je potrebno, smo že določili v “virtualnem_transportu”.

Toda sistem postfix je zelo star - verjetno gre za vrnitev iz starih časov.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

To je mogoče konfigurirati drugače za vsak poštni strežnik.

Na voljo imam 3 poštne strežnike in te nastavitve so zelo različne zaradi različnih zahtev uporabe.

Morate ga skrbno konfigurirati - sicer se bo neželena pošta vlivala k vam ali še huje - neželena pošta se bo izlila od vas.

# SPF
policyd-spf_time_limit = 3600

Nastavitev nekega vtičnika, povezanega s preverjanjem SPF dohodnih pisem.

# 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

Nastavitev je, da moramo vsem odhodnim e-poštnim sporočilom zagotoviti podpis DKIM.

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

To je ključna podrobnost pri usmerjanju pisem pri pošiljanju pisem iz PHP skriptov.

Datoteka “/etc/postfix/sdd_transport.pcre”:

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

Na levi strani so regularni izrazi. Na desni je oznaka, ki označuje črko.
Postfix v skladu z oznako - bo upošteval nekaj več konfiguracijskih vrstic za določeno črko.

Kako natančno bo postfix prekonfiguriran za določeno črko, bo navedeno v »master.cf«.

Vrstice 4, 5, 6 so glavne. V imenu katere domene pošiljamo pismo, postavimo to oznako.
Toda polje »od« ni vedno navedeno v skriptih PHP v stari kodi. Takrat na pomoč priskoči uporabniško ime.

Članek je že obsežen - ne bi rad, da bi me motilo nastavljanje nginx+fpm.

Na kratko, za vsako stran nastavimo lastnega lastnika uporabnika linux. In s tem vaš fpm-pool.

Fpm-pool uporablja katero koli različico php (super je, če lahko na istem strežniku brez težav uporabljate različne različice php in celo drugačen php.ini za sosednja mesta).

Torej ima določen uporabnik linuxa »www-domain2« spletno mesto domain2.com. To spletno mesto ima kodo za pošiljanje e-pošte brez podajanja polja pošiljatelja.

Torej bodo pisma tudi v tem primeru poslana pravilno in nikoli ne bodo pristala v neželeni pošti.

Moj "/etc/postfix/master.cf" izgleda takole:

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

Datoteka ni na voljo v celoti - je že zelo velika.
Opazil sem le, kaj se je spremenilo.

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}

To so nastavitve, povezane s spamassasinom, več o tem kasneje.

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

Omogočamo vam povezavo s poštnim strežnikom prek vrat 587.
Če želite to narediti, se morate prijaviti.

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

Omogoči preverjanje SPF.

apt-get install postfix-policyd-spf-python

Namestimo zgornji paket za preverjanje SPF.

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

In to je najbolj zanimivo. To je možnost pošiljanja pisem za določeno domeno z določenega naslova IPv4/IPv6.

To se naredi zaradi rDNS. rDNS je postopek prejemanja niza po naslovu IP.
Za pošto se ta funkcija uporablja za potrditev, da se helo natančno ujema z rDNS naslova, s katerega je bilo poslano e-poštno sporočilo.

Če se helo ne ujema z e-poštno domeno, v imenu katere je bilo pismo poslano, se dodelijo točke neželene pošte.

Helo se ne ujema z rDNS - dodeljenih je veliko točk neželene pošte.
V skladu s tem mora imeti vsaka domena svoj naslov IP.
Za OVH - v konzoli je možno določiti rDNS.
Za tech.ru - težava je rešena s podporo.
Za AWS se težava reši s podporo.
“inet_protocols” in “smtp_bind_address6” - omogočimo IPv6 podporo.
Za IPv6 morate registrirati tudi rDNS.
“syslog_name” - in to je za lažje branje dnevnikov.

Kupite certifikate Priporočam tukaj.

Tukaj nastavite povezavo postfix+dovecot.

Nastavitev SPF.

============= Golobnjak =============

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

Nastavitev mysql, namestitev samih paketov.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Avtorizacija je samo šifrirana.

Datoteka “/etc/dovecot/conf.d/10-mail.conf”

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

Tukaj navedemo mesto shranjevanja črk.

Želim, da so shranjeni v datotekah in razvrščeni po domenah.

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

To je glavna konfiguracijska datoteka dovecot.
Tu onemogočimo nezaščitene povezave.
In omogočite varne povezave.

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

Nastavitev ssl. Označujemo, da je potreben ssl.
In sam certifikat. In pomembna podrobnost je "lokalna" direktiva. Označuje, kateri certifikat SSL uporabiti pri povezovanju s katerim lokalnim IPv4.

Mimogrede, IPv6 tukaj ni konfiguriran, to opustitev bom popravil pozneje.
XX.XX.XX.X5 (domena2) - brez potrdila. Če želite povezati odjemalce, morate podati domain1.com.
XX.XX.XX.X2 (domain3) - obstaja potrdilo, lahko določite domain1.com ali domain3.com za povezavo odjemalcev.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

To bo v prihodnosti potrebno za spamassassin.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

To je vtičnik za zaščito pred neželeno pošto. Potreben za usposabljanje spamassasin v času prenosa v/iz mape »Spam«.

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

protocol pop3 {
}

Obstaja samo taka datoteka.

Datoteka »/etc/dovecot/conf.d/20-lmtp.conf«

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

Nastavitev lmtp.

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

Nastavitve usposabljanja Spamassasin v času prenosa v/iz mape z vsiljeno pošto.

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

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

Datoteka, ki določa, kaj storiti z dohodnimi pismi.

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

require ["fileinto", "mailbox"];

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

Prevesti morate datoteko: “sievec default.sieve”.

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

Določanje datotek sql za avtorizacijo.
In sama datoteka se uporablja kot metoda avtorizacije.

Datoteka "/etc/dovecot/dovecot-sql.conf.ext"

driver = mysql
connect = host=127.0.0.1 dbname=servermail user=usermail password=password
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

To ustreza podobnim nastavitvam za postfix.

Datoteka "/etc/dovecot/dovecot.conf"

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

Glavna konfiguracijska datoteka.
Pomembno je, da tukaj označimo - dodamo protokole.

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

apt-get install spamassassin spamc

Namestimo pakete.

adduser spamd --disabled-login

Dodajmo uporabnika, v imenu katerega.

systemctl enable spamassassin.service

Ob nalaganju omogočimo samodejno nalaganje storitve spamassassin.

Datoteka "/etc/default/spamassassin":

CRON=1

Z omogočanjem samodejnega posodabljanja pravil “privzeto”.

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

Ustvariti morate bazo podatkov »sa« v mysql z uporabnikom »sa« z geslom »password« (zamenjajte z ustreznim).

report_safe - to bo namesto pisma poslalo poročilo o neželeni e-pošti.
use_bayes so nastavitve strojnega učenja spamassassin.

Preostale nastavitve spamassassin so bile uporabljene prej v članku.

Splošna nastavitev "spamassassin".
O premikanju novih neželenih e-poštnih sporočil v mapo »Spam« IMAP.
O preprosti kombinaciji Dovecot + SpamAssassin.
Priporočam branje teorije učenja spamassasin pri premikanju črk v mapah imap (in odsvetujem njeno uporabo).

============= Poziv skupnosti =============

Prav tako bi rad posredoval skupnost idejo o tem, kako povečati raven varnosti posredovanih pisem. Ker sem tako globoko potopljen v temo pošte.

Da lahko uporabnik na svojem odjemalcu ustvari par ključev (outlook, thunderbird, browser-plugin, ...). Javno in zasebno. Javno - pošlji v DNS. Zasebno - prihranite pri stranki. Poštni strežniki bi lahko uporabili javni ključ za pošiljanje določenemu prejemniku.

In za zaščito pred neželeno pošto s takimi pismi (da, poštni strežnik ne bo mogel videti vsebine) - boste morali uvesti 3 pravila:

  1. Obvezen pravi podpis DKIM, obvezen SPF, obvezen rDNS.
  2. Nevronska mreža na temo antispam usposabljanja + baza podatkov za to na strani odjemalca.
  3. Algoritem šifriranja mora biti takšen, da mora pošiljateljska stran za šifriranje porabiti 100-krat več procesorske moči kot sprejemna stran.

Poleg javnih pisem razvijte standardno pismo s predlogom "za začetek varne korespondence". Eden od uporabnikov (nabiralnik) pošlje pismo s priponko v drug nabiralnik. Pismo vsebuje tekstovni predlog za zagon varnega komunikacijskega kanala za korespondenco in javni ključ lastnika poštnega predala (z zasebnim ključem na strani odjemalca).

Lahko celo naredite nekaj ključev posebej za vsako korespondenco. Uporabnik prejemnik lahko sprejme to ponudbo in pošlje svoj javni ključ (tudi izdelan posebej za to korespondenco). Nato prvi uporabnik pošlje kontrolno pismo storitve (šifrirano z javnim ključem drugega uporabnika) - po prejemu katerega lahko drugi uporabnik šteje oblikovani komunikacijski kanal za zanesljivega. Nato drugi uporabnik pošlje kontrolno pismo - in potem lahko tudi prvi uporabnik šteje oblikovan kanal za varnega.

Za boj proti prestrezanju ključev na cesti mora protokol predvideti možnost prenosa vsaj enega javnega ključa s pomočjo bliskovnega pogona.

In najpomembneje je, da vse deluje (vprašanje je "kdo bo to plačal?"):
Vnesite poštna potrdila od 10 USD za 3 leta. Kar bo pošiljatelju omogočilo, da v dns navede, da so "moji javni ključi tamle." In dali vam bodo priložnost za vzpostavitev varne povezave. Hkrati je sprejemanje tovrstnih povezav brezplačno.
gmail končno monetizira svoje uporabnike. Za 10 $ na 3 leta - pravica do ustvarjanja varnih korespondenčnih kanalov.

============== Zaključek ==============

Za testiranje celotnega članka sem nameraval najeti namenski strežnik za en mesec in kupiti domeno s SSL certifikatom.

Toda življenjske okoliščine so se razvile tako, da se je to vprašanje vleklo 2 meseca.
In tako sem se, ko sem imel spet prosti čas, odločil, da članek objavim tak kot je, ne pa da tvegam, da se bo objava vlekla še eno leto.

Če je kar veliko vprašanj, kot je "ampak to ni dovolj podrobno opisano", potem bo verjetno moč vzeti namenski strežnik z novo domeno in novim SSL certifikatom in ga opisati še bolj podrobno in večina kar je pomembno, identificirajte vse manjkajoče pomembne podrobnosti.

Prav tako bi rad prejel povratne informacije o zamislih o poštnih potrdilih. Če vam je ideja všeč, bom poskusil najti moč, da napišem osnutek za rfc.

Pri kopiranju večjih delov članka navedite povezavo do tega članka.
Pri prevajanju v kateri koli drug jezik navedite povezavo do tega članka.
Sam ga bom poskusil prevesti v angleščino in pustil navzkrižna sklicevanja.


Vir: www.habr.com

Dodaj komentar