Šis raksts ir par to, kā konfigurēt mūsdienīgu pasta serveri.
Postfix + Dovecot. SPF + DKIM + rDNS. Ar IPv6.
Ar TSL šifrēšanu. Ar atbalstu vairākām domēnām — daļa ar īstu SSL sertifikātu.
Ar pretspama aizsardzību un augstu pretspama reitingu citu pasta serveru vidū.
Ar atbalstu vairākām fiziskām saskarnēm.
Ar OpenVPN, piekļuve tam caur IPv4 un tas nodrošina IPv6.
Ja nevēlaties apgūt visas šīs tehnoloģijas, bet vēlaties konfigurēt šādu serveri — šis raksts ir jums.
Rakstā nav mēģinājumu izskaidrot katru detaļu. Izskaidrošana attiecas uz to, kas ir konfigurēts nestandarta vai svarīgi patērētāja viedokļa.
Motivācija konfigurēt pasta serveri — mana senā sapnis. Varbūt tas izklausās muļķīgi, bet IMHO, tas ir daudz labāk nekā sapņot par jaunu auto no iecienītākās markas.
Motivācija konfigurēt IPv6 — divas. IT speciālistam ir nepieciešams pastāvīgi apgūt jaunas tehnoloģijas, lai izdzīvotu. Vēlos dot savu pieticīgo ieguldījumu cīņā pret cenzūru.
Motivācija konfigurēt OpenVPN — tikai, lai IPv6 darbotos uz lokālās mašīnas.
Motivācija konfigurēt vairākas fiziskas saskarnes — manā serverī ir viena saskarne "lēna, bet neierobežota", un otra "ātra, bet par tarifu".
Motivācija konfigurēt Bind — mans providers nodrošina nestabilu DNS serveri, un Google dažkārt arī dod kļūdas. Vēlos stabilu DNS serveri personīgai lietošanai.
Motivācija uzrakstīt rakstu — melnraksts tika uzrakstīts pirms 10 mēnešiem, un es to jau divas reizes esmu skatījies. Ja pat autoram tas regulāri ir nepieciešams — tad ir liela varbūtība, ka tas būs nepieciešams arī citiem.
Universāla risinājuma pasta serverim nav. Bet es mēģināšu rakstīt kaut ko līdzīgu "izdari šādi un tad, kad viss darbosies kā vajag — izmet lieko".
Ir serveris Colocation pie uzņēmuma tech.ru. Ir iespēja salīdzināt ar OVH, Hetzner, AWS. Šīs problēmas risināšanai daudz efektīvāk būs sadarboties tieši ar tech.ru.
Uz servera ir uzstādīts Debian 9.
Uz servera ir 2 saskarnes `eno1` un `eno2`. Pirmais ir neierobežots, bet otrais ir ātrs attiecīgi.
Ir 3 statiskie IP adreses, XX.XX.XX.X0 un XX.XX.XX.X1 un XX.XX.XX.X2 uz saskarnes `eno1` un XX.XX.XX.X5 uz saskarnes `eno2`.
Ir XXXX:XXXX:XXXX:XXXX::/64 IPv6 adreses pasaule, kas ir piešķirtas uz saskarni `eno1`, un no tā XXXX:XXXX:XXXX:XXXX:1:2::/96 pēc manas lūguma tika piešķirta `eno2`.
Ir ir pieejami 3 domēni `domain1.com`, `domain2.com`, `domain3.com`. Domēniem `domain1.com` un `domain3.com` ir SSL sertifikāts.
Ir google konts, kuru vēlos saistīt ar e-pasta adresi `vasya.pupkin@domain1.com` (e-pasta saņemšana un sūtīšana tieši no gmail saskarnes).
Jābūt e-pasta adresei `support@domain2.com`, no kuras kopiju e-pasta es vēlos redzēt savā gmail. Un reti ir jādod iespēja sūtīt kaut ko no `support@domain2.com` caur tīmekļa saskarni.
Jābūt e-pasta adresei `ivanov@domain3.com`, kuru izmantos Ivanovs no sava iPhone.
Sūtītajiem e-pastiem jāatbilst visām mūsdienu prasībām pret surogātpastu.
Jābūt augstākajam šifrēšanas līmenim, kas paredzēts publiskajās tīklos.
Ir jāatbalsta IPv6 gan sūtīšanai, gan saņemšanai.
Jābūt SpamAssassin, kas nekad neizdzēsīs e-pastus. Tas darīs vai nu bounce, vai neizsūtīs, vai nosūtīs IMAP mapē "Surogātpasts".
Jābūt iestatītai automātiskajai apmācībai SpamAssassin: ja pārvietoju e-pastu uz mapi "Surogātpasts" — tas mācīsies no tā; ja pārvietoju e-pastu no mapes "Surogātpasts" — tas mācīsies no tā. SpamAssassin apmācības rezultātiem jāietekmē e-pasta nokļūšanu mapē "Surogātpasts".
PHP skriptiem jāspēj sūtīt e-pastu no jebkura domēna uz šī servera.
Jābūt openvpn pakalpojumam ar iespēju izmantot IPv6 klientiem, kam nav IPv6.
Vispirms ir jākonfigurē saskarnes un maršrutēšana, tostarp IPv6.
Pēc tam jāiestata OpenVPN, kas savienosies ar IPv4 un nodrošinās klientam statisku reālu IPv6 adresi. Šim klientam būs piekļuve visiem IPv6 pakalpojumiem serverī un piekļuve jebkurām IPv6 resursiem internetā.
Pēc tam jāiestata Postfix e-pasta sūtīšanai + SPF + DKIM + rDNS un citi tamlīdzīgi sīkumi.
Pēc tam jāiestata Dovecot un jāiestata Multidomain.
Pēc tam jāiestata SpamAssassin un jāiestata apmācība.
Noslēgumā jāuzstāda Bind.
============= Multi-saskarnes =============
Lai konfigurētu saskarnes, jāieraksta šāda informācija "\/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 piemērot jebkurā serverī tech.ru (ar nelielu saskaņošanu ar atbalstu) un tas nekavējoties darbosies, kā vajag.
Ja ir pieredze līdzīgu lietu iestatīšanā Hetzner, OVH — tur ir citādi. Grūtāk.
eno1 — tas ir tīkla kartei #1 nosaukums (lēns, bet bezlimita).
eno2 — tas ir tīkla kartei #2 nosaukums (ātrs, bet ar tarifiem).
tun0 — tas ir virtuālais 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 priekš eno2, viss pārējais nāk caur eno1.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 vārteja (jāatzīmē, ka šeit var/nāk jādara citādi. Jāpārskata IPv6 pārslēga iestatījumi).
dns-nameservers — norādīti 127.0.0.1 (tāpēc, ka bind ir instalēts lokāli) un 213.248.1.6 (tas ir no tech.ru).
«table eno1t» un «table eno2t» — šo route-rule jēga ir tāda, lai satiksme, kas ienāk caur eno1, aizietu caur to pašu, un satiksme, kas ienāk caur eno2, aizietu caur to pašu. Tāpat savienojumi, kas iniciēti no servera, aizietu caur eno1.
ip route add default via XX.XX.XX.1 table eno1tAr šo komandu mēs nosakām, ka jebkura nesaprotama satiksme, kas iekļaujas jebkurā noteikumā, kam ir atzīmēts «table eno1t» - > tiks novirzīta uz interfeisu eno1.
ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1tAr šo komandu mēs nosakām, ka jebkura satiksme, kas iniciēta no servera, tiks novirzīta uz interfeisu eno1.
ip rule add table eno1t from XX.XX.XX.X0
ip rule add table eno1t to XX.XX.XX.X0Ar šo komandu mēs nosakām pašus 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 nosaka otro IPv4 interfeisam eno1.
ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t Ar šo komandu mēs nosakām maršrutu no OpenVPN klientiem uz lokālajiem IPv4 izņemot XX.XX.XX.X0.
Kāpēc šī komanda ir pietiekama visiem IPv4 — es joprojām nesaprotu.
iface eno1 inet6 static
address XXXX:XXXX:XXXX:XXXX:1:1::/64
gateway XXXX:XXXX:XXXX:XXXX::1Šeit mēs nosakām adresi pašam interfeisam. Serveris to izmantos kā «izejošo» adresi. Nekā citādi tā netiks izmantota.
Kāpēc «:1:1::» ir norādīts tik sarežģīti? Lai OpenVPN darbotos pareizi un tikai tam. Par to sīkāk vēlāk.
Par vārteju — tas darbojas, un tas ir labi. Bet pareizi — šeit vajadzētu norādīt IPv6 pārslēgam, pie kā pieslēgts serveris.
Tomēr kaut kāpēc IPv6 pārtrauc darboties, ja es tā rīkojos. Iespējams, tas ir tech.ru kāds dīvainais moments.
ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACETas ir IPv6 adreses pievienošana interfeisam. Ja nepieciešamas simts adreses — tas nozīmē simts rindas š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::/80Atzīmēju adreses un apakštīklus visiem interfeisiem, lai būtu skaidri redzams.
eno1 — obligāti jābūt «/64» — jo tas ir viss mūsu adresu pool.
tun0 — apakšnodaļai obligāti jābūt lielākai par eno1. Pretējā gadījumā nevarēs iestatīt IPv6 vārteju OpenVPN klientiem.
eno2 — apakšnodaļai obligāti jābūt lielākai par tun0. Pretējā gadījumā OpenVPN klienti nevarēs piekļūt lokālajām IPv6 adresēm.
Lai saprastu labāk, es izvēlējos apakšnodaļas soli 16, bet, ja vēlaties, var pat iestatīt soli uz «1».
Attiecīgi 64+16 = 80, bet 80+16 = 96.Lai vēl vairāk saprastu:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY — tās ir adreses, kas jānosedz konkrētiem mājaslapām vai pakalpojumiem uz interfeisa eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY — tās ir adreses, kas jānosedz konkrētiem mājaslapām vai pakalpojumiem uz interfeisa eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY — tās ir adreses, kas jānosedz OpenVPN klientiem vai tiek izmantotas kā OpenVPN darba adreses.
Lai iestatītu tīklu — jābūt iespējai restartēt serveri.
IPv4 izmaiņas tiks uzņemtas papildus izpildot (obligāti jāiesaiņo screen — citādi šī komanda vienkārši izsistīs tīklu serverī):
/etc/init.d/networking restartFailā «/etc/iproute2/rt_tables» pievienot beigās:
100 eno1t
101 eno2t Bez tā nevar izmantot pielāgotas tabulas failā «/etc/network/interfaces».
Skaitļiem jābūt unikāliem un mazākiem par 65535.
IPv6 izmaiņas tiek veiktas viegli bez restartēšanas, bet tādēļ jāiemācās vismaz trīs komandas:
ip -6 addr ...
ip -6 route ...
ip -6 neigh ...Iestatīšana «/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Šīs ir manu servera «sysctl» iestatījumi. Izceltu svarīgo.
net.ipv4.ip_forward = 1Bez tā OpenVPN nevar darboties vispār.
net.ipv6.ip_nonlocal_bind = 1Ikviens, kurš mēģinās veikt bind IPv6 (piemēram, nginx) tūlīt pēc tam, kad interfeiss ir izveidots — saņems kļūdu. Tādu adresi nav pieejams.
Lai izvairītos no šādas situācijas, tiek veikta šāda iestatīšana.
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1Bez šiem iestatījumiem IPv6 satiksme no OpenVPN klienta nesasniegs pasauli.
Citi iestatījumi vai nu neattiecas uz šo, vai es neatceros, kāpēc tie ir.
Bet katrā ziņā atstāšu «kā ir».
Lai šī faila izmaiņas tiktu uzņemtas bez servera restartēšanas — jāizpilda komanda:
sysctl -pSīkāk par «tabula» noteikumiem:
============= OpenVPN =============
OpenVPN IPv4 nedarbojas bez iptables.
Man ir šādi iptables 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 — tas ir mans statiskais IPv4 adrese lokālajai mašīnai.
10.8.0.0/24 — IPv4 tīkls OpenVPN. IPv4 adreses OpenVPN klientiem.
Noteikumu secība ir svarīga.
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 DROPTas ir ierobežojums, lai tikai es no sava statiskā IP varētu izmantot OpenVPN.
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
-- vai --
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADELai nodrošinātu IPv4 paketu pārsūtīšanu starp OpenVPN klientiem un internetu — jāizpilda viena no šīm komandām.
Dažādiem gadījumiem viena no opcijām nevar būt piemērota.
Manai situācijai abas komandas ir piemērotas.
Pārlasot dokumentāciju, es izvēlējos pirmo variantu, jo tas patērē mazāk CPU.
Lai visas iptables konfigurācijas tiktu ielādētas pēc restartēšanas — tās jāsaglabā kaut kur.
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6Šādi nosaukumi izvēlēti ne bez iemesla. Tos izmanto pakotne «iptables-persistent».
apt-get install iptables-persistentGalvenā OpenVPN pakotnes instalēšana:
apt-get install openvpn easy-rsaIestatīsim veidni sertifikātiem (ievietojiet savas vērtības):
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
ln -s openssl-1.0.0.cnf openssl.cnfRediģēsim sertifikātu veidnes iestatījumus:
mcedit vars...
# Tie ir noklusējuma vērtības laukiem
# kuri tiks novietoti sertifikātā.
# Neatstājiet nevienu no šiem laukiem tukšus.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Krasnodar"
export KEY_CITY="Dinskaya"
export KEY_ORG="Own"
export KEY_EMAIL="admin@domain1.com"
export KEY_OU="VPN"
# X509 Subject Field
export KEY_NAME="server"
...Izveidojam servera sertifikātu:
cd ~/openvpn-ca
source vars
./clean-all
./build-ca
./build-key-server server
./build-dh
openvpn --genkey --secret keys/ta.keySagatavojam 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-CBCSagatavosim 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}/${1}.crt
<(echo -e '</cert>n<key>')
${KEY_DIR}/${1}.key
<(echo -e '</key>n<tls-auth>')
${KEY_DIR}/ta.key
<(echo -e '</tls-auth>')
> ${OUTPUT_DIR}/${1}.ovpnIzveidojam pirmo OpenVPN klientu:
cd ~/openvpn-ca
source vars
./build-key client-name
cd ~/client-configs
./make_config.sh client-nameFails «~/client-configs/files/client-name.ovpn» tiek nosūtīts uz klienta ierīci.
iOS klientiem būs jāizdara triks:
«tls-auth» taga saturs drīkst būt bez komentāriem.
Un jānovieto «key-direction 1» tieši pirms «tls-auth» taga.
Konfigurēsim OpenVPN servera iestatījumus:
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-CBCTas ir nepieciešams, lai katram klientam piešķirtu statisku adresi (nav obligāti, bet es to lietoju):
# Client config dir
client-config-dir /etc/openvpn/ccdVisgrūtākā un svarīgākā detaļa.
Diemžēl OpenVPN vēl nespēj pats iestatīt IPv6 galamērķi klientiem.
Jāizveido «manuāli» tunelēšana 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 eno1Fails «/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 eno1Abi skripti izmanto failu «/etc/openvpn/variables»:
# Subnet
prefix=XXXX:XXXX:XXXX:XXXX:2:
# netmask
prefixlen=112Kāpēc šeit tā rakstīts — nezinu.
Šobrīd izskatās dīvaini netmask = 112 (šajā gadījumā 96 vajadzētu būt).
Un prefix dīvains, nesakrīt ar tun0 tīklu.
Bet labi, atstāju «kā ir».
cipher DES-EDE3-CBCTas ir gaumes jautājums — es izvēlējos šādu savienojuma šifrēšanu.
============= Postfix =============
Pamatpakotnes uzstādīšana:
apt-get install postfixUzstādīšanas laikā izvēlēties «interneta vietne».
Mans «/etc/postfix/main.cf» izskatās tā:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = nē
# .domain pievienošana ir MUA uzdevums.
append_dot_mydomain = nē
readme_directory = nē
# Skatiet http://www.postfix.org/COMPATIBILITY_README.html -- noklusējums ir 2 uz
# jauniem uzstādījumiem.
compatibility_level = 2
# TLS parametri
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
smtpd_use_tls=jā
smtpd_tls_auth_only = jā
smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1
smtp_tls_security_level = varam
smtp_tls_ciphers = eksportēt
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
# Glabāšanas veids
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 iestatījumi
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = jā
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 = pieņemt
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock
# IP adrese pa domēnu
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcreApskatīsim šī konfiga detaļas.
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.keyPēc habrā komentētāju domām, šis bloks satur `dezinformāciju un nepareizus apgalvojumus`.Tikai pēc astoņiem gadiem kopš manas karjeras sākuma es sāku saprast, kā SSL darbojas.
Tāpēc es uzņemos aprakstīt, kā izmantot SSL (neatbildot uz jautājumiem „Kā tas darbojas?” un „Kāpēc tas darbojas?”).
Mūsdienu šifrēšanas pamats ir atslēgu pāra izveidošana (divas ļoti garas simbolu virknes).
Viens “atslēga” ir privāta, otra atslēga “publiska”. Privāto atslēgu ļoti rūpīgi glabājam noslēpumā. Publisko atslēgu izsniedzam visiem gribētājiem.
Ar publisko atslēgu var šifrēt teksta virkni tā, ka to var atšifrēt tikai privātās atslēgas īpašnieks.
Nu, lūk arī viss tehnoloģijas pamats.Solis №1 — https vietnes.
Pārlūks, piekļūstot vietnei, uzzina no tīmekļa servera, ka vietne ir https, tāpēc pieprasa publisko atslēgu.
Vebserveris nodod publisko atslēgu. Pārlūkprogramma, izmantojot publisko atslēgu, šifrē http pieprasījumu un to nosūta.
Http pieprasījuma saturu var izlasīt tikai tam, kam ir privātā atslēga, t.i., tikai serveris, uz kuru tiek veikts pieprasījums.
Http pieprasījums satur vismaz URI. Tādēļ, ja valstī cenšas ierobežot piekļuvi nevis visam vietnei, bet konkrētai lapai — tad https vietnēm to izdarīt nav iespējams.2. solis — šifrēta atbilde.
Vebserveris sniedz atbildi, kuru ceļā var viegli izlasīt.
Risinājums ir izslēgts — pārlūkprogramma vietēji izveido tādu pašu privāto-publisko atslēgu pāri katrai https vietnei.
Un kopā ar pieprasījumu publiskā atslēga nosūta savu vietējo publisko atslēgu.
Vebserveris to atceras un, sūtot http atbildi, šifrē to ar konkrētā klienta publisko atslēgu.
Tagad http atbildi var atšifrēt tikai privātā atslēgas pārlūkprogrammas īpašnieks (proti, pats klients).3. solis — aizsargāta savienojuma izveide pa publisko kanālu.
2. piemērā ir ievainojamība — nekas netraucē labvēlīgajiem nolaist http pieprasījumu un modificēt informāciju par publisko atslēgu.
Tādējādi starpnieks varēs brīnišķīgi redzēt visu nosūtīto un saņemto ziņojumu saturu, kamēr netiek mainīts sakaru kanāls.
Cīnīties ar to ir ļoti vienkārši — pietiek nosūtīt pārlūkprogrammas publisko atslēgu kā ziņojumu, ko šifrējusi vebservera publiskā atslēga.
Vebserveris tad vispirms sūta atbildi, kas saka: 'tava publiskā atslēga ir šāda' un šifrē šo ziņojumu ar to pašu publisko atslēgu.
Pārlūkprogramma skatās atbildi — ja ir saņemts ziņojums 'tava publiskā atslēga ir šāda' — tad tas ir 100% garantija, ka šis sakaru kanāls ir drošs.
Cik drošs?
Paša šāda droša sakaru kanāla izveide notiek ar ātrumu ping*2. Piemēram, 20ms.
Uzbrucējam jābūt vai nu iepriekšējai privātajai atslēgai vienai no pusēm. Vai jāizvēlas privātā atslēga pāris milisekundēs.
Mūsdienu privātās atslēgas uzlaušana aizņems desmitiem gadu uz superdatoriem.4. solis — publiska publisko atslēgu datubāze.
Acīmredzami, ka visā šajā lietā pastāv iespēja uzbrucējam, kurš sēž sakaru kanālā starp klientu un serveri.
Iespēja klientam izlikties par serveri, bet serverim par klientu. Un veikt simulu divām atslēgām abos virzienos.
Tad uzbrucējs redzēs visu trafiku un varēs "pārlabot" trafiku.
Piemēram, mainīt adresi, uz kuru nosūtīt naudu, vai n copiar paroli no tiešsaistes bankas, vai bloķēt "nepatīkamo" saturu.
Lai cīnītos ar šādiem uzbrucējiem, tika izstrādāta publiska datu bāze ar publiskajām atslēgām katram https vietnes.
Katrs pārlūks "zina" par apmēram 200 šādām datu bāzēm. Tas ir iepriekš iestatīts katrā pārlūkā.
"Zināšanas" tiek apstiprinātas ar publisko atslēgu no katra sertifikāta. Tas nozīmē, ka savienojumu ar katru konkrētu sertifikācijas centru ir neiespējami viltošs.Tagad ir skaidrs, kā izmantot SSL https.
Ja padomājat, kļūs skaidrs, kā speciālie dienesti varētu šajā konstrukcijā kaut ko uzlauzt. Bet tas viņiem prasīs milzīgas pūles.
Un organizācijām mazāk par NSA vai CIA — esošo aizsardzības līmeni praktiski neiespējami uzlauzt pat VIP.Arī pieminēšu par ssh savienojumiem. Tur nav publisko atslēgu, tad kā rīkoties. Jautājums tiek risināts divos veidos.
SSH ar paroli variants:
Pirmajā savienojumā ssh klients jābrīdina, ka šeit ir jauna publiskā atslēga no ssh servera.
Un nākamajos savienojumos, ja parādās brīdinājums "jauna publiskā atslēga no ssh servera" — tas nozīmēs, ka mēģina klausīties.
Vai pirmajā savienojumā jūs klausījāties, bet tagad sazināties ar serveri bez starpniekiem.
Patiesībā, jo klausīšanās fakts ir viegli, ātri un bez piepūles atklājams — šāda uzbrukuma izmanto tikai īpašos gadījumos, konkrētiem klientiem.SSH ar atslēgu variants:
Paņemiet zibatmiņu, ierakstiet uz tās privāto atslēgu ssh serverim (tam ir termini un daudz būtisku nianses, bet es rakstu izglītojošu tekstu, nevis instrukciju par lietošanu).
Publisko atslēgu atstājam uz datora, kur būs ssh klients, un to arī turam noslēpumā.
Atnesam zibatmiņu pie servera, ieliekam to, kopējam privāto atslēgu, pēc tam zibatmiņu sadedzinām un izklājam pelnus pa vēju (vai vismaz formatējam ar nullēm).
Un tas ir viss — pēc šādas darbības būs neiespējami uzlauzt šādu ssh savienojumu. Protams, pēc 10 gadiem superdatorā varbūt varēs apskatīt datu plūsmu — bet tas ir atsevišķs stāsts.Atvainojos par off-topic.
Tātad, tagad, kad teorija ir zināma. Pastāstīšu par ssl sertifikāta izveides plūsmu.
Ar «openssl genrsa» mēs izveidojam privāto atslēgu un «paraugu» publiskai atslēgai.
«paraugus» nosūtām trešajai pusei, kurai mēs maksājam apmēram $9 par visvienkāršāko sertifikātu.
Pēc pāris stundām mēs saņemam no šīs trešās puses mūsu «publisko» atslēgu un vēl komplektu ar vairākiem publiskajiem atslēgām.
Kāpēc trešai pusei maksāt par mana publiskā atslēgas noformēšanu — tas ir atsevišķs jautājums, ko šeit apspriest neplānojam.
Tagad ir skaidrs, kas nozīmē uzraksts:
smtpd_tls_key_file=\/etc\/ssl\/domain1.com.2018.key Mape «\/etc\/ssl» satur visus failus saistībā ar ssl jautājumiem.
domain1.com — domēna nosaukums.
2018 — atslēgu izveidošanas gads.
«key» — norāde, ka fails ir privātā atslēga.
Un šī faila nozīme:
smtpd_tls_cert_file=\/etc\/ssl\/domain1.com.2018.chained.crt
domain1.com — domēna nosaukums.
2018 — atslēgu izveidošanas gads.
chained — norāde, ka šeit ir publisko atslēgu ķēde (pirmais — mūsu publiskā un pārējie — kas nākuši no uzņēmuma, kas noformējis publisko atslēgu).
crt — norāde, ka šeit ir gatavais sertifikāts (publiskā atslēga ar tehniskajiem skaidrojumiem).
smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1Šī iestatīšana šajā gadījumā netiek izmantota, bet rakstīta piemēram.
Jo kļūda šajā parametrā novest pie tā, ka jūsu serveris sūta surogātpastu (bez jūsu labprātības).
Pēc tam pierādiet visiem, ka neesat vainīgs.
recipient_delimiter = +Iespējams, daudzi nezin, bet tas ir standarta simbols, lai klasificētu pasta sūtījumus, un to atbalsta lielākā daļa mūsdienu pasta serveru.
Piemēram, ja jums ir e-pasta kastīte «username@gmail.com», izmēģiniet nosūtīt uz «username+spam@gmail.com» — apskatiet, kas no tā iznāk.
inet_protocols = ipv4Iespējams, tas varētu mulsināt.
Bet tas nav nejauši. Katram jaunajam domēnam — pēc noklusējuma tikai IPv4, tad ieslēdzam 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 visa ienākošā pasta plūsma iet uz dovecot.
Un noteikumi domēnam, pastkastei, alias — skatīt DB.
/etc/postfix/mysql-virtual-mailbox-domains.cf
lietotājs = usermail
parole = mailpassword
hosti = 127.0.0.1
db nosaukums = servermail
vaicājums = SELECT 1 FROM virtual_domains WHERE name='%s'/etc/postfix/mysql-virtual-mailbox-maps.cf
lietotājs = usermail
parole = mailpassword
hosti = 127.0.0.1
db nosaukums = servermail
vaicājums = SELECT 1 FROM virtual_users WHERE email='%s'/etc/postfix/mysql-virtual-alias-maps.cf
lietotājs = usermail
parole = mailpassword
hosti = 127.0.0.1
db nosaukums = servermail
vaicājums = SELECT destination FROM virtual_aliases WHERE source='%s'# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yesTagad postfix zina, ka pieņemt pastu tālākai nosūtīšanai var tikai ar dovecot autentifikāciju.
Man patiešām nav skaidrs, kāpēc to te dubulēt. Mēs jau esam norādījuši «virtual_transport» visu, kas nepieciešams.
Bet postfix sistēma ir ļoti veca — droši vien tas ir risinājums no vecajiem laikiem.
smtpd_recipient_restrictions =
...
smtpd_helo_restrictions =
...
smtpd_client_restrictions =
...To jāiestata katram pastkalkam individuāli.
Manā rīcībā ir 3 pastkalkas un šie iestatījumi ir ļoti atšķirīgi atkarībā no lietošanas prasībām.
Iestatiet uzmanīgi — citādi surogātpasts uzplūdīs pie jums vai vēl sliktāk — surogātpasts plūdīs no jums.
# SPF
policyd-spf_time_limit = 3600Iestatījums kādam papildinājumam, kas saistīts ar SPF ienākošo e-pastu 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.sockIestatījums, ka visiem izejošajiem e-pastiem mums jānodrošina DKIM paraksts.
# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcreTas ir izšķirošs aspekts e-pastu maršrutēšanā, nosūtot e-pastus no php skriptiem.
Fails «/etc/postfix/sdd_transport.pcre»:
/^www-domain1@domain1.com$/ domain1:
/^www-domain2@domain1.com$/ domain2:
/^www-domain3@domain1.com$/ domain3:
/@domain1.com$/ domain1:
/@domain2.com$/ domain2:
/@domain3.com$/ domain3:Pa kreisi — regulārās izteiksmes. Pa labi — metkā, ar kuru tiek atzīmēts e-pasts.
Postfix, pamatojoties uz metku — ņems vērā vēl dažas konfigurācijas rindas konkrētajam e-pastam.Kā tieši postfix tiks pārkonfigurēts konkrētajam e-pastam — tiks norādīts «master.cf».
Rindas 4, 5, 6 — tās ir galvenās. No kāda domēna nosūtām e-pastu — tādu metku arī uzliekam.
Bet ne vienmēr php skriptos vecajā kodā tiek norādīts lauks «from». Tādēļ palīgā nāk lietotājvārds.Raksts tāpat ir plašs — negribētos novērst uzmanību uz nginx+fpm iestatīšanu.
Īsi — mēs katram vietne iestatām savu linux-user īpašnieku. Un attiecīgi savu fpm-pool.
Fpm-pool izmanto jebkuru php versiju (tas ir lieliski, jo vienā serverī bez problēmām blakus esošām vietnēm var izmantot atšķirīgas php versijas un pat atšķirīgus php.ini).
Tātad konkrētajam linux-user «www-domain2» ir vietne domain2.com. Šajā vietnē ir kods, kas nosūta e-pastus, ne norādot lauku from.
Tādā gadījumā e-pasti tiks nosūtīti pareizi un nekad nenonāks surogātpasta mapē.
Mans «/etc/postfix/master.cf» izskatās 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 Fails atsauce nav pilnīgi — tas jau tāpat ir ļoti liels.
Atzīmēju tikai to, kas ir 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 ir iestatījumi, kas saistīti ar spamassassin, 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 Atļaujam pieslēgties e-pasta serverim caur 587. portu.
Pirms tam obligāti jāautorizējas.
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spfIeslēdzam SPF pārbaudi.
apt-get install postfix-policyd-spf-pythonUzstādīsim pakotni SPF pārbaudēm iepriekš.
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-domain1Un tas ir viss interesantākais. Tas ir iespēja sūtīt e-pastus konkrētam domēnam no konkrēta IPv4/IPv6 adreses.
Tas tiek darīts, lai nodrošinātu rDNS. rDNS — tas ir pogas iegūšana no IP adreses.
Un e-pastam šī iespēja tiek izmantota, lai apstiprinātu, ka helo tiešām atbilst šī adreses rDNS, no kurienes tika nosūtīts e-pasts.Ja helo neatbilst e-pasta domēnam, no kura tika nosūtīts e-pasts — tiek piešķirti surogātpasta punkti.
Helo neatbilst rDNS — tiek piešķirts daudz surogātpasta punktu.
Tātad katram domēnam ir jābūt savai IP adresei.
OVH ir iespēja norādīt rDNS konsolē.
tech.ru jautājums tiek risināts caur atbalstu.
AWS jautājums tiek risināts caur atbalstu.
«inet_protocols» un «smtp_bind_address6» — šie iespējo IPv6 atbalstu.
Arī IPv6 nepieciešams norādīt rDNS.
«syslog_name» — tas ir ērtībai, lai lasītu žurnālus.
Pirkšanas sertifikāti .
.
============= Dovecot =============
apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispamMysql konfigurācija, instalējam pašus pakotnes.
Fails «/etc/dovecot/conf.d/10-auth.conf»
disable_plaintext_auth = yes
auth_mechanisms = plain loginAutentifikācija tikai šifrētā veidā.
Fails «/etc/dovecot/conf.d/10-mail.conf»
mail_location = maildir:/var/mail/vhosts/%d/%nŠeit norādīsim e-pastu glabāšanas vietu.
Es vēlos, lai tie tiktu glabāti failos un grupēti pēc domēniem.
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 {
}
} Tas ir galvenais dovecot iestatījumu fails.
Šeit atslēdzam neaizsargātās savienojumus.
Un iespējot aizsargātos 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
}Konfigurējam ssl. Norādam, ka ssl — ir obligāts.
Un pats sertifikāts. Un svarīga detaļa — direktīva «local». Norāda, pie kura lokālā IPv4, kāds ssl sertifikāts jātiek izmantotam.Starp citu, IPv6 šeit nav konfigurēts, to labošanu izdarīšu vēlāk.
XX.XX.XX.X5 (domain2) — sertifikāta nav. Klientu savienojumiem nepieciešams norādīt domain1.com.
XX.XX.XX.X2 (domain3) — sertifikāts ir, klientu savienojumiem var norādīt domain1.com vai domain3.com.
Fails «/etc/dovecot/conf.d/15-lda.conf»
protocol lda {
mail_plugins = $mail_plugins sieve
}Tas būs nepieciešams spamassassin tālāk.
Fails «/etc/dovecot/conf.d/20-imap.conf»
protocol imap {
mail_plugins = $mail_plugins antispam
}Tas ir antispam spraudnis. Nepieciešams spamassassin apmācībai pārvietošanas laikā uz/iz «Spam» mapes.
Fails «/etc/dovecot/conf.d/20-pop3.conf»
protocol pop3 {
}Vienkārši šāds fails ir.
Fails «/etc/dovecot/conf.d/20-lmtp.conf»
protokols lmtp {
mail_plugins = $mail_plugins sieve
postmaster_address = admin@domain1.com
}LMTP iestatījumi.
Fails «/etc/dovecot/conf.d/90-antispam.conf»
plugins {
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
}Spamassassin apmācības iestatījumi pārvietošanas laikā starp «Spam» mapēm.
Fails «/etc/dovecot/conf.d/90-sieve.conf»
plugins {
sieve = ~/dovecot.sieve
sieve_dir = ~/sieve
sieve_after = /var/lib/dovecot/sieve/default.sieve
}Fails, kurā norādīts, ko darīt ar ienākošajiem e-pastiem.
Fails «/var/lib/dovecot/sieve/default.sieve»
require ["fileinto", "mailbox"];
if header :contains "X-Spam-Flag" "YES" {
fileinto :create "Spam";
}Jāizveido 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ījums autorizācijai.
Un pats fails — kā autorizācijas veids.
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 zīmējumiem, kas paredzēti postfix.
Fails «/etc/dovecot/dovecot.conf»
protokoli = imap lmtp pop3
listen = *, ::
dict {
}
!include conf.d/*.conf
!include_try local.conf Galvenais konfigurācijas fails.
Svarīgi, ka mēs šeit norādām-pievienojam protokolus.
============= SpamAssassin =============
apt-get install spamassassin spamcInstalēsim pakotnes.
adduser spamd --disabled-loginPievienojam lietotāju, kurā pieteiksimies.
systemctl enable spamassassin.serviceIespējojiet automātisko ielāpi spamassassin pakalpojumu startējot.
Fails «/etc/default/spamassassin»:
CRON=1Iespējot automātisko jauno noteikumu atjaunoš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 passwordJāizveido mysql datubāze «sa» lietotājam «sa» ar paroli «password» (aizvietojiet ar kaut ko saprātīgu).
report_safe — tas nozīmē, ka e-pasta ziņojumam tiks nosūtīts pārskats par e-pasta plūdiem.
use_bayes — tas ir spamassassin mašīnmācīšanās iestatījumi.
Pārējie spamassassin iestatījumi tika piemēroti iepriekš rakstā.
.
.
.
.
============= Aicinājums uz kopienu =============
Vēlētos ieteikt ideju kopienai par to, kā uzlabot sūtīto e-pastu drošību. Tā kā esmu dziļi iegremdējies e-pasta tēmā.
Lai lietotājs savā klients (Outlook, Thunderbird, pārlūka paplašinājums u.c.) varētu izveidot divus atslēgas. Publisko un privāto. Publisko — nosūtīt DNS. Privāto — saglabāt savā klientā. Pasta serveri varētu izmantot publisko atslēgu sūtīšanai konkrētam adresātam.
Un, lai aizsargātu no surogātpasta šādās e-kartēs (jā, pasta serveris nevarēs apskatīt saturu) — būs nepieciešami 3 noteikumi:
- Obligāta īsta DKIM paraksts, obligāts SPF, obligāts rDNS.
- Neironu tīkls antispama apmācībai un datubāze pie klienta.
- Šifrēšanas algoritmam vajadzētu būt tādam, ka nosūtītājam ir jāpatērē 100 reizes vairāk CPU jaudas nekā ņēmējam.
Turklāt, izstrādājiet e-pasta standartu piedāvājumam "sākt drošu saraksti". Viens no lietotājiem (e-pasta kastīte) sūta citam e-pasta kastītei vēstuli ar pielikumu. Vēstulē ir teksts ar ieteikumu sākt aizsargātu saziņas kanālu un publisko atslēgu e-pasta kastītes īpašniekam (privātā atslēga ir klienta pusē).
Var pat izveidot vairākas atslēgas īpaši katrai sarakstei. Lietotājs-ņemējs var pieņemt šo piedāvājumu un nosūtīt savu publisko atslēgu (tāpat izveidotu īpaši šai sarakstei). Tālāk pirmais lietotājs nosūta kontrolsūtījumu (šifrētu ar otrā lietotāja publisko atslēgu) — saņemot šo, otrais lietotājs var uzskatīt, ka saziņas kanāls ir drošs. Tālāk otrais lietotājs nosūta kontrolsūtījumu — un tad pirmais lietotājs var uzskatīt izveidoto kanālu kā aizsargātu.
Lai cīnītos ar atslēgu pārtveršanu ceļā — protokolā jāpārdomā iespēja nosūtīt vismaz vienu publisko atslēgu, izmantojot zibatmiņu.
Un pats galvenais — lai viss tas darbotos (jautājums "kurš par to maksās?"):
Ievadīt pasta sertifikātus par cenu no 10$ uz 3 gadiem. Tie ļaus sūtītājam norādīt DNS, ka „mani publiskie atslēgas ir tur”. Un sniegs iespēju uzsākt drošu savienojumu. Turklāt — pieņemt šādus savienojumus bez maksas.
Gmail beidzot monetizē savus lietotājus. Par 10$ uz 3 gadiem — tiesības izveidot drošus sarakstes kanālus.
============= Secinājums =============
Lai pārbaudītu visu rakstu, es plānoju iznomāt veltītu serveri uz mēnesi un nopirkt domēnu ar SSL sertifikātu.
Bet dzīves apstākļi veidojās tā, ka šis jautājums iegrima uz 2 mēnešiem.
Un tagad, kad atkal parādījās brīvs laiks — nolēmu publicēt rakstu tā, kā ir, nevis riskēt ar to, ka publicēšana ieilgs vēl uz gadu.
Ja būs pietiekami daudz jautājumu par to, ka „šajā vietā nav pietiekami sīki aprakstīts” — tad, iespējams, atradīsies spēki tomēr ņemt veltītu serveri ar jaunu domēnu un jaunu SSL sertifikātu un vēl sīkāk aprakstīt un galvenais — izcelt visus izlaistos svarīgos detaļas.
Tāpat vēlētos saņemt atsauksmes par ideju par pasta sertifikātiem. Ja ideja patiks — centīšos atrast spēkus uzrakstīt melnrakstu RFC.
Kopējot lielus raksta fragmentus — norādīt saiti uz šo rakstu.
Tulkojot uz jebkuru citu valodu — norādīt saiti uz šo rakstu.
Uz angļu valodu es pats centīšos pārtulkot un atstāšu krusteniskās saites.
Avots: habr.com
