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

Den hÀr artikeln handlar om hur man stÀller in en modern e-postserver.
Postfix + duvslag. SPF + DKIM + rDNS. Med IPv6.
Med TSL-kryptering. Med stöd för flera domÀner - del med ett riktigt SSL-certifikat.
Med antispam-skydd och högt antispam-betyg frÄn andra e-postservrar.
Stöder flera fysiska grÀnssnitt.
Med OpenVPN, vars anslutning sker via IPv4, och som ger IPv6.

Om du inte vill lÀra dig alla dessa tekniker, men vill stÀlla in en sÄdan server, Àr den hÀr artikeln för dig.

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

Motivationen att sÀtta upp en e-postserver har varit en lÄng dröm för mig. Detta kan lÄta dumt, men IMHO, det Àr mycket bÀttre Àn att drömma om en ny bil frÄn ditt favoritmÀrke.

Det finns tvÄ motiv för att stÀlla in IPv6. En IT-specialist behöver hela tiden lÀra sig ny teknik för att överleva. Jag skulle vilja ge mitt blygsamma bidrag till kampen mot censur.

Motivationen för att stÀlla in OpenVPN Àr bara att fÄ IPv6 att fungera pÄ den lokala maskinen.
Motivationen för att sÀtta upp flera fysiska grÀnssnitt Àr att jag pÄ min server har ett grÀnssnitt "lÄngsamt men obegrÀnsat" och ett annat "snabbt men med en tariff".

Motivationen för att sÀtta upp Bind-instÀllningar Àr att min internetleverantör tillhandahÄller en instabil DNS-server, och google misslyckas ocksÄ ibland. Jag vill ha en stabil DNS-server för personligt bruk.

Motivation att skriva en artikel - Jag skrev ett utkast för 10 mĂ„nader sedan, och jag har redan tittat pĂ„ det tvĂ„ gĂ„nger. Även om författaren regelbundet behöver det, Ă€r det stor sannolikhet att andra ocksĂ„ kommer att behöva 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 sedan, nÀr allt fungerar som det ska, slÀng ut de extra sakerna."

Företaget tech.ru har en Colocation-server. Det gÄr att jÀmföra med OVH, Hetzner, AWS. För att lösa detta problem kommer samarbetet med tech.ru att vara mycket effektivare.

Debian 9 Àr installerat pÄ servern.

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

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

TillgÀnglig XXXX:XXXX:XXXX:XXXX::/64 en pool av IPv6-adresser som Àr tilldelade till `eno1`-grÀnssnittet och frÄn den tilldelades XXXX:XXXX:XXXX:XXXX:1:2::/96 till `eno2` pÄ min begÀran.

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

Jag har ett Google-konto som jag skulle vilja lÀnka min brevlÄda till[e-postskyddad]` (ta emot e-post och skicka e-post direkt frÄn gmail-grÀnssnittet).
Det mÄste finnas en brevlÄda`[e-postskyddad]`, en kopia av e-postmeddelandet som jag vill se i min gmail. Och det Àr sÀllan man kan skicka nÄgot pÄ uppdrag av `[e-postskyddad]` via webbgrÀnssnittet.

Det mÄste finnas en brevlÄda`[e-postskyddad]`, som Ivanov kommer att anvÀnda frÄn sin iPhone.

Skickade e-postmeddelanden mÄste uppfylla alla moderna krav pÄ antispam.
Det mÄste finnas den högsta nivÄn av kryptering som tillhandahÄlls i offentliga nÀtverk.
Det bör finnas IPv6-stöd för bÄde att skicka och ta emot brev.
Det borde finnas en SpamAssassin som aldrig kommer att radera e-postmeddelanden. Och den kommer antingen att studsa eller hoppa över eller skicka till IMAP-mappen "Spam".
SpamAssassin auto-inlÀrning mÄste konfigureras: om jag flyttar ett brev till skrÀppostmappen kommer det att lÀra sig av detta; om jag flyttar ett brev frÄn skrÀppostmappen kommer det att lÀra sig av detta. Resultaten av SpamAssassin-trÀningen bör pÄverka om brevet hamnar i skrÀppostmappen.
PHP-skript mÄste kunna skicka e-post pÄ uppdrag av vilken domÀn som helst pÄ en given server.
Det bör finnas en openvpn-tjÀnst, med möjlighet att anvÀnda IPv6 pÄ en klient som inte har IPv6.

Först mÄste du konfigurera grÀnssnitt och routing, inklusive IPv6.
Sedan mÄste du konfigurera OpenVPN, som kommer att ansluta via IPv4 och förse klienten med en statisk riktig IPv6-adress. Den hÀr klienten kommer att ha tillgÄng till alla IPv6-tjÀnster pÄ servern och tillgÄng till alla IPv6-resurser pÄ Internet.
DÄ mÄste du konfigurera Postfix för att skicka brev + SPF + DKIM + rDNS och andra liknande smÄsaker.
DÄ mÄste du konfigurera Dovecot och konfigurera Multidomain.
Sedan mÄste du konfigurera SpamAssassin och konfigurera trÀning.
Slutligen, installera Bind.

============= Multi-grÀnssnitt ==============

För att konfigurera grÀnssnitt mÄste du skriva detta i "/etc/network/interfaces".

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eno1
iface eno1 inet static
        address XX.XX.XX.X0/24
        gateway XX.XX.XX.1
        dns-nameservers 127.0.0.1 213.248.1.6
        post-up ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t
        post-up ip route add default via XX.XX.XX.1 table eno1t
        post-up ip rule add table eno1t from XX.XX.XX.X0
        post-up ip rule add table eno1t to XX.XX.XX.X0

auto eno1:1
iface eno1:1 inet static
address XX.XX.XX.X1
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X1
        post-up ip rule add table eno1t to XX.XX.XX.X1
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t

auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X2
        post-up ip rule add table eno1t to XX.XX.XX.X2

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
        gateway XXXX:XXXX:XXXX:XXXX::1
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE

# The secondary network interface
allow-hotplug eno2
iface eno2 inet static
        address XX.XX.XX.X5
        netmask 255.255.255.0
        post-up   ip route add XX.XX.XX.0/24 dev eno2 src XX.XX.XX.X5 table eno2t
        post-up   ip route add default via XX.XX.XX.1 table eno2t
        post-up   ip rule add table eno2t from XX.XX.XX.X5
        post-up   ip rule add table eno2t to XX.XX.XX.X5
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t

iface eno2 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:2::/96
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE

# OpenVPN network
iface tun0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:3::/80

Dessa instÀllningar kan tillÀmpas pÄ vilken server som helst i tech.ru (med lite samordning med support) och det kommer omedelbart att fungera som det ska.

Om du har erfarenhet av att stÀlla in liknande saker för Hetzner, OVH, Àr det annorlunda dÀr. SvÄrare.

eno1 Àr namnet pÄ nÀtverkskort #1 (lÄngsamt men obegrÀnsat).
eno2 Àr namnet pÄ nÀtverkskort #2 (snabbt, men med en taxa).
tun0 Àr namnet pÄ det virtuella nÀtverkskortet 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, allt annat frÄn utsidan gÄr in i eno1.
XXXX:XXXX:XXXX:XXXX::1 — IPv6-gateway (det Ă€r vĂ€rt att notera att detta kan/bör göras annorlunda. Ange IPv6-vĂ€xeln).
dns-nameservers - 127.0.0.1 anges (eftersom bind Àr installerat lokalt) och 213.248.1.6 (detta Àr frÄn tech.ru).

"tabell eno1t" och "tabell eno2t" - innebörden av dessa ruttregler Àr att trafik som kommer in genom eno1 -> skulle gÄ genom den, och trafik som kommer in genom eno2 -> skulle gÄ genom den. Och Àven anslutningar initierade av servern skulle gÄ genom eno1.

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

Med detta kommando specificerar vi att all obegriplig trafik som faller under nÄgon regel mÀrkt "tabell eno1t" -> skickas till eno1-grÀnssnittet.

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

Med detta kommando anger vi att all trafik som initieras av servern ska dirigeras till eno1-grÀnssnittet.

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

Med detta kommando sÀtter vi reglerna för att markera trafik.

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 specificerar en andra IPv4 för eno1-grÀnssnittet.

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

Med detta kommando stĂ€ller vi in ​​rutten frĂ„n OpenVPN-klienter till lokal IPv4 förutom XX.XX.XX.X0.
Jag förstÄr fortfarande inte varför det hÀr kommandot rÀcker för alla IPv4.

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

Det Àr hÀr vi stÀller in adressen för sjÀlva grÀnssnittet. Servern kommer att anvÀnda den som en "utgÄende" adress. Kommer inte att anvÀndas pÄ nÄgot sÀtt igen.

Varför Àr ":1:1::" sÄ komplicerat? SÄ att OpenVPN fungerar korrekt och endast för detta. Mer om detta senare.

PÄ Àmnet gateway - det Àr sÄ det fungerar och det Àr bra. Men det korrekta sÀttet Àr att hÀr ange IPv6 för switchen som servern Àr ansluten till.

Men av nÄgon anledning slutar IPv6 att fungera om jag gör detta. Det hÀr Àr förmodligen nÄgot slags tech.ru-problem.

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

Detta lÀgger till en IPv6-adress till grÀnssnittet. Om du behöver hundra adresser betyder det 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 noterade adresserna och undernÀten för alla grÀnssnitt för att göra det tydligt.
eno1 - mÄste vara "/64" - för det hÀr Àr hela vÄr pool av adresser.
tun0 - undernÀtet mÄste vara större Àn eno1. Annars kommer det inte att vara möjligt att konfigurera en IPv6-gateway för OpenVPN-klienter.
eno2 - undernÀtet mÄste vara större Àn tun0. Annars kommer OpenVPN-klienter inte att kunna komma Ät lokala IPv6-adresser.
För tydlighetens skull valde jag ett subnÀtsteg pÄ 16, men om du vill kan du till och med göra "1" steg.
Följaktligen Àr 64+16 = 80 och 80+16 = 96.

För Ànnu större tydlighet:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY Àr adresser som bör tilldelas specifika webbplatser eller tjÀnster pÄ eno1-grÀnssnittet.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY Àr adresser som bör tilldelas specifika webbplatser eller tjÀnster pÄ eno2-grÀnssnittet.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY Àr adresser som ska tilldelas OpenVPN-klienter eller anvÀndas som OpenVPN-tjÀnstadresser.

För att konfigurera nÀtverket bör det vara möjligt att starta om servern.
IPv4-Àndringar plockas upp nÀr de körs (se till att linda in det pÄ skÀrmen - annars kommer detta kommando helt enkelt att krascha 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 du inte anvÀnda anpassade tabeller i filen "/etc/network/interfaces".
Numren mÄste vara unika och mindre Àn 65535.

IPv6-Àndringar kan enkelt Àndras utan att starta om, men för att göra detta mÄste du lÀra dig minst tre kommandon:

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

InstÀllning 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

Det hÀr Àr min servers "sysctl"-instÀllningar. LÄt mig pÄpeka nÄgot viktigt.

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 (till exempel nginx) direkt efter att grÀnssnittet Àr uppe fÄr ett felmeddelande. Att denna adress inte Àr tillgÀnglig.

För att undvika en sÄdan situation görs en sÄdan instÀllning.

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

Utan dessa IPv6-instÀllningar gÄr inte trafik frÄn OpenVPN-klienten ut i vÀrlden.

Andra instÀllningar Àr antingen inte relevanta eller sÄ kommer jag inte ihÄg vad de Àr till för.
Men för sÀkerhets skull lÄter jag det vara som det Àr.

För att Àndringar i den hÀr filen ska kunna hÀmtas utan att starta om servern mÄste du köra kommandot:

sysctl -p

Mer information om "tabell"-regler: habr.com/post/108690

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

OpenVPN IPv4 fungerar inte utan iptables.

Mina iptables Àr sÄ hÀr 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 - IPv4 openvpn-nÀtverk. IPv4-adresser för openvpn-klienter.
Det Àr viktigt att reglerna Àr konsekventa.

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 bara jag kan anvÀnda OpenVPN frÄn min statiska IP.

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

För att vidarebefordra IPv4-paket mellan OpenVPN-klienter och Internet mÄste du registrera ett av dessa kommandon.

För olika fall Àr ett av alternativen inte lÀmpligt.
BÄda kommandona Àr lÀmpliga 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 kunna hÀmtas efter omstart mÄste du spara dem 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

Installera huvudpaketet OpenVPN:

apt-get install openvpn easy-rsa

LÄt oss skapa en mall för certifikat (ersÀtt dina vÀrden):

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

LÄt oss redigera certifikatmallens instÀllningar:

mcedit vars

...
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Krasnodar"
export KEY_CITY="Dinskaya"
export KEY_ORG="Own"
export KEY_EMAIL="[email protected]"
export KEY_OU="VPN"

# X509 Subject Field
export KEY_NAME="server"
...

Skapa ett servercertifikat:

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

LÄt oss förbereda möjligheten att skapa de sista "klient-namn.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

LÄt oss förbereda ett skript som kommer att slÄ samman alla filer till en enda 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}/.crt 
    <(echo -e '</cert>n<key>') 
    ${KEY_DIR}/.key 
    <(echo -e '</key>n<tls-auth>') 
    ${KEY_DIR}/ta.key 
    <(echo -e '</tls-auth>') 
    > ${OUTPUT_DIR}/.ovpn

Skapa 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-klienter mÄste du göra följande trick:
InnehÄllet i "tls-auth"-taggen mÄste vara utan kommentarer.
Och sÀtt ocksÄ "nyckelriktning 1" omedelbart före "tls-auth"-taggen.

LĂ„t oss konfigurera OpenVPN-serverns konfiguration:

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 stÀlla in en statisk adress för varje klient (inte nödvÀndigt, men jag anvÀnder det):

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

Den svÄraste och viktigaste detaljen.

TyvÀrr vet OpenVPN Ànnu inte hur man sjÀlvstÀndigt konfigurerar en IPv6-gateway för klienter.
Du 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 komma ihÄg varför det Àr skrivet sÄ hÀr.

Nu ser nĂ€tmask = 112 konstigt ut (det borde vara 96 ​​dĂ€r).
Och prefixet Àr konstigt, det matchar inte tun0-nÀtverket.
Men okej, jag lÄter det vara som det Àr.

cipher DES-EDE3-CBC

Detta Àr inte för alla - jag valde den hÀr metoden för att kryptera anslutningen.

LÀs mer om hur du stÀller in OpenVPN IPv4.

LÀs mer om hur du stÀller in OpenVPN IPv6.

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

Installera huvudpaketet:

apt-get install postfix

NÀr du installerar, vÀlj "webbplats".

Mitt "/etc/postfix/main.cf" ser ut sÄ hÀr:

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

# appending .domain is the MUA's job.
append_dot_mydomain = no

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1

smtp_tls_security_level = may
smtp_tls_ciphers = export
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_loglevel = 1

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = domain1.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = domain1.com
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

internal_mail_filter_classes = bounce

# Storage type
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        #reject_invalid_hostname,
        #reject_unknown_recipient_domain,
        reject_unauth_destination,
        reject_rbl_client sbl.spamhaus.org,
        check_policy_service unix:private/policyd-spf

smtpd_helo_restrictions =
        #reject_invalid_helo_hostname,
        #reject_non_fqdn_helo_hostname,
        reject_unknown_helo_hostname

smtpd_client_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_helo_hostname,
        permit

# SPF
policyd-spf_time_limit = 3600

# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock

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

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 Khabrovsk-invÄnarna innehÄller detta block "felinformation och felaktiga teser."Först 8 Är efter starten 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 kryptering Àr skapandet av ett nyckelpar (tvÄ mycket lÄnga teckenstrÀngar).

En "nyckel" Àr privat, den andra nyckeln Àr "offentlig". Vi hÄller den privata nyckeln mycket noggrant hemlig. Vi delar ut den publika nyckeln till alla.

Med hjÀlp av en offentlig nyckel kan du kryptera en textstrÀng sÄ att endast Àgaren till den privata nyckeln kan dekryptera den.
Tja, det Àr hela grunden för tekniken.

Steg #1 - https-webbplatser.
NÀr du kommer Ät en webbplats lÀr webblÀsaren frÄn webbservern att webbplatsen Àr https och begÀr dÀrför en offentlig nyckel.
Webbservern ger den publika nyckeln. WebblÀsaren anvÀnder den publika nyckeln för att kryptera http-förfrÄgan och skicka den.
InnehÄllet i en http-förfrÄgan kan endast lÀsas av de som har den privata nyckeln, det vill sÀga endast servern som begÀran görs till.
Http-begÀran innehÄller minst en URI. DÀrför, om ett land försöker begrÀnsa Ätkomsten inte till hela webbplatsen, utan till en specifik sida, Àr detta omöjligt att göra för https-webbplatser.

Steg #2 - krypterat svar.
Webbservern ger ett svar som lÀtt kan lÀsas pÄ vÀgen.
Lösningen Àr extremt enkel - webblÀsaren genererar lokalt samma privata och offentliga nyckelpar för varje https-sida.
Och tillsammans med begÀran om webbplatsens publika nyckel skickar den sin lokala publika nyckel.
Webbservern kommer ihÄg det och, nÀr du skickar http-svar, krypterar det med den publika nyckeln för en specifik klient.
Nu kan http-svar bara dekrypteras av Àgaren av klientens privata webblÀsarnyckel (det vill sÀga klienten sjÀlv).

Steg nr 3 - upprÀttande av en sÀker anslutning via en offentlig kanal.
Det finns en sÄrbarhet i exempel nr 2 - ingenting hindrar vÀlvilliga frÄn att fÄnga upp en http-förfrÄgan och redigera information om den publika nyckeln.
SÄledes kommer mellanhanden tydligt att se allt innehÄll i skickade och mottagna meddelanden tills kommunikationskanalen Àndras.
Att hantera detta Àr extremt enkelt - skicka bara webblÀsarens publika nyckel som ett meddelande krypterat med webbserverns publika nyckel.
Webbservern skickar sedan först ett svar som "din offentliga nyckel Àr sÄ hÀr" och krypterar detta meddelande med samma publika nyckel.
WebblÀsaren tittar pÄ svaret - om meddelandet "din offentliga nyckel Àr sÄ hÀr" tas emot - sÄ Àr detta en 100% garanti för att denna kommunikationskanal Àr sÀker.
Hur sÀkert Àr det?
SjÀlva skapandet av en sÄdan sÀker kommunikationskanal sker med en hastighet av ping*2. Till exempel 20ms.
Angriparen mÄste ha en av parternas privata nyckel i förvÀg. Eller hitta en privat nyckel pÄ ett par millisekunder.
Att hacka en modern privat nyckel kommer att ta decennier pÄ en superdator.

Steg #4 - offentlig databas med publika nycklar.
Uppenbarligen finns det i hela den hÀr historien en möjlighet för en angripare att sitta pÄ kommunikationskanalen mellan klienten och servern.
Klienten kan lÄtsas vara servern och servern kan lÄtsas vara klienten. Och efterlikna ett par nycklar i bÄda riktningarna.
DĂ„ kommer angriparen att se all trafik och kommer att kunna "redigera" trafiken.
Ändra till exempel adressen dit du ska skicka pengar eller kopiera lösenordet frĂ„n nĂ€tbanken eller blockera "stötande" innehĂ„ll.
För att bekÀmpa sÄdana angripare kom de med en offentlig databas med publika nycklar för varje https-sajt.
Varje webblÀsare "vet" om förekomsten av cirka 200 sÄdana databaser. Detta kommer förinstallerat i alla webblÀsare.
"Kunskap" backas upp av en publik nyckel frÄn varje certifikat. Det vill sÀga att kopplingen till varje specifik certifieringsmyndighet inte kan fejkas.

Nu finns det en enkel förstÄelse för hur man anvÀnder SSL för https.
Om du anvÀnder din hjÀrna kommer det att bli tydligt hur specialtjÀnsterna kan hacka nÄgot i den hÀr strukturen. Men det kommer att kosta dem monstruösa anstrÀngningar.
Och organisationer mindre Àn NSA eller CIA - det Àr nÀstan omöjligt att hacka den befintliga skyddsnivÄn, Àven för VIP.

Jag kommer ocksÄ att lÀgga till om ssh-anslutningar. Det finns inga publika nycklar dÀr, sÄ vad kan du göra? Problemet löses pÄ tvÄ sÀtt.
Alternativ ssh-by-password:
Under den första anslutningen bör ssh-klienten varna att vi har en ny publik nyckel frÄn ssh-servern.
Och under ytterligare anslutningar, om varningen "ny offentlig nyckel frÄn ssh-servern" visas, kommer det att betyda att de försöker avlyssna dig.
Eller sÄ blev du avlyssnad pÄ din första anslutning, men nu kommunicerar du med servern utan mellanhÀnder.
PÄ grund av det faktum att avlyssning enkelt, snabbt och utan anstrÀngning avslöjas, anvÀnds denna attack endast i speciella fall för en specifik klient.

Alternativ ssh-by-key:
Vi tar en flash-enhet, skriver ner den privata nyckeln för ssh-servern pÄ den (det finns termer och mÄnga viktiga nyanser för detta, men jag skriver ett utbildningsprogram, inte instruktioner för anvÀndning).
Vi lÀmnar den publika nyckeln pÄ maskinen dÀr ssh-klienten kommer att vara och vi hÄller den ocksÄ hemlig.
Vi tar flashenheten till servern, sÀtter in den, kopierar den privata nyckeln och brÀnner flashenheten och sprider askan för vinden (eller Ätminstone formatera 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 kommer det om 10 Är att vara möjligt att se trafik pÄ en superdator - men det Àr en annan historia.

Jag ber om ursÀkt för offtopic.

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

Genom att anvÀnda "openssl genrsa" skapar vi en privat nyckel och "blanks" för den publika nyckeln.
Vi skickar "blanks" till ett tredjepartsföretag, till vilket vi betalar cirka $9 för det enklaste certifikatet.

Efter ett par timmar fÄr vi vÄr "offentliga" nyckel och en uppsÀttning med flera publika nycklar frÄn detta tredjepartsföretag.

Varför ska ett tredjepartsföretag betala för registreringen av min publika nyckel Àr en separat frÄga, vi kommer inte att övervÀga det hÀr.

Nu Àr det klart vad innebörden av inskriptionen Àr:

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

Mappen "/etc/ssl" innehÄller alla filer för ssl-problem.
domain1.com — domĂ€nnamn.
2018 Àr nyckelskapandets Är.
"nyckel" - beteckning pÄ att filen Àr en privat nyckel.

Och innebörden av denna fil:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — domĂ€nnamn.
2018 Àr nyckelskapandets Är.
kedjad - beteckning pÄ att det finns en kedja av publika nycklar (den första Àr vÄr publika nyckel och resten Àr vad som kom frÄn företaget som utfÀrdade den publika nyckeln).
crt - beteckning pÄ att det 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 inte i det hÀr fallet, utan Àr skriven som ett exempel.

Eftersom ett fel i denna parameter kommer att leda till att spam skickas frÄn din server (utan din vilja).

Bevisa sedan för alla att du inte Àr skyldig.

recipient_delimiter = +

MÄnga kanske inte vet, men detta Àr ett standardtecken för att rangordna e-postmeddelanden, och det stöds av de flesta moderna e-postservrar.

Till exempel, om du har en brevlÄda "[e-postskyddad]"försök att skicka till"[e-postskyddad]"- titta vad som kommer av det.

inet_protocols = ipv4

Detta kan vara förvirrande.

Men det Àr inte bara sÄ. Varje ny domÀn Àr som standard endast IPv4, sedan slÄr jag pÄ IPv6 för var och en separat.

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 post gÄr till dovecot.
Och reglerna för domÀn, brevlÄda, alias - titta i databasen.

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

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

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

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'

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

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

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

Nu vet postfix att det Àr möjligt att acceptera post för vidare sÀndning endast efter auktorisation med dovecot.

Jag förstÄr verkligen inte varför detta dupliceras hÀr. Vi har redan specificerat allt som behövs i "virtuell_transport".

Men postfix-systemet Àr vÀldigt gammalt - förmodligen Àr det en tillbakagÄng frÄn gamla dagar.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Detta kan konfigureras pÄ olika sÀtt för varje e-postserver.

Jag har 3 e-postservrar till mitt förfogande och dessa instÀllningar Àr vÀldigt olika pÄ grund av olika anvÀndningskrav.

Du mÄste konfigurera det noggrant - annars kommer spam att strömma in till dig, eller Ànnu vÀrre - spam kommer att strömma ut frÄn dig.

# SPF
policyd-spf_time_limit = 3600

Konfigurera för nÄgot plugin relaterat till att kontrollera SPF för inkommande brev.

# 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 Àr att vi mÄste tillhandahÄlla en DKIM-signatur med alla utgÄende e-postmeddelanden.

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

Detta Àr en nyckeldetalj i brevdirigering nÀr du skickar brev frÄn PHP-skript.

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

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

Till vÀnster finns reguljÀra uttryck. Till höger finns en etikett som markerar bokstaven.
Postfix i enlighet med etiketten - kommer att ta hÀnsyn till nÄgra fler konfigurationsrader för en specifik bokstav.

Exakt hur postfix kommer att omkonfigureras för en specifik bokstav kommer att anges i "master.cf".

Raderna 4, 5, 6 Àr de viktigaste. PÄ uppdrag av vilken domÀn vi skickar brevet sÀtter vi denna etikett.
Men "frÄn"-fÀltet anges inte alltid i PHP-skript i den gamla koden. DÄ kommer anvÀndarnamnet till undsÀttning.

Artikeln Àr redan omfattande - jag skulle inte vilja bli distraherad av att stÀlla in nginx+fpm.

Kortfattat, för varje webbplats anger vi en egen linux-anvÀndarÀgare. Och dÀrmed din fpm-pool.

Fpm-pool anvÀnder vilken version av php som helst (det Àr bra nÀr du pÄ samma server kan anvÀnda olika versioner av php och till och med olika php.ini för angrÀnsande webbplatser utan problem).

SÄ, en specifik linux-anvÀndare "www-domain2" har en webbplats domain2.com. Den hÀr sidan har en kod för att skicka e-postmeddelanden utan att ange frÄn-fÀltet.

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

Mitt "/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 tillhandahÄlls inte i sin helhet - den Àr redan mycket stor.
Jag noterade bara vad som Àndrades.

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}

Det hÀr Àr instÀllningar relaterade till spamassasin, 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 dig att ansluta till e-postservern via port 587.
För att göra detta mÄste du logga in.

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

Aktivera SPF-kontroll.

apt-get install postfix-policyd-spf-python

LÄt oss installera 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 det hÀr Àr det mest intressanta. Detta Àr möjligheten att skicka brev för en specifik domÀn frÄn en specifik IPv4/IPv6-adress.

Detta görs för rDNS skull. rDNS Àr processen att ta emot en strÀng per IP-adress.
Och för e-post anvÀnds den hÀr funktionen för att bekrÀfta att helo exakt matchar rDNS för adressen frÄn vilken e-postmeddelandet skickades.

Om helo inte stÀmmer överens med e-postdomÀnen för vilken brevet skickades tilldelas spampoÀng.

Helo matchar inte rDNS - mÄnga skrÀppostpoÀng delas ut.
Följaktligen mÄste varje domÀn ha sin egen IP-adress.
För OVH - i konsolen Àr det möjligt att ange rDNS.
För tech.ru - problemet löses genom support.
För AWS löses problemet genom support.
"inet_protocols" och "smtp_bind_address6" - vi aktiverar IPv6-stöd.
För IPv6 behöver du ocksÄ registrera rDNS.
"syslog_name" - och detta Àr för att underlÀtta lÀsning av loggar.

Köp certifikat Jag rekommenderar hÀr.

StÀller in postfix+dovecot lÀnk hÀr.

StÀlla in SPF.

============== Duvsko ==============

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

Konfigurera mysql, installera sjÀlva paketen.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Auktorisering Àr endast krypterad.

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

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

HÀr anger vi förvaringsplatsen för bokstÀverna.

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

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 den huvudsakliga dovecot-konfigurationsfilen.
HÀr inaktiverar vi osÀkra anslutningar.
Och möjliggör sÀkra 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
}

Konfigurera ssl. Vi anger att ssl krÀvs.
Och sjÀlva certifikatet. Och en viktig detalj Àr det "lokala" direktivet. Indikerar vilket SSL-certifikat som ska anvÀndas vid anslutning till vilken lokal IPv4.

Förresten, IPv6 Àr inte konfigurerat hÀr, jag kommer att korrigera detta utelÀmnande senare.
XX.XX.XX.X5 (domĂ€n2) – inget certifikat. För att ansluta klienter mĂ„ste du ange domain1.com.
XX.XX.XX.X2 (domÀn3) - det finns ett certifikat, du kan ange domain1.com eller domain3.com för att ansluta klienter.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Detta kommer att behövas för spamassassin i framtiden.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Detta Àr ett antispam-plugin. Behövs för trÀning av spamassasin vid tidpunkten för överföring till/frÄn "Spam"-mappen.

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

protocol pop3 {
}

Det finns just en sÄdan fil.

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

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

Konfigurera lmtp.

Filen "/etc/dovecot/conf.d/90-antispam.conf"

plugin {
  antispam_backend = pipe
  antispam_trash = Trash;trash
  antispam_spam = Junk;Spam;SPAM
  antispam_pipe_program_spam_arg = --spam
  antispam_pipe_program_notspam_arg = --ham
  antispam_pipe_program = /usr/bin/sa-learn
  antispam_pipe_program_args = --username=%Lu
}

Spamassasin trÀningsinstÀllningar vid tidpunkten för överföring till/frÄn skrÀppostmappen.

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

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

En fil som anger vad som ska göras med inkommande brev.

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

require ["fileinto", "mailbox"];

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

Du mÄste kompilera filen: "sievec default.sieve".

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

Ange sql-filer för auktorisering.
Och sjÀlva filen anvÀnds som auktoriseringsmetod.

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

Filen "/etc/dovecot/dovecot.conf"

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

Huvudkonfigurationsfil.
Det viktiga Àr att vi anger hÀr - lÀgg till protokoll.

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

apt-get install spamassassin spamc

LĂ„t oss installera paketen.

adduser spamd --disabled-login

LÄt oss lÀgga till en anvÀndare pÄ vars vÀgnar.

systemctl enable spamassassin.service

Vi aktiverar automatisk laddning av spamassassin-tjÀnst vid laddning.

Filen "/etc/default/spamassassin":

CRON=1

Genom att aktivera automatisk uppdatering av regler "som standard".

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

Du mÄste skapa en databas "sa" i mysql med anvÀndaren "sa" med lösenordet "lösenord" (ersÀtt med nÄgot adekvat).

report_safe - detta kommer att skicka en rapport om skrÀppost istÀllet för ett brev.
use_bayes Àr spamassassin maskininlÀrningsinstÀllningar.

De ÄterstÄende spamassassin-instÀllningarna anvÀndes tidigare i artikeln.

AllmÀn instÀllning "spamassassin".
Om att flytta nya skrÀppostmeddelanden till IMAP-mappen "Spam"..
Om en enkel kombination av Dovecot + SpamAssassin.
Jag rekommenderar att du lÀser spamassasin-inlÀrningsteorin nÀr du flyttar bokstÀver i imap-mappar (och jag rekommenderar inte att du anvÀnder den).

============= VÀdja till samhÀllet ==============

Jag skulle ocksÄ vilja slÀnga in en idé i samhÀllet om hur man kan öka sÀkerhetsnivÄn för vidarebefordrade brev. Eftersom jag Àr sÄ djupt fördjupad i Àmnet mail.

SÄ att anvÀndaren kan skapa ett par nycklar pÄ sin klient (outlook, thunderbird, browser-plugin, ...). Offentliga och privata. Public - skicka till DNS. Privat - spara pÄ klienten. E-postservrar skulle kunna anvÀnda en offentlig nyckel för att skicka till en specifik mottagare.

Och för att skydda mot spam med sÄdana brev (ja, e-postservern kommer inte att kunna se innehÄllet) - du mÄste införa tre regler:

  1. Obligatorisk riktig DKIM-signatur, obligatorisk SPF, obligatorisk rDNS.
  2. Ett neuralt nÀtverk i Àmnet antispam-trÀning + en databas för det pÄ klientsidan.
  3. Krypteringsalgoritmen mÄste vara sÄdan att den sÀndande sidan mÄste spendera 100 gÄnger mer CPU-kraft pÄ kryptering Àn den mottagande sidan.

Utöver offentliga brev, utveckla ett standardförslagsbrev "för att börja sÀker korrespondens." En av anvÀndarna (brevlÄda) skickar ett brev med en bilaga till en annan brevlÄda. Brevet innehÄller ett textförslag om att starta en sÀker kommunikationskanal för korrespondens och den offentliga nyckeln till Àgaren av brevlÄdan (med en privat nyckel pÄ klientsidan).

Du kan till och med skapa ett par nycklar specifikt för varje korrespondens. Den mottagande anvÀndaren kan acceptera detta erbjudande och skicka sin publika nyckel (Àven gjord speciellt för denna korrespondens). DÀrefter skickar den första anvÀndaren ett tjÀnstekontrollbrev (krypterat med den andra anvÀndarens publika nyckel) - vid mottagandet av vilket den andra anvÀndaren kan betrakta den bildade kommunikationskanalen som tillförlitlig. DÀrefter skickar den andra anvÀndaren ett kontrollbrev - och dÄ kan den första anvÀndaren ocksÄ betrakta den bildade kanalen som sÀker.

För att bekÀmpa avlyssning av nycklar pÄ vÀgen mÄste protokollet tillhandahÄlla möjligheten att överföra minst en offentlig nyckel med hjÀlp av en flash-enhet.

Och det viktigaste Àr att allt fungerar (frÄgan Àr "vem ska betala för det?"):
Ange postbevis som börjar pÄ $10 för 3 Är. Vilket gör att avsÀndaren kan indikera i dns att "mina publika nycklar Àr dÀr borta." Och de kommer att ge dig möjligheten att starta en sÀker anslutning. Samtidigt Àr det gratis att acceptera sÄdana anslutningar.
Gmail tjÀnar Àntligen pengar pÄ sina anvÀndare. För $10 per 3 Är - rÀtten att skapa sÀkra korrespondenskanaler.

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

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

Men livsförhÄllandena utvecklades sÄ den hÀr frÄgan drog ut pÄ tiden i 2 mÄnader.
Och sÄ, nÀr jag hade ledig tid igen, bestÀmde jag mig för att publicera artikeln som den Àr, snarare Àn att riskera att publiceringen skulle dra ut pÄ tiden ett Är till.

Om det finns ganska mÄnga frÄgor som "men det hÀr beskrivs inte tillrÀckligt detaljerat", sÄ kommer det förmodligen finnas styrka att ta en dedikerad server med en ny domÀn och ett nytt SSL-certifikat och beskriva det Ànnu mer detaljerat och, de flesta Viktigt, identifiera alla saknade viktiga detaljer.

Jag skulle ocksÄ vilja ha feedback pÄ idéer om postbevis. Om du gillar idén ska jag försöka hitta styrkan att skriva ett utkast till rfc.

NÀr du kopierar stora delar av en artikel, ange en lÀnk till den hÀr artikeln.
NÀr du översÀtter till nÄgot annat sprÄk, tillhandahÄll en lÀnk till den hÀr artikeln.
Jag ska sjÀlv försöka översÀtta den till engelska och lÀmna korsreferenser.


KĂ€lla: will.com

LĂ€gg en kommentar