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

Den hÀr artikeln handlar om hur man konfigurerar en modern e-postserver.
Postfix + Dovecot. SPF + DKIM + rDNS. Med IPv6.
Med TSL-kryptering. Med stöd för flera domÀner - del med ett giltigt SSL-certifikat.
Med skrÀppostskydd och högt skrÀppostbetyg hos andra e-postservrar.
Med stöd för flera fysiska grÀnssnitt.
Med OpenVPN, som ansluts via IPv4 och som ger IPv6.

Om du inte vill lÀra dig alla dessa teknologier men vill konfigurera en sÄdan server - dÄ Àr den hÀr artikeln för dig.

Artikeln innehÄller inga försök att förklara varje detalj. Förklaringen gÄr till att det som konfigurerats inte Àr standard eller Àr viktigt ur konsumentens synvinkel.

Motivationen att konfigurera en e-postserver Àr min lÄngvariga dröm. Det kanske lÄter dumt, men IMHO, det Àr mycket bÀttre Àn att drömma om en ny bil av min favorittyp.

Motivationen att konfigurera IPv6 Àr tvÄ. IT-specialister mÄste stÀndigt lÀra sig nya teknologier för att överleva. Jag vill göra min blygsamma insats i kampen mot censur.

Motivationen att konfigurera OpenVPN Àr endast för att IPv6 ska fungera pÄ den lokala maskinen.
Motivationen att konfigurera flera fysiska grÀnssnitt Àr att jag har en "lÄngsam, men obegrÀnsad" grÀnssnitt pÄ servern och en "snabb, men med begrÀnsning".

Motivationen att konfigurera Bind Àr att min leverantör tillhandahÄller en instabil DNS-server, och Google ger ocksÄ ibland fel. Jag vill ha en stabil DNS-server för personligt bruk.

Motivationen att skriva artikeln Àr att kladden skrevs för 10 mÄnader sedan, och jag har redan tittat pÄ den tvÄ gÄnger. Om Àven författaren behöver det regelbundet, Àr det en stor möjlighet att andra ocksÄ behöver det.

Det finns ingen universell lösning för en e-postserver. Men jag ska försöka skriva nÄgot i stil med "gör sÄ hÀr, och nÀr allt fungerar som det ska - slÀng det överflödiga."

Jag har en Colocation-server hos företaget tech.ru. Det finns möjlighet att jÀmföra med OVH, Hetzner, AWS. För att lösa detta problem kommer samarbetet med just tech.ru att vara mycket mer effektivt.

Debian 9 Àr installerat pÄ servern.

Servern har 2 grÀnssnitt `eno1` och `eno2`. Den första Àr obegrÀnsad och den andra snabb, respektive.

Det finns 3 statiska IP-adresser, XX.XX.XX.X0 och XX.XX.XX.X1 och XX.XX.XX.X2 pÄ grÀnssnittet `eno1` och XX.XX.XX.X5 pÄ grÀnssnittet `eno2`.

Det finns XXXX:XXXX:XXXX:XXXX::/64 pool med IPv6-adresser, som har tilldelats grÀnssnittet `eno1` och frÄn det XXXX:XXXX:XXXX:XXXX:1:2::/96 pÄ min begÀran har tilldelats `eno2`.

Det finns 3 domÀner `domain1.com`, `domain2.com`, `domain3.com`. För `domain1.com` och `domain3.com` finns det ett SSL-certifikat.

Det finns ett Google-konto som jag vill koppla till e-postlÄdan `vasya.pupkin@domain1.com` (ta emot och skicka e-post direkt frÄn Gmail-grÀnssnittet).
Det ska finnas en e-postlÄda `support@domain2.com`, vars kopia jag vill se i min Gmail. Och sÀllan vilja kunna skicka nÄgot frÄn `support@domain2.com` via webgrÀnssnittet.

Det ska finnas en e-postlÄda `ivanov@domain3.com`, som Ivanov kommer att anvÀnda frÄn sin iPhone.

Skickade e-postmeddelanden mÄste uppfylla alla moderna krav pÄ anti-spam.
Det ska finnas den högsta nivÄn av kryptering som Àr tillgÀnglig i offentliga nÀtverk.
Det ska finnas stöd för IPv6 bÄde för att skicka och ta emot e-post.
Det ska finnas SpamAssassin som aldrig kommer att ta bort e-postmeddelanden. IstÀllet ska det antingen göra en bounce, eller slÀppa igenom, eller skicka till IMAP-mappen "Spam".
SpamAssassin ska vara konfigurerad för auto-inlÀrning: om jag flyttar ett e-postmeddelande till "Spam" ska det lÀra sig av det; om jag flyttar ett e-postmeddelande frÄn mappen "Spam" ska det lÀra sig av det. Resultaten av SpamAssassins inlÀrning ska pÄverka om e-postmeddelandet hamnar i "Spam"-mappen.
PHP-skript ska kunna skicka e-post Ä namnet av vilken domÀn som helst pÄ denna server.
Det ska finnas en OpenVPN-tjÀnst som möjliggör anvÀndning av IPv6 pÄ en klient som inte har IPv6.

Först mÄste grÀnssnitt och routing konfigureras, inklusive IPv6.
Sedan mÄste OpenVPN konfigureras sÄ att den ansluter via IPv4 och tillhandahÄller klienten en statisk verklig IPv6-adress. Denna klient kommer fÄ tillgÄng till alla IPv6-tjÀnster pÄ servern och till alla IPv6-resurser pÄ internet.
DÀrefter mÄste Postfix konfigureras för att skicka e-post + SPF + DKIM + rDNS och andra liknande detaljer.
Sedan mÄste Dovecot konfigureras och Multi-domÀn stÀllas in.
Till slut installera Bind.
============= Multi-interfaces =============

För att konfigurera grÀnssnitten mÄste följande skrivas i "\/etc\/network\/interfaces".

Dessa instÀllningar kan tillÀmpas pÄ vilken server som helst i tech.ru (efter ett litet samrÄd med supporten) och de kommer att fungera som de ska.

# 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

Om erfarenhet av att konfigurera liknande saker för Hetzner, OVH — dĂ€r Ă€r det annorlunda. Mer komplicerat.

eno1 — det Ă€r namnet pĂ„ nĂ€tverkskort #1 (lĂ„ngsam, men obegrĂ€nsad).

eno2 — det Ă€r namnet pĂ„ nĂ€tverkskort #2 (snabb, men med en plan).
eno2 — det Ă€r namnet pĂ„ nĂ€tverkskort #2 (snabb, men med en plan).
tun0 — namnet pĂ„ det virtuella nĂ€tverksgrĂ€nssnittet frĂ„n OpenVPN.
XX.XX.XX.X0 — IPv4 #1 pĂ„ eno1.
XX.XX.XX.X1 — IPv4 #2 pĂ„ eno1.
XX.XX.XX.X2 — IPv4 #3 pĂ„ eno1.
XX.XX.XX.X5 — IPv4 #1 pĂ„ eno2.
XX.XX.XX.1 — IPv4 gateway.
XXXX:XXXX:XXXX:XXXX::/64 — IPv6 för hela servern.
XXXX:XXXX:XXXX:XXXX:1:2::/96 — IPv6 för eno2, medan allt annat gĂ„r via eno1.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 gateway (det Ă€r vĂ€rt att notera att detta kan/detta bör göras annorlunda. Ange IPv6 för switchen).
dns-nameservers — anges som 127.0.0.1 (eftersom bind Ă€r installerat lokalt) och 213.248.1.6 (detta Ă€r frĂ„n tech.ru).

«table eno1t» och «table eno2t» — syftet med dessa route-rule Ă€r att trafik som kommer in genom eno1 -> ska gĂ„ tillbaka genom samma grĂ€nssnitt, och trafik som kommer in genom eno2 -> ska gĂ„ tillbaka genom eno2. Dessutom ska serverinitierade anslutningar gĂ„ ut genom eno1.

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

Med det hÀr kommandot anger vi att all oidentifierad trafik som faller under en regel dÀr «table eno1t» Àr markerad -> ska dirigeras till grÀnssnittet eno1.

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

Med det hÀr kommandot anger vi att all trafik som initieras av servern ska dirigeras till grÀnssnittet eno1.

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

Med det hÀr kommandot definierar vi sjÀlva reglerna för trafikmÀrkning.

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

Detta block definierar en andra IPv4 för grÀnssnittet eno1.

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

Med det hÀr kommandot anger vi rutten frÄn OpenVPN-klienter till lokala IPv4, förutom XX.XX.XX.X0.
Varför detta kommando Ă€r tillrĂ€ckligt för alla IPv4 — förstĂ„r jag fortfarande inte.

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

HÀr anger vi adressen för grÀnssnittet. Servern kommer att anvÀnda den som «utgÄende» adress. Den kommer inte att anvÀndas pÄ nÄgot annat sÀtt.

Varför anges «:1:1::» sÄ komplicerat? För att OpenVPN ska fungera korrekt och bara för det. Mer om detta senare.

AngĂ„ende gateway — det fungerar sĂ„ och sĂ„ Ă€r det. Men i praktiken borde vi ange IPv6 för switchen till vilken servern Ă€r ansluten.

Men av nÄgon anledning slutar IPv6 att fungera nÀr jag gör sÄ. Kanske Àr det nÄgra konstigheter frÄn tech.ru.

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

Detta lĂ€gger till en IPv6-adress pĂ„ grĂ€nssnittet. Om det behövs hundra adresser — dĂ„ behövs hundra rader i den hĂ€r filen.

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

Jag har markerat adresserna och subnÀten för alla grÀnssnitt för tydlighetens skull.
eno1 — mĂ„ste alltid vara «/64» — eftersom det Ă€r hela vĂ„rt adresspool.
tun0 — nĂ€tverket mĂ„ste alltid vara större Ă€n eno1. Annars gĂ„r det inte att konfigurera IPv6-gatewayen för OpenVPN-kunder.
eno2 — nĂ€tverket mĂ„ste alltid vara större Ă€n tun0. Annars kan inte OpenVPN-kunder nĂ„ lokala IPv6-adresser.
För tydlighetens skull har jag valt subnet-storlek 16, men om du vill kan du till och med anvÀnda storlek «1».
SÄledes 64+16 = 80, och 80+16 = 96.

För Ànnu mer tydlighet:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY — det hĂ€r Ă€r adresser som ska tilldelas specifika webbplatser eller tjĂ€nster pĂ„ grĂ€nssnittet eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY — det hĂ€r Ă€r adresser som ska tilldelas specifika webbplatser eller tjĂ€nster pĂ„ grĂ€nssnittet eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY — det hĂ€r Ă€r adresser som ska tilldelas OpenVPN-kunder eller anvĂ€ndas som OpenVPN-tjĂ€nstadresser.

För att konfigurera nĂ€tverket — mĂ„ste det finnas möjlighet att starta om servern.
IPv4-Ă€ndringar upptas vid körning (viktigt att köra i screen — annars kommer detta kommando helt enkelt att fĂ€lla nĂ€tverket pĂ„ servern):

/etc/init.d/networking restart

LÀgg till i slutet av filen «/etc/iproute2/rt_tables»:

100 eno1t
101 eno2t

Utan detta kan man inte anvÀnda anpassade tabeller i filen «/etc/network/interfaces».
Siffrorna mÄste vara unika och mindre Àn 65535.

IPv6-Àndringar Àndras enkelt utan omstart, men för detta behöver man lÀra sig minst tre kommandon:

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

Konfigurering av «/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

Detta Àr instÀllningar för «sysctl» pÄ min server. Jag vill betona det viktiga.

net.ipv4.ip_forward = 1

Utan detta kommer OpenVPN inte att fungera alls.

net.ipv6.ip_nonlocal_bind = 1

Den som försöker binda IPv6 (t.ex. nginx) direkt efter att grĂ€nssnittet har tilldelats — kommer att fĂ„ ett fel. Att en sĂ„dan adress inte Ă€r tillgĂ€nglig.

För att undvika en sÄdan situation görs denna konfiguration.

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

Utan dessa instÀllningar kommer IPv6-trafik frÄn OpenVPN-kunder inte att nÄ vÀrlden.

Andra instÀllningar Àr antingen irrelevanta eller minns jag inte varför de Àr dÀr.
Men för sÀkerhets skull lÀmnar jag det «som det Àr».

För att dessa Ă€ndringar i filen ska trĂ€da i kraft utan att starta om servern — mĂ„ste kommandot utföras:

sysctl -p

Mer detaljerat om «tabell» regler: habr.com/post/108690

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

OpenVPN IPv4 fungerar inte utan iptables.

Jag har följande iptables för 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 Àr min statiska IPv4-adress för den lokala maskinen.
10.8.0.0/24 Àr IPv4-nÀtverket för openvpn. IPv4-adresser för openvpn-klienter.
Reglernas sekvens Àr viktig.

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

Detta Àr en begrÀnsning sÄ att endast jag med min statiska IP kan anvÀnda OpenVPN.

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

För att vidarebefordra IPv4-paket mellan OpenVPN-klienterna och internet mÄste en av dessa kommandon anges.

För olika scenarier kanske en av alternativen inte passar.
BÄda kommandona passar för mitt fall.
Efter att ha lÀst dokumentationen valde jag det första alternativet eftersom det anvÀnder mindre CPU.

För att alla iptables-instÀllningar ska tillÀmpas efter omstart mÄste de sparas nÄgonstans.

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

SÄdana namn valdes inte av en slump. De anvÀnds av paketet "iptables-persistent".

apt-get install iptables-persistent

Installation av OpenVPN:s huvudpaket:

apt-get install openvpn easy-rsa

LÄt oss stÀlla in en mall för certifikaten (ersÀtt med dina vÀrden):

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

LÄt oss redigera instÀllningarna för certifikatmallen:

mcedit vars

...
# Dessa Àr standardvÀrden för fÀlten
# som kommer att placeras i certifikatet.
# LÀmna inte nÄgot av dessa fÀlt tomma.
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"
...

Vi skapar ett servercertifikat:

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

Vi förbereder möjligheten att skapa de slutgiltiga "client-name.opvn"-filerna:

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

Vi förbereder ett skript som kommer att sammanfoga alla filer till en enhetlig opvn-fil.

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

Vi skapar den första OpenVPN-klienten:

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

Filen "~/client-configs/files/client-name.ovpn" skickas till klientens enhet.

För iOS-kunder mÄste vi göra ett trick:
InnehÄllet i taggen «tls-auth» ska vara utan kommentarer.
Och Àven sÀtta «key-direction 1» direkt före taggen «tls-auth».

LÄt oss konfigurera OpenVPN-servern:

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

Detta behövs för att tilldela en statisk adress till varje kund (inte nödvÀndigt, men jag anvÀnder det):

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

Den mest komplexa och nyckelfrÄgan.

TyvÀrr kan inte OpenVPN Àn automatiskt konfigurera IPv6-gateway för kunder.
Vi mÄste «manuellt» vidarebefordra detta för varje kund.

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

Filen «/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

Filen «/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

BÄda skripten anvÀnder filen «/etc/openvpn/variables»:

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

Jag har svÄrt att minnas varför det stÄr sÄ hÀr.

Det ser nu konstigt ut netmask = 112 (det borde vara 96).
Och prefixet Àr konstigt, det överensstÀmmer inte med nÀtverket tun0.
Men jaja, jag behÄller det «som det Àr».

cipher DES-EDE3-CBC

Detta Ă€r en smaksak — jag valde denna krypteringsmetod för anslutningen.

Mer detaljerad information om konfiguration av OpenVPN IPv4.

Mer detaljerad information om konfiguration av OpenVPN IPv6.

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

Installation av huvudpaketet:

apt-get install postfix

VÀlj «internet-site» vid installation.

Min «/etc/postfix/main.cf» ser ut sÄ hÀr:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# att lÀgga till .domain Àr MUA:s jobb.
append_dot_mydomain = no

readme_directory = no

# Se http://www.postfix.org/COMPATIBILITY_README.html -- standardinstÀllning Àr 2 pÄ
# nya installationer.
compatibility_level = 2

# TLS-parametrar
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

# Lagringstyp
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 instÀllningar
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-adress per domÀn
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

LÄt oss titta pÄ detaljerna i denna konfiguration.

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

Enligt medlemmar pÄ Habr Àr denna sektion fylld med `desinformation och felaktiga pÄstÄenden`.Först efter Ätta Är av min karriÀr började jag förstÄ hur SSL fungerar.

DÀrför tar jag mig friheten att beskriva hur man anvÀnder SSL (utan att svara pÄ frÄgorna "Hur fungerar det?" och "Varför fungerar det?").

Grunden för modern encryption Àr att skapa ett nyckelpar (tvÄ vÀldigt lÄnga strÀngar av tecken).

En "nyckel" Àr privat, den andra nyckeln Àr "offentlig". Den privata nyckeln förvaras noga i hemlighet. Den offentliga nyckeln delas ut till alla som vill ha den.

Med hjÀlp av den offentliga nyckeln kan man kryptera en textrad sÄ att endast Àgaren av den privata nyckeln kan dekryptera den.
Och det Àr grunden för teknologin.

Steg №1 — https-sajter.
NÀr webblÀsaren begÀr en webbplats fÄr den veta av webbservern att webbplatsen Àr https och dÀrför begÀr den den offentliga nyckeln.
Webbservern skickar den offentliga nyckeln. WebblÀsaren anvÀnder den offentliga nyckeln för att kryptera http-förfrÄgan och skickar den.
InnehÄllet i http-förfrÄgan kan endast lÀsas av den som har den privata nyckeln, det vill sÀga endast servern som anropas.
Http-förfrĂ„gan innehĂ„ller Ă„tminstone ett URI. SĂ„ om ett land försöker begrĂ€nsa Ă„tkomsten inte till hela webbplatsen, utan till en specifik sida — Ă€r det omöjligt att göra det för https-webbplatser.

Steg #2 — krypterat svar.
Webbservern ger ett svar som enkelt kan lÀsas lÀngs vÀgen.
Lösningen Ă€r extremt enkel — webblĂ€saren skapar lokalt ett par privat-offentlig nyckel för varje https-webbplats.
Och tillsammans med begÀran om webbplatsens offentliga nyckel skickar den sin lokala offentliga nyckel.
Webbservern kommer ihÄg den och vid sÀndning av http-svar krypterar den med just denna offentliga nyckel för den specifika klienten.
Nu kan http-svaret endast dekrypteras av innehavaren av den privata nyckeln för klientens webblÀsare (det vill sÀga sjÀlva klienten).

Steg #3 — etablering av en sĂ€ker anslutning över en offentlig kanal.
I exempel #2 finns en sĂ„rbarhet — inget hindrar illvilliga aktörer frĂ„n att avlyssna http-förfrĂ„gan och redigera informationen om den offentliga nyckeln.
SÄledes kan en mellanhand se allt innehÄll i skickade och mottagna meddelanden sÄ lÀnge som kommunikationskanalen inte Àndras.
Att bekĂ€mpa detta Ă€r ganska enkelt — det rĂ€cker med att skicka webblĂ€sarens offentliga nyckel som ett meddelande krypterat med webbserverns offentliga nyckel.
Webbservern skickar dÄ först ett svar av typen "din offentliga nyckel ser ut sÄ hÀr" och krypterar detta meddelande med samma offentliga nyckel.
WebblĂ€saren granskar svaret — om meddelandet "din offentliga nyckel ser ut sĂ„ hĂ€r" kommer, sĂ„ Ă€r det en 100% garanti för att denna kommunikationskanal Ă€r sĂ€ker.
Hur sÀker Àr den?
SjÀlva skapandet av en sÄ sÀker kommunikationskanal sker med hastigheten ping*2. Till exempel 20 ms.
En illvillig aktör mÄste antingen ha den privata nyckeln för en av parterna i förvÀg. Eller knÀcka den privata nyckeln pÄ nÄgra millisekunder.
Att bryta ett modernt privat nyckel skulle ta decennier pÄ en superdator.

Steg #4 — offentlig databas för offentliga nycklar.
Det Àr uppenbart att det i hela denna historia finns möjlighet för en illvillig aktör som sitter pÄ kommunikationskanalen mellan klienten och servern.
Möjligheten för kunden att framstÀllas som server och för servern att framstÀllas som kund. Och att simulera ett par nycklar Ät bÄda hÄll.
DÄ kommer angriparen att se all trafik och ha möjlighet att "redigera" trafiken.
Till exempel Àndra adressen dit pengarna ska skickas eller kopiera lösenordet till internetbanken eller blockera "misshagligt" innehÄll.
För att bekÀmpa sÄdana angripare har en offentlig databas med publika nycklar skapats för varje https-webbplats.
Varje webblÀsare "vet" om existensen av cirka 200 sÄdana databaser. Detta Àr förinstallerat i varje webblÀsare.
"Kunskapen" bekrÀftas av den publika nyckeln frÄn varje certifikat. Det vill sÀga, det Àr omöjligt att förfalska en anslutning till varje specifik certifieringsmyndighet.

Nu finns det en enkel förstÄelse för hur man anvÀnder SSL för https.
Om man anstrÀnger sig en smula blir det klart hur specialtjÀnster kan hacka nÄgot i denna konstruktion. Men det kommer att kosta dem enorma anstrÀngningar.
För organisationer mindre Àn NSA eller CIA Àr det praktiskt taget omöjligt att hacka den befintliga skyddsnivÄn, Àven för VIP.

Jag tillÀgger ocksÄ om ssh-anslutningar. DÀr finns det inga publika nycklar, hur ska man göra? FrÄgan löses pÄ tvÄ sÀtt.
SSH-lösenord alternativet:
Vid första anslutningen mÄste ssh-klienten varna att vi har en ny publik nyckel frÄn ssh-servern.
Och vid framtida anslutningar, om det dyker upp en varning "ny publik nyckel frĂ„n ssh-servern" — betyder det att nĂ„gon försöker avlyssna.
Eller vid första anslutningen avlyssnades du, och nu kommunicerar du med servern utan mellanhÀnder.
Faktum Ă€r att eftersom avlyssning kan upptĂ€ckas enkelt, snabbt och utan anstrĂ€ngning — anvĂ€nds denna attack endast i speciella fall under specifika kunder.

SSH-nycklarnas alternativ:
Vi tar en USB-enhet, skriver den privata nyckeln för ssh-servern pÄ den (det finns termer och massor av betydelsefulla nyanser, men jag skriver en allmÀn översikt, inte en anvÀndarmanual).
Den publika nyckeln lÀmnar vi pÄ maskinen dÀr ssh-klienten kommer att vara och hÄller den ocksÄ hemlig.
Vi tar USB-enheten till servern, sÀtter i den, kopierar den privata nyckeln, och brÀnner sedan USB-enheten och sprider aska i vinden (eller Ätminstone formaterar den med nollor).
Det Ă€r allt — efter en sĂ„dan operation kommer det att vara omöjligt att hacka en sĂ„dan ssh-anslutning. Naturligtvis kan trafiken pĂ„ en superdator efter 10 Ă„r granskas — men det Ă€r en annan historia.

Jag ber om ursÀkt för offtopik.

SÄ nu nÀr teorin Àr kÀnd. Jag kommer att berÀtta om flödet för att skapa ett ssl-certifikat.

Med hjÀlp av "openssl genrsa" skapar vi en privat nyckel och "mallar" för den offentliga nyckeln.
"mallar" skickar vi till ett tredjepartsföretag som vi betalar ungefÀr $9 för det enklaste certifikatet.

Efter ett par timmar fÄr vi frÄn detta tredjepartsföretag vÄr "offentliga" nyckel och ytterligare ett set med flera offentliga nycklar.

FrĂ„gan Ă€r varför man ska betala ett tredjepartsföretag för att utfĂ€rda min offentliga nyckel — det Ă€r en separat frĂ„ga och vi ska inte gĂ„ in pĂ„ det hĂ€r.

Nu förstÄr vi meningen med inskriptionen:

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

I katalogen "/etc/ssl" finns alla filer för ssl-frÄgor.
domain1.com — domĂ€nens namn.
2018 — Ă„ret dĂ„ nycklarna skapades.
"key" — beteckningen pĂ„ att filen Ă€r en privat nyckel.

Och meningen med denna fil Àr:

smtpd_tls_cert_file= /etc/ssl/domain1.com.2018.chained.crt
domain1.com — domĂ€nens namn.
2018 — Ă„ret dĂ„ nycklarna skapades.
chained — beteckningen för att hĂ€r finns en kedja av offentliga nycklar (den första — vĂ„r offentliga och de andra — vad som kom frĂ„n företaget som utfĂ€rdade den offentliga nyckeln).
crt — beteckningen för att hĂ€r finns ett fĂ€rdigt certifikat (offentlig nyckel med tekniska förklaringar).

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

Denna instÀllning anvÀnds i detta fall inte, men den Àr skriven som ett exempel.

För ett fel i detta parameter kommer att leda till att spam skickas frÄn din server (utan din vilja).

Sen fÄr du bevisa för alla att du inte Àr skyldig.

recipient_delimiter = +

MÄnga kanske inte vet, men detta Àr den standard symbolen för att rangordna e-post och stöds av de flesta moderna e-postservrar.

Till exempel, om du har e-postlĂ„dan "username@gmail.com" försök skicka till "username+spam@gmail.com" — se vad som hĂ€nder.

inet_protocols = ipv4

Detta kan vara förvirrande.

Men det Àr inte utan anledning. Varje ny domÀn har som standard endast IPv4, sedan aktiverar jag IPv6 för varje separat domÀn.

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

HÀr anger vi att all inkommande e-post gÄr till dovecot.
Och reglerna för domĂ€n, mailbox, alias — se i databasen.

/etc/postfix/mysql-virtual-mailbox-domains.cf

anvÀndare = anvÀndarens e-post
lösenord = maillösenord
vÀrdar = 127.0.0.1
databasnamn = servermail
frĂ„ga = VÄLJ 1 FRÅN virtuella_domĂ€ner DÄR namn='%s'

/etc/postfix/mysql-virtual-mailbox-maps.cf

anvÀndare = anvÀndarens e-post
lösenord = maillösenord
vÀrdar = 127.0.0.1
databasnamn = servermail
frĂ„ga = VÄLJ 1 FRÅN virtuella_anvĂ€ndare DÄR e-post='%s'

/etc/postfix/mysql-virtual-alias-maps.cf

anvÀndare = anvÀndarens e-post
lösenord = maillösenord
vÀrdar = 127.0.0.1
databasnamn = servermail
frĂ„ga = VÄLJ destination FRÅN virtuella_alias DÄR source='%s'

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

Nu vet postfix att det endast kan ta emot e-post för vidarebefordran genom autentisering med dovecot.

Jag förstÄr faktiskt inte riktigt varför detta ska dupliceras hÀr. Vi har ju redan angivit allt som behövs i "virtual_transport".

Men postfix Àr ett mycket gammalt system - det Àr nog sÄ kallade lösningar frÄn gamla tider.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Detta ska konfigureras för varje e-postserver pÄ sitt eget sÀtt.

Jag har 3 e-postservrar, och dessa instÀllningar Àr mycket olika pÄ grund av olika krav för anvÀndning.

Konfigurationen mÄste göras noggrant - annars kommer spam att strömma till dig eller Ànnu vÀrre - spam kommer att strömma frÄn dig.

# SPF
policyd-spf_time_limit = 3600

InstÀllningen för en viss plugin relaterad till kontroll av SPF för inkommande e-post.

# 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

InstÀllningen att alla utgÄende e-postmeddelanden ska försörjas med en DKIM-signatur.

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

Detta Àr en nyckeldetalj i ruttningen av e-post nÀr man skickar e-post frÄn php-skript.

Fil "\/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:

Till vÀnster - reguljÀra uttryck. Till höger - en etikett som mÀrker meddelandet.
Postfix kommer enligt etiketten att ta hÀnsyn till ytterligare nÄgra konfigurationsrader för det specifika meddelandet.

Hur postfix kommer att rekonfigureras för det specifika meddelandet kommer att anges i "master.cf".

Raderna 4, 5, 6 - de Àr viktiga. I vilket namn vi skickar meddelandet frÄn - sÄ sÀtter vi etiketten.
Men inte alltid i php-skript i gammal kod anges fÀltet "from". DÄ kommer anvÀndarnamnet till hjÀlp.

Den hÀr artikeln Àr redan omfattande - jag skulle helst inte vilja förlora fokus pÄ att konfigurera nginx+fpm.

Kort och gott - för varje webbplats anger vi vÄr egen linux-anvÀndare som Àgare. Och dÀrmed sin egen fpm-pool.

Fpm-pool anvÀnder vilken php-version som helst (det Àr utmÀrkt att man kan anvÀnda olika php-versioner och Àven olika php.ini utan problem för angrÀnsande webbplatser pÄ samma server).

SÄ för den specifika linux-anvÀndaren "www-domain2" finns det en webbplats domain2.com. PÄ denna webbplats finns det kod för att skicka meddelanden utan att ange "from"-fÀltet.

SÄ Àven i det hÀr fallet kommer meddelandena att skickas korrekt och hamnar aldrig i spam.

Min "\/etc\/postfix\/master.cf" ser ut sÄ hÀr:

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

Filen Ă€r inte helt komplett – den Ă€r redan vĂ€ldigt stor.
Jag har bara noterat det som har Àndrats.

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}

Detta Àr instÀllningar relaterade till spamassassin, mer om det senare.

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

Vi tillÄter anslutning till e-postservern via port 587.
För detta behöver man absolut autentisera sig.

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

Vi aktiverar SPF-kontroll.

apt-get install postfix-policyd-spf-python

Vi installerar paketet för SPF-kontroller ovan.

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

Och detta Àr det mest intressanta. Det Àr möjligheten att skicka mejl för en specifik domÀn frÄn en specifik IPv4/IPv6-adress.

Detta görs för rDNS. rDNS Àr att fÄ en viss strÀng frÄn IP-adressen.
Och för e-post anvÀnds denna möjlighet för att bekrÀfta att helo exakt matchar rDNS för den adress frÄn vilken e-post meddelandet skickades.

Om helo inte matchar domÀnen för den e-postadress som skickade meddelandet, tilldelas spampoÀng.

Helo matchar inte rDNS – mĂ„nga spampoĂ€ng tilldelas.
DÀrför mÄste varje domÀn ha sin egen IP-adress.
För OVH – finns det möjlighet att ange rDNS i kontrollpanelen.
För tech.ru – denna frĂ„ga löses via supporten.
För AWS – denna frĂ„ga löses via supporten.
«inet_protocols» och «smtp_bind_address6» — hĂ€r aktiverar vi stöd för IPv6.
För IPv6 mÄste ocksÄ rDNS anges.
«syslog_name» — detta Ă€r för att underlĂ€tta lĂ€sningen av loggar.

Köpa certifikat jag rekommenderar hÀr.

Konfigurera kombinationen postfix+dovecot hÀr.

Konfigurera SPF.

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

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

Konfigurera mysql, installera paketen sjÀlva.

Filen «/etc/dovecot/conf.d/10-auth.conf»

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autentisering endast i krypterad form.

Filen «/etc/dovecot/conf.d/10-mail.conf»

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

HÀr anger vi platsen för lagring av e-post.

Jag vill att de lagras i filer och grupperas efter domÀner.

Filen «/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 {
  }
}

Detta Àr huvudkonfigurationsfilen för dovecot.
HÀr stÀnger vi av oskyddade anslutningar.
Och aktiverar skyddade anslutningar.

Filen «/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
}

Vi konfigurerar ssl. Anger att ssl Àr obligatoriskt.
Och sjĂ€lva certifikatet. En viktig detalj — direktivet «local». Det anger vilket ssl-certifikat som ska anvĂ€ndas vid anslutning till vilken lokal IPv4.

Förresten, IPv6 Àr inte konfigurerat hÀr, jag ska rÀtta till det senare.
XX.XX.XX.X5 (domain2) — det finns inget certifikat. För klientanslutningar mĂ„ste domain1.com anges.
XX.XX.XX.X2 (domain3) — det finns ett certifikat, för klientanslutningar kan domain1.com eller domain3.com anges.

Filen «/etc/dovecot/conf.d/15-lda.conf»

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Detta kommer senare att behövas för spamassassin.

Filen «/etc/dovecot/conf.d/20-imap.conf»

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Detta Àr antispam-plugin. Behövs för trÀning av spamassassin vid flytt till/frÄn mappen «Spam».

Filen «/etc/dovecot/conf.d/20-pop3.conf»

protocol pop3 {
}

Det finns helt enkelt en sÄdan fil.

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

protokoll lmtp {
  mail_plugins = $mail_plugins sieve
  postmaster_address = admin@domain1.com
}

InstÀllning av lmtp.

Fil "\/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
}

InstÀllningar för SpamAssassin-lÀrande vid överföring till/frÄn mappen "Spam".

Fil "\/etc\/dovecot\/conf.d\/90-sieve.conf"

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

Fil dÀr det anges vad som ska göras med inkommande brev.

Fil "\/var\/lib\/dovecot\/sieve\/default.sieve"

require ["fileinto", "mailbox"];

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

Filen mÄste kompileras: "sievec default.sieve".

Fil "\/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
}

Angivelse av sql-filer för autentisering.
Och filen sjĂ€lv – som ett sĂ€tt att autentisera.

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

Detta motsvarar liknande instÀllningar för postfix.

Fil "\/etc\/dovecot\/dovecot.conf"

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

Huvudkonfigurationsfil.
Viktigt Àr att vi anger-lÀgger protokoll hÀr.

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

apt-get install spamassassin spamc

Vi installerar paketen.

adduser spamd --disabled-login

Vi lÀgger till en anvÀndare i vars namn.

systemctl enable spamassassin.service

Aktiverar automatisk start av spamassassin-tjÀnsten vid uppstart.

Fil "\/etc\/default\/spamassassin":

CRON=1

Aktiverar automatisk uppdatering av regler "som standard".

Fil "\/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

MÄste göra en mysql-databas "sa" med anvÀndaren "sa" och lösenordet "password" (byt till nÄgot lÀmpligt).

report_safe – istĂ€llet för mail kommer en rapport om spam-mailet att skickas.
use_bayes – detta Ă€r instĂ€llningar för maskininlĂ€rning i spamassassin.

Övriga instĂ€llningar för spamassassin tillĂ€mpades tidigare enligt artikeln.

AllmÀn instÀllning "spamassassin".
Om flyttning av nya spam-brev till IMAP-mappen "Spam"..
Om en enkel kombination av Dovecot + SpamAssassin..
Rekommenderar att lÀsa teorin om spamassassin-lÀrande vid flytt av brev i imap-mappar (och rekommenderar inte att anvÀnda den)..

============= Kontakt med gemenskapen =============

Jag skulle ocksÄ vilja föra fram en idé till gemenskapen om hur man kan öka skyddsnivÄn för skickade mejl. Eftersom jag har fördjupat mig sÄ mycket i Àmnet e-post.

För att anvĂ€ndaren ska kunna skapa ett par nycklar pĂ„ sin klient (Outlook, Thunderbird, webblĂ€sartillĂ€gg, 
). En offentlig och en privat nyckel. Den offentliga nyckeln – skicka till DNS. Den privata – spara pĂ„ klienten. E-postservrar skulle kunna anvĂ€nda den offentliga nyckeln för att skicka till en specifik mottagare.

Och för att skydda mot skrĂ€ppost i sĂ„dana mejl (ja, e-postservern kan inte se innehĂ„llet) – mĂ„ste tre regler införas:

  1. Obligatorisk Àkta DKIM-signatur, obligatorisk SPF, obligatorisk rDNS.
  2. En neuralt nÀtverk för att lÀra sig att bekÀmpa skrÀppost + en databas för detta pÄ klientsidan.
  3. Krypteringsalgoritmen mÄste vara sÄdan att sÀndande part mÄste anvÀnda 100 gÄnger mer CPU-kapacitet för kryptering Àn mottagande part.

Utöver offentliga mejl – utveckla en standard för förslagsmejl "starta en sĂ€ker konversation". En av anvĂ€ndarna (e-postlĂ„da) skickar ett mejl till en annan e-postlĂ„da med en bilaga. I mejlet finns textförslaget att starta en sĂ€ker kommunikationskanal för konversationen och den offentliga nyckeln för Ă€garen av e-postlĂ„dan (medan den privata nyckeln förblir pĂ„ klientsidan).

Man kan till och med skapa ett par nycklar speciellt för varje konversation. Mottagande anvĂ€ndare kan acceptera detta erbjudande och skicka sin offentliga nyckel (ocksĂ„ skapad speciellt för denna konversation). DĂ€refter skickar den första anvĂ€ndaren en tjĂ€nstestyrd kontrollmejl (krypterad med den andra anvĂ€ndarens offentliga nyckel) – vid mottagandet av denna kan den andra anvĂ€ndaren anse att den bildade kommunikationskanalen Ă€r tillförlitlig. DĂ€refter skickar den andra anvĂ€ndaren en kontrollmejl – och dĂ„ kan ocksĂ„ den första anvĂ€ndaren anse den bildade kanalen som skyddad.

För att bekĂ€mpa avlyssning av nycklar pĂ„ vĂ€gen – mĂ„ste protokollet tillhandahĂ„lla möjligheten att överföra Ă„tminstone en offentlig nyckel med hjĂ€lp av en USB-enhet.

Och det viktigaste – att allt detta fungerar (frĂ„gan 'vem ska betala för detta?'):
Ange e-postcertifikat som kostar frĂ„n 10 $ för 3 Ă„r. Dessa kommer att tillĂ„ta avsĂ€ndaren att ange i DNS att "mina publika nycklar finns dĂ€r borta". De kommer att möjliggöra början pĂ„ en sĂ€ker anslutning. Med detta — ta emot sĂ„dana anslutningar gratis.
Gmail monetariserar Ă€ntligen sina anvĂ€ndare. För 10 $ under 3 Ă„r — rĂ€tten att skapa sĂ€kra kommunikationskanaler.

============= Slutsats =============

För att testa hela artikeln planerade jag att hyra en dedikerad server i en mÄnad och köpa en domÀn med SSL-certifikat.

Men livsomstÀndigheterna gjorde att denna frÄga drog ut pÄ tiden i 2 mÄnader.
Och nu nĂ€r det Ă„terigen fanns ledig tid — beslutade jag att publicera artikeln som den Ă€r, istĂ€llet för att riskera att publiceringen drar ut pĂ„ tiden ytterligare ett Ă„r.

Om det kommer tillrĂ€ckligt med frĂ„gor som "hĂ€r Ă€r inte tillrĂ€ckligt beskrivet" — dĂ„ kommer det troligen att finnas krafter att faktiskt ta en dedikerad server med en ny domĂ€n och ett nytt SSL-certifikat och beskriva mer detaljerat och framför allt — avslöja alla viktiga detalj som har missats.

Jag skulle ocksĂ„ vilja fĂ„ feedback om idĂ©n med e-postcertifikat. Om idĂ©n uppskattas — ska jag försöka hitta motivation att skriva ett utkast för RFC.

Vid kopiering av stora delar av artikeln — ange en lĂ€nk till denna artikel.
Vid översĂ€ttning till nĂ„got annat sprĂ„k — ange en lĂ€nk till denna artikel.
Jag ska sjÀlv försöka översÀtta till engelska och lÀmna korslÀnkar.


KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster