See artikkel rÀÀgib, kuidas seadistada kaasaegset postiserverit.
Postfix + Dovecot. SPF + DKIM + rDNS. IPv6-ga.
TSL-i krĂŒpteerimisega. Toetab mitut domeeni â osa tĂ”elise SSL-sertifikaadiga.
Sisaldab rÀmpsposti kaitset ja kÔrget rÀmpsposti reitingut teiste postiserverite seas.
Toetab mitut fĂŒĂŒsilist liidest.
OpenVPN, millele pÀÀseb juurde IPv4 kaudu ja mis vĂ”imaldab IPv6 ĂŒhendust.
Kui te ei soovi neid kĂ”iki tehnoloogiaid Ă”ppida, kuid tahate sellist serverit seadistada â siis see artikkel on teie jaoks.
Artiklis puuduvad katsetused iga detaili selgitamiseks. Selgitus kÀib selle kohta, mis on mittestandardsed vÔi tarbija seisukohalt olulised seadistused.
Motivatsioon postiserveri seadistamiseks â minu pikaaegne unistus. VĂ”ib-olla tundub see rumal, kuid IMO on see palju parem, kui unistada oma lemmikbrĂ€ndi uuest autost.
IPv6 seadistamise motivatsioon on kaks. IT spetsialist peab pidevalt Ôppima uusi tehnoloogiaid, et ellu jÀÀda. Tahaksin anda oma tagasihoidliku panuse tsensuuri vastu vÔitlemisse.
OpenVPN seadistamise motivatsioon â ainult selleks, et IPv6 töötaks kohaliku masinaga.
Mitme fĂŒĂŒsilise liidese seadistamise motivatsioon â mul on serveris ĂŒks liides âaeglane, kuid piiramatuâ, teine aga âkiire, kuid pakettidegaâ.
Bind seadistamise motivatsioon â minu teenusepakkuja pakub ebastabiilset DNS-serverit ja Google'il vĂ”ib samuti esineda tĂ”rkeid. Soovin usaldusvÀÀrset DNS-serverit isiklikuks kasutamiseks.
Artikli kirjutamise motivatsioon â mustand kirjutati 10 kuud tagasi ning olen sellesse juba kaks korda vaadanud. Kui isegi autorile on see regulaarselt vajalik â on suur tĂ”enĂ€osus, et ka teistele on see vajalik.
Universaalset lahendust postiserveri jaoks ei ole. Kuid ma pĂŒĂŒan kirjutada midagi taolist: âtehke nii ja kui kĂ”ik töötab nagu peab â visake ĂŒleliigne minemaâ.
On server, mille colocation on ettevĂ”ttes tech.ru. VĂ”imalus vĂ”rrelda OVH, Hetzneri, AWS-iga. Selle ĂŒlesande lahendamiseks oleks tĂ”husam koostöö just tech.ru-ga.
Serveris on installitud Debian 9.
Serveris on 2 liidest `eno1` ja `eno2`. Esimene on piiramatu, teine aga vastavalt kiire.
On 3 staatilist IP-aadressi, XX.XX.XX.X0 ja XX.XX.XX.X1 ning XX.XX.XX.X2 liideses `eno1` ja XX.XX.XX.X5 liideses `eno2`.
On XXXX:XXXX:XXXX:XXXX::/64 IPv6 aadresside plokk, mis on mÀÀratud liidesele `eno1` ja millest XXX:XXXX:XXXX:XXXX:1:2::/96 mÀÀrati minu palve pÔhjal `eno2`.
On 3 domains `domain1.com`, `domain2.com`, `domain3.com`. There is an SSL certificate for `domain1.com` and `domain3.com`.
There is a Google account, to which I want to link the email `vasya.pupkin@domain1.com` (to receive and send emails directly from the Gmail interface).
There should be an email account `support@domain2.com`, from which I want to see a copy of the emails in my Gmail. And occasionally have the ability to send something on behalf of `support@domain2.com` through the web interface.
There should be an email account `ivanov@domain3.com`, which Ivanov will use from his iPhone.
Sent emails must comply with all modern anti-spam requirements.
The highest level of encryption provided in public networks must be implemented.
There must be support for IPv6 for sending and receiving emails.
There should be SpamAssassin, which will never delete emails but either bounce them or pass them through to the IMAP folder 'Spam'.
Auto-training of SpamAssassin must be configured: if I move an email to the 'Spam' folder, it will train on that; if I move an email from the 'Spam' folder, it will train on that. The training results of SpamAssassin should affect the delivery of emails to the 'Spam' folder.
PHP scripts must be able to send emails on behalf of any domain on this server.
There should be an OpenVPN service with the ability to use IPv6 on clients that do not have IPv6.
First, the interfaces and routing must be configured, including IPv6.
Then, OpenVPN must be set up to connect via IPv4 and provide the client with a static real IPv6 address. This client will have access to all IPv6 services on the server and to any IPv6 resources on the Internet.
Next, Postfix must be configured for sending emails + SPF + DKIM + rDNS and other similar details.
After that, Dovecot must be configured and Multidomain must be set up.
Then, SpamAssassin must be configured and training must be set up.
Finally, Bind must be installed.
============= Multi-interfaces =============
To configure the interfaces, the following should be written in '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::/80These settings can be applied to any server in tech.ru (with minor agreement with support) and it will work as expected.
If you have experience configuring similar things for Hetzner, OVH â it works differently there. More complex.
eno1 is the name of network card #1 (slow, but unlimited).
eno2 is the name of network card #2 (fast, but with a rate).
tun0 â see virtuaalne vĂ”rkaart OpenVPN-ist.
XX.XX.XX.X0 â IPv4 #1 eno1-l.
XX.XX.XX.X1 â IPv4 #2 eno1-l.
XX.XX.XX.X2 â IPv4 #3 eno1-l.
XX.XX.XX.X5 â IPv4 #1 eno2-l.
XX.XX.XX.1 â IPv4 gateway.
XXXX:XXXX:XXXX:XXXX::/64 â IPv6 kogu serveri jaoks.
XXXX:XXXX:XXXX:XXXX:1:2::/96 â IPv6 eno2 jaoks, kĂ”ik muu tuleb paarituks eno1 kaudu.
XXXX:XXXX:XXXX:XXXX::1 â IPv6 gateway (tuleb mĂ€rkida, et siin vĂ”iks/k peaks olema teistmoodi. MÀÀrake IPv6 lĂŒliti).
dns-nameservers â mÀÀratud 127.0.0.1 (sest bind on paigaldatud kohapeal) ja 213.248.1.6 (see on tech.ru poolt).
«table eno1t» ja «table eno2t» â nende route-reeglite mĂ”te on see, et liiklus, mis siseneb lĂ€bi eno1, vĂ€ljub samuti lĂ€bi selle, ja liiklus, mis siseneb lĂ€bi eno2, vĂ€ljub samuti selle kaudu. Samuti, mis tahes serveripoolsete algatustega seonduvad ĂŒhendused peaksid minema lĂ€bi eno1.
ip route add default via XX.XX.XX.1 table eno1tSelle kÀsklusega mÀÀrame, et kÔik arusaamatud andmed, mis langevad mis tahes reegli alla, millel on mÀrgitud «table eno1t», suunatakse eno1 liidesele.
ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1tSelle kÀsklusega mÀÀrame, et kogu serveri algatatav liiklus suunatakse eno1 liidesele.
ip rule add table eno1t from XX.XX.XX.X0
ip rule add table eno1t to XX.XX.XX.X0Selle kÀsklusega mÀÀrame paremad liiklusmÀrgistamise reeglid.
auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
post-up ip rule add table eno1t from XX.XX.XX.X2
post-up ip rule add table eno1t to XX.XX.XX.X2See plokk mÀÀrab teise IPv4 liidesele eno1.
ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t Selle kÀsklusega mÀÀrame marsruudi OpenVPNi klientide ja kohalike IPv4-de vahel, vÀlja arvatud XX.XX.XX.X0.
Miks piisab sellest kĂ€sust kĂ”igi IPv4-de jaoks â ma ei saa siiani aru.
iface eno1 inet6 static
address XXXX:XXXX:XXXX:XXXX:1:1::/64
gateway XXXX:XXXX:XXXX:XXXX::1Sellega mÀÀrame aadressi liidesele. Server kasutab seda «vÀljuvana» aadressina. Muul viisil ei kasutata.
Miks on mÀrgitud «:1:1::» nii keeruliselt? Et OpenVPN töötaks Ôigesti ja ainult selleks. Sellest rÀÀgime hiljem rohkem.
Gateway teemal â see töötab ja on okei. Kuid Ă”igesti öeldes tuleks siia mĂ€rgistada IPv6 lĂŒliti, mille kaudu server on ĂŒhendatud.
Kuid mingil pÔhjusel lÔpetab IPv6 töötamise, kui ma seda teen. TÔenÀoliselt on need teknika.ru kummalised probleemid.
ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACESee on IPv6 aadressi lisamine liidesele. Kui on vaja sada aadressi â tĂ€hendab saja rida selle faili.
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::/80MÀrgistasin kÔigi liideste aadressid ja alamvÔrgud, et see oleks selgem.
eno1 â peab olema kindlasti "\/64" â sest see on kogu meie aadresside partii.
tun0 â alamvĂ”rk peab kindlasti olema suurem kui eno1. Vastasel juhul ei saa avada IPv6 vĂ€ravat OpenVPN klientidele.
eno2 â alamvĂ”rk peab kindlasti olema suurem kui tun0. Vastasel juhul ei saa OpenVPN kliendid juurdepÀÀsu kohalikele IPv6 aadressidele.
Selguse huvides valisin alamvÔrgu sammuks 16, kuid soovi korral vÔib isegi "1" sammu kasutada.
Seega 64+16 = 80, ja 80+16 = 96.Veel suurema selguse huvides:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY â need on aadressid, mis tuleb mÀÀrata konkreetsetele saitidele vĂ”i teenustele liidesel eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY â need on aadressid, mis tuleb mÀÀrata konkreetsetele saitidele vĂ”i teenustele liidesel eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY â need on aadressid, mis tuleb mÀÀrata OpenVPN klientidele vĂ”i kasutada OpenVPN teenuslike aadressidena.
VÔrgu seadistamiseks peab olema vÔimalus serverit taaskÀivitada.
IPv4 muudatused vĂ”etakse kasutusele jĂ€rgmise kĂ€su tĂ€itmisel (kindlasti tuleks see kĂ€sk panna screeni â vastasel juhul toob see kĂ€su lihtsalt serveri vĂ”rgu alla):
/etc/init.d/networking restartFaili "\/etc\/iproute2\/rt_tables" lÔppu tuleks lisada:
100 eno1t
101 eno2t Ilma selleta ei saa kasutada kohandatud tabelit failis "\/etc\/network\/interfaces".
Numbrid peavad olema unikaalsed ja alla 65535.
IPv6 muudatused on lihtsasti muudetavad ilma taaskÀivitamiseta, kuid selleks tuleb Ôppida vÀhemalt kolme kÀsku:
ip -6 addr ...
ip -6 route ...
ip -6 neigh ...Seadistamine "\/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 = 1Need on minu serveri "sysctl" seaded. Tahan mÀrkida olulise.
net.ipv4.ip_forward = 1Ilma selleta OpenVPN ei tööta kuidagi.
net.ipv6.ip_nonlocal_bind = 1IgaĂŒks, kes ĂŒritab teha IPv6 bind'i (nĂ€iteks nginx) kohe pĂ€rast liidese vĂ€rskendamist â saab vea. Selline aadress on kĂ€ttesaamatu.
Selle olukorra vÀltimiseks on selline seadistus tehtud.
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1Ilma nende seadistusteta ei vÀlju OpenVPN kliendi IPv6 liiklus maailma.
Teised seaded kas ei puuduta teemat vÔi ma ei mÀleta, miks need on.
Aga igaks juhuks jÀtan need "selliseks, nagu on".
Kuna selle faili muudatused peab vĂ”tma ilma serveri taaskĂ€ituseta â peab tĂ€itma kĂ€sku:
sysctl -pĂksikasjalikumalt "tabeli" reeglite kohta:
============= OpenVPN =============
OpenVPN IPv4 ei tööta ilma iptables'ta.
Minu iptables on sellised VPN-ile:
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 â see on minu staatiline IPv4-aadress kohaliku masina jaoks.
10.8.0.0/24 â IPv4 vĂ”rk openvpn. IPv4 aadressid openvpn klientidele.
Reeglite jÀrjekord on oluline.
iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT
...
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j DROP
iptables -A FORWARD -p udp --dport 1194 -j DROPSee piirang on mÔeldud selleks, et ainult mina oma staatilisest IP-st vÔiksin OpenVPN-i kasutada.
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
-- vÔi --
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADEIPv4 pakettide edastamiseks OpenVPN klientide ja Interneti vahel â tuleb kasutada mĂ”nda neist kĂ€skudest.
Erinevates olukordades ei sobi ĂŒks variant.
Minu olukorrale sobivad mÔlemad kÀsud.
Dokumentatsiooni lugedes valisin esimese variandi, kuna see tarbib vÀhem CPU-d.
Kuna kĂ”ik iptables sĂ€tted peaksid olema aktiveeritud pĂ€rast taaskĂ€ivitamist â tuleb need kuhugi salvestada.
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6Sellised nimetused ei ole juhuslikud. Neid kasutab pakett «iptables-persistent».
apt-get install iptables-persistentPeamise OpenVPN paketi paigaldamine:
apt-get install openvpn easy-rsaSeadistame sertifikaatide mallid (asendage oma vÀÀrtustega):
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
ln -s openssl-1.0.0.cnf openssl.cnfMuudame sertifikaatide mallide seadeid:
mcedit vars...
# Need on vÀljade vaikevÀÀrtused
# mis pannakse sertifikaati.
# Ărge jĂ€tke ĂŒhtegi neist vĂ€li tĂŒhjaks.
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"
...Loome serveri sertifikaadi:
cd ~/openvpn-ca
source vars
./clean-all
./build-ca
./build-key-server server
./build-dh
openvpn --genkey --secret keys/ta.keyValmistame ette vÔimaluse luua lÔplikud «client-name.opvn» failid:
mkdir -p ~/client-configs/files
chmod 700 ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
mcedit ~/client-configs/base.conf# Client mode
client
# Interface tunnel type
dev tun
# TCP protocol
proto tcp-client
# Address/Port of VPN server
remote XX.XX.XX.X0 1194
# Don't bind to local port/address
nobind
# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun
# Remote peer must have a signed certificate
remote-cert-tls server
ns-cert-type server
# Enable compression
comp-lzo
# Custom
ns-cert-type server
tls-auth ta.key 1
cipher DES-EDE3-CBCValmistame ette skripti, mis koondab kĂ”ik failid ĂŒheks opvn failiks.
mcedit ~/client-configs/make_config.sh
chmod 700 ~/client-configs/make_config.sh#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG}
<(echo -e '<ca>')
${KEY_DIR}/ca.crt
<(echo -e '</ca>n<cert>')
${KEY_DIR}/${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}.ovpnLoome esimese OpenVPN kliendi:
cd ~/openvpn-ca
source vars
./build-key client-name
cd ~/client-configs
./make_config.sh client-nameFail «~/client-configs/files/client-name.ovpn» saadetakse kliendi seadmesse.
iOS klientide tuleb teha trikk:
Tag «tls-auth» sisu peab olema ilma kommentaarideta.
Samuti tuleb panna «key-direction 1» kohe enne tagi «tls-auth».
Seadistame OpenVPN serveri konfiguratsiooni:
cd ~/openvpn-ca/keys
cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | tee /etc/openvpn/server.conf
mcedit /etc/openvpn/server.conf# Listen port
port 1194
# Protocol
proto tcp-server
# IP tunnel
dev tun0
tun-ipv6
push tun-ipv6
# Master certificate
ca ca.crt
# Server certificate
cert server.crt
# Server private key
key server.key
# Diffie-Hellman parameters
dh dh2048.pem
# Allow clients to communicate with each other
client-to-client
# Client config dir
client-config-dir /etc/openvpn/ccd
# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"
# Server mode and client subnets
server 10.8.0.0 255.255.255.0
server-ipv6 XXXX:XXXX:XXXX:XXXX:1:3::/80
topology subnet
# IPv6 routes
push "route-ipv6 XXXX:XXXX:XXXX:XXXX::/64"
push "route-ipv6 2000::/3"
# DNS (for Windows)
# These are OpenDNS
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
# Configure all clients to redirect their default network gateway through the VPN
push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway ipv6" #For iOS
# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun
# Ping every 10s. Timeout of 120s.
keepalive 10 120
# Enable compression
comp-lzo
# User and group
user vpn
group vpn
# Log a short status
status openvpn-status.log
# Logging verbosity
##verb 4
# Custom config
tls-auth ta.key 0
cipher DES-EDE3-CBCSee on vajalik, et mÀÀrata iga kliendi jaoks staatiline aadress (pole kindlasti vajalik, aga ma kasutan):
# Client config dir
client-config-dir /etc/openvpn/ccdKÔige keerulisem ja vÔtmekoht.
Kahjuks OpenVPN ei oska iseseisvalt seadistada IPv6 gateway'd klientide jaoks.
Tuleb «kÀsitsi» edastada see igale kliendile.
# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"Fail «/etc/openvpn/server-clientconnect.sh»:
#!/bin/sh
# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
echo "Missing environment variable."
exit 1
fi
# Load server variables
. /etc/openvpn/variables
ipv6=""
# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
# Get fixed IPv6 from client config file
ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
echo $ipv6
fi
# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
echo "Invalid IPv4 part."
exit 1
fi
hexipp=$(printf '%x' $ipp)
ipv6="$prefix$hexipp"
fi
# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev eno1Fail «/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 eno1MÔlemad skriptid kasutavad faili «/etc/openvpn/variables»:
# Subnet
prefix=XXXX:XXXX:XXXX:XXXX:2:
# netmask
prefixlen=112Miks siin nii on kirjutatud â ei oska meenutada.
Praegu nÀeb imelik vÀlja netmask = 112 (siin peaks olema 96).
Ja prefix on imelik, ei vasta vÔrgule tun0.
Aga noh, jÀtan «nagu on».
cipher DES-EDE3-CBCSee on maitseasi â ma valisin sellise ĂŒhenduse krĂŒpteerimise viisi.
============= Postfix =============
PÔhipaketi paigaldamine:
apt-get install postfixPaigaldamisel valida «internet-site».
Minu «/etc/postfix/main.cf» nÀeb vÀlja nii:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# .domain'i lisamise eest vastutab MUA.
append_dot_mydomain = no
readme_directory = no
# Vaata http://www.postfix.org/COMPATIBILITY_README.html -- vaikimisi 2 uutel installatsioonidel.
compatibility_level = 2
# TLS parameetrid
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
# SalvestustĂŒĂŒp
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 seadistused
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-aadress iga domeeni jaoks
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcreVaatame selle konfi ĂŒksikasju.
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.keyHabr'i kasutajate arvates sisaldab see plokk `valeinfo ja eksitavad vÀited`.Ainult 8 aastat pÀrast oma karjÀÀri algust hakkasin ma aru saama, kuidas SSL töötab.
SeetĂ”ttu vĂ”tan endale julguse kirjeldada, kuidas kasutada SSL-i (vastamata kĂŒsimustele "Kuidas see töötab?" ja "Miks see töötab?").
Kaasaegse krĂŒpteerimise alus on vĂ”tmepaaride loomine (kaks vĂ€ga pikka tĂ€hemĂ€rgi stringi).
Ăks "vĂ”ti" on privaatne, teine "avalik". PrivaatvĂ”tit hoia ÀÀrmiselt hoolikalt saladuses. Avalikku vĂ”tit jagame igale soovijale.
Avaliku vĂ”tmega saab krĂŒpteerida tekstistringi nii, et ainult privaatvĂ”tme omanik suudab selle dekrĂŒpteerida.
Nii et see on kogu tehnoloogia alus.Samm #1 â https saidid.
Brauser, kui ta pöördub saidi poole, saab veebiserverilt teada, et sait on https ja seetĂ”ttu kĂŒsib ta avalikku vĂ”tit.
Veebiserver edastab avaliku vĂ”tme. Brauser kasutab avalikku vĂ”tit HTTP-pĂ€ringu krĂŒpteerimiseks ja saadab selle edasi.
HTTP-pÀringu sisu saab lugeda ainult see, kellel on privaatvÔti, st ainult server, mille poole pöördutakse.
HTTP-pĂ€ring sisaldab vĂ€hemalt URI-d. SeetĂ”ttu, kui riigis ĂŒritatakse juurdepÀÀsu piirata mitte kogu saidile, vaid konkreetsele lehele â siis HTTPS-i saitide puhul on see vĂ”imatu.Samm nr 2 â krĂŒpteeritud vastus.
Veebiserver vastab, mida saavad teel kergesti lugeda.
Lahendus on ÀÀrmiselt lihtne â brauser genereerib kohapeal sama privaat-avaliku vĂ”tme paari iga HTTPS-i saidi jaoks.
Ja koos saidi avaliku vÔtme pÀringuga saadab ta oma kohandatud avaliku vÔtme.
Veebiserver mĂ€letab seda ja HTTP-vastuse saatmisel krĂŒpteerib ta konkreetse kliendi avaliku vĂ”tmega.
NĂŒĂŒd saab HTTP-vastust dekrĂŒpteerida ainult privaatvĂ”tme omanik kliendi brauseris (ehk siis klient ise).Samm nr 3 â kaitstud ĂŒhenduse loomine avalikul kanalil.
NĂ€ites nr 2 on haavatavus â pole midagi, mis takistaks pahatahtlikul isikul HTTP-pĂ€ringu pealtkuulamist ja avaliku vĂ”tme teabe muutmist.
Seega nÀeb vahendaja suurepÀraselt kogu saadetavat ja saadud sÔnumite sisu seni, kuni sidekanal ei muutu.
Selle vastu on ÀÀrmiselt lihtne vĂ”idelda â piisab, kui saata brauseri avalik vĂ”ti sĂ”numina, mis on krĂŒpteeritud veebiserveri avaliku vĂ”tmega.
Veebiserver saadab siis kĂ”igepealt vastuse, mis ĂŒtleb: âsinu avalik vĂ”ti on sellineâ ja krĂŒpteerib selle sĂ”numi sama avaliku vĂ”tmega.
Brauser vaatab vastust â kui tuli sĂ”num âsinu avalik vĂ”ti on sellineâ â on see 100% garantii, et see sidekanal on turvaline.
Kui turvaline?
Sellise turvalise sidekanali loomine toimub kiirusel ping*2. NĂ€iteks 20ms.
Kurjategijal peab olema kas eelnevalt privaatvĂ”ti ĂŒhe osapoole jaoks. VĂ”i peab ta privaatvĂ”tit paariks millisekundiks proovima.
Ăhe tĂ€napĂ€evase privaatvĂ”tme murdmine vĂ”tab superarvutis aastakĂŒmneid.Samm nr 4 â avalik andmebaas avalikest vĂ”tmetest.
On ilmne, et kogu selles loos on vÔimalus kurjategijaks, kes istub kliendi ja serveri vahelisel sidekanalil.
Klient saab esindada serverit ja server saab esindada klienti. Ja simuleerida vÔtmeid mÔlemas suunas.
Siis nĂ€eb rĂŒndaja kogu liiklust ja tal on vĂ”imalus "toimetada" liiklust.
NÀiteks muutnud aadressi, kuhu raha saata, vÔi kopeerida pangakonto parooli vÔi blokeerida "ebameeldivat" sisu.
Selliste rĂŒndajate vastu loodi avalik andmebaas iga https saidi jaoks, kus hoitakse avalikke vĂ”tit.
Iga brauser "teab" umbes 200 sellist andmebaasi. See on eelnevalt seadistatud igasse brauserisse.
"Teadmised" on kinnitatud iga sertifikaadi avaliku vĂ”tmega. See tĂ€hendab, et iga konkreetse sertifitseerimiskeskusega ĂŒhendust simuleerida ei saa.NĂŒĂŒd on lihtne aru saada, kuidas kasutada SSL-i https jaoks.
Kui natuke mÔelda, siis saab selgeks, kuidas spetsiaalteenistused vÔivad selle struktuuri kaudu midagi hÀkkida. Kuid see nÔuab neilt tohutult pingutust.
Organisatsioonide jaoks on NSA vĂ”i CIA vĂ€hem vĂ”imalik, et isegi vip-tasemel on olemasolevat kaitset murda.Samuti lisan ssh-ĂŒhenduste kohta. Seal pole avalikke vĂ”tmeid, kuidas siis olla? KĂŒsimus lahendatakse kahel viisil.
Ssh-parooliga variant:
Esimese ĂŒhenduse korral peab ssh-kliendi teavitama, et meil on uus avalik vĂ”ti ssh-serverilt.
Ja edasistes ĂŒhendustes, kui ilmneb teade "uus avalik vĂ”ti ssh-serverilt", tĂ€hendab see, et teid ĂŒritatakse pealt kuulata.
VĂ”i kui esimesel ĂŒhendusel pealt kuulatati, rÀÀgite nĂŒĂŒd serveriga ilma vahendajateta.
Just seetĂ”ttu, et pealt kuulamise fakti on lihtne, kiire ja vaevata paljastada, kasutatakse seda rĂŒnnakut ainult erijuhtudel konkreetse kliendi jaoks.Ssh-vĂ”tmega variant:
VĂ”tame USB-mĂ€lupulga, salvestame sellele privaatvĂ”tme ssh-serverile (selle jaoks on terminid ja palju olulisi nĂŒansse, kuid ma kirjutan lihtsalt teadmiste jagamiseks, mitte kasutusjuhendiks).
Avaliku vÔtme jÀtame masinale, kus on ssh-klient, ja hoidke seda ka saladuses.
Viime USB-mÀlupulga serverisse, sisestame selle, kopeerime privaatvÔtme ja pÔletame mÀlupulga ning puistame tuhka tuule kÀtte (vÔi vÀhemalt vormindame nullidega).
NĂŒĂŒd on kĂ”ik â pĂ€rast sellist protseduuri pole vĂ”imalik sellist ssh-ĂŒhendust murda. Loomulikult on pĂ€rast 10 aastat superarvutiga vĂ”imalik vaadata liiklust â aga see on eraldi lugu.Vabandan off-topic'i pĂ€rast.
NĂŒĂŒd, kui teooria on teada, rÀÀgin ssl-sertifikaadi loomise voost.
Kasutades âopenssl genrsaâ, loome privaatvĂ”tme ja âpĂ”hjastikudâ avaliku vĂ”tme jaoks.
âPĂ”hjastikudâ saadame kolmanda osapoole ettevĂ”ttele, kellele maksame umbes 9 dollarit kĂ”ige lihtsama sertifikaadi eest.
Paari tunni pĂ€rast saame sellelt kolmandalt osapoolelt meie âavalikuâ vĂ”tme ja veel komplekti mitmeid avalikke vĂ”tit.
Miks maksta kolmanda osapoole ettevĂ”ttele minu avaliku vĂ”tme vormistamise eest â see on eraldi kĂŒsimus, siin ei pea seda arutama.
NĂŒĂŒd on selge, mis on selle kirjutise mĂ”te:
smtpd_tls_key_file=//ssl/domain1.com.2018.key Kaustas â//sslâ on kĂ”ik ssl-iga seotud failid.
domain1.com â domeeninimi.
2018 â vĂ”tmete loomise aasta.
âkeyâ â tĂ€histus, et fail on privaatvĂ”ti.
Ja selle faili mÔte:
smtpd_tls_cert_file=//ssl/domain1.com.2018.chained.crt
domain1.com â domeeninimi.
2018 â vĂ”tmete loomise aasta.
chained â tĂ€histus, et siin on avalike vĂ”tmestiku ahel (esimene â meie avalik ja ĂŒlejÀÀnud â need, mis saadeti ettevĂ”ttelt, kes vormistas avaliku vĂ”tme).
crt â tĂ€histus, et see on valmis sertifikaat (avalik vĂ”tme koos tehniliste selgitustega).
smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1See seade ei ole antud juhul kasutusele vÔetud, kuid on kirjutatud nÀitena.
Sest vale parameeter toob kaasa selle, et teie server saadab rÀmpsposti (ilma teie tahte).
SeejĂ€rel peab kĂ”igile tĂ”estama, et te ei ole sĂŒĂŒdi.
recipient_delimiter = +Paljud ei pruugi teada, kuid see on standardne sĂŒmbol rikkaimate e-kirjade jĂ€rjestamiseks ja see on toetatud enamikus kaasaegsetes e-posti serverites.
NĂ€iteks, kui teil on e-posti aadress âusername@gmail.comâ, proovige saata âusername+spam@gmail.comâ â vaadake, mis juhtub.
inet_protocols = ipv4See vÔib teid segadusse ajada.
Aga see ei ole niisama. Iga uus domeen â vaikimisi ainult IPv4, hiljem lĂŒlitan igaĂŒhe jaoks eraldi IPv6 sisse.
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf Siin mÀÀrame, et kogu sissetulev post lÀheb dovecotisse.
Ja reeglid domeeni, postkasti, alias jaoks â vaadake DB-st.
/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 = yesNĂŒĂŒd teab postfix, et e-kirjade vastuvĂ”tmine edasitoimetamiseks on vĂ”imalik ainult autentimise kaudu dovecoti.
Mulle tÔesti ei ole pÀris selge, miks seda siin dubleerida. Oleme ju juba «virtual_transport» kÔik vajalikud mÀÀranud.
Kuid postfix on vĂ€ga vana sĂŒsteem â tĂ”enĂ€oliselt on need vanadest aegadest pĂ€rit tugimeetmed.
smtpd_recipient_restrictions =
...
smtpd_helo_restrictions =
...
smtpd_client_restrictions =
...Seda tuleb seadistada iga e-posti serveri jaoks erinevalt.
Mul on kolme e-posti serveri kÀsutuses, ja need seaded on vÀga erinevad, kuna kasutuse nÔuded on erinevad.
Seadistama peab hoolikalt â vastasel juhul Ă€hvardab teid spĂ€mmi voolamine vĂ”i halvem â spĂ€mmi saatmine teie poolt.
# SPF
policyd-spf_time_limit = 3600Seadistus mÔne pluginaga, mis seondub sissetulevate kirjade SPF kontrollimisega.
# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sockSeadistus, et kÔik saadetavad kirjad peavad olema varustatud DKIM allkirjaga.
# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcreSee on oluline detail, mis seondub kirjade suunamisega, kui saadetakse kirju php skriptide kaudu.
Fail «/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:Vasakul â regulaaravaldised. Paremal â mĂ€rk, millega kiri on tĂ€histatud.
Postfix arvestab vastavalt mĂ€rgile veel mĂ”ne konfigureerimisreegliga konkreetse kirja jaoks.Kuidas postfix konkreetsena kirja jaoks ĂŒmber konfigureeritakse â see on mÀÀratud failis «master.cf».
Read 4, 5, 6 â need on peamised. Millise domeeni nimel kiri saadetakse â sellele mĂ€rgile paneme.
Kuid vanades php skriptides ei ole alati vĂ€lja «from» mÀÀratud. Siis tuleb appi kasutajanimi.Artikkel on juba ulatuslik â ei tahaks segadusse minna nginx+fpm seadistamisega.
LĂŒhidalt â mÀÀrame igale saidile oma linux-kasutaja omaniku. Ja vastavalt oma fpm-pooli.
Fpm-pool kasutab igasugust php versiooni (see on suurepÀrane, kui samal serveril ei teki probleeme erinevate php versioonide ja isegi erinevate php.ini'dega).
Nii et konkreetsel linux-kasutajal «www-domain2» on sait domain2.com. Sellel saidil on kood, mis saadab kirju ilma «from» vÀlja mÀÀramata.
Nii et isegi sellisel juhul lÀhevad kirjad Ôigesti ja ei satu kunagi spÀmmi.
Minu «/etc/postfix/master.cf» nÀeb vÀlja jÀrgmine:
...
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 Fail ei ole tĂ€ielikult esitatud â see on juba niigi vĂ€ga suur.
MĂ€rgisin ainult loetletud muudatused.
smtp inet n - y - - smtpd
-o content_filter=spamassassin
...
spamassassin unix - n n - - pipe
user=spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}Need on spamassassini seonduvad seaded, sellele tuleb hiljem keskenduda.
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 Lubame ĂŒhenduda meiliserveriga pordi 587 kaudu.
Selleks tuleb kindlasti autentida.
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spfLĂŒlitame sisse SPF kontrolli.
apt-get install postfix-policyd-spf-pythonInstallime ĂŒlaltoodud SPF kontrollimiseks paketi.
domain1 unix - - n - - smtp
-o smtp_bind_address=XX.XX.XX.X1
-o smtp_helo_name=domain1.com
-o inet_protocols=all
-o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
-o syslog_name=postfix-domain1See on kÔige huvitavam osa. See on vÔimalus saata kirju konkreetse domeeni nimel konkreetse IPv4/IPv6 aadressiga.
Seda tehakse rDNS jaoks. rDNS â IP aadressilt mingi rea saamine.
Ja selle vĂ”imalust kasutatakse e-posti puhul selleks, et kinnitada, et helo vastab tĂ”eliselt rDNS-ile aadressilt, millelt e-kiri saadeti.Kui helo ei vasta e-posti domeenile, kelle nime all kiri saadeti â antakse spĂ€mmi punkte.
Helo ei vasta rDNS-ile â antakse palju spĂ€mmi punkte.
Seega peab igal domeenil olema oma IP aadress.
OVH jaoks â konsoolis on vĂ”imalus seadistada rDNS.
tech.ru jaoks â kĂŒsimus lahendatakse toega.
AWS-i puhul â kĂŒsimus lahendatakse toega.
«inet_protocols» ja «smtp_bind_address6» â see vĂ”imaldab IPv6 toe.
IPv6 jaoks tuleb samuti rDNS seadistada.
«syslog_name» â see on mĂ”eldud logide mugavaks lugemiseks.
Osta sertifikaadid .
.
============= Dovecot =============
apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispamSeadistame MySQL, installime vajalikud paketid.
Fail «/etc/dovecot/conf.d/10-auth.conf»
disable_plaintext_auth = yes
auth_mechanisms = plain loginAutoriseerimine ainult krĂŒpteeritud vormis.
Fail «/etc/dovecot/conf.d/10-mail.conf»
mail_location = maildir:/var/mail/vhosts/%d/%nSiin mÀÀrame, kus postkaste hoida.
Soovin, et need oleksid salvestatud failidesse ja grupeeritud domeenide kaupa.
Fail «/etc/dovecot/conf.d/10-master.conf»
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 0
}
inet_listener pop3s {
address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
port = 995
ssl = yes
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service imap {
}
service pop3 {
}
service auth {
unix_listener auth-userdb {
mode = 0600
user = vmail
}
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
user = dovecot
}
service auth-worker {
user = vmail
}
service dict {
unix_listener dict {
}
} See on Dovecoti peamine seadistusfail.
Siin keelame ebaturvalised ĂŒhendused.
Ja aktiveerime turvalised ĂŒhendused.
Fail «/etc/dovecot/conf.d/10-ssl.conf»
ssl = required
ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt
ssl_key = </etc/nginx/ssl/domain1.com.2018.key
local XX.XX.XX.X5 {
ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt
ssl_key = </etc/nginx/ssl/domain2.com.2018.key
}Seadistame ssl. MÀÀrame, et ssl on kohustuslik.
Ja ise sertifikaat. Ja oluline detail â direktiiv «local». MÀÀrab, millise kohaliku IPv4 puhul millist ssl sertifikaati kasutada.Muide, IPv6 pole siin seadistatud, parandan selle puudujÀÀgi kunagi hiljem.
XX.XX.XX.X5 (domain2) â sertifikaati ei ole. Klientide ĂŒhendamiseks tuleb kasutada domain1.com.
XX.XX.XX.X2 (domain3) â sertifikaat olemas, klientide ĂŒhendamiseks vĂ”ib kasutada domain1.com vĂ”i domain3.com.
Fail «/etc/dovecot/conf.d/15-lda.conf»
protocol lda {
mail_plugins = $mail_plugins sieve
}Seda on hiljem vaja spamassassini jaoks.
Fail «/etc/dovecot/conf.d/20-imap.conf»
protocol imap {
mail_plugins = $mail_plugins antispam
}See on antispami plugin. Vajalik spamassassini Ôpetamiseks kaustadese vahetamisel «Spam».
Fail «/etc/dovecot/conf.d/20-pop3.conf»
protocol pop3 {
}Lihtsalt selline fail on olemas.
Fail «/etc/dovecot/conf.d/20-lmtp.conf»
protokoll lmtp {
mail_plugins = $mail_plugins sieve
postmaster_address = admin@domain1.com
}lmtp seadistus.
Fail «/etc/dovecot/conf.d/90-antispam.conf»
plugin {
antispam_backend = pipe
antispam_trash = Trash;trash
antispam_spam = Junk;Spam;SPAM
antispam_pipe_program_spam_arg = --spam
antispam_pipe_program_notspam_arg = --ham
antispam_pipe_program = /usr/bin/sa-learn
antispam_pipe_program_args = --username=%Lu
}Spamassini treeningu seaded kaustade vahel liikumise ajal âSpamâ.
Fail «/etc/dovecot/conf.d/90-sieve.conf»
plugin {
sieve = ~/..dovecot.sieve
sieve_dir = ~/sieve
sieve_after = /var/lib/dovecot/sieve/default.sieve
}Fail, kus on sÀtestatud, mida teha saabuvate kirjateenustega.
Fail «/var/lib/dovecot/sieve/default.sieve»
require ["fileinto", "mailbox"];
if header :contains "X-Spam-Flag" "YES" {
fileinto :create "Spam";
}Fail tuleb koostada: «sievec default.sieve».
Fail «/etc/dovecot/conf.d/auth-sql.conf.ext»
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
} sql failide mÀÀramine autentimiseks.
Ja fail â autoriseerimise meetodina.
Fail «/etc/dovecot/dovecot-sql.conf.ext»
driver = mysql
connect = host=127.0.0.1 dbname=servermail user=usermail password=password
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';See vastab Postfixi sarnastele seadetele.
Fail «/etc/dovecot/dovecot.conf»
protokollid = imap lmtp pop3
listen = *, ::
dict {
}
!include conf.d/*.conf
!include_try local.conf Peamine konfiguratsioonifail.
Oluline on, et siin mÀÀrame-lisame protokolle.
============= SpamAssassin =============
apt-get install spamassassin spamcInstalleerime paketid.
adduser spamd --disabled-loginLisame kasutaja nimel, kellelt.
systemctl enable spamassassin.serviceLĂŒlitame spamassassini teenuse automaatkĂ€ivituse sisse.
Fail «/etc/default/spamassassin»:
CRON=1LĂŒlitab automaatse reeglite âvaikimisiâ vĂ€rskendamise sisse.
Fail «/etc/spamassassin/local.cf»:
report_safe 0
use_bayes 1
bayes_auto_learn 1
bayes_auto_expire 1
bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
bayes_sql_dsn DBI:mysql:sa:localhost:3306
bayes_sql_username sa
bayes_sql_password passwordTuleb luua mysql andmebaas âsaâ kasutajaga âsaâ parooliga âpasswordâ (asendada millegagi mĂ”istlikumaga).
report_safe tÀhendab, et kirja spÀmmi e-kiri saadetakse raportina.
use_bayes â need on spamassini masinĂ”ppeseaded.
Muud spamassini seaded rakendati eelnevalt artiklis.
.
.
.
.
============= Kogukonna pöördumine =============
Samuti tahaksin kogukonnale esitada idee, kuidas suurendada edastatavate kirjade turvalisust. Kuna olen sellesse e-posti teemasse nii sĂŒgavale sĂŒvenenud.
Kasutaja saaks oma kliendis (Outlook, Thunderbird, brauseri plugin jne) luua paar vÔtit. Avalik ja privaatne. Avaliku saadaks DNS-i. Privaatne jÀÀb kliendi juurde. E-posti serverid oskaksid kasutada avalikku vÔtme, et saata seda konkreetsesse aadressi.
Ja spÀmmi kaitsmiseks nende kirjade puhul (jah, e-posti server ei saa vaadata sisu) tuleb kehtestada 3 reeglit:
- Kohustuslik tÔeline DKIM allkiri, kohustuslik SPF ning kohustuslik rDNS.
- NeuraalvÔrk antispÀmmi koolitamiseks + andmebaas selle kohta kliendi poolel.
- KrĂŒpteerimise algoritm peaks olema selline, et saatja pool peab krĂŒpteerimise jaoks kulutama 100 korda rohkem CPU vĂ”imsust kui vastuvĂ”tja pool.
Lisaks avalikele kirjadele - arendada vĂ€lja standard ettepaneku kirja âalustada kaitstud suhtlustâ. Ăks kasutajatest (e-posti aadress) saadab teisele e-posti aadressile kirja koos manusena. Kirjas on tekst ettepanek alustada kaitstud kommunikatsioonikanalit ja e-posti aadressi omaniku avalik vĂ”ti (samal ajal sĂ€ilitades privaatne vĂ”ti kliendi poolel).
VĂ”ib isegi teha paar vĂ”tit spetsiaalselt igaks suhtluseks. VastuvĂ”tja kasutaja vĂ”ib selle ettepaneku aktsepteerida ja saata oma avaliku vĂ”tme (ka spetsiaalselt selle suhtluse jaoks). SeejĂ€rel saadab esimene kasutaja teenindusliku kontrollkirja (krĂŒpteeritud teise kasutaja avaliku vĂ”tmega) - mille saanud, vĂ”ib teine kasutaja pidada loodud suhtluskanaali usaldusvÀÀrseks. Edasi saadab teine kasutaja kontrollkirja - ja siis vĂ”ib ka esimene kasutaja pidada loodud kanaali kaitstuks.
VĂ”tmete teel kinni pĂŒĂŒdmiseks tuleb protokollis ette nĂ€ha vĂ€hemalt ĂŒhe avaliku vĂ”tme edastamise vĂ”imalus lĂ€bi mĂ€lupulga.
Ja kĂ”ige tĂ€htsam on, et see kĂ”ik töötaks (kĂŒsimus: âkes selle eest maksab?â):
Sisestage postiserveri sertifikaadi hind alates 10 dollarist 3 aastaks. See vĂ”imaldab saatjal nĂ€idata DNS-is, et âminu avalikud vĂ”tmed on sealâ. Ja see annab vĂ”imaluse alustada turvalist ĂŒhendust, samas aktsepteerides selliseid ĂŒhendusi tasuta.
Gmail lĂ”puks monetiseerib oma kasutajaid. 10 dollari eest 3 aastaks â Ă”iguse luua turvalisi suhtluskanaleid.
============= JĂ€reldus =============
Kogu artikli testimiseks kavatsesin rendida dedikeeritud serveri ĂŒheks kuuks ja osta domeeni koos SSL-sertifikaadiga.
Kuid elusĂŒndmused venitasid selle kĂŒsimuse kahe kuu peale.
Ja nĂŒĂŒd, kui mul on jĂ€lle vaba aega, otsustasin artikli avaldada nii nagu on, mitte riskeerida, et avaldamine venib veel aastaks.
Kui tuleb piisavalt palju kĂŒsimusi stiilis âaga siin ei ole piisavalt ĂŒksikasjalikult kirjeldatudâ, siis tĂ”enĂ€oliselt leidub jĂ”udu vĂ”tta dedikeeritud server uue domeeniga ja uue SSL-sertifikaadiga ning kirjeldada veel detailselt ning mis kĂ”ige tĂ€htsam â tuua esile kĂ”ik tĂ€helepanuta jÀÀnud olulised detailid.
Sooviksin ka arvamusi idee kohta postiserveri sertifikaatidest. Kui idee meeldib, siis pĂŒĂŒan leida jĂ”udu kirjutada mustand RFC jaoks.
Suuri lĂ”ike artiklist kopeerides â palun mĂ€rkige viide sellele artiklile.
Kui tĂ”lgitakse mĂ”nda teise keelde â palun mĂ€rkige viide sellele artiklile.
Inglise keele tĂ”lkimise pĂŒĂŒan teha ise ja jĂ€tta ristviidatud lingid.
Allikas: habr.com
