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

Ovaj članak govori o tome kako postaviti moderan mail server.
Postfix + Dovecot. SPF + DKIM + rDNS. Sa IPv6.
Sa TSL enkripcijom. Uz podršku za više domena - dio sa pravim SSL certifikatom.
Sa zaštitom od neželjene pošte i visokom ocjenom zaštite od neželjene pošte sa drugih servera pošte.
Podržava više fizičkih interfejsa.
Sa OpenVPN-om, veza na koji je preko IPv4, a koji pruža IPv6.

Ako ne želite da naučite sve ove tehnologije, ali želite da postavite takav server, onda je ovaj članak za vas.

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

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

Postoje dvije motivacije za postavljanje IPv6. IT stručnjak mora stalno da uči nove tehnologije kako bi preživio. Želio bih da dam svoj skroman doprinos borbi protiv cenzure.

Motivacija za postavljanje OpenVPN-a je samo da IPv6 radi na lokalnoj mašini.
Motivacija za postavljanje nekoliko fizičkih interfejsa je što na svom serveru imam jedan interfejs „sporo ali neograničen“ i drugi „brz ali sa tarifom“.

Motivacija za postavljanje Bind postavki je to što moj ISP pruža nestabilan DNS server, a google također ponekad ne uspije. Želim stabilan DNS server za ličnu upotrebu.

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

Ne postoji univerzalno rješenje za mail server. Ali pokušaću da napišem nešto poput „uradite ovo i onda, kada sve funkcioniše kako treba, bacite dodatne stvari“.

Kompanija tech.ru ima Colocation server. Moguće je porediti sa OVH, Hetzner, AWS. Da bi se riješio ovaj problem, saradnja sa tech.ru će biti mnogo efikasnija.

Debian 9 je instaliran na serveru.

Server ima 2 interfejsa `eno1` i `eno2`. Prvi je neograničen, a drugi brz.

Postoje 3 statične IP adrese, XX.XX.XX.X0 i XX.XX.XX.X1 i XX.XX.XX.X2 na `eno1` interfejsu i XX.XX.XX.X5 na `eno2` interfejsu .

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

Postoje 3 domene `domain1.com`, `domain2.com`, `domain3.com`. Postoji SSL certifikat za `domain1.com` i `domain3.com`.

Imam Google nalog sa kojim bih želeo da povežem svoje poštansko sanduče[email zaštićen]` (primanje pošte i slanje pošte direktno iz gmail interfejsa).
Mora postojati poštansko sanduče`[email zaštićen]`, kopija e-pošte koju želim vidjeti u svom gmailu. I rijetko se može poslati nešto u ime `[email zaštićen]` putem web sučelja.

Mora postojati poštansko sanduče`[email zaštićen]`, koji će Ivanov koristiti sa svog iPhone-a.

Poslane e-poruke moraju biti u skladu sa svim modernim zahtjevima za zaštitu od neželjene pošte.
U javnim mrežama mora postojati najviši nivo enkripcije.
Trebalo bi postojati IPv6 podrška i za slanje i za primanje pisama.
Trebao bi postojati SpamAssassin koji nikada neće izbrisati mejlove. I to će ili odskočiti, preskočiti ili poslati u IMAP folder “Spam”.
SpamAssassin automatsko učenje mora biti konfigurirano: ako premjestim pismo u mapu Spam, ono će naučiti iz ovoga; ako premjestim pismo iz mape Spam, naučit će iz ovoga. Rezultati obuke za SpamAssassin bi trebali utjecati na to da li će pismo završiti u mapi Spam.
PHP skripte moraju biti u mogućnosti da šalju poštu u ime bilo kojeg domena na datom serveru.
Trebao bi postojati openvpn servis, s mogućnošću korištenja IPv6 na klijentu koji nema IPv6.

Prvo morate da konfigurišete interfejse i rutiranje, uključujući IPv6.
Zatim ćete morati da konfigurišete OpenVPN, koji će se povezati preko IPv4 i obezbediti klijentu statički realnu IPv6 adresu. Ovaj klijent će imati pristup svim IPv6 uslugama na serveru i pristup svim IPv6 resursima na Internetu.
Zatim ć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.

============= Multi-interfejsi ==============

Da biste konfigurisali interfejse, ovo morate 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

Ova podešavanja se mogu primeniti na bilo kom serveru na tech.ru (uz malo koordinacije sa 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 (spora, ali neograničena).
eno2 je naziv mrežne kartice #2 (brza, ali sa tarifom).
tun0 je naziv virtuelne 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 gateway.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 za cijeli server.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 za eno2, sve ostalo spolja ide u eno1.
XXXX:XXXX:XXXX:XXXX::1 — IPv6 gateway (vrijedi napomenuti da se ovo može/treba uraditi drugačije. Navedite IPv6 prekidač).
dns-nameservers - 127.0.0.1 je naznačen (jer je bind instaliran lokalno) i 213.248.1.6 (ovo je sa tech.ru).

“tabela eno1t” i “tabela eno2t” - značenje ovih pravila rute je da bi saobraćaj koji ulazi kroz eno1 -> izlazio kroz njega, a saobraćaj koji ulazi kroz eno2 -> bi izlazio kroz njega. Takođe, veze koje je pokrenuo server bi prolazile kroz eno1.

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

Ovom komandom specificiramo da se svaki nerazumljiv promet koji potpada pod bilo koje pravilo označeno sa “table eno1t” -> šalje na eno1 interfejs.

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

Ovom naredbom specificiramo da svaki promet koji inicira server treba biti usmjeren na eno1 sučelje.

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

Ovom komandom postavljamo pravila za označavanje saobraćaja.

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 od OpenVPN klijenata do lokalnog IPv4 osim XX.XX.XX.X0.
Još uvijek ne razumijem zašto je ova komanda 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 sam interfejs. Server će je koristiti kao „odlaznu“ adresu. Neće se više koristiti ni na koji način.

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

Na temu gateway-a - tako to funkcionira i to je u redu. Ali ispravan način je da se ovdje naznači IPv6 prekidača na koji je server povezan.

Međutim, iz nekog razloga IPv6 prestaje raditi ako to učinim. Ovo je vjerovatno 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 interfejsu. Ako vam treba sto adresa, to znači stotinu redova 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 interfejsa da bi bilo jasno.
eno1 - mora biti "/64" - jer je ovo cijeli naš skup adresa.
tun0 - podmreža mora biti veća od eno1. U suprotnom, neće biti moguće konfigurirati IPv6 gateway za OpenVPN klijente.
eno2 - podmreža mora biti veća od tun0. U suprotnom, 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 napraviti č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 lokacijama ili uslugama na eno1 interfejsu.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY su adrese koje bi trebale biti dodijeljene određenim lokacijama ili uslugama na eno2 interfejsu.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY su adrese koje treba dodijeliti OpenVPN klijentima ili koristiti kao adrese OpenVPN servisa.

Da biste konfigurisali mrežu, trebalo bi da postoji mogućnost ponovnog pokretanja servera.
IPv4 promjene se preuzimaju kada se izvrše (obavezno je umotajte u ekran - inače će ova komanda jednostavno srušiti mrežu na serveru):

/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 tabele u datoteci “/etc/network/interfaces”.
Brojevi moraju biti jedinstveni i manji od 65535.

IPv6 promjene se mogu 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 ...

Postavljanje "/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 servera. Dozvolite 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

Svako ko pokuša da poveže IPv6 (na primer nginx) odmah nakon što se interfejs pokrene, dobiće grešku. Da ova adresa nije dostupna.

Da bi se izbjegla takva situacija, vrši se takva postavka.

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

Bez ovih IPv6 postavki, promet sa OpenVPN klijenta ne odlazi u svijet.

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

Da bi se promjene u ovoj datoteci pokupile bez ponovnog pokretanja servera, potrebno je pokrenuti naredbu:

sysctl -p

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

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

OpenVPN IPv4 ne radi bez iptables.

Moji iptables su ovako 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 lokalne mašine.
10.8.0.0/24 - IPv4 openvpn mreža. IPv4 adrese za openvpn klijente.
Važna je dosljednost pravila.

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 svoje statičke IP adrese.

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 što sam pročitao dokumentaciju, izabrao sam prvu opciju jer koristi manje CPU-a.

Da bi se sve postavke iptablesa pokupile nakon ponovnog pokretanja, morate ih negdje sačuvati.

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

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

apt-get install iptables-persistent

Instaliranje glavnog OpenVPN paketa:

apt-get install openvpn easy-rsa

Postavimo šablon 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"
...

Kreirajte certifikat servera:

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

Hajde da pripremimo mogućnost kreiranja 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

Hajde da pripremimo skriptu koja će spojiti sve fajlove 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

Kreiranje prvog OpenVPN klijenta:

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

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

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

Konfigurirajmo konfiguraciju OpenVPN servera:

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 za postavljanje statičke adrese za svakog klijenta (nije neophodno, 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.
Ovo morate "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"

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

Fajl “/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/varijable”:

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

Teško mi je da se setim zašto je ovako napisano.

Sada netmask = 112 izgleda čudno (trebalo bi biti 96 upravo tamo).
I prefiks je čudan, ne odgovara mreži tun0.
Ali u redu, ostaviću to kako jeste.

cipher DES-EDE3-CBC

Ovo nije za svakoga - izabrao sam ovaj način šifriranja veze.

Saznajte više o postavljanju OpenVPN IPv4.

Saznajte više o postavljanju OpenVPN IPv6.

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

Instalacija glavnog paketa:

apt-get install postfix

Prilikom instaliranja odaberite "internet stranica".

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 riječima stanovnika Khabrovska, ovaj blok sadrži "dezinformacije i netačne teze".Samo 8 godina nakon početka moje karijere počeo sam shvaćati kako SSL funkcionira.

Stoga ću uzeti slobodu da opišem kako se koristi SSL (bez odgovora na pitanja “Kako funkcionira?” i “Zašto funkcionira?”).

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

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

Koristeći javni ključ, 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 web lokacije.
Prilikom pristupa web stranici, pretraživač od web servera saznaje da je stranica https i stoga zahtijeva javni ključ.
Web server daje javni ključ. Pregledač koristi javni ključ da šifrira http-zahtjev i pošalje ga.
Sadržaj http-zahtjeva mogu čitati samo oni koji imaju privatni ključ, odnosno samo server kojem je zahtjev upućen.
Http-zahtjev sadrži barem URI. Stoga, ako država pokušava ograničiti pristup ne cijeloj web-lokaciji, već određenoj stranici, to je nemoguće učiniti za https stranice.

Korak #2 - šifrirani odgovor.
Web server daje odgovor koji se lako može pročitati na putu.
Rješenje je krajnje jednostavno - pretraživač lokalno generiše isti par privatnih i javnih ključeva za svaku https lokaciju.
I zajedno sa zahtjevom za javnim ključem stranice, šalje svoj lokalni javni ključ.
Web server ga pamti i, kada šalje http-odgovor, šifrira ga javnim ključem određenog klijenta.
Sada http-odgovor može dešifrirati samo vlasnik privatnog ključa klijentovog pretraživača (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 dok se ne promijeni kanal komunikacije.
Riješiti se s tim je krajnje jednostavno - samo pošaljite javni ključ preglednika kao poruku šifriranu javnim ključem web servera.
Web server tada prvo šalje odgovor poput "vaš javni ključ je ovakav" i šifrira ovu poruku istim javnim ključem.
Preglednik gleda na odgovor - ako je primljena poruka "vaš javni ključ je ovakav" - onda je to 100% garancija da je ovaj komunikacijski kanal siguran.
Koliko je sigurno?
Samo stvaranje takvog sigurnog komunikacijskog kanala odvija se brzinom pinga*2. Na primjer 20ms.
Napadač mora unaprijed imati privatni ključ jedne od strana. Ili pronađite privatni ključ za nekoliko milisekundi.
Hakovanje jednog modernog privatnog ključa će trajati decenijama na superkompjuteru.

Korak #4 - javna baza podataka javnih ključeva.
Očigledno, u cijeloj ovoj priči postoji prilika da napadač sjedi na komunikacijskom kanalu između klijenta i servera.
Klijent se može pretvarati da je server, a server 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 "urediti".
Na primjer, promijenite adresu na koju se šalje novac ili kopirajte lozinku iz internet bankarstva ili blokirajte "neprihvatljiv" sadržaj.
Za borbu protiv takvih napadača, osmislili su javnu bazu podataka s javnim ključevima za svaku https stranicu.
Svaki pretraživač “zna” za postojanje oko 200 takvih baza podataka. Ovo dolazi unapred instalirano u svakom pretraživaču.
“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 koristite svoj mozak, postaće jasno kako specijalne službe mogu hakirati nešto u ovoj strukturi. Ali to će ih koštati monstruoznih napora.
A organizacije manje od NSA ili CIA - gotovo je nemoguće hakirati postojeći nivo zaštite, čak i za VIP osobe.

Dodaću i o ssh konekcijama. Tamo nema javnih ključeva, pa šta možete učiniti? Problem se rješava na dva načina.
Opcija ssh-by-password:
Prilikom prvog povezivanja, ssh klijent bi trebao upozoriti da imamo novi javni ključ sa ssh servera.
A prilikom daljih povezivanja, ako se pojavi upozorenje “novi javni ključ sa ssh servera”, to će značiti da vas pokušavaju prisluškivati.
Ili ste prisluškivali vašu prvu vezu, ali sada komunicirate sa serverom 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č:
Uzimamo fleš disk, na njega upisujemo privatni ključ za ssh server (za to postoje uslovi i puno važnih nijansi, ali ja pišem obrazovni program, a ne uputstva za upotrebu).
Ostavljamo javni ključ na mašini na kojoj će biti ssh klijent i takođe ga čuvamo u tajnosti.
Donosimo fleš disk na server, ubacujemo ga, kopiramo privatni ključ i spaljujemo fleš disk i razbacujemo pepeo u vetar (ili ga barem formatiramo nulama).
To je sve - nakon takve operacije bit će nemoguće hakirati takvu ssh vezu. Naravno, za 10 godina će biti moguće vidjeti promet na superkompjuteru - ali to je druga priča.

Izvinjavam se na offtopicu.

Dakle, sada kada je teorija poznata. Reći ću vam o toku kreiranja SSL sertifikata.

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

Nakon nekoliko sati dobijamo naš “javni” ključ i set od nekoliko javnih ključeva od ove treće strane.

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

Sada je jasno šta znači natpis:

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

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

I značenje ovog fajla:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — naziv domene.
2018. godina je godina stvaranja ključeva.
chained - oznaka da postoji lanac javnih ključeva (prvi je naš javni ključ, a ostali su ono što je došlo od kompanije koja je izdala javni ključ).
crt - oznaka da postoji gotov certifikat (javni ključ sa 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 u ovom slučaju ne koristi, već je napisana kao primjer.

Jer greška u ovom parametru će dovesti do slanja neželjene pošte sa vašeg servera (bez vaše volje).

Onda dokažite svima da niste krivi.

recipient_delimiter = +

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

Na primjer, ako imate poštansko sanduče "[email zaštićen]"pokušaj poslati na "[email zaštićen]“- pogledajte šta je od toga.

inet_protocols = ipv4

Ovo bi moglo biti zbunjujuće.

Ali nije samo tako. Svaka nova domena je po defaultu samo IPv4, onda 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 specificiramo da sva dolazna pošta ide u dovecot.
A pravila za domen, poštansko sanduče, alias - pogledajte u bazi podataka.

/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

Sada postfix zna da se pošta može prihvatiti za dalje slanje samo nakon autorizacije sa dovecot-om.

Zaista ne razumijem zašto se ovo ovdje duplira. Već smo naveli sve što je potrebno u “virtual_transport”.

Ali postfix sistem je veoma star - vjerovatno je povratak iz starih dana.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Ovo se može drugačije konfigurisati za svaki server pošte.

Na raspolaganju imam 3 mail servera i ove postavke su vrlo različite zbog različitih zahtjeva za korištenje.

Morate ga pažljivo konfigurirati - inače će spam sipati u vas, ili još gore - spam će izliti iz vas.

# SPF
policyd-spf_time_limit = 3600

Postavljanje nekog dodatka koji se odnosi na provjeru SPF-a dolaznih slova.

# 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 obezbijediti DKIM potpis uz sve odlazne e-poruke.

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

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

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

Na lijevoj strani su regularni izrazi. Sa desne strane je etiketa koja označava slovo.
Postfix u skladu s oznakom - uzet će u obzir još nekoliko konfiguracijskih linija za određeno slovo.

Kako će tačno postfiks biti rekonfigurisan za određeno slovo bić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 uvek 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 ometaju postavljanjem nginx+fpm.

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

Fpm-pool koristi bilo koju verziju php-a (odlično je kada na istom serveru 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 kod za slanje e-pošte bez navođenja polja od.

Dakle, čak i u ovom slučaju, pisma će biti poslata ispravno i nikada neće završiti u neželjenoj pošti.

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

Fajl nije dostavljen u cijelosti - već je jako velik.
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 vezane za 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

Dozvoljavamo vam da se povežete na mail server preko 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ćite SPF provjeru.

apt-get install postfix-policyd-spf-python

Instalirajmo gore navedeni 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 najzanimljivija stvar. Ovo je mogućnost slanja pisama za određeni domen sa određene IPv4/IPv6 adrese.

Ovo se radi radi rDNS-a. rDNS je proces primanja niza po IP adresi.
A za poštu, ova funkcija se koristi za potvrdu da helo tačno odgovara rDNS-u adrese sa koje je e-poruka poslana.

Ako se helo ne podudara s domenom e-pošte u ime koje je pismo poslano, dodjeljuju se spam bodovi.

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

Kupite sertifikate Preporučujem ovdje.

Postavljanje postfix+dovecot linka ovdje.

Postavljanje SPF.

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

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

Postavljanje mysql-a, instaliranje samih paketa.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Autorizacija je samo šifrirana.

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

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

Ovdje označavamo lokaciju za skladištenje slova.

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

Fajl "/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 golubarnika.
Ovdje onemogućavamo nesigurne veze.
I omogućite sigurne veze.

Fajl "/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. Naznačavamo da je ssl potreban.
I sam sertifikat. A važan detalj je „lokalna“ direktiva. Označava koji SSL certifikat koristiti pri povezivanju na koji lokalni IPv4.

Inače, IPv6 ovdje nije konfiguriran, kasnije ću ispraviti ovaj propust.
XX.XX.XX.X5 (domen2) - nema certifikata. Za povezivanje klijenata potrebno je navesti domen1.com.
XX.XX.XX.X2 (domain3) - postoji certifikat, možete odrediti domain1.com ili domain3.com za povezivanje klijenata.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

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

Fajl "/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 foldera “Spam”.

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

protocol pop3 {
}

Postoji upravo takav fajl.

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

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

Postavljanje lmtp-a.

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

Postavke obuke za Spamassasin u trenutku prijenosa u/iz foldera Spam.

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

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

Fajl koji specificira šta da se radi sa dolaznim slovima.

Fajl "/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”.

Fajl "/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 metod autorizacije.

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

Fajl "/etc/dovecot/dovecot.conf"

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

Glavna konfiguraciona datoteka.
Bitno je da ovdje naznačimo - dodaj protokole.

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

apt-get install spamassassin spamc

Hajde da instaliramo pakete.

adduser spamd --disabled-login

Dodajmo korisnika u čije ime.

systemctl enable spamassassin.service

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

Fajl "/etc/default/spamassassin":

CRON=1

Omogućavanjem automatskog ažuriranja pravila „podrazumevano“.

Fajl “/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 sa korisnikom “sa” sa lozinkom “password” (zamijenite nečim adekvatnim).

report_safe - ovo će poslati izvještaj o neželjenoj e-pošti umjesto pisma.
use_bayes su postavke mašinskog učenja spamassasina.

Preostale postavke spamassasina korištene su ranije u članku.

Opća postavka "spamassassin".
O premeštanju novih neželjenih e-poruka u IMAP folder „Neželjena pošta“..
O jednostavnoj kombinaciji Dovecot + SpamAssassin.
Preporučujem da pročitate teoriju učenja spamassasina kada premještate slova u mape imap (i ne preporučujem da je koristite).

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

Također bih želio u zajednicu baciti ideju o tome kako povećati nivo sigurnosti proslijeđenih pisama. Pošto sam tako 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 na DNS. Privatno - uštedite na klijentu. Mail serveri bi mogli koristiti javni ključ za slanje određenom primaocu.

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

  1. Obavezno pravi DKIM potpis, obavezan SPF, obavezan rDNS.
  2. Neuronska mreža na temu obuke antispam + baza podataka za nju 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.

Osim javnih pisama, izradite standardno pismo prijedloga „za početak bezbedne korespondencije“. Jedan od korisnika (poštansko sanduče) šalje pismo sa prilogom u drugo poštansko sanduče. Pismo sadrži tekstualni prijedlog za pokretanje sigurnog komunikacijskog kanala za prepisku i javni ključ vlasnika poštanskog sandučeta (sa privatnim ključem na strani klijenta).

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

Za borbu protiv presretanja ključeva na cesti, protokol mora predvidjeti mogućnost prijenosa barem jednog javnog ključa pomoću fleš diska.

I najvažnije je da sve funkcioniše (pitanje je "ko će to platiti?"):
Unesite poštanske potvrde počevši od 10 USD za 3 godine. Što će omogućiti pošiljaocu da naznači u dns-u da su "moji javni ključevi tamo." I oni će vam dati priliku da pokrenete sigurnu vezu. Istovremeno, prihvatanje takvih veza je besplatno.
gmail konačno unovčava svoje korisnike. Za 10 dolara na 3 godine - pravo na kreiranje sigurnih kanala za korespondenciju.

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

Da bih testirao cijeli članak, namjeravao sam iznajmiti namjenski server 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, kada sam opet imao slobodnog vremena, odlučio sam objaviti članak kakav jeste, umjesto da rizikujem da se objavljivanje oduži još godinu dana.

Ako ima dosta pitanja poput "ali ovo nije dovoljno detaljno opisano", onda će vjerovatno biti snage uzeti namjenski server s novom domenom i novim SSL certifikatom i opisati ga još detaljnije i, većina što je najvažnije, identificirati sve važne detalje koji nedostaju.

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

Kada kopirate velike dijelove članka, navedite vezu do ovog članka.
Kada prevodite na bilo koji drugi jezik, navedite vezu do ovog članka.
Pokušat ću sam to prevesti na engleski i ostaviti unakrsne reference.


izvor: www.habr.com

Dodajte komentar