Debian + Postfix + Dovecot + vairāku domēnu + SSL + IPv6 + OpenVPN + vairāku saskarnes + SpamAssassin-learn + Bind

Šis raksts ir par moderna pasta servera iestatīšanu.
Postfix + Dovecot. SPF + DKIM + rDNS. Ar IPv6.
Ar TSL šifrēšanu. Ar vairāku domēnu atbalstu — piedalieties ar īstu SSL sertifikātu.
Ar aizsardzību pret surogātpastu un augstu pretsurogātpasta vērtējumu no citiem pasta serveriem.
Atbalsta vairākas fiziskas saskarnes.
Izmantojot OpenVPN, ar kuru tiek izveidots savienojums, izmantojot IPv4, un kas nodrošina IPv6.

Ja nevēlaties apgūt visas šīs tehnoloģijas, bet vēlaties izveidot šādu serveri, tad šis raksts ir paredzēts jums.

Rakstā nav mēģināts izskaidrot katru detaļu. Paskaidrojums attiecas uz to, kas nav konfigurēts kā standarta vai ir svarīgs no patērētāja viedokļa.

Motivācija izveidot pasta serveri ir bijis mans sens sapnis. Tas var izklausīties muļķīgi, bet IMHO, tas ir daudz labāk nekā sapņot par jaunu automašīnu no jūsu iecienītākās markas.

IPv6 iestatīšanai ir divi iemesli. IT speciālistam nepārtraukti jāapgūst jaunas tehnoloģijas, lai izdzīvotu. Es vēlētos sniegt savu pieticīgo ieguldījumu cīņā pret cenzūru.

OpenVPN iestatīšanas motivācija ir tikai panākt, lai IPv6 darbotos vietējā mašīnā.
Vairāku fizisko saskarņu iestatīšanas motivācija ir tāda, ka manā serverī man ir viens interfeiss “lēns, bet neierobežots” un otrs “ātrs, bet ar tarifu”.

Saistīšanas iestatījumu iestatīšanas motivācija ir tāda, ka mans ISP nodrošina nestabilu DNS serveri, un arī Google dažreiz neizdodas. Es vēlos stabilu DNS serveri personīgai lietošanai.

Motivācija rakstīt rakstu - es uzrakstīju melnrakstu pirms 10 mēnešiem, un es to jau esmu apskatījis divas reizes. Pat ja autoram tas ir regulāri nepieciešams, pastāv liela varbūtība, ka tas būs vajadzīgs arī citiem.

Pasta serverim nav universāla risinājuma. Bet es mēģināšu uzrakstīt kaut ko līdzīgu: “dari to un tad, kad viss darbosies kā nākas, izmetiet liekās lietas”.

Uzņēmumam tech.ru ir izvietošanas serveris. Var salīdzināt ar OVH, Hetzner, AWS. Lai atrisinātu šo problēmu, sadarbība ar tech.ru būs daudz efektīvāka.

Debian 9 ir instalēts serverī.

Serverim ir 2 saskarnes "eno1" un "eno2". Pirmais ir neierobežots, bet otrais ir attiecīgi ātrs.

Ir 3 statiskas IP adreses: XX.XX.XX.X0 un XX.XX.XX.X1 un XX.XX.XX.X2 saskarnē 'eno1' un XX.XX.XX.X5 'eno2' saskarnē. .

Pieejams XXXX:XXXX:XXXX:XXXX::/64 IPv6 adrešu kopums, kas ir piešķirts interfeisam "eno1", un no tā XXXX:XXXX:XXXX:XXXX:1:2::/96 pēc mana pieprasījuma tika piešķirts eno2.

Ir 3 domēni "domain1.com", "domain2.com", "domain3.com". Ir SSL sertifikāts domēnam1.com un domēnam3.com.

Man ir Google konts, ar kuru vēlos saistīt savu pastkasti[e-pasts aizsargāts]` (pasta saņemšana un pasta sūtīšana tieši no Gmail saskarnes).
Jābūt pastkastei`[e-pasts aizsargāts]`, e-pasta ziņojuma kopija, no kuras es vēlos redzēt savā gmail. Un reti kurš var kaut ko nosūtīt ` vārdā[e-pasts aizsargāts]` izmantojot tīmekļa saskarni.

Jābūt pastkastei`[e-pasts aizsargāts]`, ko Ivanovs izmantos no sava iPhone.

Nosūtītajiem e-pastiem jāatbilst visām mūsdienu pretspam prasībām.
Publiskajos tīklos ir jānodrošina augstākais šifrēšanas līmenis.
Ir jābūt IPv6 atbalstam gan vēstuļu nosūtīšanai, gan saņemšanai.
Ir jābūt SpamAssassin, kas nekad neizdzēsīs e-pastus. Un tas vai nu atlēcis, vai izlaidīs, vai arī nosūtīs uz IMAP “Surogātpasta” mapi.
SpamAssassin automātiskā apmācība ir jākonfigurē: ja es pārvietošu vēstuli uz mapi Mēstules, tā mācīsies no tā; ja es pārvietošu vēstuli no mapes Mēstules, tā mācīsies no šīs. SpamAssassin apmācības rezultātiem vajadzētu ietekmēt to, vai vēstule nonāk mapē Mēstules.
PHP skriptiem jāspēj nosūtīt vēstules jebkura domēna vārdā uz dotā servera.
Jābūt openvpn pakalpojumam ar iespēju izmantot IPv6 klientam, kuram nav IPv6.

Vispirms ir jākonfigurē saskarnes un maršrutēšana, tostarp IPv6.
Pēc tam jums būs jākonfigurē OpenVPN, kas izveidos savienojumu, izmantojot IPv4, un nodrošinās klientam statisku-reālu IPv6 adresi. Šim klientam būs piekļuve visiem IPv6 pakalpojumiem serverī un piekļuve visiem IPv6 resursiem internetā.
Pēc tam jums būs jākonfigurē Postfix, lai nosūtītu vēstules + SPF + DKIM + rDNS un citus līdzīgus sīkumus.
Pēc tam jums būs jākonfigurē Dovecot un jākonfigurē Multidomain.
Pēc tam jums būs jākonfigurē SpamAssassin un jākonfigurē apmācība.
Visbeidzot, instalējiet Bind.

============= Vairākas saskarnes ==============

Lai konfigurētu saskarnes, tas ir jāieraksta mapē /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

Šos iestatījumus var lietot jebkurā tech.ru serverī (ar nelielu saskaņošanu ar atbalstu), un tas nekavējoties darbosies, kā vajadzētu.

Ja jums ir pieredze līdzīgu lietu iestatīšanā uzņēmumam Hetzner, OVH, tur ir savādāk. Grūtāk.

eno1 ir tīkla kartes #1 nosaukums (lēns, bet neierobežots).
eno2 ir tīkla kartes #2 nosaukums (ātri, bet ar tarifu).
tun0 ir virtuālās tīkla kartes nosaukums no OpenVPN.
XX.XX.XX.X0 — IPv4 #1 uz eno1.
XX.XX.XX.X1 — IPv4 #2 uz eno1.
XX.XX.XX.X2 — IPv4 #3 uz eno1.
XX.XX.XX.X5 — IPv4 #1 uz eno2.
XX.XX.XX.1 — IPv4 vārteja.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 visam serverim.
XXXX:XXXX:XXXX:XXXX:1:2::/96 — IPv6 eno2, viss pārējais no ārpuses nonāk eno1.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 vārteja (ir vērts atzīmēt, ka to var/vajadzētu darīt citādi. Norādiet IPv6 slēdzi).
dns-nameservers - ir norādīts 127.0.0.1 (jo bind ir instalēts lokāli) un 213.248.1.6 (tas ir no tech.ru).

"Tabula eno1t" un "Tabula eno2t" - šo maršruta noteikumu nozīme ir tāda, ka satiksme, kas iebrauc caur eno1 -> izietu caur to, un satiksme, kas iebrauc caur eno2 -> izietu caur to. Un arī servera iniciētie savienojumi iet caur eno1.

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

Ar šo komandu mēs norādām, ka jebkura nesaprotama trafika, uz kuru attiecas kāds noteikums, kas apzīmēts ar “table eno1t” ->, tiek nosūtīts uz eno1 saskarni.

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

Ar šo komandu mēs norādām, ka jebkura servera iniciēta trafika jānovirza uz eno1 interfeisu.

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

Ar šo komandu mēs uzstādām satiksmes marķēšanas noteikumus.

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

Šis bloks norāda otru IPv4 eno1 interfeisam.

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

Ar šo komandu mēs iestatām maršrutu no OpenVPN klientiem uz vietējo IPv4, izņemot XX.XX.XX.X0.
Es joprojām nesaprotu, kāpēc ar šo komandu pietiek visiem IPv4.

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

Šeit mēs iestatām paša interfeisa adresi. Serveris to izmantos kā “izejošo” adresi. Nekādā veidā vairs netiks izmantots.

Kāpēc ":1:1::" ir tik sarežģīts? Lai OpenVPN darbotos pareizi un tikai šim nolūkam. Vairāk par to vēlāk.

Par vārtejas tēmu - tā tas darbojas, un tas ir labi. Bet pareizais veids ir šeit norādīt tā slēdža IPv6, kuram ir pievienots serveris.

Tomēr kāda iemesla dēļ IPv6 pārstāj darboties, ja es to daru. Iespējams, tā ir sava veida tech.ru problēma.

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

Tas interfeisam pievieno IPv6 adresi. Ja jums ir vajadzīgas simts adreses, tas nozīmē simts rindiņas šajā failā.

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

Es atzīmēju visu saskarņu adreses un apakštīklus, lai tas būtu skaidrs.
eno1 — jābūt "/64"- jo tas ir viss mūsu adrešu kopums.
tun0 — apakštīklam jābūt lielākam par eno1. Pretējā gadījumā nebūs iespējams konfigurēt IPv6 vārteju OpenVPN klientiem.
eno2 — apakštīklam jābūt lielākam par tun0. Pretējā gadījumā OpenVPN klienti nevarēs piekļūt vietējām IPv6 adresēm.
Skaidrības labad es izvēlējos apakštīkla soli 16, bet, ja vēlaties, varat veikt pat “1” soli.
Attiecīgi 64+16 = 80 un 80+16 = 96.

Vēl lielākai skaidrībai:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY ir adreses, kas jāpiešķir noteiktām vietnēm vai pakalpojumiem eno1 saskarnē.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY ir adreses, kas jāpiešķir noteiktām vietnēm vai pakalpojumiem eno2 saskarnē.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY ir adreses, kas jāpiešķir OpenVPN klientiem vai jāizmanto kā OpenVPN pakalpojumu adreses.

Lai konfigurētu tīklu, ir jābūt iespējai restartēt serveri.
IPv4 izmaiņas tiek uztvertas, kad tās tiek izpildītas (noteikti ietiniet to ekrānā — pretējā gadījumā šī komanda vienkārši avarēs servera tīklu):

/etc/init.d/networking restart

Pievienojiet faila beigām “/etc/iproute2/rt_tables”:

100 eno1t
101 eno2t

Bez tā jūs nevarat izmantot pielāgotas tabulas failā “/etc/network/interfaces”.
Cipariem ir jābūt unikāliem un mazākiem par 65535.

IPv6 izmaiņas var viegli mainīt bez pārstartēšanas, taču, lai to izdarītu, ir jāapgūst vismaz trīs komandas:

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

Iestatījums "/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

Šie ir mana servera "sysctl" iestatījumi. Ļaujiet man norādīt uz kaut ko svarīgu.

net.ipv4.ip_forward = 1

Bez tā OpenVPN vispār nedarbosies.

net.ipv6.ip_nonlocal_bind = 1

Ikviens, kurš mēģina saistīt IPv6 (piemēram, nginx) tūlīt pēc saskarnes, saņems kļūdu. Ka šī adrese nav pieejama.

Lai izvairītos no šādas situācijas, tiek veikts šāds iestatījums.

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

Bez šiem IPv6 iestatījumiem datplūsma no OpenVPN klienta nenonāk pasaulē.

Citi iestatījumi vai nu nav atbilstoši, vai arī es neatceros, kam tie paredzēti.
Bet katram gadījumam es atstāju to "kā ir".

Lai šī faila izmaiņas tiktu uztvertas bez servera pārstartēšanas, jums ir jāizpilda komanda:

sysctl -p

Sīkāka informācija par galda noteikumiem: habr.com/post/108690

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

OpenVPN IPv4 nedarbojas bez iptables.

Mani iptables ir šādi 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 ir mana vietējās mašīnas statiskā IPv4 adrese.
10.8.0.0/24 — IPv4 openvpn tīkls. IPv4 adreses openvpn klientiem.
Svarīga ir noteikumu konsekvence.

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

Tas ir ierobežojums, lai tikai es varu izmantot OpenVPN no sava statiskā 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

Lai pārsūtītu IPv4 paketes starp OpenVPN klientiem un internetu, ir jāreģistrē viena no šīm komandām.

Dažādiem gadījumiem viena no iespējām nav piemērota.
Abas komandas ir piemērotas manam gadījumam.
Pēc dokumentācijas izlasīšanas izvēlējos pirmo variantu, jo tas izmanto mazāk CPU.

Lai pēc pārstartēšanas tiktu uztverti visi iptables iestatījumi, tie kaut kur jāsaglabā.

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

Tādi vārdi netika izvēlēti nejauši. Tos izmanto pakotne "iptables-persistent".

apt-get install iptables-persistent

Galvenās OpenVPN pakotnes instalēšana:

apt-get install openvpn easy-rsa

Iestatīsim sertifikātu veidni (aizstāj savas vērtības):

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

Rediģēsim sertifikāta veidnes iestatījumus:

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

Izveidojiet servera sertifikātu:

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

Sagatavosim iespēju izveidot galīgos “client-name.opvn” failus:

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

Sagatavosim skriptu, kas apvienos visus failus vienā opvn failā.

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

Pirmā OpenVPN klienta izveide:

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

Fails “~/client-configs/files/client-name.ovpn” tiek nosūtīts uz klienta ierīci.

iOS klientiem jums būs jāveic šāds triks:
Atzīmes "tls-auth" saturam jābūt bez komentāriem.
Un arī ievietojiet “key-direction 1” tieši pirms taga “tls-auth”.

Konfigurēsim OpenVPN servera konfigurāciju:

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

Tas ir nepieciešams, lai katram klientam iestatītu statisku adresi (nav nepieciešams, bet es to izmantoju):

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

Sarežģītākā un galvenā detaļa.

Diemžēl OpenVPN vēl nezina, kā neatkarīgi konfigurēt IPv6 vārteju klientiem.
Jums tas ir “manuāli” jāpārsūta katram klientam.

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

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

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

Abi skripti izmanto failu “/etc/openvpn/variables”:

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

Man ir grūti atcerēties, kāpēc tas ir rakstīts šādi.

Tagad tīkla maska ​​= 112 izskatās dīvaini (tam vajadzētu būt 96).
Un prefikss ir dīvains, tas neatbilst tun0 tīklam.
Bet labi, es atstāšu to kā ir.

cipher DES-EDE3-CBC

Tas nav piemērots visiem — es izvēlējos šo savienojuma šifrēšanas metodi.

Uzziniet vairāk par OpenVPN IPv4 iestatīšanu.

Uzziniet vairāk par OpenVPN IPv6 iestatīšanu.

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

Galvenās pakotnes instalēšana:

apt-get install postfix

Instalēšanas laikā atlasiet “interneta vietne”.

Mans "/etc/postfix/main.cf" izskatās šādi:

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

Apskatīsim šīs konfigurācijas detaļas.

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

Pēc Habrovskas iedzīvotāju domām, šajā blokā ir “dezinformācija un nepareizas tēzes”.Tikai 8 gadus pēc savas karjeras sākuma es sāku saprast, kā darbojas SSL.

Tāpēc es atļaušos aprakstīt, kā lietot SSL (neatbildot uz jautājumiem “Kā tas darbojas?” un “Kāpēc tas darbojas?”).

Mūsdienu šifrēšanas pamatā ir atslēgu pāra izveide (divas ļoti garas rakstzīmju virknes).

Viena atslēga ir privāta, otra atslēga ir publiska. Mēs ļoti rūpīgi glabājam privāto atslēgu noslēpumā. Mēs izplatām publisko atslēgu visiem.

Izmantojot publisko atslēgu, varat šifrēt teksta virkni, lai to atšifrētu tikai privātās atslēgas īpašnieks.
Nu, tas ir viss tehnoloģijas pamats.

1. darbība — https vietnes.
Piekļūstot vietnei, pārlūkprogramma no tīmekļa servera uzzina, ka vietne ir https, un tāpēc pieprasa publisko atslēgu.
Tīmekļa serveris piešķir publisko atslēgu. Pārlūkprogramma izmanto publisko atslēgu, lai šifrētu http pieprasījumu un nosūtītu to.
http-pieprasījuma saturu var lasīt tikai tie, kuriem ir privātā atslēga, tas ir, tikai serveris, kuram tiek nosūtīts pieprasījums.
HTTP pieprasījums satur vismaz URI. Tāpēc, ja valsts mēģina ierobežot piekļuvi nevis visai vietnei, bet gan konkrētai lapai, tad https vietnēm to nav iespējams izdarīt.

2. darbība — šifrēta atbilde.
Tīmekļa serveris sniedz atbildi, ko var viegli izlasīt ceļā.
Risinājums ir ārkārtīgi vienkāršs – pārlūkprogramma lokāli ģenerē vienu un to pašu privāto un publisko atslēgu pāri katrai https vietnei.
Un kopā ar vietnes publiskās atslēgas pieprasījumu tā nosūta savu vietējo publisko atslēgu.
Tīmekļa serveris to atceras un, nosūtot http-atbildi, šifrē to ar konkrēta klienta publisko atslēgu.
Tagad http-atbildi var atšifrēt tikai klienta pārlūkprogrammas privātās atslēgas īpašnieks (tas ir, pats klients).

Solis Nr.3 - droša savienojuma izveide caur publisko kanālu.
Piemērā Nr. 2 ir ievainojamība — nekas neliedz labvēlīgiem cilvēkiem pārtvert http pieprasījumu un rediģēt informāciju par publisko atslēgu.
Tādējādi starpnieks skaidri redzēs visu nosūtīto un saņemto ziņojumu saturu līdz komunikācijas kanāla maiņai.
To atrisināt ir ļoti vienkārši — vienkārši nosūtiet pārlūkprogrammas publisko atslēgu kā ziņojumu, kas šifrēts ar tīmekļa servera publisko atslēgu.
Pēc tam tīmekļa serveris vispirms nosūta atbildi, piemēram, “jūsu publiskā atslēga ir šāda” un šifrē šo ziņojumu ar to pašu publisko atslēgu.
Pārlūkprogramma apskata atbildi - ja tiek saņemts ziņojums "jūsu publiskā atslēga ir šāda" - tad tā ir 100% garantija, ka šis saziņas kanāls ir drošs.
Cik tas ir droši?
Pati šāda droša sakaru kanāla izveide notiek ar ping*2 ātrumu. Piemēram, 20 ms.
Uzbrucējam iepriekš ir jābūt vienas puses privātajai atslēgai. Vai arī atrodiet privāto atslēgu pāris milisekundēs.
Vienas modernas privātās atslēgas uzlaušana superdatorā prasīs gadu desmitus.

4. darbība – publisko atslēgu publiskā datubāze.
Acīmredzot visā šajā stāstā uzbrucējam ir iespēja sēdēt komunikācijas kanālā starp klientu un serveri.
Klients var izlikties par serveri, un serveris var izlikties par klientu. Un atdariniet taustiņu pāri abos virzienos.
Tad uzbrucējs redzēs visu trafiku un varēs “rediģēt” trafiku.
Piemēram, mainiet adresi, uz kuru sūtīt naudu, vai nokopējiet paroli no internetbankas vai bloķējiet “iebilstošu” saturu.
Lai cīnītos pret šādiem uzbrucējiem, viņi nāca klajā ar publisku datubāzi ar publiskajām atslēgām katrai https vietnei.
Katra pārlūkprogramma “zina” par aptuveni 200 šādu datu bāzu esamību. Tas ir iepriekš instalēts katrā pārlūkprogrammā.
“Zināšanas” tiek nodrošinātas ar publisko atslēgu no katra sertifikāta. Tas ir, savienojumu ar katru konkrēto sertifikācijas iestādi nevar viltot.

Tagad ir vienkārša izpratne par SSL izmantošanu https.
Ja izmantosi smadzenes, kļūs skaidrs, kā specdienesti var kaut ko uzlauzt šajā struktūrā. Bet tas viņiem maksās milzīgas pūles.
Un organizācijas, kas ir mazākas par NSA vai CIP - ir gandrīz neiespējami uzlauzt esošo aizsardzības līmeni pat VIP personām.

Es arī pievienošu par ssh savienojumiem. Tur nav publisko atslēgu, ko jūs varat darīt? Problēma tiek atrisināta divos veidos.
Opcija ssh-by-password:
Pirmā savienojuma laikā ssh klientam jābrīdina, ka mums ir jauna publiskā atslēga no ssh servera.
Un turpmāko savienojumu laikā, ja parādās brīdinājums “jauna publiskā atslēga no ssh servera”, tas nozīmēs, ka viņi mēģina jūs noklausīties.
Vai arī jūs noklausījās pirmo savienojumu, bet tagad jūs sazināties ar serveri bez starpniekiem.
Faktiski, tā kā telefonsarunu noklausīšanās fakts tiek atklāts viegli, ātri un bez piepūles, šis uzbrukums tiek izmantots tikai īpašos gadījumos konkrētam klientam.

Opcija ssh-by-key:
Mēs paņemam zibatmiņas disku, ierakstām tajā ssh servera privāto atslēgu (tam ir termini un daudz svarīgu nianšu, bet es rakstu izglītojošu programmu, nevis lietošanas instrukcijas).
Mēs atstājam publisko atslēgu uz mašīnas, kurā atradīsies ssh klients, un mēs to arī turam noslēpumā.
Atnesam zibatmiņu uz serveri, ievietojam, nokopējam privāto atslēgu un zibatmiņas disku sadedzinām un pelnus izkaisām vējā (vai vismaz formatējam ar nullēm).
Tas arī viss – pēc šādas operācijas šādu ssh savienojumu uzlauzt nebūs iespējams. Protams, pēc 10 gadiem būs iespējams skatīt trafiku superdatorā, taču tas ir cits stāsts.

Atvainojos par offtopiku.

Tātad tagad, kad teorija ir zināma. Es jums pastāstīšu par SSL sertifikāta izveides gaitu.

Izmantojot “openssl genrsa”, mēs izveidojam privāto atslēgu un “tukšas vietas” publiskajai atslēgai.
“Sagataves” nosūtām trešās puses uzņēmumam, kuram par visvienkāršāko sertifikātu maksājam aptuveni 9 USD.

Pēc pāris stundām mēs saņemam mūsu “publisko” atslēgu un vairāku publisko atslēgu komplektu no šīs trešās puses uzņēmuma.

Kāpēc trešās puses uzņēmumam būtu jāmaksā par manas publiskās atslēgas reģistrāciju, tas ir atsevišķs jautājums, mēs to šeit neapskatīsim.

Tagad ir skaidrs, kāda ir uzraksta nozīme:

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

Mapē “/etc/ssl” ir visi ssl problēmu faili.
domain1.com — domēna vārds.
2018. gads ir atslēgu radīšanas gads.
“atslēga” - apzīmējums, ka fails ir privāta atslēga.

Un šī faila nozīme:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — domēna vārds.
2018. gads ir atslēgu radīšanas gads.
ķēdes — apzīmējums, ka pastāv publisko atslēgu ķēde (pirmā ir mūsu publiskā atslēga, bet pārējās ir tās, kas nāk no uzņēmuma, kas izsniedza publisko atslēgu).
crt - apzīmējums, ka ir gatavs sertifikāts (publiskā atslēga ar tehniskajiem paskaidrojumiem).

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

Šis iestatījums šajā gadījumā netiek izmantots, bet ir uzrakstīts kā piemērs.

Tā kā šī parametra kļūda novedīs pie surogātpasta sūtīšanas no jūsu servera (bez jūsu gribas).

Tad pierādi visiem, ka neesi vainīgs.

recipient_delimiter = +

Daudzi cilvēki var nezināt, taču šī ir standarta rakstzīme e-pasta ranžēšanai, un to atbalsta lielākā daļa mūsdienu pasta serveru.

Piemēram, ja jums ir pastkaste "[e-pasts aizsargāts]"mēģiniet nosūtīt uz"[e-pasts aizsargāts]"- paskatieties, kas no tā sanāk.

inet_protocols = ipv4

Tas varētu būt mulsinoši.

Bet tas nav tikai tā. Katrs jaunais domēns pēc noklusējuma ir tikai IPv4, tad es ieslēdzu IPv6 katram atsevišķi.

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

Šeit mēs norādām, ka viss ienākošais pasts tiek nosūtīts uz dovecot.
Un noteikumi par domēnu, pastkastīti, aizstājvārdu - meklējiet datu bāzē.

/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

Tagad postfix zina, ka pastu var pieņemt tālākai sūtīšanai tikai pēc autorizācijas ar baložu novietni.

Es īsti nesaprotu, kāpēc tas šeit tiek dublēts. Mēs jau esam norādījuši visu, kas nepieciešams “virtual_transport”.

Bet postfix sistēma ir ļoti veca - iespējams, tā ir veco laiku atmiņa.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Katram pasta serverim to var konfigurēt atšķirīgi.

Manā rīcībā ir 3 pasta serveri, un šie iestatījumi ir ļoti atšķirīgi dažādu lietošanas prasību dēļ.

Jums tas ir rūpīgi jākonfigurē - pretējā gadījumā mēstules ieplūdīs pie jums vai, vēl ļaunāk, no jums izplūst surogātpasts.

# SPF
policyd-spf_time_limit = 3600

Dažu spraudņu iestatīšana saistībā ar ienākošo vēstuļu SPF pārbaudi.

# 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

Iestatījums ir tāds, ka mums ir jānodrošina DKIM paraksts ar visiem izejošajiem e-pastiem.

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

Šī ir galvenā detaļa vēstuļu maršrutēšanā, sūtot vēstules no PHP skriptiem.

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

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

Kreisajā pusē ir regulāras izteiksmes. Labajā pusē ir etiķete, kas apzīmē burtu.
Postfix saskaņā ar etiķeti - ņems vērā vēl dažas konfigurācijas rindas konkrētam burtam.

Kā tieši postfix tiks pārkonfigurēts konkrētai vēstulei, tiks norādīts “master.cf”.

Galvenās ir 4., 5., 6. rindas. Kura domēna vārdā sūtām vēstuli, uzliekam šo etiķeti.
Bet vecajā kodā PHP skriptos ne vienmēr ir norādīts lauks “no”. Tad palīgā nāk lietotājvārds.

Raksts jau ir apjomīgs - es nevēlos, lai mani novērstu, iestatot nginx+fpm.

Īsumā katrai vietnei mēs iestatām savu Linux lietotāja īpašnieku. Un attiecīgi jūsu fpm-pool.

Fpm-pool izmanto jebkuru php versiju (tas ir lieliski, ja vienā serverī bez problēmām varat izmantot dažādas php versijas un pat dažādas php.ini blakus vietnēm).

Tātad konkrētam Linux lietotājam “www-domain2” ir vietne domain2.com. Šajā vietnē ir kods e-pasta ziņojumu sūtīšanai, nenorādot lauku no.

Tātad arī šajā gadījumā vēstules tiks nosūtītas pareizi un nekad nenonāks surogātpastu.

Mans "/etc/postfix/master.cf" izskatās šādi:

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

Fails nav nodrošināts pilnībā - tas jau ir ļoti liels.
Es tikai atzīmēju, kas tika mainīts.

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}

Šie iestatījumi ir saistīti ar spamassasin, vairāk par to vēlāk.

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

Mēs ļaujam izveidot savienojumu ar pasta serveri, izmantojot portu 587.
Lai to izdarītu, jums ir jāpiesakās.

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

Iespējot SPF pārbaudi.

apt-get install postfix-policyd-spf-python

Instalēsim iepriekš minēto pakotni SPF pārbaudēm.

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

Un tas ir pats interesantākais. Šī ir iespēja nosūtīt vēstules noteiktam domēnam no noteiktas IPv4/IPv6 adreses.

Tas tiek darīts rDNS dēļ. rDNS ir virknes saņemšanas process pēc IP adreses.
Un pastam šī funkcija tiek izmantota, lai apstiprinātu, ka helo precīzi atbilst tās adreses rDNS, no kuras tika nosūtīts e-pasts.

Ja helo neatbilst e-pasta domēnam, kura vārdā tika nosūtīta vēstule, tiek piešķirti surogātpasta punkti.

Helo neatbilst rDNS - tiek piešķirts daudz surogātpasta punktu.
Attiecīgi katram domēnam ir jābūt savai IP adresei.
OVH - konsolē ir iespējams norādīt rDNS.
Vietnei tech.ru - problēma tiek atrisināta, izmantojot atbalstu.
AWS problēma tiek atrisināta, izmantojot atbalstu.
“inet_protocols” un “smtp_bind_address6” — mēs iespējojam IPv6 atbalstu.
IPv6 jums ir jāreģistrē arī rDNS.
“syslog_name” — un tas ir paredzēts žurnālu lasīšanas ērtībai.

Pērciet sertifikātus Es iesaku šeit.

Šeit tiek iestatīta saite postfix+dovecot.

SPF iestatīšana.

============= Baložu kūts ==============

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

Mysql iestatīšana, pašu pakotņu instalēšana.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorizācija ir tikai šifrēta.

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

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

Šeit mēs norādām burtu uzglabāšanas vietu.

Es vēlos, lai tie tiktu saglabāti failos un grupēti pēc domēna.

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

Šis ir galvenais baložu kūts konfigurācijas fails.
Šeit mēs atspējojam nedrošos savienojumus.
Un iespējojiet drošus savienojumus.

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

Notiek ssl iestatīšana. Mēs norādām, ka ir nepieciešams ssl.
Un pats sertifikāts. Un svarīga detaļa ir “vietējā” direktīva. Norāda, kurš SSL sertifikāts jāizmanto, izveidojot savienojumu ar kādu vietējo IPv4.

Starp citu, IPv6 šeit nav konfigurēts, es vēlāk izlabošu šo izlaidumu.
XX.XX.XX.X5 (domēns2) — nav sertifikāta. Lai savienotu klientus, jānorāda domēns1.com.
XX.XX.XX.X2 (domēns3) - ir sertifikāts, klientu savienošanai varat norādīt domēns1.com vai domain3.com.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Nākotnē tas būs nepieciešams spamassassin.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Šis ir surogātpasta spraudnis. Nepieciešams spamassasin apmācībai laikā, kad notiek pārsūtīšana uz/no mapes “Surogātpasts”.

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

protocol pop3 {
}

Ir tikai šāds fails.

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

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

Lmtp iestatīšana.

Fails "/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 treniņu iestatījumi pārsūtīšanas laikā uz/no mapes Mēstules.

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

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

Fails, kas norāda, ko darīt ar ienākošajiem vēstulēm.

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

require ["fileinto", "mailbox"];

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

Jums ir jāapkopo fails: “sievec default.sieve”.

Fails "/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 failu norādīšana autorizācijai.
Un pats fails tiek izmantots kā autorizācijas metode.

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

Tas atbilst līdzīgiem postfix iestatījumiem.

Fails "/etc/dovecot/dovecot.conf"

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

Galvenais konfigurācijas fails.
Svarīgi ir tas, ka mēs šeit norādām - pievienojiet protokolus.

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

apt-get install spamassassin spamc

Instalēsim pakotnes.

adduser spamd --disabled-login

Pievienosim lietotāju, kura vārdā.

systemctl enable spamassassin.service

Mēs iespējojam automātiskās ielādes spamassassin pakalpojumu ielādes laikā.

Fails "/etc/default/spamassassin":

CRON=1

Iespējojot automātisku noteikumu atjaunināšanu “pēc noklusējuma”.

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

Jums ir jāizveido datu bāze “sa” programmā mysql ar lietotāju “sa” ar paroli “password” (aizstāt ar kaut ko atbilstošu).

report_safe — vēstules vietā tiks nosūtīts ziņojums par surogātpasta e-pasta ziņojumu.
use_bayes ir spamassassin mašīnmācīšanās iestatījumi.

Atlikušie spamassassin iestatījumi tika izmantoti iepriekš rakstā.

Vispārējs iestatījums "spamassassin".
Par jaunu mēstuļu e-pasta ziņojumu pārvietošanu uz IMAP mapi “Surogātpasts”..
Par vienkāršu Dovecot + SpamAssassin kombināciju.
Iesaku izlasīt teoriju par spamassasin apguvi, pārvietojot burtus imap mapēs (un neiesaku to izmantot).

============= Aicinājums kopienai =============

Vēlos arī iemest sabiedrībā ideju par to, kā paaugstināt pārsūtīto vēstuļu drošības līmeni. Tā kā esmu tik dziļi iegrimis pasta tēmā.

Lai lietotājs varētu savam klientam izveidot atslēgu pāri (outlook, thunderbird, pārlūkprogrammas spraudnis, ...). Publisks un privāts. Publisks - nosūtīt uz DNS. Privāts - ietaupiet uz klienta rēķina. Pasta serveri varētu izmantot publisko atslēgu, lai nosūtītu to konkrētam adresātam.

Un, lai aizsargātu pret surogātpastu ar šādām vēstulēm (jā, pasta serveris nevarēs skatīt saturu) - jums būs jāievieš 3 noteikumi:

  1. Obligāts reāls DKIM paraksts, obligāts SPF, obligāts rDNS.
  2. Neironu tīkls par surogātpasta apmācību + tam paredzēta datubāze klienta pusē.
  3. Šifrēšanas algoritmam ir jābūt tādam, lai sūtītājai pusei šifrēšanai ir jāpatērē 100 reizes vairāk CPU jaudas nekā saņēmējai pusei.

Papildus publiskām vēstulēm izstrādājiet standarta priekšlikuma vēstuli “lai sāktu drošu saraksti”. Viens no lietotājiem (pastkaste) nosūta vēstuli ar pielikumu uz citu pastkasti. Vēstulē ir teksta piedāvājums uzsākt drošu saziņas kanālu korespondencei un pastkastes īpašnieka publiskā atslēga (ar privāto atslēgu klienta pusē).

Jūs pat varat izveidot pāris atslēgas īpaši katrai sarakstei. Saņēmējs lietotājs var pieņemt šo piedāvājumu un nosūtīt savu publisko atslēgu (arī īpaši šai sarakstei). Tālāk pirmais lietotājs nosūta pakalpojuma kontroles vēstuli (šifrētu ar otrā lietotāja publisko atslēgu) - pēc tās saņemšanas otrais lietotājs var uzskatīt izveidoto sakaru kanālu par uzticamu. Tālāk otrais lietotājs nosūta kontroles vēstuli – un tad arī pirmais lietotājs var uzskatīt izveidoto kanālu par drošu.

Lai cīnītos pret atslēgu pārtveršanu ceļā, protokolā jāparedz iespēja pārsūtīt vismaz vienu publisko atslēgu, izmantojot zibatmiņas disku.

Un vissvarīgākais ir tas, ka tas viss darbojas (jautājums ir "kurš par to maksās?"):
Ievadiet pasta sertifikātus, sākot no USD 10 uz 3 gadiem. Tas ļaus sūtītājam dns norādīt, ka “manas publiskās atslēgas atrodas tur”. Un tie dos jums iespēju izveidot drošu savienojumu. Tajā pašā laikā šādu savienojumu pieņemšana ir bez maksas.
Gmail beidzot gūst peļņu no saviem lietotājiem. Par 10 $ uz 3 gadiem - tiesības izveidot drošus korespondences kanālus.

============= Secinājums ==============

Lai pārbaudītu visu rakstu, es grasījos īrēt speciālu serveri uz mēnesi un iegādāties domēnu ar SSL sertifikātu.

Bet dzīves apstākļi attīstījās, tāpēc šis jautājums ievilkās 2 mēnešus.
Un tā, kad atkal bija brīvs laiks, nolēmu publicēt rakstu tādu, kāds tas ir, nevis riskēt, ka publikācija ievilksies vēl uz gadu.

Ja ir diezgan daudz jautājumu, piemēram, "bet tas nav pietiekami detalizēti aprakstīts", tad, iespējams, būs spēks paņemt speciālu serveri ar jaunu domēnu un jaunu SSL sertifikātu un aprakstīt to vēl detalizētāk un vairumā gadījumu. galvenais, identificējiet visas trūkstošās svarīgās detaļas.

Vēlos arī saņemt atsauksmes par idejām par pasta apliecībām. Ja jums patīk ideja, es mēģināšu atrast spēku uzrakstīt uzmetumu rfc.

Kopējot lielas raksta daļas, norādiet saiti uz šo rakstu.
Tulkojot jebkurā citā valodā, norādiet saiti uz šo rakstu.
Mēģināšu pats to pārtulkot angliski un atstāt savstarpējās atsauces.


Avots: www.habr.com

Pievieno komentāru