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

Ovaj članak govori o tome kako postaviti moderan poslužitelj pošte.
Postfix + Dovecot. SPF + DKIM + rDNS. S IPv6.
S TSL enkripcijom. S podrškom za više domena - dio s pravim SSL certifikatom.
S antispam zaštitom i visokom antispam ocjenom drugih poslužitelja e-pošte.
Podržava više fizičkih sučelja.
S OpenVPN-om, veza s kojim je putem IPv4, a koji pruža IPv6.

Ako ne želite naučiti sve te tehnologije, ali želite postaviti takav poslužitelj, onda je ovaj članak za vas.

Članak ne pokušava objasniti svaki detalj. Objašnjenje se odnosi na ono što nije standardno konfigurirano ili je važno sa stajališta potrošača.

Motivacija za postavljanje mail servera bila je moj dugogodišnji san. Ovo možda zvuči glupo, ali IMHO, puno je bolje nego sanjati o novom automobilu vaše omiljene marke.

Dva su motiva za postavljanje IPv6. Informatičar mora stalno učiti nove tehnologije kako bi preživio. Želio bih dati svoj skromni doprinos borbi protiv cenzure.

Motivacija za postavljanje OpenVPN-a je samo da IPv6 radi na lokalnom računalu.
Motivacija za postavljanje nekoliko fizičkih sučelja je što na svom poslužitelju imam jedno sučelje “sporo ali neograničeno” i drugo “brzo ali s tarifom”.

Motivacija za postavljanje Bind postavki je to što moj ISP pruža nestabilan DNS poslužitelj, a google također ponekad zakaže. Želim stabilan DNS poslužitelj za osobnu upotrebu.

Motivacija za pisanje članka - Nacrt sam napisao prije 10 mjeseci i već sam ga dva puta pogledao. Čak i ako je autoru redovito potrebna, velika je vjerojatnost da će trebati i drugima.

Ne postoji univerzalno rješenje za poslužitelj e-pošte. Ali pokušat ću napisati nešto poput "napravi ovo i onda, kada sve bude radilo kako treba, izbaci dodatne stvari."

Tvrtka tech.ru ima Colocation server. Moguće je usporediti s OVH, Hetzner, AWS. Da biste riješili ovaj problem, suradnja s tech.ru bit će mnogo učinkovitija.

Debian 9 je instaliran na poslužitelju.

Poslužitelj ima 2 sučelja `eno1` i `eno2`. Prvi je neograničen, a drugi je brz.

Postoje 3 statičke IP adrese, XX.XX.XX.X0 i XX.XX.XX.X1 i XX.XX.XX.X2 na sučelju `eno1` i XX.XX.XX.X5 na sučelju `eno2` .

Dostupno XXXX:XXXX:XXXX:XXXX ::/64 skup IPv6 adresa koje su dodijeljene sučelju `eno1` i iz njega je XXXX:XXXX:XXXX:XXXX:1:2::/96 dodijeljeno `eno2` na moj zahtjev.

Postoje 3 domene `domena1.com`, `domena2.com`, `domena3.com`. Postoji SSL certifikat za `domain1.com` i `domain3.com`.

Imam Google račun s kojim želim povezati svoj poštanski sandučić[e-pošta zaštićena]` (primanje pošte i slanje pošte izravno s gmail sučelja).
Mora postojati poštanski sandučić`[e-pošta zaštićena]`, kopiju e-pošte koju želim vidjeti na svom gmailu. I rijetko se može poslati nešto u ime `[e-pošta zaštićena]` putem web sučelja.

Mora postojati poštanski sandučić`[e-pošta zaštićena]`, koji će Ivanov koristiti sa svog iPhonea.

Poslane e-poruke moraju biti u skladu sa svim modernim zahtjevima za zaštitu od spama.
U javnim mrežama mora postojati najviša razina enkripcije.
Trebala bi postojati podrška za IPv6 i za slanje i za primanje pisama.
Trebao bi postojati SpamAssassin koji nikada neće brisati e-poštu. I to će ili odskočiti ili preskočiti ili poslati u IMAP mapu "Spam".
SpamAssassin automatsko učenje mora biti konfigurirano: ako premjestim pismo u mapu Spam, ono će učiti iz ovoga; ako premjestim pismo iz mape Spam, ono će učiti iz ovoga. Rezultati obuke SpamAssassin trebali bi utjecati na to hoće li pismo završiti u mapi Spam.
PHP skripte moraju moći slati poštu u ime bilo koje domene na određenom poslužitelju.
Trebala bi postojati openvpn usluga, s mogućnošću korištenja IPv6 na klijentu koji nema IPv6.

Najprije trebate konfigurirati sučelja i usmjeravanje, uključujući IPv6.
Zatim ćete morati konfigurirati OpenVPN, koji će se povezati putem IPv4 i pružiti klijentu statičku-pravu IPv6 adresu. Ovaj će klijent imati pristup svim IPv6 uslugama na poslužitelju i pristup svim IPv6 resursima na Internetu.
Tada ćete morati konfigurirati Postfix za slanje pisama + SPF + DKIM + rDNS i druge slične sitnice.
Zatim ćete morati konfigurirati Dovecot i konfigurirati Multidomain.
Tada ćete morati konfigurirati SpamAssassin i konfigurirati obuku.
Na kraju instalirajte Bind.

============= Više sučelja =============

Da biste konfigurirali sučelja, morate ovo napisati u “/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

Ove se postavke mogu primijeniti na bilo kojem poslužitelju na tech.ru (uz malu koordinaciju s podrškom) i odmah će raditi kako treba.

Ako imate iskustva s postavljanjem sličnih stvari za Hetzner, OVH, tamo je drugačije. Teže.

eno1 je naziv mrežne kartice #1 (spore ali neograničene).
eno2 je naziv mrežne kartice #2 (brza, ali s tarifom).
tun0 je naziv virtualne mrežne kartice iz OpenVPN-a.
XX.XX.XX.X0 - IPv4 #1 na eno1.
XX.XX.XX.X1 - IPv4 #2 na eno1.
XX.XX.XX.X2 - IPv4 #3 na eno1.
XX.XX.XX.X5 - IPv4 #1 na eno2.
XX.XX.XX.1 - IPv4 pristupnik.
XXXX:XXXX:XXXX:XXXX ::/64 - IPv6 za cijeli poslužitelj.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 za eno2, sve ostalo izvana ide u eno1.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 gateway (vrijedi napomenuti da se ovo može/treba učiniti drugačije. Navedite IPv6 prekidač).
dns-nameservers - naznačeno je 127.0.0.1 (jer je bind instaliran lokalno) i 213.248.1.6 (ovo je s tech.ru).

“tablica eno1t” i “tablica eno2t” - značenje ovih pravila rute je da bi promet koji ulazi kroz eno1 -> izlazio kroz nju, a promet koji ulazi kroz eno2 -> izlazio bi kroz nju. Također bi veze koje pokreće poslužitelj išle kroz eno1.

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

Ovom naredbom određujemo da se svaki nerazumljivi promet koji potpada pod bilo koje pravilo označeno kao “tablica eno1t” -> šalje na sučelje eno1.

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

Ovom naredbom određujemo da svaki promet koji pokrene poslužitelj treba biti usmjeren na sučelje eno1.

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

Ovom naredbom postavljamo pravila za označavanje prometa.

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

Ovaj blok specificira drugi IPv4 za eno1 sučelje.

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

Ovom naredbom postavljamo rutu s OpenVPN klijenata na lokalni IPv4 osim XX.XX.XX.X0.
Još uvijek ne razumijem zašto je ova naredba dovoljna za sve IPv4.

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

Ovdje postavljamo adresu za samo sučelje. Poslužitelj će je koristiti kao "odlaznu" adresu. Neće se više koristiti ni na koji način.

Zašto je ":1:1::" tako komplicirano? Tako da OpenVPN radi ispravno i samo za ovo. Više o ovome kasnije.

Na temu pristupnika - tako to funkcionira i to je u redu. Ali ispravan način je da ovdje navedete IPv6 preklopnika na koji je poslužitelj spojen.

Međutim, iz nekog razloga IPv6 prestaje raditi ako to učinim. Ovo je vjerojatno neka vrsta tech.ru problema.

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

Ovo je dodavanje IPv6 adrese sučelju. Ako trebate stotinu adresa, to znači stotinu redaka u ovoj datoteci.

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

Zabilježio sam adrese i podmreže svih sučelja kako bi bilo jasnije.
eno1 - mora biti "/64" - jer ovo je cijeli naš skup adresa.
tun0 - podmreža mora biti veća od eno1. U suprotnom, neće biti moguće konfigurirati IPv6 pristupnik za OpenVPN klijente.
eno2 - podmreža mora biti veća od tun0. U protivnom OpenVPN klijenti neće moći pristupiti lokalnim IPv6 adresama.
Radi jasnoće, odabrao sam korak podmreže od 16, ali ako želite, možete učiniti čak i korak "1".
Prema tome, 64+16 = 80, a 80+16 = 96.

Za još veću jasnoću:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY su adrese koje bi trebale biti dodijeljene određenim stranicama ili uslugama na eno1 sučelju.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY su adrese koje bi trebale biti dodijeljene određenim stranicama ili uslugama na eno2 sučelju.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY su adrese koje bi se trebale dodijeliti OpenVPN klijentima ili koristiti kao adrese OpenVPN usluga.

Da biste konfigurirali mrežu, trebalo bi biti moguće ponovno pokrenuti poslužitelj.
Promjene IPv4 preuzimaju se kada se izvrše (svakako ih umotajte u zaslon - inače će ova naredba jednostavno srušiti mrežu na poslužitelju):

/etc/init.d/networking restart

Dodajte na kraj datoteke “/etc/iproute2/rt_tables”:

100 eno1t
101 eno2t

Bez toga ne možete koristiti prilagođene tablice u datoteci “/etc/network/interfaces”.
Brojevi moraju biti jedinstveni i manji od 65535.

IPv6 promjene mogu se lako promijeniti bez ponovnog pokretanja, ali da biste to učinili morate naučiti najmanje tri naredbe:

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

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

Ovo su "sysctl" postavke mog poslužitelja. Dopustite mi da istaknem nešto važno.

net.ipv4.ip_forward = 1

Bez toga OpenVPN uopće neće raditi.

net.ipv6.ip_nonlocal_bind = 1

Svatko tko pokuša vezati IPv6 (na primjer nginx) odmah nakon što se sučelje pokrene, dobit će pogrešku. Da ova adresa nije dostupna.

Da bi se izbjegla takva situacija, napravljena je takva postavka.

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

Bez ovih IPv6 postavki, promet s OpenVPN klijenta ne izlazi u svijet.

Druge postavke ili nisu relevantne ili se ne sjećam čemu služe.
Ali za svaki slučaj, ostavljam "kako jest".

Kako bi se promjene ove datoteke pokupile bez ponovnog pokretanja poslužitelja, morate pokrenuti naredbu:

sysctl -p

Više detalja o pravilima "stola": habr.com/post/108690

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

OpenVPN IPv4 ne radi bez iptables.

Moje iptables su ovakve za 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 je moja statička IPv4 adresa lokalnog stroja.
10.8.0.0/24 - IPv4 openvpn mreža. IPv4 adrese za openvpn klijente.
Dosljednost pravila je važna.

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

Ovo je ograničenje tako da samo ja mogu koristiti OpenVPN sa svog statičkog IP-a.

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

Za prosljeđivanje IPv4 paketa između OpenVPN klijenata i interneta, trebate registrirati jednu od ovih naredbi.

Za različite slučajeve jedna od opcija nije prikladna.
Obje naredbe su prikladne za moj slučaj.
Nakon čitanja dokumentacije, odabrao sam prvu opciju jer koristi manje procesora.

Kako bi se sve postavke iptablesa preuzele nakon ponovnog pokretanja, morate ih negdje spremiti.

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

Takva imena nisu odabrana slučajno. Koristi ih paket "iptables-persistent".

apt-get install iptables-persistent

Instaliranje glavnog OpenVPN paketa:

apt-get install openvpn easy-rsa

Postavimo predložak za certifikate (zamijenite svoje vrijednosti):

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

Uredimo postavke predloška certifikata:

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

Izradite certifikat poslužitelja:

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

Pripremimo mogućnost stvaranja konačnih datoteka “client-name.opvn”:

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

Pripremimo skriptu koja će spojiti sve datoteke u jednu opvn datoteku.

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

Stvaranje prvog OpenVPN klijenta:

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

Datoteka “~/client-configs/files/client-name.ovpn” šalje se na uređaj klijenta.

Za iOS klijente morat ćete napraviti sljedeći trik:
Sadržaj oznake "tls-auth" mora biti bez komentara.
Također stavite "key-direction 1" neposredno prije oznake "tl-auth".

Konfigurirajmo konfiguraciju OpenVPN poslužitelja:

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

Ovo je potrebno kako bi se postavila statička adresa za svakog klijenta (nije potrebno, ali ja je koristim):

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

Najteži i ključni detalj.

Nažalost, OpenVPN još ne zna kako samostalno konfigurirati IPv6 gateway za klijente.
Morate to "ručno" proslijediti za svakog klijenta.

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

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

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

Obje skripte koriste datoteku “/etc/openvpn/variables”:

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

Teško se sjetiti zašto je ovdje tako napisano.

Sada mrežna maska ​​= 112 izgleda čudno (trebalo bi biti 96 upravo tamo).
A prefiks je čudan, ne odgovara mreži tun0.
Ali dobro, ostavit ću kako jest.

cipher DES-EDE3-CBC

Ovo nije za svakoga - odabrao sam ovu metodu šifriranja veze.

Saznajte više o postavljanju OpenVPN IPv4.

Saznajte više o postavljanju OpenVPN IPv6.

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

Instaliranje glavnog paketa:

apt-get install postfix

Prilikom instalacije odaberite “internetsku stranicu”.

Moj "/etc/postfix/main.cf" izgleda ovako:

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

Pogledajmo detalje ove konfiguracije.

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

Prema stanovnicima Habrovska, ovaj blok sadrži "dezinformacije i netočne teze".Tek 8 godina nakon početka moje karijere počeo sam shvaćati kako SSL funkcionira.

Stoga ću si uzeti slobodu opisati kako koristiti SSL (bez odgovora na pitanja "Kako radi?" i "Zašto radi?").

Osnova moderne enkripcije je stvaranje para ključeva (dva vrlo duga niza znakova).

Jedan "ključ" je privatni, drugi ključ je "javni". Privatni ključ čuvamo u vrlo pažljivoj tajnosti. Svima dijelimo javni ključ.

Pomoću javnog ključa možete šifrirati niz teksta tako da ga samo vlasnik privatnog ključa može dešifrirati.
Pa, to je cijela osnova tehnologije.

Korak #1 - https stranice.
Prilikom pristupa web-mjestu, preglednik saznaje od web-poslužitelja da je web-mjesto https i stoga zahtijeva javni ključ.
Web poslužitelj daje javni ključ. Preglednik koristi javni ključ za šifriranje http-zahtjeva i njegovo slanje.
Sadržaj http-zahtjeva mogu čitati samo oni koji imaju privatni ključ, odnosno samo poslužitelj kojem je zahtjev poslan.
Http-zahtjev sadrži najmanje URI. Stoga, ako država pokušava ograničiti pristup ne cijeloj stranici, već određenoj stranici, to je nemoguće učiniti za https stranice.

Korak #2 - šifrirani odgovor.
Web poslužitelj daje odgovor koji se lako može pročitati na cesti.
Rješenje je krajnje jednostavno - preglednik lokalno generira isti par privatnih i javnih ključeva za svaku https stranicu.
I zajedno sa zahtjevom za javnim ključem stranice, šalje svoj lokalni javni ključ.
Web poslužitelj ga pamti i prilikom slanja http-odgovora šifrira ga javnim ključem određenog klijenta.
Sada http-odgovor može dešifrirati samo vlasnik privatnog ključa preglednika klijenta (to jest, sam klijent).

Korak br. 3 - uspostavljanje sigurne veze putem javnog kanala.
Postoji ranjivost u primjeru br. 2 - ništa ne sprječava dobronamjernike da presretnu http-zahtjev i uređuju informacije o javnom ključu.
Tako će posrednik jasno vidjeti sav sadržaj poslanih i primljenih poruka sve dok se ne promijeni komunikacijski kanal.
Rješavanje ovoga je krajnje jednostavno - samo pošaljite javni ključ preglednika kao poruku šifriranu javnim ključem web poslužitelja.
Web poslužitelj tada prvo šalje odgovor poput "vaš javni ključ je ovakav" i šifrira tu poruku istim javnim ključem.
Preglednik gleda odgovor - ako se primi poruka "vaš javni ključ je ovakav" - to je 100% jamstvo da je ovaj komunikacijski kanal siguran.
Koliko je sigurno?
Samo stvaranje takvog sigurnog komunikacijskog kanala događa se brzinom od ping*2. Na primjer 20ms.
Napadač mora unaprijed imati privatni ključ jedne od strana. Ili pronađite privatni ključ u nekoliko milisekundi.
Hakiranje jednog modernog privatnog ključa trajat će desetljećima na superračunalu.

Korak #4 - javna baza javnih ključeva.
Očito u cijeloj ovoj priči postoji prilika da napadač sjedne na komunikacijski kanal između klijenta i servera.
Klijent se može pretvarati da je poslužitelj, a poslužitelj se može pretvarati da je klijent. I oponašajte par ključeva u oba smjera.
Tada će napadač vidjeti sav promet i moći će ga "uređivati".
Na primjer, promijenite adresu na koju šaljete novac ili kopirajte lozinku iz internetskog bankarstva ili blokirajte “neprijatan” sadržaj.
Za borbu protiv takvih napadača osmislili su javnu bazu podataka s javnim ključevima za svaku https stranicu.
Svaki preglednik “zna” za postojanje oko 200 takvih baza podataka. Ovo je unaprijed instalirano u svakom pregledniku.
“Znanje” je podržano javnim ključem iz svakog certifikata. Odnosno, veza sa svakim određenim certifikacijskim tijelom ne može se lažirati.

Sada postoji jednostavno razumijevanje kako koristiti SSL za https.
Ako upotrijebite svoj mozak, postat će vam jasno kako specijalne službe mogu hakirati nešto u ovoj strukturi. Ali to će ih stajati monstruoznih napora.
A organizacije manje od NSA ili CIA - gotovo je nemoguće hakirati postojeću razinu zaštite, čak i za VIP osobe.

Također ću dodati o ssh vezama. Tamo nema javnih ključeva, pa što možete učiniti? Problem se rješava na dva načina.
Opcija ssh-by-password:
Prilikom prve veze, ssh klijent bi trebao upozoriti da imamo novi javni ključ od ssh poslužitelja.
A tijekom daljnjih povezivanja, ako se pojavi upozorenje “novi javni ključ sa ssh servera”, to će značiti da vas pokušavaju prisluškivati.
Ili su vas prisluškivali na prvoj vezi, ali sada komunicirate s poslužiteljem bez posrednika.
Naime, zbog činjenice da se činjenica prisluškivanja lako, brzo i bez napora otkriva, ovaj napad se koristi samo u posebnim slučajevima za određenog klijenta.

Opcija ssh-po-ključu:
Uzimamo flash pogon, na njega pišemo privatni ključ za ssh poslužitelj (za to postoje uvjeti i puno važnih nijansi, ali pišem obrazovni program, a ne upute za korištenje).
Ostavljamo javni ključ na stroju gdje će biti ssh klijent i također ga držimo tajnim.
Donesemo flash disk na server, ubacimo ga, kopiramo privatni ključ, a flash pogon spalimo i raznesemo pepeo u vjetar (ili ga barem formatiramo s nulama).
To je sve - nakon takve operacije bit će nemoguće hakirati takvu ssh vezu. Naravno, za 10 godina bit će moguće vidjeti promet na superračunalu - ali to je druga priča.

Ispričavam se na offtopicu.

Sada kada je teorija poznata. Reći ću vam o tijeku stvaranja SSL certifikata.

Koristeći “openssl genrsa” stvaramo privatni ključ i “praznine” za javni ključ.
Šaljemo "praznine" tvrtki treće strane, kojoj plaćamo otprilike 9 USD za najjednostavniji certifikat.

Nakon nekoliko sati dobivamo naš "javni" ključ i set od nekoliko javnih ključeva od ove treće strane.

Zašto bi treća tvrtka trebala platiti registraciju mog javnog ključa je zasebno pitanje, nećemo ga ovdje razmatrati.

Sada je jasno koje je značenje natpisa:

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

Mapa “/etc/ssl” sadrži sve datoteke za probleme s ssl-om.
domain1.com — naziv domene.
2018. je godina stvaranja ključeva.
“ključ” - oznaka da je datoteka privatni ključ.

A značenje ove datoteke:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — naziv domene.
2018. je godina stvaranja ključeva.
lančano - oznaka da postoji lanac javnih ključeva (prvi je naš javni ključ, a ostali su oni koji su došli od tvrtke koja je izdala javni ključ).
crt - oznaka da postoji gotov certifikat (javni ključ s tehničkim objašnjenjima).

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

Ova postavka se ne koristi u ovom slučaju, ali je napisana kao primjer.

Budući da će pogreška u ovom parametru dovesti do slanja neželjene pošte s vašeg poslužitelja (bez vaše volje).

Onda dokaži svima da nisi kriv.

recipient_delimiter = +

Mnogi ljudi možda ne znaju, ali ovo je standardni znak za rangiranje e-pošte, a podržava ga većina modernih poslužitelja e-pošte.

Na primjer, ako imate poštanski sandučić "[e-pošta zaštićena]"pokušaj poslati na"[e-pošta zaštićena]"- vidi što dolazi od toga.

inet_protocols = ipv4

Ovo bi moglo biti zbunjujuće.

Ali nije samo tako. Svaka nova domena je standardno samo IPv4, zatim uključujem IPv6 za svaku posebno.

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

Ovdje navodimo da sva dolazna pošta ide u dovecot.
A pravila za domenu, poštanski sandučić, alias - pogledajte u bazi.

/etc/postfix/mysql-virtualni-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-virtualni-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

Sada postfix zna da se pošta može prihvatiti za daljnje slanje samo nakon autorizacije dovecotom.

Stvarno mi nije jasno zašto se ovo ovdje duplira. Već smo naveli sve što je potrebno u “virtual_transport”.

Ali postfiks sustav je vrlo star - vjerojatno je to povratak iz starih vremena.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Ovo se može drugačije konfigurirati za svaki poslužitelj e-pošte.

Na raspolaganju imam 3 poslužitelja e-pošte i ove su postavke vrlo različite zbog različitih zahtjeva korištenja.

Morate ga pažljivo konfigurirati - inače će spam stizati do vas, ili još gore - spam će se sipati od vas.

# SPF
policyd-spf_time_limit = 3600

Postavljanje za neki dodatak koji se odnosi na provjeru SPF-a dolaznih pisama.

# 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

Postavka je da moramo osigurati DKIM potpis sa svim odlaznim e-porukama.

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

Ovo je ključni detalj u usmjeravanju pisama prilikom slanja pisama iz PHP skripti.

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

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

S lijeve strane su regularni izrazi. Desno je oznaka koja označava slovo.
Postfix u skladu s oznakom - uzet će u obzir još nekoliko konfiguracijskih redaka za određeno slovo.

Kako će se točno postfiks rekonfigurirati za određeno slovo bit će naznačeno u “master.cf”.

Linije 4, 5, 6 su glavne. U ime koje domene šaljemo pismo stavljamo ovu oznaku.
Ali polje "od" nije uvijek naznačeno u PHP skriptama u starom kodu. Tada korisničko ime dolazi u pomoć.

Članak je već opširan - ne bih želio da me ometa postavljanje nginx+fpm.

Ukratko, za svaku stranicu postavljamo vlastitog vlasnika linux korisnika. I sukladno tome vaš fpm-pool.

Fpm-pool koristi bilo koju verziju php-a (sjajno je kada na istom poslužitelju možete bez problema koristiti različite verzije php-a, pa čak i različite php.ini za susjedne stranice).

Dakle, određeni linux korisnik “www-domain2” ima web stranicu domain2.com. Ova stranica ima kôd za slanje e-pošte bez navođenja polja pošiljatelja.

Dakle, čak iu ovom slučaju, pisma će biti poslana ispravno i nikada neće završiti u spamu.

Moj "/etc/postfix/master.cf" izgleda ovako:

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

Datoteka nije isporučena u cijelosti - već je vrlo velika.
Zabilježio sam samo ono što je promijenjeno.

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}

Ovo su postavke koje se odnose na spamassasin, više o tome kasnije.

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

Omogućujemo vam povezivanje s poslužiteljem e-pošte putem porta 587.
Da biste to učinili, morate se prijaviti.

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

Omogući SPF provjeru.

apt-get install postfix-policyd-spf-python

Instalirajmo gornji paket za SPF provjere.

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

A ovo je najzanimljivije. Ovo je mogućnost slanja pisama za određenu domenu s određene IPv4/IPv6 adrese.

Ovo se radi radi rDNS-a. rDNS je proces primanja niza putem IP adrese.
A za poštu, ova se značajka koristi za potvrdu da helo točno odgovara rDNS-u adrese s koje je poslana e-pošta.

Ako helo ne odgovara domeni e-pošte u ime koje je pismo poslano, dodjeljuju se bodovi neželjene pošte.

Helo ne odgovara rDNS-u - dodjeljuje se mnogo spam bodova.
Sukladno tome, svaka domena mora imati svoju IP adresu.
Za OVH - u konzoli je moguće navesti rDNS.
Za tech.ru - problem je riješen putem podrške.
Za AWS problem se rješava putem podrške.
“inet_protocols” i “smtp_bind_address6” - omogućujemo IPv6 podršku.
Za IPv6 također morate registrirati rDNS.
“syslog_name” - a ovo je za lakše čitanje zapisa.

Kupite certifikate Preporučam ovdje.

Postavljanje veze postfix+dovecot ovdje.

Postavljanje SPF-a.

============= Golubnjak =============

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

Postavljanje mysql-a, instaliranje samih paketa.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorizacija je samo šifrirana.

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

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

Ovdje označavamo mjesto pohrane slova.

Želim da budu pohranjeni u datotekama i grupirani po domeni.

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

Ovo je glavna konfiguracijska datoteka dovecota.
Ovdje onemogućujemo nezaštićene veze.
I omogućite sigurne veze.

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

Postavljanje ssl-a. Naznačujemo da je ssl potreban.
I sam certifikat. I važan detalj je "lokalna" direktiva. Označava koji SSL certifikat koristiti pri povezivanju na koji lokalni IPv4.

Usput, IPv6 nije konfiguriran ovdje, kasnije ću ispraviti ovaj propust.
XX.XX.XX.X5 (domena2) - nema certifikata. Za povezivanje klijenata morate navesti domain1.com.
XX.XX.XX.X2 (domain3) - postoji certifikat, možete navesti domain1.com ili domain3.com za povezivanje klijenata.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Ovo će biti potrebno za spamassassin u budućnosti.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Ovo je antispam dodatak. Potrebno za obuku spamassasina u trenutku prijenosa u/iz mape “Spam”.

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

protocol pop3 {
}

Postoji upravo takva datoteka.

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

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

Postavljanje lmtp-a.

Datoteka "/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 postavke obuke u trenutku prijenosa u/iz mape Spam.

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

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

Datoteka koja određuje što učiniti s dolaznim pismima.

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

require ["fileinto", "mailbox"];

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

Morate kompajlirati datoteku: “sievec default.sieve”.

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

Određivanje sql datoteka za autorizaciju.
I sama datoteka se koristi kao metoda autorizacije.

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

Ovo odgovara sličnim postavkama za postfix.

Datoteka "/etc/dovecot/dovecot.conf"

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

Glavna konfiguracijska datoteka.
Važno je da ovdje naznačimo - dodajte protokole.

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

apt-get install spamassassin spamc

Instalirajmo pakete.

adduser spamd --disabled-login

Dodajmo korisnika u čije ime.

systemctl enable spamassassin.service

Omogućujemo automatsko učitavanje usluge spamassassin nakon učitavanja.

Datoteka "/etc/default/spamassassin":

CRON=1

Omogućavanjem automatskog ažuriranja pravila “po defaultu”.

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

Morate kreirati bazu podataka “sa” u mysql-u s korisnikom “sa” uz lozinku “password” (zamijenite s nečim odgovarajućim).

report_safe - ovo će poslati izvješće o neželjenoj e-pošti umjesto pisma.
use_bayes su spamassassin postavke strojnog učenja.

Preostale postavke za spamassassin korištene su ranije u članku.

Opća postavka "spamassassin".
O premještanju nove neželjene e-pošte u IMAP mapu “Spam”..
O jednostavnoj kombinaciji Dovecot + SpamAssassin.
Preporučam da pročitate teoriju učenja spamassasin kada premještate slova u imap mapama (i ne preporučujem da je koristite).

============= Apel zajednici =============

Također bih želio dati ideju zajednici o tome kako povećati razinu sigurnosti proslijeđenih pisama. Budući da sam duboko uronjen u temu pošte.

Tako da korisnik može kreirati par ključeva na svom klijentu (outlook, thunderbird, browser-plugin, ...). Javno i privatno. Javno - pošalji DNS-u. Privatno - uštedite na klijentu. Poslužitelji pošte mogli bi koristiti javni ključ za slanje određenom primatelju.

A za zaštitu od neželjene pošte s takvim pismima (da, poslužitelj pošte neće moći vidjeti sadržaj) - morat ćete uvesti 3 pravila:

  1. Obavezan pravi DKIM potpis, obavezan SPF, obavezan rDNS.
  2. Neuronska mreža na temu antispam obuke + baza podataka za to na strani klijenta.
  3. Algoritam šifriranja mora biti takav da strana koja šalje mora potrošiti 100 puta više CPU snage na enkripciju od strane koja prima.

Uz javna pisma, izradite standardno pismo prijedloga "kako biste započeli sigurno dopisivanje". Jedan od korisnika (pretinac) šalje pismo s privitkom u drugi poštanski sandučić. Pismo sadrži tekstualni prijedlog za pokretanje sigurnog komunikacijskog kanala za korespondenciju i javni ključ vlasnika poštanskog sandučića (s privatnim ključem na strani klijenta).

Možete čak napraviti nekoliko ključeva posebno za svako dopisivanje. Korisnik primatelj može prihvatiti ovu ponudu i poslati svoj javni ključ (također izrađen posebno za ovu korespondenciju). Zatim prvi korisnik šalje servisno kontrolno pismo (kriptirano javnim ključem drugog korisnika) - po čijem primitku drugi korisnik formirani komunikacijski kanal može smatrati pouzdanim. Zatim, drugi korisnik šalje kontrolno pismo - i tada prvi korisnik također može formirani kanal smatrati sigurnim.

Za borbu protiv presretanja ključeva na cesti, protokol mora osigurati mogućnost prijenosa barem jednog javnog ključa pomoću flash pogona.

I što je najvažnije, sve to radi (pitanje je tko će to platiti?):
Unesite poštanske potvrde počevši od 10 USD za 3 godine. Što će omogućiti pošiljatelju da navede u DNS-u da su "moji javni ključevi tamo." I oni će vam dati priliku da uspostavite sigurnu vezu. U isto vrijeme, prihvaćanje takvih veza je besplatno.
gmail konačno unovčava svoje korisnike. Za 10 dolara za 3 godine - pravo na stvaranje sigurnih kanala za dopisivanje.

============= Zaključak ==============

Da testiram cijeli članak, namjeravao sam unajmiti namjenski poslužitelj na mjesec dana i kupiti domenu sa SSL certifikatom.

Ali životne okolnosti su se razvile tako da se ovo pitanje oteglo 2 mjeseca.
I tako, kad sam opet imao slobodnog vremena, odlučio sam objaviti članak takav kakav jest, a ne riskirati da se objavljivanje oteže još koju godinu.

Ako ima dosta pitanja poput "ali ovo nije dovoljno detaljno opisano", tada će vjerojatno biti snage uzeti namjenski poslužitelj s novom domenom i novim SSL certifikatom i opisati ga još detaljnije i, većina najvažnije, identificirajte sve važne detalje koji nedostaju.

Također bih želio dobiti povratne informacije o idejama o poštanskim potvrdama. Ako vam se sviđa ideja, pokušat ću smoći snage da napišem nacrt za rfc.

Kada kopirate velike dijelove članka, navedite poveznicu na ovaj članak.
Prilikom prijevoda na bilo koji drugi jezik navedite poveznicu na ovaj članak.
Pokušat ću ga sam prevesti na engleski i ostaviti unakrsne reference.


Izvor: www.habr.com

Dodajte komentar