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

Dit artikel giet oer hoe't jo in moderne e-posttsjinner ynstelle.
Postfix + Dovecot. SPF + DKIM + rDNS. Mei IPv6.
Mei TSL fersifering. Mei stipe foar meardere domeinen - diel mei in echt SSL-sertifikaat.
Mei antispambeskerming en in hege antispamwurdearring fan oare e-postservers.
Unterstützt meardere fysike ynterfaces.
Mei OpenVPN, de ferbining wêrmei is fia IPv4, en dat leveret IPv6.

As jo ​​​​al dizze technologyen net wolle leare, mar sa'n tsjinner wolle ynstelle, dan is dit artikel foar jo.

It artikel docht gjin besykjen om elk detail út te lizzen. De útlis giet nei wat net as standert ynsteld is of wichtich is út it eachpunt fan de konsumint.

De motivaasje om in e-posttsjinner op te setten is in lange dream fan my west. Dit klinkt miskien dom, mar IMHO, it is folle better as in dream fan in nije auto fan jo favorite merk.

D'r binne twa motivaasjes foar it ynstellen fan IPv6. In IT-spesjalist moat konstant nije technologyen leare om te oerlibjen. Ik wol myn beskieden bydrage leverje oan de striid tsjin sensuer.

De motivaasje foar it ynstellen fan OpenVPN is gewoan om IPv6 te wurkjen op 'e lokale masine.
De motivaasje foar it opsetten fan ferskate fysike ynterfaces is dat ik op myn server ien ynterface "stadich mar ûnbeheind" en in oare "rap mar mei in taryf" haw.

De motivaasje foar it ynstellen fan Bind-ynstellingen is dat myn ISP in ynstabile DNS-tsjinner leveret, en google mislearret ek soms. Ik wol in stabile DNS-tsjinner foar persoanlik gebrûk.

Motivaasje om in artikel te skriuwen - ik skreau in konsept 10 moannen lyn, en ik haw it al twa kear sjoen. Sels as de skriuwer it geregeld nedich hat, is de kâns grut dat oaren it ek nedich hawwe.

D'r is gjin universele oplossing foar in e-posttsjinner. Mar ik sil besykje wat te skriuwen as "do dit en dan, as alles wurket sa't it moat, smyt it ekstra spul út."

It bedriuw tech.ru hat in Colocation-tsjinner. It is mooglik om te fergelykjen mei OVH, Hetzner, AWS. Om dit probleem op te lossen, sil gearwurking mei tech.ru folle effektiver wêze.

Debian 9 is ynstalleare op 'e tsjinner.

De tsjinner hat 2 ynterfaces `eno1` en `eno2`. De earste is ûnbeheind, en de twadde is respektivelik fluch.

D'r binne 3 statyske IP-adressen, XX.XX.XX.X0 en XX.XX.XX.X1 en XX.XX.XX.X2 op 'eno1'-ynterface en XX.XX.XX.X5 op 'eno2'-ynterface .

Beskikber XXXX:XXXX:XXXX:XXXX::/64 in pool fan IPv6-adressen dy't wurde tawiisd oan 'e 'eno1'-ynterface en dêrút XXXX: XXXX: XXXX: XXXX: 1: 2::/96 waard tawiisd oan 'eno2' op myn fersyk.

Der binne 3 domeinen `domain1.com`, `domain2.com`, `domain3.com`. D'r is in SSL-sertifikaat foar `domain1.com` en `domain3.com`.

Ik haw in Google akkount dêr't ik myn postfak oan keppelje wol[e-post beskerme]` (e-post ûntfange en e-post direkt ferstjoere fanút de gmail-ynterface).
Der moat in brievebus komme`[e-post beskerme]`, in kopy fan 'e e-post wêrfan ik yn myn gmail sjen wol. En it is seldsum dat jo wat stjoere kinne út namme fan `[e-post beskerme]` fia de webynterface.

Der moat in brievebus komme`[e-post beskerme]`, dy't Ivanov sil brûke fan syn iPhone.

Ferstjoerde e-mails moatte foldwaan oan alle moderne antyspam-easken.
D'r moat it heechste nivo fan fersifering wurde levere yn iepenbiere netwurken.
D'r moat IPv6-stipe wêze foar sawol it ferstjoeren as it ûntfangen fan brieven.
D'r moat in SpamAssassin wêze dy't e-posten noait sil wiskje. En it sil of bounce of oerslaan of stjoere nei de IMAP "Spam" map.
SpamAssassin auto-learning moat konfigurearre wurde: as ik in brief ferpleatse nei de map Spam, sil it hjirfan leare; as ik in brief ferpleatse út de map Spam, sil it hjirfan leare. De resultaten fan SpamAssassin-training moatte beynfloedzje oft de brief yn 'e Spam-map telâne komt.
PHP-skripts moatte e-post kinne ferstjoere út namme fan elk domein op in opjûne tsjinner.
D'r moat in openvpn-tsjinst wêze, mei de mooglikheid om IPv6 te brûken op in kliïnt dy't gjin IPv6 hat.

Earst moatte jo ynterfaces en routing konfigurearje, ynklusyf IPv6.
Dan moatte jo OpenVPN konfigurearje, dat sil ferbine fia IPv4 en de kliïnt in statysk-echt IPv6-adres leverje. Dizze kliïnt sil tagong hawwe ta alle IPv6-tsjinsten op 'e tsjinner en tagong ta alle IPv6-boarnen op it ynternet.
Dan moatte jo Postfix konfigurearje om brieven + SPF + DKIM + rDNS en oare ferlykbere lytse dingen te ferstjoeren.
Dan moatte jo Dovecot konfigurearje en Multidomain konfigurearje.
Dan moatte jo SpamAssassin konfigurearje en training konfigurearje.
As lêste, ynstallearje Bind.

============== Multi-interfaces ==============

Om ynterfaces te konfigurearjen, moatte jo dit skriuwe yn "/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

Dizze ynstellingen kinne tapast wurde op elke server yn tech.ru (mei in bytsje koördinaasje mei stipe) en it sil fuortendaliks wurkje sa't it moat.

As jo ​​ûnderfining hawwe mei it ynstellen fan ferlykbere dingen foar Hetzner, OVH, is it dêr oars. Dreger.

eno1 is de namme fan netwurkkaart #1 (stadich mar ûnbeheind).
eno2 is de namme fan netwurk card # 2 (fluch, mar mei in taryf).
tun0 is de namme fan 'e firtuele netwurkkaart fan OpenVPN.
XX.XX.XX.X0 - IPv4 #1 op eno1.
XX.XX.XX.X1 - IPv4 #2 op eno1.
XX.XX.XX.X2 - IPv4 #3 op eno1.
XX.XX.XX.X5 - IPv4 #1 op eno2.
XX.XX.XX.1 - IPv4-gateway.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 foar de heule tsjinner.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 foar eno2, al it oare fan bûten giet yn eno1.
XXXX: XXXX: XXXX: XXXX :: 1 - IPv6-gateway (it is de muoite wurdich op te merken dat dit oars kin/moat wurde dien. Spesifisearje de IPv6-skeakel).
dns-nameservers - 127.0.0.1 wurdt oanjûn (om't bind is lokaal ynstalleare) en 213.248.1.6 (dit is fan tech.ru).

"tabel eno1t" en "tabel eno2t" - de betsjutting fan dizze rûte-regels is dat ferkear dat troch eno1 komt -> der trochhinne soe, en ferkear dat troch eno2 -> der trochhinne soe. En ek ferbiningen inisjearre troch de tsjinner soe gean troch eno1.

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

Mei dit kommando spesifisearje wy dat elk ûnbegryplik ferkear dat falt ûnder elke regel markearre "tabel eno1t" -> stjoerd wurde nei de eno1-ynterface.

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

Mei dit kommando spesifisearje wy oan dat elk ferkear dat troch de tsjinner is inisjearre moat wurde rjochte op de eno1-ynterface.

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

Mei dit kommando sette wy de regels foar it markearjen fan ferkear.

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

Dit blok spesifiseart in twadde IPv4 foar de eno1-ynterface.

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

Mei dit kommando sette wy de rûte fan OpenVPN-kliïnten nei lokale IPv4 útsein XX.XX.XX.X0.
Ik begryp noch net wêrom dit kommando genôch is foar alle IPv4.

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

Dit is wêr't wy it adres ynstelle foar de ynterface sels. De tsjinner sil it brûke as in "útgeand" adres. Sil op gjin inkelde manier wer brûkt wurde.

Wêrom is ":1:1::" sa yngewikkeld? Dat OpenVPN wurket goed en allinich foar dit. Mear hjiroer letter.

Oer it ûnderwerp fan poarte - dat is hoe't it wurket en dat is goed. Mar de juste manier is om hjir de IPv6 oan te jaan fan 'e skeakel wêrmei de tsjinner ferbûn is.

Om ien of oare reden stopt IPv6 lykwols mei wurkjen as ik dit doch. Dit is wierskynlik in soarte fan tech.ru-probleem.

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

Dit is it tafoegjen fan in IPv6-adres oan 'e ynterface. As jo ​​hûndert adressen nedich binne, betsjut dat hûndert rigels yn dit bestân.

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

Ik notearre de adressen en subnets fan alle ynterfaces om it dúdlik te meitsjen.
eno1 - moat wêze "/64"- om't dit ús hiele pool fan adressen is.
tun0 - it subnet moat grutter wêze dan eno1. Oars sil it net mooglik wêze om in IPv6-gateway te konfigurearjen foar OpenVPN-kliïnten.
eno2 - it subnet moat grutter wêze as tun0. Oars kinne OpenVPN-kliïnten gjin tagong krije ta lokale IPv6-adressen.
Foar dúdlikens keas ik in subnetstap fan 16, mar as jo wolle, kinne jo sels "1" stap dwaan.
Sadwaande, 64+16 = 80, en 80+16 = 96.

Foar noch gruttere dúdlikens:
XXXX: XXXX: XXXX: XXXX: 1: 1: YYYY: YYYY binne adressen dy't moatte wurde tawiisd oan spesifike siden of tsjinsten op de eno1 ynterface.
XXXX: XXXX: XXXX: XXXX: 1: 2: YYYY: YYYY binne adressen dy't moatte wurde tawiisd oan spesifike siden of tsjinsten op de eno2 ynterface.
XXXX: XXXX: XXXX: XXXX: 1: 3: YYYY: YYYY binne adressen dy't moatte wurde tawiisd oan OpenVPN-kliïnten of brûkt wurde as OpenVPN-tsjinstadressen.

Om it netwurk te konfigurearjen, moat it mooglik wêze om de tsjinner opnij te starten.
IPv4-wizigingen wurde oppakt as se wurde útfierd (wês wis dat jo it yn it skerm ynpakke - oars sil dit kommando it netwurk op 'e tsjinner gewoan crashe):

/etc/init.d/networking restart

Foegje oan it ein fan it bestân "/etc/iproute2/rt_tables" ta:

100 eno1t
101 eno2t

Sûnder dit kinne jo gjin oanpaste tabellen brûke yn it bestân "/etc/network/interfaces".
De nûmers moatte unyk wêze en minder dan 65535.

IPv6-wizigingen kinne maklik feroare wurde sûnder opnij te begjinnen, mar om dit te dwaan moatte jo op syn minst trije kommando's leare:

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

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

Dit binne de "sysctl" ynstellings fan myn server. Lit my wat wichtichs oanwize.

net.ipv4.ip_forward = 1

Sûnder dit sil OpenVPN hielendal net wurkje.

net.ipv6.ip_nonlocal_bind = 1

Elkenien dy't besiket te binen IPv6 (bygelyks nginx) fuortendaliks neidat de ynterface is up sil ûntfange in flater. Dat dit adres is net beskikber.

Om sa'n situaasje foar te kommen, wurdt sa'n ynstelling makke.

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

Sûnder dizze IPv6-ynstellingen giet ferkear fan 'e OpenVPN-kliïnt net de wrâld yn.

Oare ynstellings binne óf net relevant óf ik herinner my net wêr't se foar binne.
Mar foar it gefal lit ik it "as is."

Om feroarings oan dit bestân op te nimmen sûnder de tsjinner opnij te begjinnen, moatte jo it kommando útfiere:

sysctl -p

Mear details oer "tabel" regels: habr.com/post/108690

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

OpenVPN IPv4 wurket net sûnder iptables.

Myn iptables binne sa foar 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 is myn statyske IPv4-adres fan 'e lokale masine.
10.8.0.0/24 - IPv4 openvpn netwurk. IPv4-adressen foar openvpn-kliïnten.
De gearhing fan 'e regels is wichtich.

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

Dit is in beheining sadat allinich ik OpenVPN kin brûke fan myn statyske IP.

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

Om IPv4-pakketten troch te stjoeren tusken OpenVPN-kliïnten en it ynternet, moatte jo ien fan dizze kommando's registrearje.

Foar ferskate gefallen is ien fan 'e opsjes net geskikt.
Beide kommando's binne geskikt foar myn gefal.
Nei it lêzen fan de dokumintaasje keas ik de earste opsje om't it minder CPU brûkt.

Om alle iptables-ynstellingen nei herstarten op te heljen, moatte jo se earne bewarje.

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

Sokke nammen binne net tafallich keazen. Se wurde brûkt troch it pakket "iptables-persistent".

apt-get install iptables-persistent

Ynstallearje fan it haad OpenVPN-pakket:

apt-get install openvpn easy-rsa

Litte wy in sjabloan ynstelle foar sertifikaten (ferfang jo wearden):

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

Litte wy de ynstellings foar sertifikaatsjabloanen bewurkje:

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

Meitsje in serversertifikaat:

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

Litte wy de mooglikheid tariede om de lêste "client-name.opvn"-bestannen te meitsjen:

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

Litte wy in skript tariede dat alle bestannen sil gearfoegje yn ien opvn-bestân.

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

De earste OpenVPN-kliïnt oanmeitsje:

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

It bestân "~/client-configs/files/client-name.ovpn" wurdt stjoerd nei it apparaat fan de kliïnt.

Foar iOS-kliïnten moatte jo de folgjende trúk dwaan:
De ynhâld fan 'e tag "tls-auth" moat sûnder opmerkings wêze.
En set ek "key-direction 1" direkt foar de "tls-auth" tag.

Litte wy de OpenVPN-tsjinner konfiguraasje konfigurearje:

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

Dit is nedich om in statysk adres foar elke kliïnt yn te stellen (net nedich, mar ik brûk it):

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

It dreechste en kaai detail.

Spitigernôch wit OpenVPN noch net hoe't jo in IPv6-gateway foar kliïnten selsstannich konfigurearje.
Jo moatte dit "hânmjittich" foar elke klant trochstjoere.

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

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

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

Beide skripts brûke it bestân "/etc/openvpn/variables":

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

Ik fyn it dreech om te ûnthâlden wêrom't it sa skreaun is.

No netmask = 112 sjocht der nuver út (it moat dêr 96 wêze).
En it foarheaksel is nuver, it komt net oerien mei it tun0-netwurk.
Mar goed, ik sil it sa litte.

cipher DES-EDE3-CBC

Dit is net foar elkenien - ik keas dizze metoade om de ferbining te fersiferjen.

Learje mear oer it ynstellen fan OpenVPN IPv4.

Learje mear oer it ynstellen fan OpenVPN IPv6.

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

It haadpakket ynstallearje:

apt-get install postfix

By it ynstallearjen, selektearje "ynternetside".

Myn "/etc/postfix/main.cf" sjocht der sa út:

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

Litte wy nei de details fan dizze konfiguraasje sjen.

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

Neffens ynwenners fan Khabrovsk befettet dit blok "ferkearde ynformaasje en ferkearde proefskriften."Allinich 8 jier nei it begjin fan myn karriêre begon ik te begripen hoe't SSL wurket.

Dêrom sil ik de frijheid nimme om te beskriuwen hoe't jo SSL brûke (sûnder de fragen "Hoe wurket it?" En "Wêrom wurket it?").

De basis fan moderne fersifering is it oanmeitsjen fan in kaaipaar (twa heul lange tekens fan tekens).

Ien "kaai" is privee, de oare kaai is "iepenbier". Wy hâlde de privee kaai tige foarsichtich geheim. Wy distribuearje de iepenbiere kaai oan elkenien.

Mei in iepenbiere kaai kinne jo in tekenrige tekst fersiferje, sadat allinich de eigner fan 'e privee kaai it kin ûntsiferje.
No, dat is de hiele basis fan 'e technology.

Stap #1 - https-siden.
By tagong ta in side leart de browser fan de webserver dat de side https is en freget dêrom in iepenbiere kaai oan.
De webserver jout de iepenbiere kaai. De browser brûkt de iepenbiere kaai om it http-fersyk te fersiferjen en te ferstjoeren.
De ynhâld fan in http-fersyk kin allinich lêzen wurde troch dyjingen dy't de privee kaai hawwe, dat is allinich de tsjinner dêr't it fersyk oan dien wurdt.
Http-fersyk befettet op syn minst in URI. Dêrom, as in lân besiket tagong te beheinen net ta de heule side, mar nei in spesifike side, dan is dit ûnmooglik te dwaan foar https-siden.

Stap #2 - fersifere antwurd.
De webserver jout in antwurd dat maklik ûnderweis te lêzen is.
De oplossing is ekstreem ienfâldich - de browser genereart lokaal itselde privee-iepenbiere kaaipaar foar elke https-side.
En tegearre mei it fersyk foar de iepenbiere kaai fan 'e side, stjoert it syn lokale iepenbiere kaai.
De webserver ûnthâldt it en, by it ferstjoeren fan http-antwurd, fersiferet it mei de iepenbiere kaai fan in spesifike kliïnt.
No kin http-antwurd allinich ûntsiferje troch de eigner fan 'e priveekaai fan' e blêder fan 'e kliïnt (dat is, de kliïnt sels).

Stap No.. 3 - it meitsjen fan in feilige ferbining fia in iepenbier kanaal.
D'r is in kwetsberens yn foarbyld nr.
Sa sil de tuskenpersoan dúdlik alle ynhâld fan ferstjoerde en ûntfongen berjochten sjen oant it kommunikaasjekanaal feroaret.
Omgean mei dit is ekstreem ienfâldich - stjoer gewoan de iepenbiere kaai fan 'e browser as in berjocht fersifere mei de iepenbiere kaai fan' e webtsjinner.
De webserver stjoert dan earst in antwurd lykas "jo iepenbiere kaai is sa" en fersiferet dit berjocht mei deselde iepenbiere kaai.
De browser sjocht nei it antwurd - as it berjocht "jo iepenbiere kaai is sa" wurdt ûntfongen - dan is dit in 100% garânsje dat dit kommunikaasjekanaal feilich is.
Hoe feilich is it?
De skepping fan sa'n feilich kommunikaasjekanaal bart mei in snelheid fan ping*2. Bygelyks 20 ms.
De oanfaller moat de privee kaai fan ien fan 'e partijen foarôf hawwe. Of fyn in privee kaai yn in pear millisekonden.
Hacking fan ien moderne privee kaai sil tsientallen jierren duorje op in superkomputer.

Stap #4 - iepenbiere database fan iepenbiere kaaien.
Fansels is yn dit hiele ferhaal in kâns foar in oanfaller om te sitten op it kommunikaasjekanaal tusken de kliïnt en de tsjinner.
De kliïnt kin foardwaan as de tsjinner, en de tsjinner kin foardwaan as de kliïnt. En emulearje in pear kaaien yn beide rjochtingen.
Dan sil de oanfaller al it ferkear sjen en kin it ferkear "bewurkje".
Feroarje bygelyks it adres wêr't jo jild moatte ferstjoere of kopiearje it wachtwurd fan online bankieren of blokkearje "oanfallende" ynhâld.
Om sokke oanfallers te bestriden, kamen se mei in iepenbiere database mei iepenbiere kaaien foar elke https-side.
Elke browser "wit" oer it bestean fan sa'n 200 sokke databases. Dit komt foarôf ynstalleare yn elke browser.
"Kennis" wurdt stipe troch in iepenbiere kaai fan elk sertifikaat. Dat is, de ferbining mei elke spesifike sertifikaasjeautoriteit kin net fake wurde.

No is d'r in ienfâldich begryp fan hoe't jo SSL brûke kinne foar https.
As jo ​​​​jo harsens brûke, sil it dúdlik wurde hoe't de spesjale tsjinsten wat kinne hacke yn dizze struktuer. Mar it sil kostje harren meunsterlike ynspannings .
En organisaasjes lytser as de NSA of CIA - it is hast ûnmooglik om te hack it besteande nivo fan beskerming, sels foar VIPs.

Ik sil ek tafoegje oer ssh-ferbiningen. D'r binne gjin iepenbiere kaaien, dus wat kinne jo dwaan? It probleem wurdt op twa manieren oplost.
Opsje ssh-by-wachtwurd:
Tidens de earste ferbining moat de ssh-client warskôgje dat wy in nije iepenbiere kaai hawwe fan 'e ssh-tsjinner.
En by fierdere ferbiningen, as de warskôging "nije iepenbiere kaai fan 'e ssh-tsjinner" ferskynt, sil it betsjutte dat se besykje jo te ôflústerjen.
Of jo waarden ôfluistere op jo earste ferbining, mar no kommunisearje jo mei de tsjinner sûnder tuskenpersoanen.
Eins, fanwege it feit dat it feit fan wiretapping is maklik, fluch en sûnder muoite iepenbiere, dizze oanfal wurdt brûkt allinnich yn spesjale gefallen foar in spesifike klant.

Opsje ssh-by-key:
Wy nimme in flash drive, skriuwe de privee kaai foar de ssh-tsjinner derop (d'r binne termen en in protte wichtige nuânses foar dit, mar ik skriuw in edukatyf programma, gjin ynstruksjes foar gebrûk).
Wy litte de iepenbiere kaai op 'e masine wêr't de ssh-kliïnt sil wêze en wy hâlde it ek geheim.
Wy bringe de flash drive nei de tsjinner, ynfoegje it, kopiearje de privee kaai, en burn it flash drive en ferspriede de jiske nei de wyn (of op syn minst formatearje it mei nullen).
Dat is alles - nei sa'n operaasje sil it ûnmooglik wêze om sa'n ssh-ferbining te hacken. Fansels sil it oer 10 jier mooglik wêze om ferkear op in superkomputer te besjen - mar dat is in oar ferhaal.

Ik ferûntskuldigje my foar it offtopic.

Dus no't de teory bekend is. Ik sil jo fertelle oer de stream fan it meitsjen fan in SSL-sertifikaat.

Mei help fan "openssl genrsa" meitsje wy in privee kaai en "blanks" foar de iepenbiere kaai.
Wy stjoere de "blanks" nei in bedriuw fan tredden, dêr't wy sawat $ 9 betelje foar it ienfâldichste sertifikaat.

Nei in pear oeren krije wy ús "iepenbiere" kaai en in set fan ferskate iepenbiere kaaien fan dit bedriuw fan tredden.

Wêrom moat in bedriuw fan tredden betelje foar de registraasje fan myn iepenbiere kaai is in aparte fraach, wy sille it hjir net beskôgje.

No is dúdlik wat de betsjutting fan 'e ynskripsje is:

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

De map "/etc/ssl" befettet alle bestannen foar ssl-problemen.
domain1.com - domeinnamme.
2018 is it jier fan kaai skepping.
"kaai" - oantsjutting dat it bestân in privee kaai is.

En de betsjutting fan dit bestân:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com - domeinnamme.
2018 is it jier fan kaai skepping.
chained - oantsjutting dat d'r in keatling fan iepenbiere kaaien is (de earste is ús iepenbiere kaai en de rest binne wat kaam fan it bedriuw dat de iepenbiere kaai útjoech).
crt - oantsjutting dat der in klearmakke sertifikaat (iepenbiere kaai mei technyske ferklearrings).

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

Dizze ynstelling wurdt net brûkt yn dit gefal, mar wurdt skreaun as in foarbyld.

Omdat in flater yn dizze parameter sil liede ta spam wurdt ferstjoerd fan jo tsjinner (sûnder jo wil).

Bewize dan oan elkenien dat jo net skuldich binne.

recipient_delimiter = +

In protte minsken kinne it net witte, mar dit is in standert karakter foar ranglist fan e-mails, en it wurdt stipe troch de measte moderne e-posttsjinners.

As jo ​​bygelyks in postfak hawwe "[e-post beskerme]"probearje te stjoeren nei"[e-post beskerme]"- sjoch wat der fan komt.

inet_protocols = ipv4

Dit kin betiizjend wêze.

Mar it is net allinnich sa. Elk nij domein is standert allinich IPv4, dan skeakelje ik IPv6 foar elk apart yn.

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

Hjir spesifisearje wy dat alle ynkommende post nei dovehot giet.
En de regels foar domein, postfak, alias - sjoch yn 'e databank.

/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

No wit postfix dat post kin wurde akseptearre foar fierder ferstjoeren allinnich nei autorisaasje mei dovecot.

Ik begryp echt net wêrom dit hjir duplikearre wurdt. Wy hawwe al oanjûn alles dat nedich is yn "firtual_transport".

Mar it postfix-systeem is heul âld - wierskynlik is it in weromkear fan 'e âlde dagen.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Dit kin oars ynsteld wurde foar elke e-posttsjinner.

Ik haw 3 e-posttsjinners ta myn beskikking en dizze ynstellings binne hiel oars fanwege ferskillende gebrûkseasken.

Jo moatte it foarsichtich konfigurearje - oars sil spam nei jo streame, of noch slimmer - spam sil fan jo útstreame.

# SPF
policyd-spf_time_limit = 3600

Ynstelle foar guon plugin yn ferbân mei it kontrolearjen fan de SPF fan ynkommende brieven.

# 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

De ynstelling is dat wy in DKIM-hântekening moatte leverje mei alle útgeande e-mails.

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

Dit is in kaaidetail yn letterrouting by it ferstjoeren fan brieven fan PHP-skripts.

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

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

Oan de linkerkant binne reguliere útdrukkingen. Oan de rjochterkant is in kaartsje dat markearret de letter.
Postfix yn oerienstimming mei it label - sil rekken hâlde mei in pear mear konfiguraasje rigels foar in spesifike brief.

Hoe krekt postfix sil wurde opnij konfigurearre foar in spesifike brief sil oanjûn wurde yn "master.cf".

Rigels 4, 5, 6 binne de wichtichste. Ut namme fan hokker domein wy de brief stjoere, sette wy dit label.
Mar it fjild "fan" wurdt net altyd oanjûn yn PHP-skripts yn 'e âlde koade. Dan komt de brûkersnamme te rêden.

It artikel is al wiidweidich - ik soe net wolle wurde ôfleid troch it ynstellen fan nginx + fpm.

Koartsein, foar elke side sette wy syn eigen linux-brûkerseigner yn. En dêrmei jo fpm-pool.

Fpm-pool brûkt elke ferzje fan php (it is geweldich as jo op deselde server ferskate ferzjes fan php brûke kinne en sels ferskate php.ini foar oanbuorjende siden sûnder problemen).

Dat, in spesifike linux-brûker "www-domain2" hat in webside domain2.com. Dizze side hat in koade foar it ferstjoeren fan e-mails sûnder it fan-fjild op te jaan.

Dat, sels yn dit gefal, sille de brieven goed ferstjoerd wurde en sille nea yn 'e spam einigje.

Myn "/etc/postfix/master.cf" sjocht der sa út:

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

De triem is net folslein levere - it is al heul grut.
Ik haw allinnich notearre wat der feroare wie.

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}

Dit binne ynstellings yn ferbân mei spamassasin, mear oer dat letter.

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

Wy tastean jo te ferbinen mei de e-posttsjinner fia poarte 587.
Om dit te dwaan, moatte jo ynlogge.

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

SPF-kontrôle ynskeakelje.

apt-get install postfix-policyd-spf-python

Litte wy it pakket foar SPF-kontrôles hjirboppe ynstallearje.

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

En dit is it meast nijsgjirrige ding. Dit is de mooglikheid om brieven te stjoeren foar in spesifyk domein fan in spesifyk IPv4/IPv6-adres.

Dit wurdt dien om 'e wille fan rDNS. rDNS is it proses fan it ûntfangen fan in tekenrige troch IP-adres.
En foar post wurdt dizze funksje brûkt om te befestigjen dat de helo krekt oerienkomt mei de rDNS fan it adres wêrfan de e-post is ferstjoerd.

As de helo net oerienkomt mei it e-postdomein út namme fan wa't de brief is ferstjoerd, wurde spampunten takend.

Helo komt net oerien mei rDNS - in protte spampunten wurde takend.
Dêrom moat elk domein in eigen IP-adres hawwe.
Foar OVH - yn 'e konsole is it mooglik om rDNS op te jaan.
Foar tech.ru - it probleem wurdt oplost troch stipe.
Foar AWS wurdt it probleem oplost troch stipe.
"inet_protocols" en "smtp_bind_address6" - wy skeakelje IPv6-stipe yn.
Foar IPv6 moatte jo ek rDNS registrearje.
"syslog_name" - en dit is foar it gemak fan it lêzen fan logs.

Keapje sertifikaten Ik advisearje hjir.

It ynstellen fan postfix + dovecot keppeling hjir.

SPF ynstelle.

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

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

Mysql ynstelle, de pakketten sels ynstallearje.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorisaasje is allinnich fersifere.

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

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

Hjir jouwe wy de opslachlokaasje foar de brieven oan.

Ik wol se wurde opslein yn triemmen en groepearre troch domein.

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

Dit is it haaddovecot-konfiguraasjetriem.
Hjir skeakelje wy ûnbefeilige ferbiningen út.
En ynskeakelje feilige ferbinings.

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

It opsetten fan ssl. Wy jouwe oan dat ssl fereaske is.
En it sertifikaat sels. En in wichtich detail is de "lokale" rjochtline. Jout oan hokker SSL-sertifikaat te brûken by it ferbinen mei hokker lokale IPv4.

Trouwens, IPv6 is hjir net konfigureare, ik sil dizze weglating letter korrigearje.
XX.XX.XX.X5 (domain2) - gjin sertifikaat. Om kliïnten te ferbinen moatte jo domain1.com opjaan.
XX.XX.XX.X2 (domain3) - d'r is in sertifikaat, jo kinne domain1.com of domain3.com opjaan om kliïnten te ferbinen.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Dit sil nedich wêze foar spamassassin yn 'e takomst.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Dit is in antispam-plugin. Need foar training spamassasin op it momint fan oerdracht nei/fan de map "Spam".

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

protocol pop3 {
}

Der is krekt sa'n triem.

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

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

Lmtp ynstelle.

Triem "/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 training ynstellings op it momint fan oerdracht nei/fan de map Spam.

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

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

In bestân dat spesifisearret wat te dwaan mei ynkommende brieven.

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

require ["fileinto", "mailbox"];

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

Jo moatte it bestân kompilearje: "sievec default.sieve".

Triem "/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-bestannen opjaan foar autorisaasje.
En it bestân sels wurdt brûkt as autorisaasjemetoade.

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

Dit komt oerien mei ferlykbere ynstellings foar postfix.

Triem "/etc/dovecot/dovecot.conf"

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

Main konfiguraasjetriem.
It wichtichste is dat wy hjir oanjaan - protokollen tafoegje.

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

apt-get install spamassassin spamc

Litte wy de pakketten ynstallearje.

adduser spamd --disabled-login

Litte wy in brûker tafoegje út waans namme.

systemctl enable spamassassin.service

Wy ynskeakelje automatysk laden spamassassin tsjinst by laden.

Triem "/etc/default/spamassassin":

CRON=1

Troch automatysk bywurkjen fan regels "standert" yn te skeakeljen.

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

Jo moatte in databank "sa" yn mysql meitsje mei de brûker "sa" mei it wachtwurd "wachtwurd" (ferfange mei wat adekwaat).

report_safe - dit sil in rapport fan spam-e-post stjoere ynstee fan in brief.
use_bayes binne spamassassin masine learen ynstellings.

De oerbleaune spamassassin-ynstellingen waarden earder yn it artikel brûkt.

Algemiene ynstelling "spamassassin".
Oer it ferpleatsen fan nije spam-e-postberjochten nei de IMAP-map "Spam"..
Oer in ienfâldige kombinaasje fan Dovecot + SpamAssassin.
Ik advisearje it lêzen fan de spamassasin-learteory by it ferpleatsen fan letters yn imap-mappen (en ik advisearje it net te brûken).

============== Berop op de mienskip ==============

Ik soe ek graach in idee yn de mienskip smite oer hoe't it nivo fan feiligens fan trochstjoerde brieven te ferheegjen. Sûnt ik bin sa djip ûnderdompele yn it ûnderwerp fan post.

Sadat de brûker in pear kaaien oanmeitsje kin op syn kliïnt (outlook, thunderbird, browser-plugin, ...). Iepenbier en privee. Iepenbier - stjoere nei DNS. Privee - bewarje op 'e klant. E-posttsjinners soene in iepenbiere kaai kinne brûke om nei in spesifike ûntfanger te stjoeren.

En om te beskermjen tsjin spam mei sokke brieven (ja, de e-posttsjinner kin de ynhâld net sjen) - jo moatte 3 regels ynfiere:

  1. Ferplichte echte DKIM-hântekening, ferplichte SPF, ferplichte rDNS.
  2. In neuraal netwurk oer it ûnderwerp fan antispam-training + in databank foar it oan 'e kliïntkant.
  3. It fersiferingsalgoritme moat sa wêze dat de stjoerende kant 100 kear mear CPU-krêft moat besteegje oan fersifering as de ûntfangende kant.

Neist iepenbiere brieven, ûntwikkelje in standert foarstelbrief "om feilige korrespondinsje te begjinnen." Ien fan de brûkers (brievebus) stjoert in brief mei in taheaksel nei in oare postbus. De brief befettet in tekstfoarstel om in feilich kommunikaasjekanaal te begjinnen foar korrespondinsje en de iepenbiere kaai fan 'e eigner fan' e brievebus (mei in priveekaai oan 'e kliïntside).

Jo kinne sels in pear kaaien spesifyk meitsje foar elke korrespondinsje. De ûntfanger brûker kin akseptearje dit oanbod en stjoer syn iepenbiere kaai (ek makke spesifyk foar dizze korrespondinsje). Dêrnei stjoert de earste brûker in tsjinstkontrôlebrief (fersifere mei de iepenbiere kaai fan 'e twadde brûker) - by ûntfangst wêrfan de twadde brûker it foarme kommunikaasjekanaal betrouber kin beskôgje. Dêrnei stjoert de twadde brûker in kontrôlebrief - en dan kin de earste brûker ek it foarme kanaal feilich beskôgje.

Om it ûnderskeppen fan kaaien op 'e dyk te bestriden, moat it protokol soargje foar de mooglikheid om op syn minst ien iepenbiere kaai te ferstjoeren mei in flash drive.

En it wichtichste is dat it allegear wurket (de fraach is "wa sil it betelje?"):
Fier postsertifikaten yn begjinnend by $ 10 foar 3 jier. Wat sil de stjoerder tastean om yn 'e dns oan te jaan dat "myn iepenbiere kaaien dêr binne." En se sille jo de kâns jaan om in feilige ferbining te begjinnen. Tagelyk is it akseptearjen fan sokke ferbinings fergees.
gmail is einlings monetarisearret syn brûkers. Foar $ 10 per 3 jier - it rjocht om feilige korrespondinsjekanalen te meitsjen.

============= Konklúzje ==============

Om it hiele artikel te testen, soe ik in moanne in tawijd server hiere en in domein keapje mei in SSL-sertifikaat.

Mar libbensomstannichheden ûntwikkele, sadat dit probleem 2 moannen duorre.
En sadwaande, doe't ik wer frije tiid hie, besleat ik it artikel sa't it is te publisearjen, yn stee fan it risiko dat de publikaasje noch in jier lang slepe soe.

As d'r nochal in soad fragen binne lykas "mar dit is net yn genôch detail beskreaun", dan sil d'r wierskynlik krêft wêze om in tawijd server mei in nij domein en in nij SSL-sertifikaat te nimmen en it noch mear yn detail te beskriuwen en, meast wichtich, identifisearje alle ûntbrekkende wichtige details.

Ik wol ek graach feedback krije oer ideeën oer postsertifikaten. As jo ​​​​it idee leuk fine, sil ik besykje de krêft te finen om in ûntwerp foar rfc te skriuwen.

By it kopiearjen fan grutte dielen fan in artikel, jou dan in keppeling nei dit artikel.
By it oersetten yn in oare taal, jou dan in keppeling nei dit artikel.
Ik sil besykje it sels yn it Ingelsk oer te setten en krúsferwizings efter te litten.


Boarne: www.habr.com

Add a comment