Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + monikäyttöliittymät + SpamAssassin-learn + Bind

Tämä artikkeli käsittelee nykyaikaisen sähköpostipalvelimen määrittämistä.
Postfix + Dovecot. SPF + DKIM + rDNS. IPv6:lla.
TSL-salauksella. Tuki useille verkkotunnuksille - osaksi oikea SSL-sertifikaatti.
Roskapostisuojauksella ja korkealla muiden sähköpostipalvelimien roskapostin estoarvolla.
Tukee useita fyysisiä liitäntöjä.
OpenVPN:llä, johon yhteys on IPv4:n kautta ja joka tarjoaa IPv6:n.

Jos et halua oppia kaikkia näitä tekniikoita, mutta haluat perustaa tällaisen palvelimen, tämä artikkeli on sinua varten.

Artikkeli ei yritä selittää jokaista yksityiskohtaa. Selitys koskee sitä, mikä ei ole konfiguroitu vakioksi tai on kuluttajan kannalta tärkeää.

Motivaatio sähköpostipalvelimen perustamiseen on ollut pitkäaikainen haaveeni. Tämä saattaa kuulostaa tyhmältä, mutta IMHO, se on paljon parempi kuin haaveilla uudesta autosta suosikkimerkiltäsi.

IPv6:n käyttöönottoon on kaksi syytä. IT-asiantuntijan on opittava jatkuvasti uusia teknologioita selviytyäkseen. Haluaisin antaa vaatimattoman panokseni sensuurin torjuntaan.

Motivaatio OpenVPN:n käyttöönotolle on vain saada IPv6 toimimaan paikallisella koneella.
Motiivi useiden fyysisten liitäntöjen luomiseen on se, että palvelimellani on yksi rajapinta "hidas mutta rajoittamaton" ja toinen "nopea mutta tariffi".

Motiivi Bind-asetusten määrittämiseen on se, että Internet-palveluntarjoajani tarjoaa epävakaan DNS-palvelimen, ja myös google epäonnistuu joskus. Haluan vakaan DNS-palvelimen henkilökohtaiseen käyttöön.

Motivaatio artikkelin kirjoittamiseen - Kirjoitin luonnoksen 10 kuukautta sitten, ja olen katsonut sitä jo kahdesti. Vaikka kirjoittaja tarvitsee sitä säännöllisesti, on suuri todennäköisyys, että myös muut tarvitsevat sitä.

Postipalvelimelle ei ole universaalia ratkaisua. Mutta yritän kirjoittaa jotain kuten "tee tämä ja sitten, kun kaikki toimii niin kuin pitää, heitä ylimääräiset tavarat pois."

Yrityksellä tech.ru on Colocation-palvelin. Voidaan verrata OVH:n, Hetznerin, AWS:n kanssa. Tämän ongelman ratkaisemiseksi yhteistyö tech.ru:n kanssa on paljon tehokkaampaa.

Debian 9 on asennettu palvelimelle.

Palvelimessa on 2 liitäntää "eno1" ja "eno2". Ensimmäinen on rajoittamaton, ja toinen on vastaavasti nopea.

On kolme staattista IP-osoitetta, XX.XX.XX.X3 ja XX.XX.XX.X0 ja XX.XX.XX.X1 "eno2"-liitännässä ja XX.XX.XX.X1 "eno5"-liitännässä .

Saatavilla XXXX:XXXX:XXXX:XXXX::/64 joukko IPv6-osoitteita, jotka on määritetty eno1-rajapinnalle ja siitä XXXX:XXXX:XXXX:XXXX:1:2::/96 määritettiin pyynnöstäni eno2:lle.

On 3 verkkotunnusta `domain1.com`, `domain2.com`, `domain3.com`. Verkkotunnukselle `domain1.com` ja `domain3.com` on SSL-varmenne.

Minulla on Google-tili, johon haluaisin linkittää postilaatikkoni[sähköposti suojattu]` (postin vastaanottaminen ja lähettäminen suoraan gmailin käyttöliittymästä).
Siellä täytyy olla postilaatikko[sähköposti suojattu]`, kopio sähköpostista, jonka haluan nähdä Gmailissani. Ja on harvinaista, että pystymme lähettämään jotain henkilön ` puolesta[sähköposti suojattu]` verkkokäyttöliittymän kautta.

Siellä täytyy olla postilaatikko[sähköposti suojattu]`, jota Ivanov käyttää iPhonellaan.

Lähetettyjen sähköpostien on täytettävä kaikki nykyaikaiset roskapostin estovaatimukset.
Julkisissa verkoissa on oltava korkein salaustaso.
IPv6-tuki pitäisi olla sekä kirjeiden lähettämiseen että vastaanottamiseen.
Pitäisi olla SpamAssassin, joka ei koskaan poista sähköposteja. Ja se joko hyppää tai ohittaa tai lähettää IMAP-roskapostikansioon.
SpamAssassinin automaattinen oppiminen on määritettävä: jos siirrän kirjeen Roskaposti-kansioon, se oppii tästä; jos siirrän kirjeen roskapostikansiosta, se oppii tästä. SpamAssassin-koulutuksen tulosten pitäisi vaikuttaa siihen, päätyykö kirje roskapostikansioon.
PHP-skriptien on voitava lähettää sähköpostia minkä tahansa tietyn palvelimen verkkotunnuksen puolesta.
Siellä pitäisi olla openvpn-palvelu, joka voi käyttää IPv6:ta asiakaskoneessa, jossa ei ole IPv6:ta.

Ensin sinun on määritettävä liitännät ja reititys, mukaan lukien IPv6.
Sitten sinun on määritettävä OpenVPN, joka muodostaa yhteyden IPv4:n kautta ja antaa asiakkaalle staattisen todellisen IPv6-osoitteen. Tällä asiakkaalla on pääsy kaikkiin palvelimen IPv6-palveluihin ja kaikkiin Internetin IPv6-resursseihin.
Sitten sinun on määritettävä Postfix lähettämään kirjeitä + SPF + DKIM + rDNS ja muita vastaavia pieniä asioita.
Sitten sinun on määritettävä Dovecot ja määritettävä Multidomain.
Sitten sinun on määritettävä SpamAssassin ja määritettävä koulutus.
Asenna lopuksi Bind.

============= Monikäyttöliittymät ==============

Liitäntöjen konfigurointia varten sinun on kirjoitettava tämä kohtaan "/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

Näitä asetuksia voidaan käyttää millä tahansa tech.ru:n palvelimella (pienellä koordinaatiolla tuen kanssa), ja se toimii heti kuten pitää.

Jos sinulla on kokemusta vastaavien asioiden asettamisesta Hetznerille, OVH:lle, se on erilaista siellä. Vaikeampaa.

eno1 on verkkokortin #1 nimi (hidas mutta rajoittamaton).
eno2 on verkkokortin #2 nimi (nopea, mutta maksullinen).
tun0 on OpenVPN:n virtuaalisen verkkokortin nimi.
XX.XX.XX.X0 – IPv4 #1 eno1:ssä.
XX.XX.XX.X1 – IPv4 #2 eno1:ssä.
XX.XX.XX.X2 – IPv4 #3 eno1:ssä.
XX.XX.XX.X5 – IPv4 #1 eno2:ssä.
XX.XX.XX.1 – IPv4-yhdyskäytävä.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 koko palvelimelle.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 eno2:lle, kaikki muu ulkopuolelta menee eno1:een.
XXXX:XXXX:XXXX:XXXX::1 — IPv6-yhdyskäytävä (huomaa, että tämä voidaan/pitäisi tehdä toisin. Määritä IPv6-kytkin).
dns-nameservers - 127.0.0.1 on ilmoitettu (koska bind on asennettu paikallisesti) ja 213.248.1.6 (tämä on osoitteesta tech.ru).

"taulukko eno1t" ja "taulukko eno2t" - näiden reittisääntöjen tarkoitus on, että eno1 -> kautta saapuva liikenne lähtisi sen kautta ja eno2 -> lähtee sen kautta. Ja myös palvelimen aloittamat yhteydet kulkisivat eno1:n kautta.

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

Tällä komennolla määritämme, että kaikki käsittämätön liikenne, joka kuuluu minkä tahansa "taulukko eno1t" -> merkityn säännön alle, lähetetään eno1-rajapintaan.

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

Tällä komennolla määritämme, että kaikki palvelimen käynnistämä liikenne tulee ohjata eno1-rajapintaan.

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

Tällä komennolla asetamme säännöt liikenteen merkitsemiseen.

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

Tämä lohko määrittää toisen IPv4:n eno1-rajapinnalle.

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

Tällä komennolla asetamme reitin OpenVPN-asiakkailta paikalliseen IPv4:ään paitsi XX.XX.XX.X0.
En vieläkään ymmärrä, miksi tämä komento riittää kaikille IPv4: lle.

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

Tässä asetamme osoitteen itse käyttöliittymälle. Palvelin käyttää sitä "lähtevänä" osoitteena. Ei käytetä enää millään tavalla.

Miksi ":1:1::" on niin monimutkainen? Jotta OpenVPN toimii oikein ja vain tätä varten. Tästä lisää myöhemmin.

Aiheesta yhdyskäytävä - näin se toimii ja se on hyvä. Mutta oikea tapa on ilmoittaa tässä kytkimen IPv6, johon palvelin on kytketty.

Jostain syystä IPv6 kuitenkin lakkaa toimimasta, jos teen tämän. Tämä on luultavasti jonkinlainen tech.ru-ongelma.

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

Tämä lisää IPv6-osoitteen käyttöliittymään. Jos tarvitset sata osoitetta, se tarkoittaa sataa riviä tässä tiedostossa.

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

Huomasin kaikkien liitäntöjen osoitteet ja aliverkot sen selventämiseksi.
eno1 - täytyy olla "/64" - koska tämä on koko osoitevalikoimamme.
tun0 - aliverkon on oltava suurempi kuin eno1. Muuten ei ole mahdollista määrittää IPv6-yhdyskäytävää OpenVPN-asiakkaille.
eno2 - aliverkon on oltava suurempi kuin tun0. Muuten OpenVPN-asiakkaat eivät voi käyttää paikallisia IPv6-osoitteita.
Selvyyden vuoksi valitsin aliverkkoaskeleen 16, mutta voit halutessasi tehdä jopa "1"-askeleen.
Vastaavasti 64+16 = 80 ja 80+16 = 96.

Vielä selvemmäksi:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY ovat osoitteita, jotka tulee määrittää tietyille sivustoille tai palveluille eno1-rajapinnassa.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY ovat osoitteita, jotka tulee määrittää tietyille sivustoille tai palveluille eno2-rajapinnassa.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY ovat osoitteita, jotka tulee määrittää OpenVPN-asiakkaille tai käyttää OpenVPN-palveluosoitteina.

Verkon konfigurointia varten palvelin pitäisi voida käynnistää uudelleen.
IPv4-muutokset poimitaan suoritettaessa (muista kääriä se näyttöön - muuten tämä komento yksinkertaisesti kaataa palvelimen verkon):

/etc/init.d/networking restart

Lisää tiedoston loppuun "/etc/iproute2/rt_tables":

100 eno1t
101 eno2t

Ilman tätä et voi käyttää mukautettuja taulukoita /etc/network/interfaces-tiedostossa.
Numeroiden on oltava yksilöllisiä ja pienempiä kuin 65535.

IPv6-muutokset voidaan muuttaa helposti ilman uudelleenkäynnistystä, mutta tehdäksesi tämän sinun on opeteltava vähintään kolme komentoa:

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

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

Nämä ovat palvelimeni "sysctl"-asetukset. Haluan huomauttaa eräästä tärkeästä asiasta.

net.ipv4.ip_forward = 1

Ilman tätä OpenVPN ei toimi ollenkaan.

net.ipv6.ip_nonlocal_bind = 1

Jokainen, joka yrittää sitoa IPv6:n (esimerkiksi nginx) heti käyttöliittymän valmistuttua, saa virheilmoituksen. Että tämä osoite ei ole saatavilla.

Tällaisen tilanteen välttämiseksi tehdään tällainen asetus.

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

Ilman näitä IPv6-asetuksia OpenVPN-asiakkaasta tuleva liikenne ei mene maailmalle.

Muut asetukset eivät joko ole merkityksellisiä tai en muista, mitä varten ne ovat.
Mutta varmuuden vuoksi jätän sen "ennalleen".

Jotta tähän tiedostoon tehdyt muutokset voidaan ottaa vastaan ​​käynnistämättä palvelinta uudelleen, sinun on suoritettava komento:

sysctl -p

Lisätietoja "taulukon" säännöistä: habr.com/post/108690

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

OpenVPN IPv4 ei toimi ilman iptablesia.

Omat iptableni ovat seuraavat VPN:lle:

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 on paikallisen koneen staattinen IPv4-osoitteeni.
10.8.0.0/24 - IPv4 openvpn-verkko. IPv4-osoitteet openvpn-asiakkaille.
Sääntöjen johdonmukaisuus on tärkeää.

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

Tämä on rajoitus, joten vain minä voin käyttää OpenVPN:ää staattiselta IP-osoitteeltani.

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

Jos haluat välittää IPv4-paketteja OpenVPN-asiakkaiden ja Internetin välillä, sinun on rekisteröitävä jokin näistä komennoista.

Eri tapauksiin yksi vaihtoehdoista ei sovellu.
Molemmat komennot sopivat minun tapaukseeni.
Dokumentaation luettuani valitsin ensimmäisen vaihtoehdon, koska se käyttää vähemmän prosessoria.

Jotta kaikki iptables-asetukset voidaan ottaa käyttöön uudelleenkäynnistyksen jälkeen, sinun on tallennettava ne jonnekin.

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

Tällaisia ​​nimiä ei valittu sattumalta. Niitä käyttää "iptables-persistent" -paketti.

apt-get install iptables-persistent

OpenVPN-pääpaketin asentaminen:

apt-get install openvpn easy-rsa

Luodaan malli varmenteille (korvaa arvosi):

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

Muokataan varmennemallin asetuksia:

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

Luo palvelinvarmenne:

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

Valmistellaan kyky luoda lopulliset “client-name.opvn”-tiedostot:

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

Valmistetaan komentosarja, joka yhdistää kaikki tiedostot yhdeksi opvn-tiedostoksi.

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

Ensimmäisen OpenVPN-asiakkaan luominen:

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

Tiedosto “~/client-configs/files/client-name.ovpn” lähetetään asiakkaan laitteeseen.

iOS-asiakkaille sinun on tehtävä seuraava temppu:
"tls-auth" -tunnisteen sisällön tulee olla ilman kommentteja.
Ja laita myös "key-direction 1" välittömästi ennen "tls-auth" -tunnistetta.

Määritetään OpenVPN-palvelimen asetukset:

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

Tätä tarvitaan staattisen osoitteen asettamiseksi jokaiselle asiakkaalle (ei välttämätöntä, mutta käytän sitä):

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

Vaikein ja tärkein yksityiskohta.

Valitettavasti OpenVPN ei vielä osaa määrittää itsenäisesti IPv6-yhdyskäytävää asiakkaille.
Sinun on lähetettävä tämä "manuaalisesti" jokaiselle asiakkaalle.

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

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

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

Molemmat skriptit käyttävät tiedostoa "/etc/openvpn/variables":

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

Minun on vaikea muistaa, miksi se on kirjoitettu näin.

Nyt verkkomaski = 112 näyttää oudolta (sen pitäisi olla 96 siellä).
Ja etuliite on outo, se ei vastaa tun0-verkkoa.
Mutta okei, jätän sen ennalleen.

cipher DES-EDE3-CBC

Tämä ei ole kaikille - valitsin tämän menetelmän yhteyden salaamiseen.

Lue lisää OpenVPN IPv4:n määrittämisestä.

Lue lisää OpenVPN IPv6:n määrittämisestä.

============= Jälkikorjaus ==============

Pääpaketin asentaminen:

apt-get install postfix

Kun asennat, valitse "Internet-sivusto".

"/etc/postfix/main.cf" näyttää tältä:

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

Katsotaanpa tämän konfiguraation yksityiskohtia.

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

Habrovskin asukkaiden mukaan tämä lohko sisältää "väärätietoa ja vääriä teesejä".Vain 8 vuotta urani alkamisen jälkeen aloin ymmärtää, miten SSL toimii.

Siksi otan vapauden kuvailla SSL:n käyttöä (vastaamatta kysymyksiin "Miten se toimii?" ja "Miksi se toimii?").

Nykyaikaisen salauksen perusta on avainparin (kaksi erittäin pitkää merkkijonoa) luominen.

Yksi "avain" on yksityinen, toinen avain on "julkinen". Pidämme yksityisen avaimen erittäin huolellisesti salassa. Jaamme julkisen avaimen kaikille.

Julkisella avaimella voit salata tekstijonon niin, että vain yksityisen avaimen omistaja voi purkaa sen salauksen.
No, se on koko tekniikan perusta.

Vaihe 1 – https-sivustot.
Sivustoa käytettäessä selain oppii verkkopalvelimelta, että sivusto on https ja pyytää siksi julkista avainta.
Web-palvelin antaa julkisen avaimen. Selain käyttää julkista avainta http-pyynnön salaamiseen ja lähettämiseen.
http-pyynnön sisällön voivat lukea vain ne, joilla on yksityinen avain, eli vain palvelin, jolle pyyntö on tehty.
Http-pyyntö sisältää vähintään URI:n. Siksi, jos maa yrittää rajoittaa pääsyä ei koko sivustoon, vaan tietylle sivulle, tämä on mahdotonta tehdä https-sivustoille.

Vaihe 2 - salattu vastaus.
Web-palvelin tarjoaa vastauksen, joka on helposti luettavissa tien päällä.
Ratkaisu on erittäin yksinkertainen - selain luo paikallisesti saman yksityisen ja julkisen avainparin jokaiselle https-sivustolle.
Ja yhdessä sivuston julkisen avaimen pyynnön kanssa se lähettää paikallisen julkisen avaimensa.
Web-palvelin muistaa sen ja lähettää http-vastauksen salaa sen tietyn asiakkaan julkisella avaimella.
Nyt http-vastauksen salauksen voi purkaa vain asiakkaan selaimen yksityisen avaimen omistaja (eli asiakas itse).

Vaihe nro 3 - suojatun yhteyden muodostaminen julkisen kanavan kautta.
Esimerkissä nro 2 on haavoittuvuus - mikään ei estä hyväntahtoisia sieppaamasta http-pyyntöä ja muokkaamasta julkisen avaimen tietoja.
Siten välittäjä näkee selvästi lähetettyjen ja vastaanotettujen viestien sisällön, kunnes viestintäkanava vaihtuu.
Tämän käsitteleminen on äärimmäisen yksinkertaista - lähetä vain selaimen julkinen avain viestinä, joka on salattu verkkopalvelimen julkisella avaimella.
Tämän jälkeen verkkopalvelin lähettää ensin vastauksen, kuten "julkinen avaimesi on tällainen" ja salaa tämän viestin samalla julkisella avaimella.
Selain tarkastelee vastausta - jos viesti "julkinen avaimesi on tällainen" vastaanotetaan - tämä on 100% takuu siitä, että tämä viestintäkanava on turvallinen.
Kuinka turvallista se on?
Tällaisen suojatun viestintäkanavan luominen tapahtuu ping*2-nopeudella. Esimerkiksi 20ms.
Hyökkääjällä on oltava jommankumman osapuolen yksityinen avain etukäteen. Tai löydä yksityinen avain muutamassa millisekunnissa.
Yhden modernin yksityisen avaimen hakkerointi kestää vuosikymmeniä supertietokoneella.

Vaihe 4 - julkinen tietokanta julkisista avaimista.
Ilmeisesti tässä koko tarinassa hyökkääjällä on mahdollisuus istua asiakkaan ja palvelimen välisellä viestintäkanavalla.
Asiakas voi teeskennellä olevansa palvelin, ja palvelin voi teeskennellä olevansa asiakas. Ja emuloi näppäinparia molempiin suuntiin.
Sitten hyökkääjä näkee kaiken liikenteen ja voi "muokata" liikennettä.
Muuta esimerkiksi osoitetta, johon lähetät rahaa, tai kopioi salasana verkkopankista tai estä "sopiva" sisältö.
Tällaisten hyökkääjien torjumiseksi he kehittivät julkisen tietokannan, jossa oli julkiset avaimet jokaiselle https-sivustolle.
Jokainen selain "tietää" noin 200 tällaisen tietokannan olemassaolosta. Tämä on esiasennettu jokaiseen selaimeen.
"Tietoa" tukee julkinen avain jokaisesta varmenteesta. Toisin sanoen yhteyttä kuhunkin tiettyyn varmenneviranomaiseen ei voida väärentää.

Nyt on yksinkertainen käsitys siitä, kuinka SSL:ää käytetään https:lle.
Jos käytät aivojasi, käy selväksi, kuinka erikoispalvelut voivat hakkeroida jotain tässä rakenteessa. Mutta se maksaa heille hirvittäviä ponnisteluja.
Ja organisaatiot, jotka ovat pienemmät kuin NSA tai CIA - on lähes mahdotonta hakkeroida olemassa olevaa suojaustasoa, jopa VIP-henkilöille.

Lisään myös ssh-yhteyksistä. Siellä ei ole julkisia avaimia, joten mitä voit tehdä? Ongelma ratkaistaan ​​kahdella tavalla.
Vaihtoehto ssh-by-password:
Ensimmäisen yhteyden aikana ssh-asiakkaan tulee varoittaa, että meillä on uusi julkinen avain ssh-palvelimelta.
Ja lisäyhteyksien aikana, jos varoitus "uusi julkinen avain ssh-palvelimelta" tulee näkyviin, se tarkoittaa, että he yrittävät salakuunnella sinua.
Tai sinua salakuunneltiin ensimmäisellä yhteydelläsi, mutta nyt kommunikoit palvelimen kanssa ilman välittäjiä.
Itse asiassa, koska salakuuntelun tosiasia paljastetaan helposti, nopeasti ja vaivattomasti, tätä hyökkäystä käytetään vain erityistapauksissa tietylle asiakkaalle.

Vaihtoehto ssh-by-key:
Otamme flash-aseman, kirjoitamme siihen ssh-palvelimen yksityisen avaimen (tässä on termejä ja paljon tärkeitä vivahteita, mutta kirjoitan koulutusohjelmaa, en käyttöohjeita).
Jätämme julkisen avaimen koneelle, jossa ssh-asiakas tulee olemaan ja pidämme sen myös salassa.
Tuomme flash-aseman palvelimelle, asetamme sen, kopioimme yksityisen avaimen ja poltamme flash-aseman ja sirotamme tuhkaa tuuleen (tai ainakin alustamme sen nolilla).
Siinä kaikki - tällaisen toimenpiteen jälkeen on mahdotonta hakkeroida tällaista ssh-yhteyttä. Tietysti 10 vuoden kuluttua on mahdollista katsella liikennettä supertietokoneella - mutta se on eri tarina.

Pyydän anteeksi offtopicista.

Joten nyt kun teoria on tiedossa. Kerron sinulle SSL-varmenteen luomisprosessista.

Käyttämällä "openssl genrsa" luomme yksityisen avaimen ja "tyhjiä" julkiselle avaimelle.
Lähetämme "aihiot" kolmannelle osapuolelle, jolle maksamme noin 9 dollaria yksinkertaisimmasta sertifikaatista.

Muutaman tunnin kuluttua saamme "julkisen" avaimemme ja joukon useita julkisia avaimia tältä kolmannen osapuolen yritykseltä.

Miksi kolmannen osapuolen yrityksen pitäisi maksaa julkisen avaimeni rekisteröinnistä, on erillinen kysymys, emme käsittele sitä tässä.

Nyt on selvää, mitä kirjoitus tarkoittaa:

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

Kansio "/etc/ssl" sisältää kaikki ssl-ongelmien tiedostot.
domain1.com — verkkotunnuksen nimi.
Vuosi 2018 on avainten luomisen vuosi.
"avain" - merkintä siitä, että tiedosto on yksityinen avain.

Ja tämän tiedoston merkitys:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com — verkkotunnuksen nimi.
Vuosi 2018 on avainten luomisen vuosi.
ketjutettu - merkintä julkisten avainten ketjusta (ensimmäinen on julkinen avaimemme ja loput julkisen avaimen myöntäneeltä yritykseltä).
crt - merkintä siitä, että on olemassa valmis varmenne (julkinen avain teknisillä selityksillä).

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

Tätä asetusta ei käytetä tässä tapauksessa, mutta se on kirjoitettu esimerkkinä.

Koska virhe tässä parametrissa johtaa roskapostin lähettämiseen palvelimeltasi (ilman tahtoasi).

Todista sitten kaikille, että et ole syyllinen.

recipient_delimiter = +

Monet ihmiset eivät ehkä tiedä, mutta tämä on tavallinen merkki sähköpostien luokittelussa, ja useimmat nykyaikaiset sähköpostipalvelimet tukevat sitä.

Jos sinulla on esimerkiksi postilaatikko "[sähköposti suojattu]"yritä lähettää"[sähköposti suojattu]"- katso mitä siitä tulee.

inet_protocols = ipv4

Tämä saattaa olla hämmentävää.

Mutta se ei ole vain niin. Jokainen uusi verkkotunnus on oletuksena vain IPv4, sitten otan IPv6:n käyttöön jokaiselle erikseen.

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

Tässä määritetään, että kaikki saapuva posti menee Dovecotiin.
Ja säännöt verkkotunnukselle, postilaatikolle, aliakselle - katso tietokannasta.

/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

Nyt postfix tietää, että posti voidaan hyväksyä jatkolähetykseen vain kyyhkyskopan valtuutuksen jälkeen.

En todellakaan ymmärrä miksi tämä kopioidaan tänne. Olemme jo määrittäneet kaiken, mitä tarvitaan "virtuaalikuljetuksessa".

Mutta postfix-järjestelmä on hyvin vanha - luultavasti se on takaisku vanhasta ajasta.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Tämä voidaan määrittää eri tavalla kullekin sähköpostipalvelimelle.

Käytössäni on 3 sähköpostipalvelinta ja nämä asetukset ovat hyvin erilaisia ​​erilaisten käyttövaatimusten vuoksi.

Sinun on määritettävä se huolellisesti - muuten roskapostia virtaa sinulle tai vielä pahempaa - roskapostia virtaa sinusta.

# SPF
policyd-spf_time_limit = 3600

Joidenkin tulevien kirjeiden SPF:n tarkistamiseen liittyvän laajennuksen asetukset.

# 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

Asetus on, että meidän on annettava DKIM-allekirjoitus kaikkiin lähteviin sähköposteihin.

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

Tämä on tärkeä yksityiskohta kirjeen reitityksessä lähetettäessä kirjeitä PHP-skripteistä.

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

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

Vasemmalla ovat säännölliset lausekkeet. Oikealla on tarra, joka merkitsee kirjaimen.
Postfix tarran mukaisesti - ottaa huomioon vielä muutaman konfigurointirivin tietylle kirjaimelle.

"master.cf" osoittaa, kuinka tarkalleen postfix määritetään uudelleen tietylle kirjaimelle.

Rivit 4, 5, 6 ovat tärkeimmät. Laitamme tämän tunnisteen minkä verkkotunnuksen puolesta lähetämme kirjeen.
Mutta "from"-kenttää ei aina mainita vanhan koodin PHP-skripteissä. Sitten käyttäjätunnus tulee apuun.

Artikkeli on jo laaja - en haluaisi olla häiriintynyt määrittämällä nginx+fpm.

Lyhyesti sanottuna kullekin sivustolle asetamme oman linux-käyttäjän omistajan. Ja vastaavasti fpm-poolisi.

Fpm-pool käyttää mitä tahansa php-versiota (on hienoa, kun samalla palvelimella voit käyttää php:n eri versioita ja jopa eri php.ini-tiedostoja viereisille sivustoille ilman ongelmia).

Joten tietyllä linux-käyttäjällä "www-domain2" on verkkosivusto domain2.com. Tällä sivustolla on koodi sähköpostien lähettämiseen ilman lähettäjä-kenttää.

Joten jopa tässä tapauksessa kirjeet lähetetään oikein, eivätkä ne koskaan päädy roskapostiin.

"/etc/postfix/master.cf" näyttää tältä:

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

Tiedostoa ei toimiteta kokonaan - se on jo erittäin suuri.
Huomasin vain sen, mikä on muuttunut.

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}

Nämä ovat spamassasiniin liittyviä asetuksia, niistä lisää myöhemmin.

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

Voit muodostaa yhteyden sähköpostipalvelimeen portin 587 kautta.
Tätä varten sinun on kirjauduttava sisään.

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

Ota SPF-tarkistus käyttöön.

apt-get install postfix-policyd-spf-python

Asennataan yllä oleva SPF-tarkistuspaketti.

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

Ja tämä on mielenkiintoisin asia. Tämä on kyky lähettää kirjeitä tietylle toimialueelle tietystä IPv4/IPv6-osoitteesta.

Tämä tehdään rDNS:n vuoksi. rDNS on prosessi, jossa vastaanotetaan merkkijono IP-osoitteen perusteella.
Ja postin osalta tätä ominaisuutta käytetään varmistamaan, että helo vastaa täsmälleen sen osoitteen rDNS:ää, josta sähköposti lähetettiin.

Jos helo ei vastaa sähköpostin verkkotunnusta, jonka puolesta kirje lähetettiin, myönnetään roskapostipisteitä.

Helo ei vastaa rDNS:ää – paljon roskapostipisteitä myönnetään.
Vastaavasti jokaisella verkkotunnuksella on oltava oma IP-osoite.
OVH:lle - konsolissa on mahdollista määrittää rDNS.
tech.ru:lle - ongelma ratkaistaan ​​tuen avulla.
AWS:n tapauksessa ongelma ratkaistaan ​​tuen avulla.
"inet_protocols" ja "smtp_bind_address6" - otamme käyttöön IPv6-tuen.
IPv6:ta varten sinun on myös rekisteröitävä rDNS.
"syslog_name" - ja tämä on tehty lokien lukemisen helpottamiseksi.

Osta sertifikaatteja Suosittelen täällä.

Asetetaan postfix+dovecot linkki tähän.

SPF:n asettaminen.

============= Kyyhkynen ==============

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

Mysql:n asennus, itse pakettien asennus.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

Valtuutus on vain salattu.

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

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

Tässä osoitamme kirjainten säilytyspaikan.

Haluan, että ne tallennetaan tiedostoihin ja ryhmitellään toimialueen mukaan.

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

Tämä on dovecot-määritystiedosto.
Tässä poistamme suojaamattomat yhteydet käytöstä.
Ja ota turvalliset yhteydet käyttöön.

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

ssl:n määrittäminen. Osoitamme, että ssl vaaditaan.
Ja itse todistus. Ja tärkeä yksityiskohta on "paikallinen" direktiivi. Ilmaisee, mitä SSL-varmennetta käytetään yhdistettäessä mihin paikalliseen IPv4:ään.

Muuten, IPv6:ta ei ole määritetty täällä, korjaan tämän puutteen myöhemmin.
XX.XX.XX.X5 (domain2) – ei varmennetta. Jotta voit yhdistää asiakkaita, sinun on määritettävä domain1.com.
XX.XX.XX.X2 (domain3) - on varmenne, voit määrittää domain1.com tai domain3.com asiakkaiden yhdistämiseksi.

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

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Tätä tarvitaan spamassassinille tulevaisuudessa.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Tämä on roskapostin estolaajennus. Tarvitaan spamassasin-harjoitteluun, kun siirretään roskapostikansioon/roskapostikansiosta.

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

protocol pop3 {
}

On vain tällainen tiedosto.

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

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

Lmtp:n määrittäminen.

Tiedosto "/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-harjoitusasetukset roskapostikansioon/postikansioon siirron yhteydessä.

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

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

Tiedosto, joka määrittää mitä tulee tehdä saapuville kirjeille.

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

require ["fileinto", "mailbox"];

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

Sinun on käännettävä tiedosto: "sievec default.sieve".

Tiedosto "/etc/dovecot/conf.d/auth-sql.conf.ext"

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Sql-tiedostojen määrittäminen valtuutusta varten.
Ja itse tiedostoa käytetään valtuutusmenetelmänä.

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

Tämä vastaa samanlaisia ​​asetuksia postfixille.

Tiedosto "/etc/dovecot/dovecot.conf"

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

Pääasetustiedosto.
Tärkeintä on, että ilmoitamme tässä - lisää protokollia.

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

apt-get install spamassassin spamc

Asennetaan paketit.

adduser spamd --disabled-login

Lisätään käyttäjä, jonka puolesta.

systemctl enable spamassassin.service

Otamme käyttöön automaattisen latauksen spamassassin-palvelun latauksen yhteydessä.

Tiedosto "/etc/default/spamassassin":

CRON=1

Ottamalla käyttöön sääntöjen automaattisen päivityksen "oletuksena".

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

Sinun on luotava mysql-tietokanta "sa" käyttäjällä "sa" salasanalla "salasana" (korvaa jollain sopivalla).

report_safe - tämä lähettää raportin roskapostista kirjeen sijaan.
use_bayes ovat spamassassinin koneoppimisasetuksia.

Loput spamassassin-asetukset käytettiin aiemmin artikkelissa.

Yleinen asetus "spamassassin".
Tietoja uusien roskapostiviestien siirtämisestä IMAP-roskapostikansioon.
Tietoja yksinkertaisesta yhdistelmästä Dovecot + SpamAssassin.
Suosittelen lukemaan spamassasin-oppimisteorian, kun siirrät kirjaimia imap-kansioissa (enkä suosittele sen käyttöä).

============= Vetoo yhteisöön ==============

Haluaisin myös heittää yhteisöön idean siitä, miten edelleen lähetettävien kirjeiden turvallisuustasoa voidaan lisätä. Koska olen niin syvästi uppoutunut postin aiheeseen.

Jotta käyttäjä voi luoda avainparin asiakkaalleen (outlook, thunderbird, selainlaajennus, ...). Julkinen ja yksityinen. Julkinen - lähetä DNS:ään. Yksityinen – säästä asiakkaalta. Postipalvelimet voisivat käyttää julkista avainta lähettääkseen tietylle vastaanottajalle.

Ja suojautuaksesi roskapostilta tällaisilla kirjeillä (kyllä, sähköpostipalvelin ei voi tarkastella sisältöä) - sinun on esitettävä 3 sääntöä:

  1. Pakollinen todellinen DKIM-allekirjoitus, pakollinen SPF, pakollinen rDNS.
  2. Neuraaliverkko roskapostin torjuntakoulutuksesta + tietokanta sitä varten asiakaspuolella.
  3. Salausalgoritmin on oltava sellainen, että lähettävän puolen tulee käyttää 100 kertaa enemmän prosessoritehoa salaukseen kuin vastaanottavan puolen.

Julkisten kirjeiden lisäksi kehitä vakioehdotuskirje "suojatun kirjeenvaihdon aloittamiseksi". Yksi käyttäjistä (postilaatikko) lähettää liitteen sisältävän kirjeen toiseen postilaatikkoon. Kirje sisältää tekstiehdotuksen suojatun viestintäkanavan käynnistämiseksi kirjeenvaihtoa varten ja postilaatikon omistajan julkisen avaimen (yksityisellä avaimella asiakaspuolella).

Voit jopa tehdä pari avainta erikseen jokaista kirjeenvaihtoa varten. Vastaanottajan käyttäjä voi hyväksyä tämän tarjouksen ja lähettää julkisen avaimensa (joka on myös tehty erityisesti tätä kirjeenvaihtoa varten). Seuraavaksi ensimmäinen käyttäjä lähettää palvelun ohjauskirjeen (salattu toisen käyttäjän julkisella avaimella) - jonka vastaanotettuaan toinen käyttäjä voi pitää muodostettua viestintäkanavaa luotettavana. Seuraavaksi toinen käyttäjä lähettää ohjauskirjeen - ja sitten ensimmäinen käyttäjä voi myös pitää muodostettua kanavaa turvallisena.

Avainten sieppauksen estämiseksi tiellä protokollan on tarjottava mahdollisuus lähettää vähintään yksi julkinen avain käyttämällä flash-asemaa.

Ja tärkeintä on, että kaikki toimii (kysymys on "kuka sen maksaa?"):
Syötä postitodistukset alkaen 10 dollaria 3 vuoden ajan. Tämän ansiosta lähettäjä voi ilmoittaa dns:ssä, että "julkiset avaimeni ovat siellä". Ja he antavat sinulle mahdollisuuden luoda suojattu yhteys. Samaan aikaan tällaisten yhteyksien hyväksyminen on ilmaista.
gmail on vihdoin ansainnut käyttäjiään. 10 dollarilla per 3 vuotta - oikeus luoda suojattuja kirjeenvaihtokanavia.

============= Päätelmä ==============

Koko artikkelin testaamiseksi aioin vuokrata erillisen palvelimen kuukaudeksi ja ostaa verkkotunnuksen, jossa on SSL-sertifikaatti.

Mutta elämänolosuhteet kehittyivät, joten tämä ongelma kesti 2 kuukautta.
Ja niinpä, kun minulla oli taas vapaa-aikaa, päätin julkaista artikkelin sellaisenaan, sen sijaan, että olisin vaarassa, että julkaisu venyy vielä vuodeksi.

Jos on melko paljon kysymyksiä, kuten "mutta tätä ei ole kuvattu riittävän yksityiskohtaisesti", on luultavasti voimaa ottaa oma palvelin uudella verkkotunnuksella ja uudella SSL-sertifikaatilla ja kuvata sitä vielä yksityiskohtaisemmin ja useimmat mikä tärkeintä, tunnistaa kaikki puuttuvat tärkeät yksityiskohdat.

Haluaisin myös saada palautetta postitodistuksiin liittyvistä ideoista. Jos pidät ideasta, yritän löytää voimaa kirjoittaa luonnos rfc:lle.

Kun kopioit suuria osia artikkelista, lisää linkki tähän artikkeliin.
Kun käännät jollekin muulle kielelle, anna linkki tähän artikkeliin.
Yritän kääntää sen itse englanniksi ja jättää ristiviittauksia.


Lähde: will.com

Lisää kommentti