Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Multi-koppelvlakke + SpamAssassin-leer + Bind

Hierdie artikel handel oor hoe om 'n moderne posbediener op te stel.
Postfix + Duifkot. SPF + DKIM + rDNS. met IPv6.
Met TSL-enkripsie. Met ondersteuning vir verskeie domeine - die deel met 'n regte SSL-sertifikaat.
Met anti-spam-beskerming en 'n hoë anti-spam-gradering van ander e-posbedieners.
Met ondersteuning vir verskeie fisiese koppelvlakke.
Met OpenVPN, die verbinding waarmee is via IPv4, en wat IPv6 gee.

As jy nie al hierdie tegnologieë wil leer nie, maar so 'n bediener wil opstel, dan is hierdie artikel vir jou.

Hierdie artikel poog nie om elke detail te verduidelik nie. Die verduideliking gaan na wat nie standaard opgestel is nie of belangrik is vanuit die oogpunt van die verbruiker.

Die motivering om 'n posbediener op te stel is my ou droom. Dit klink dalk dom, maar IMHO, dit is baie beter as om te droom oor 'n nuwe motor van jou gunsteling handelsmerk.

Die motivering om IPv6 op te stel is twee. ’n IT-spesialis moet voortdurend nuwe tegnologieë aanleer om te kan oorleef. Ek wil graag my beskeie bydrae lewer tot die stryd teen sensuur.

Die motivering vir die konfigurasie van OpenVPN is net om IPv6 op die plaaslike masjien te laat werk.
Die motivering vir die opstel van veelvuldige fisiese koppelvlakke is dat ek op my bediener een "stadige maar onbeperkte" koppelvlak het en die ander "vinnig, maar met 'n tarief".

Die motivering vir die opstel van die Bind-instellings is dat my ISP 'n onstabiele DNS-bediener verskaf, en google crash soms ook. Ek wil 'n stabiele DNS-bediener hê vir persoonlike gebruik.

Die motivering om die artikel te skryf is dat die konsep 10 maande gelede geskryf is, en ek het al twee keer daarna gekyk. Selfs al het die skrywer dit gereeld nodig, dan is daar 'n groot waarskynlikheid dat ander dit nodig sal hê.

Daar is geen universele oplossing vir die posbediener nie. Maar ek sal probeer om iets te skryf soos "doen dit en dan, wanneer alles werk soos dit moet, gooi die oorskot uit."

Daar is 'n Colocation-bediener van tech.ru. Dit is moontlik om te vergelyk met OVH, Hetzner, AWS. Om hierdie probleem op te los, sal samewerking met tech.ru baie meer effektief wees.

Die bediener het Debian 9 geïnstalleer.

Bediener het 2 koppelvlakke `eno1` en `eno2`. Die eerste is onderskeidelik onbeperk, en die tweede is vinnig.

Daar is 3 statiese IP-adresse, XX.XX.XX.X0 en XX.XX.XX.X1 en XX.XX.XX.X2 op die `eno1`-koppelvlak en XX.XX.XX.X5 op die `eno2`-koppelvlak .

Beskikbaar XXXX:XXXX:XXXX:XXXX::/64 'n poel van IPv6-adresse wat aan die `eno1`-koppelvlak toegewys is en daaruit XXXX:XXXX:XXXX:XXXX:1:2::/96 is op my versoek aan `eno2` toegewys.

Daar is 3 domeine `domain1.com`, `domain2.com`, `domain3.com`. Daar is 'n SSL-sertifikaat vir `domain1.com` en `domain3.com`.

Ek het 'n Google-rekening waaraan ek 'n posbus wil koppel[e-pos beskerm]` (ontvang pos en stuur pos direk vanaf die gmail-koppelvlak).
Moet 'n posbus hê `[e-pos beskerm]`, 'n afskrif van die pos waaruit ek in my gmail wil sien. En dit is selde om iets namens `[e-pos beskerm]` via die webkoppelvlak.

Moet 'n posbus hê `[e-pos beskerm]`, wat Ivanov vanaf sy iPhone sal gebruik.

E-posse wat gestuur word, moet aan alle moderne vereistes vir anti-spam voldoen.
Moet die hoogste vlak van enkripsie wees wat in openbare netwerke voorsien word.
Daar moet IPv6-ondersteuning wees vir beide die stuur en ontvang van e-posse.
Moet SpamAssassin wees, wat nooit e-posse sal uitvee nie. En dit sal óf bons óf slaan óf na die IMAP Spam-lêergids stuur.
SpamAssassin-outo-leer moet gekonfigureer word: as ek die brief na die Spam-lêergids skuif, sal dit hieruit leer; as ek 'n brief uit die Spam-lêergids skuif, sal dit daaruit leer. SpamAssassin-opleidingsresultate - behoort die tref van die letter in die Spam-lêergids te beïnvloed.
PHP-skrifte moet pos namens enige domein op 'n gegewe bediener kan stuur.
Daar moet 'n openvpn-diens wees, met die vermoë om IPv6 te gebruik op 'n kliënt wat nie IPv6 het nie.

Eerstens moet u koppelvlakke en roetering opstel, insluitend IPv6.
Dan sal jy OpenVPN moet konfigureer, wat via IPv4 sal koppel en die kliënt van 'n staties-regte IPv6-adres sal voorsien. Hierdie kliënt sal toegang hê tot alle IPv6-dienste op die bediener en toegang tot enige IPv6-bronne op die internet.
Dan sal jy Postfix moet instel om e-pos + SPF + DKIM + rDNS en ander klein dingetjies soos dit te stuur.
Dan sal jy Dovecot moet konfigureer en Multidomain instel.
Dan sal jy SpamAssassin moet konfigureer en opleiding moet opstel.
Laastens, installeer Bind.

============= Multi-koppelvlakke ==============

Om koppelvlakke op te stel, moet jy dit registreer in "/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

Hierdie instellings kan op enige bediener in tech.ru toegepas word (met 'n bietjie koördinasie met ondersteuning) en dit sal dadelik werk soos dit moet.

As die ervaring van die opstel van soortgelyke dinge vir Hetzner, OVH is anders daar. Moeiliker.

eno1 is die naam van netwerkkaart #1 (stadig maar onbeperk).
eno2 is die naam van netwerkkaart #2 (vinnig, maar met 'n tarief).
tun0 is die naam van die virtuele NIC van OpenVPN.
XX.XX.XX.X0 - IPv4 #1 op eno1.
XX.XX.XX.X1 - IPv4 #2 op eno1.
XX.XX.XX.X2 - IPv4 #3 op eno1.
XX.XX.XX.X5 - IPv4 #1 op eno2.
XX.XX.XX.1 - IPv4-poort.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 vir die hele bediener.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 vir eno2, alles anders gaan van buite na eno1.
XXXX:XXXX:XXXX:XXXX::1 - IPv6-poort (dit is opmerklik dat jy dit anders kan / moet doen. Spesifiseer die IPv6-skakelaar).
dns-naambedieners - 127.0.0.1 word gespesifiseer (omdat bind plaaslik geïnstalleer is) en 213.248.1.6 (dit is van tech.ru).

"table eno1t" en "table eno2t" - die betekenis van hierdie roete-reëls is dat die verkeer wat deur eno1 binnegekom het -> daardeur sou vertrek, en die verkeer wat deur eno2 ingevoer word -> daardeur sou vertrek. En ook verbindings op die inisiatief van die bediener sal deur eno1 vertrek.

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

Met hierdie opdrag stel ons dat enige onverstaanbare verkeer wat onder enige reël val wat "table eno1t" gemerk het -> aanstuur na die eno1-koppelvlak.

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

Met hierdie opdrag spesifiseer ons dat enige verkeer wat deur die bediener geïnisieer word, na die eno1-koppelvlak gerig word.

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

Met hierdie opdrag stel ons self die verkeersmerkreëls.

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

Hierdie blok spesifiseer 'n tweede IPv4 vir die eno1-koppelvlak.

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

Met hierdie opdrag stel ons die roete vanaf OpenVPN-kliënte na plaaslike IPv4 behalwe vir XX.XX.XX.X0.
Hoekom hierdie opdrag genoeg is vir alle IPv4 - ek verstaan ​​nog steeds nie.

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

Ons stel die adres vir die koppelvlak self. Die bediener sal dit as die "uitgaande" adres gebruik. Nie meer sal gebruik word nie.

Hoekom is ":1:1::" so ingewikkeld? Vir OpenVPN om korrek te werk en slegs hiervoor. Meer hieroor later.

Oor die onderwerp van gateway - dit werk goed. Maar volgens die korrekte een moet u hier die IPv6 van die skakelaar spesifiseer waaraan die bediener gekoppel is.

Om een ​​of ander rede hou IPv6 egter op om te werk as ek dit doen. Waarskynlik, dit is 'n paar probleme van tech.ru.

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

Dit voeg 'n IPv6-adres by 'n koppelvlak. As jy honderd adresse benodig, dan honderd reëls in hierdie lêer.

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

Het die adresse en subnette van alle koppelvlakke gemerk om dit duidelik te maak.
eno1 - moet wees "/64" - want dit is ons hele poel adresse.
tun0 - die subnet moet groter as eno1 wees. Andersins sal u nie IPv6-poort vir OpenVPN-kliënte kan opstel nie.
eno2 - die subnet moet groter as tun0 wees. Andersins sal OpenVPN-kliënte nie by IPv6 plaaslike adresse kan uitkom nie.
Vir duidelikheid het ek die subnet stap 16 gekies, maar as jy wil, kan jy selfs 'n "1" stap doen.
Gevolglik is 64+16 = 80, en 80+16 = 96.

Vir nog meer duidelikheid:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY is die adresse wat aan spesifieke werwe of dienste op koppelvlak eno1 toegeken moet word.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY is die adresse wat aan spesifieke werwe of dienste op koppelvlak eno2 toegeken moet word.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY is die adresse wat aan OpenVPN-kliënte toegeken moet word of as OpenVPN-diensadresse gebruik moet word.

Om die netwerk op te stel, behoort dit moontlik te wees om die bediener te herbegin.
IPv4-veranderinge word tydens uitvoering opgetel (maak seker om dit in die skerm toe te draai - anders sal hierdie opdrag eenvoudig die netwerk op die bediener laat val):

/etc/init.d/networking restart

Voeg aan die einde in die lêer "/etc/iproute2/rt_tables" by:

100 eno1t
101 eno2t

Daarsonder kan jy nie pasgemaakte tabelle in die "/etc/network/interfaces"-lêer gebruik nie.
Syfers moet uniek en minder as 65535 wees.

IPv6-veranderinge word maklik verander sonder 'n herlaai, maar hiervoor moet u ten minste drie opdragte leer:

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

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

Dit is my bediener se "sysctl" instellings. Ek sal iets belangrik uitwys.

net.ipv4.ip_forward = 1

Daarsonder sal OpenVPN op geen manier werk nie.

net.ipv6.ip_nonlocal_bind = 1

Enigeen wat probeer om IPv6 (soos nginx) te bind net nadat die koppelvlak opgegaan het, sal 'n fout kry. Dat so 'n adres nie beskikbaar is nie.

Om so 'n situasie te vermy, word so 'n instelling gemaak.

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

Sonder hierdie instellings gaan IPv6-verkeer vanaf die OpenVPN-kliënt nie die wêreld in nie.

Die ander instellings is óf irrelevant óf ek onthou nie hoekom nie.
Maar vir ingeval, laat ek dit “soos dit is”.

Om die veranderinge aan hierdie lêer opgetel te kan word sonder om die bediener te herbegin, moet jy die opdrag uitvoer:

sysctl -p

Meer besonderhede oor "tafel"-reëls: habr.com/post/108690

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

OpenVPN IPv4 werk nie sonder iptables nie.

Ek het iptables soos hierdie vir 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 is my statiese IPv4-adres van die plaaslike masjien.
10.8.0.0/24 - IPv4 openvpn-netwerk. IPv4-adresse vir openvpn-kliënte.
Die volgorde van die reëls is belangrik.

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

Dit is 'n beperking sodat net ek OpenVPN vanaf my statiese IP kan gebruik.

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

Om IPv4-pakkies tussen OpenVPN-kliënte en die internet aan te stuur, moet u een van hierdie opdragte registreer.

Vir verskillende gevalle is een van die opsies nie geskik nie.
Albei opdragte is geskik vir my geval.
Nadat ek die dokumentasie gelees het, het ek die eerste opsie gekies, want dit eet minder SVE.

Om alle iptables-instellings na herlaai opgetel te kan word, moet u dit iewers stoor.

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

Hierdie name is nie toevallig gekies nie. Hulle word gebruik deur die "iptables-persistent" pakket.

apt-get install iptables-persistent

Installeer die hoof OpenVPN-pakket:

apt-get install openvpn easy-rsa

Stel 'n sjabloon vir sertifikate op (vervang jou eie waardes):

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

Kom ons wysig die sertifikaatsjablooninstellings:

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

Skep 'n bedienersertifikaat:

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

Kom ons berei die vermoë voor om die finale "kliënt-naam.opvn"-lêers te skep:

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

Kom ons berei 'n skrif voor wat alle lêers in 'n enkele opvn-lêer sal saamvoeg.

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

Skep die eerste OpenVPN-kliënt:

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

Die lêer "~/client-configs/files/client-name.ovpn" word na die toestel na die kliënt gestuur.

Vir iOS-kliënte sal jy die truuk moet doen:
Die inhoud van die "tls-auth" merker moet sonder kommentaar wees.
En sit ook "sleutel-rigting 1" onmiddellik voor die "tls-auth" merker.

Stel die OpenVPN-bedienerkonfigurasie op:

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

Dit is nodig om 'n statiese adres vir elke kliënt te stel (nie nodig nie, maar ek gebruik):

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

Die moeilikste en belangrikste detail.

Ongelukkig weet OpenVPN nog nie hoe om IPv6-poort vir kliënte op sy eie op te stel nie.
Jy moet dit "handmatig" vir elke kliënt aanstuur.

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

Lêer "/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

Lêer "/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

Beide skrifte gebruik die "/etc/openvpn/variables" lêer:

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

Hoekom dit so hier geskryf is – ek vind dit moeilik om te onthou.

Nou lyk dit vreemd netmasker = 112 (dit behoort 96 net daar te wees).
En die voorvoegsel is vreemd, stem nie ooreen met die tun0-netwerk nie.
Maar goed, ek los dit soos dit is.

cipher DES-EDE3-CBC

Dit is nie vir almal nie - ek het hierdie metode gekies om die verbinding te enkripteer.

Kom meer te wete oor die opstel van OpenVPN IPv4.

Kom meer te wete oor die opstel van OpenVPN IPv6.

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

Die installering van die hoofpakket:

apt-get install postfix

Wanneer jy installeer, kies "internet-werf".

My "/etc/postfix/main.cf" lyk so:

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

Kom ons kyk na die besonderhede van hierdie konfigurasie.

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

Volgens die Khabroviete bevat hierdie blok `disinformasie en verkeerde tesisse`.Slegs 8 jaar na die begin van my loopbaan het ek begin verstaan ​​hoe SSL werk.

Daarom sal ek die vrymoedigheid neem om te beskryf hoe om SSL te gebruik (sonder om die vrae "Hoe werk dit?" en "Hoekom werk dit?" te beantwoord.

Die basis van moderne enkripsie is die skepping van 'n sleutelpaar (twee baie lang stringe karakters).

Een "sleutel" is privaat, die ander sleutel is "publiek". Die private sleutel word baie versigtig geheim gehou. Ons versprei die publieke sleutel aan almal.

Deur die publieke sleutel te gebruik, kan jy 'n string teks enkripteer sodat slegs die eienaar van die private sleutel dit kan dekripteer.
Wel, dit is die hele basis van tegnologie.

Stap #1 - https-werwe.
Die blaaier, wanneer toegang tot die webwerf verkry word, leer van die webbediener dat die webwerf https is en versoek dus die publieke sleutel.
Die webbediener gee die publieke sleutel. Die blaaier gebruik die publieke sleutel om die http-versoek te enkripteer en stuur dit.
Die inhoud van die http-versoek kan slegs gelees word deur die een wat die private sleutel het, dit wil sê slegs die bediener waartoe toegang verkry word.
Http-versoek bevat ten minste 'n URI. As 'n land dus probeer om toegang nie tot die hele webwerf te beperk nie, maar tot 'n spesifieke bladsy, kan dit nie vir https-werwe gedoen word nie.

Stap #2 - Geënkripteerde reaksie.
Die webbediener gee 'n reaksie wat maklik langs die pad gelees kan word.
Die oplossing is uiters eenvoudig - die blaaier genereer plaaslik dieselfde privaat-openbare sleutelpaar vir elke https-werf.
En saam met die versoek vir die webwerf se publieke sleutel, stuur dit sy plaaslike publieke sleutel.
Die webbediener onthou dit en, wanneer http-antwoord gestuur word, enkripteer dit met hierdie publieke sleutel van 'n spesifieke kliënt.
Nou kan http-respons slegs deur die eienaar van die kliënt se blaaier se private sleutel (dit wil sê die kliënt self) gedekripteer word.

Stap nommer 3 - vestig 'n veilige verbinding oor 'n publieke kanaal.
In voorbeeld nr. 2 is daar 'n kwesbaarheid - niks verhoed goedgesindes om die http-versoek te onderskep en die inligting oor die publieke sleutel te redigeer nie.
Dus sal die tussenganger perfek in staat wees om die hele inhoud van boodskappe wat gestuur en ontvang is te sien totdat die kommunikasiekanaal verander word.
Om dit te hanteer is uiters eenvoudig - stuur net die blaaier se publieke sleutel as 'n boodskap wat geïnkripteer is met die webbediener se publieke sleutel.
Die webbediener stuur dan eerstens 'n antwoord soos "jou publieke sleutel is so" en enkripteer hierdie boodskap met dieselfde publieke sleutel.
Die blaaier kyk na die antwoord - as die boodskap "jou publieke sleutel is so" ontvang word, dan is dit 'n 100% waarborg dat hierdie kommunikasiekanaal veilig is.
Hoe veilig is dit?
Die skepping van so 'n veilige kommunikasiekanaal vind plaas teen 'n spoed van ping * 2. Byvoorbeeld 20ms.
Die aanvaller moet óf vooraf die private sleutel van een van die partye hê. Of haal 'n private sleutel binne 'n paar millisekondes op.
Om een ​​moderne privaat sleutel te breek sal dekades neem op 'n superrekenaar.

Stap 4 - publieke databasis van publieke sleutels.
Dit is duidelik dat daar dwarsdeur hierdie storie 'n moontlikheid is vir 'n aanvaller om op die kommunikasiekanaal tussen die kliënt en die bediener te sit.
Die vermoë vir die kliënt om as die bediener te verskyn, en vir die bediener om as die kliënt te verskyn. En naboots 'n paar sleutels in beide rigtings.
Dan sal die aanvaller al die verkeer sien en die verkeer kan "redigeer".
Verander byvoorbeeld die adres waarheen om geld te stuur of kopieer die wagwoord van die aanlynbank af of blokkeer "aanstootlike" inhoud.
Om sulke indringers te bekamp, ​​het hulle met 'n publieke databasis vorendag gekom met publieke sleutels vir elke https-werf.
Elke blaaier "weet" van die bestaan ​​van ongeveer 200 sulke databasisse. Dit kom vooraf geïnstalleer met elke blaaier.
"Kennis" word gerugsteun deur 'n publieke sleutel van elke sertifikaat. Dit wil sê, die verband met elke spesifieke sertifiseringsowerheid kan nie vervals word nie.

Nou is daar 'n eenvoudige begrip van hoe om SSL vir https te gebruik.
As jy jou brein beweeg, sal dit duidelik word hoe spesiale dienste iets in hierdie struktuur kan hack. Maar dit sal hulle geweldige moeite kos.
En vir organisasies kleiner as die NSA of die CIA, is dit byna onmoontlik om die bestaande vlak van beskerming selfs vir vip te breek.

Ek sal ook byvoeg oor ssh-verbindings. Daar is geen publieke sleutels nie, hoe om te wees. Die probleem word op twee maniere opgelos.
ssh-by-wagwoord opsie:
By die eerste verbinding moet die ssh-kliënt waarsku dat ons 'n nuwe publieke sleutel vanaf die ssh-bediener hier het.
En met verdere verbindings, as 'n waarskuwing "'n nuwe publieke sleutel vanaf die ssh-bediener" verskyn, sal dit beteken dat hulle na jou probeer luister.
Of by die eerste verbinding na jou geluister is, en nou kommunikeer jy met die bediener sonder tussengangers.
Eintlik, as gevolg van die feit dat die feit van afluistering maklik, vinnig en moeiteloos onthul word, word hierdie aanval slegs in spesiale gevalle vir 'n spesifieke kliënt gebruik.

ssh-vir-sleutel opsie:
Ons neem 'n flash drive, skryf 'n private sleutel vir die ssh-bediener daaraan (daar is terme en baie noodsaaklike nuanses hiervoor, maar ek skryf 'n opvoedkundige program, nie gebruiksinstruksies nie).
Ons los die publieke sleutel op die masjien waar die ssh-kliënt sal wees en ons hou dit ook geheim.
Ons bring die flash drive na die bediener, plak dit, kopieer die private sleutel, en verbrand die flash drive en strooi die as in die wind (of formateer dit ten minste met nul opvulling).
Dit is al - na so 'n operasie sal dit onmoontlik wees om so 'n ssh-verbinding te hack. Natuurlik sal dit oor 10 jaar moontlik wees om verkeer op 'n superrekenaar te sien - maar dit is 'n ander storie.

Ek vra om verskoning vir die offtopic.

So, noudat die teorie bekend is. Ek sal jou vertel van die vloei van die skep van 'n ssl-sertifikaat.

Met die hulp van "openssl genrsa" skep ons 'n private sleutel en "blanks" vir die publieke sleutel.
Ons stuur "blanks" na 'n derdeparty-maatskappy, waaraan ons ongeveer $ 9 betaal vir die eenvoudigste sertifikaat.

Na 'n paar uur ontvang ons van hierdie derdeparty-maatskappy ons "openbare" sleutel en 'n stel van verskeie publieke sleutels.

Hoekom sal 'n derdeparty-maatskappy betaal vir die registrasie van my publieke sleutel is 'n aparte kwessie, ons sal dit nie hier oorweeg nie.

Nou is dit duidelik wat die betekenis van die inskripsie is:

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

Die "/etc/ssl"-lêergids bevat al die lêers vir ssl-vrae.
domain1.com is die naam van die domein.
2018 is die jaar wat die sleutels geskep is.
"sleutel" is die aanduiding dat die lêer 'n private sleutel is.

En die betekenis van hierdie lêer:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com is die naam van die domein.
2018 is die jaar wat die sleutels geskep is.
vasgeketting - aanduiding dat daar 'n ketting van publieke sleutels is (die eerste is ons publieke sleutel en die res is wat van die maatskappy gekom het wat die publieke sleutel uitgereik het).
crt - aanduiding dat daar 'n klaargemaakte sertifikaat is (openbare sleutel met tegniese verduidelikings).

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

Hierdie instelling word nie in hierdie geval gebruik nie, maar word as 'n voorbeeld geskryf.

Omdat 'n fout in hierdie parameter daartoe sal lei dat strooipos vanaf jou bediener gestuur word (sonder jou wil).

Bewys dan aan almal dat jy nie skuldig is nie.

recipient_delimiter = +

Miskien weet baie nie, so dit is die standaardkarakter vir die rangorde van pasem, en dit word ondersteun deur die meeste moderne posbedieners.

Byvoorbeeld, as jy 'n posbus "[e-pos beskerm]» probeer om te stuur na «[e-pos beskerm]- Kyk wat gebeur.

inet_protocols = ipv4

Miskien sal dit verwarrend wees.

Maar dit is nie net dit nie. Elke nuwe domein - by verstek slegs IPv4, dan skakel ek IPv6 vir elkeen afsonderlik aan.

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

Hier spesifiseer ons dat alle inkomende pos na duiwehok gaan.
En die reëls vir domein, posbus, alias - kyk in die databasis.

/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

Nou weet postfix dat dit moontlik is om pos te aanvaar vir verdere versending slegs deur magtiging met dovecot.

Ek verstaan ​​nie regtig hoekom dit hier gedupliseer word nie. Ons het reeds alles aangedui wat nodig is in “virtuele_vervoer”.

Maar die postfix-stelsel is baie oud - waarskynlik is dit 'n rolverdeling uit die ou dae.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Dit word op sy eie manier vir elke posbediener opgestel.

Ek het 3 posbedieners tot my beskikking en hierdie instellings verskil baie as gevolg van verskillende gebruiksvereistes.

Jy moet dit noukeurig opstel - anders sal strooipos na jou toe oorstroom of nog erger - strooipos sal van jou af oorstroom.

# SPF
policyd-spf_time_limit = 3600

Instelling vir een of ander inprop wat verband hou met die nagaan van die SPF van inkomende e-posse.

# 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

Om te stel dat alle uitgaande briewe ons 'n DKIM-handtekening moet verskaf.

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

Dit is 'n sleuteldetail in e-posroetering wanneer e-posse vanaf php-skrifte gestuur word.

Lêer "/etc/postfix/sdd_transport.pcre":

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

Aan die linkerkant is gereelde uitdrukkings. Aan die regterkant is 'n etiket wat die letter merk.
Postfix volgens die etiket - sal nog 'n paar reëls van konfigurasie vir 'n spesifieke letter in ag neem.

Hoe presies postfix herkonfigureer sal word vir 'n spesifieke letter, sal in "master.cf" aangedui word.

Reëls 4, 5, 6 is die belangrikstes. Namens watter domein stuur ons 'n brief - ons sit so 'n etiket.
Maar nie altyd in php-skrifte in die ou kode word die "van"-veld aangedui nie. Dan kom die gebruikersnaam tot die redding.

Die artikel is reeds omvattend - ek wil nie afgelei word deur nginx + fpm op te stel nie.

Kortliks - ons stel ons eie linux-gebruiker eienaar vir elke webwerf. En dienooreenkomstig jou fpm-poel.

Fpm-pool gebruik enige weergawe van php (dit is wonderlik as jy verskillende weergawes van php en selfs verskillende php.ini op dieselfde bediener kan gebruik sonder probleme vir naburige webwerwe).

Dus, 'n spesifieke linux-gebruiker "www-domain2" het 'n webwerf domain2.com. Hierdie webwerf het 'n kode om e-posse te stuur sonder om die van-veld te spesifiseer.

So selfs in hierdie geval, sal die briewe korrek verlaat en sal nooit in strooipos val nie.

My "/etc/postfix/master.cf" lyk so:

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

Die lêer word nie volledig gewys nie - dit is reeds baie groot.
Ek het net gemerk wat verander is.

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}

Dit is instellings wat verband hou met spamassasin, meer daaroor later.

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

Ons laat jou toe om aan die posbediener te koppel deur poort 587.
Om dit te doen, moet jy aangemeld wees.

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

Skakel SPF-tjek aan.

apt-get install postfix-policyd-spf-python

Installeer die pakket vir SPF-tjeks hierbo.

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

En dit is die interessantste. Dit is die vermoë om e-posse vir 'n spesifieke domein vanaf 'n spesifieke IPv4/IPv6-adres te stuur.

Dit word gedoen ter wille van rDNS. rDNS kry 'n string volgens IP-adres.
En vir pos word hierdie kenmerk gebruik om te bevestig dat helo presies ooreenstem met die rDNS van die adres waarvandaan die e-pos gestuur is.

As helo nie ooreenstem met die posdomein namens wie die brief gestuur is nie, word strooipospunte toegeken.

Helo voldoen nie aan rDNS nie - baie spampunte word toegeken.
Gevolglik moet elke domein sy eie IP-adres hê.
Vir OVH is dit moontlik om rDNS in die konsole te spesifiseer.
Vir tech.ru word die probleem opgelos deur ondersteuning.
Vir AWS word die probleem opgelos deur ondersteuning.
"inet_protocols" en "smtp_bind_address6" - ons aktiveer IPv6-ondersteuning.
Vir IPv6 moet jy ook rDNS registreer.
"syslog_name" - en dit is vir die gerief om die logs te lees.

Koop sertifikate beveel hier aan.

Die opstel van 'n postfix + dovecot skakel hier.

SPF instelling.

============== Duifkot ===============

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

Stel mysql op, installeer die pakkette self.

Lêer "/etc/dovecot/conf.d/10-auth.conf"

disable_plaintext_auth = yes
auth_mechanisms = plain login

Magtiging is slegs geïnkripteer.

Lêer "/etc/dovecot/conf.d/10-mail.conf"

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

Hier dui ons die ligging van die stoor van briewe aan.

Ek wil hê hulle moet in lêers gestoor word en volgens domein gegroepeer word.

Lêer "/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 {
  }
}

Dit is die hoof duiwelkolom konfigurasie lêer.
Hier deaktiveer ons onveilige verbindings.
En aktiveer veilige verbindings.

Lêer "/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
}

Stel ssl op. Ons dui aan dat ssl vereis word.
En die sertifikaat self. En 'n belangrike detail is die "plaaslike" richtlijn. Spesifiseer watter ssl-sertifikaat om te gebruik wanneer aan watter plaaslike IPv4 gekoppel word.

Terloops, IPv6 is nie hier gekonfigureer nie, ek sal hierdie weglating later as 'n draad regstel.
XX.XX.XX.X5 (domein2) - geen sertifikaat nie. Om kliënte te koppel, moet jy domain1.com spesifiseer.
XX.XX.XX.X2 (domain3) - daar is 'n sertifikaat, jy kan domain1.com of domain3.com spesifiseer om kliënte te verbind.

Lêer "/etc/dovecot/conf.d/15-lda.conf"

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Dit sal later nodig wees vir spamassassin.

Lêer "/etc/dovecot/conf.d/20-imap.conf"

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Dit is 'n antispam-inprop. Benodig vir opleiding van spamassasin ten tyde van oordrag na / van die "Strooipos"-lêergids.

Lêer "/etc/dovecot/conf.d/20-pop3.conf"

protocol pop3 {
}

Daar is net so 'n lêer.

Lêer "/etc/dovecot/conf.d/20-lmtp.conf"

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

Stel lmtp.

Lêer "/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 opleidingsinstellings ten tyde van oordrag na/van die "Spam"-lêergids.

Lêer "/etc/dovecot/conf.d/90-sieve.conf"

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

'n Lêer wat spesifiseer wat om met inkomende boodskappe te doen.

Lêer "/var/lib/dovecot/sieve/default.sieve"

require ["fileinto", "mailbox"];

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

Dit is nodig om die lêer saam te stel: "sievec default.sieve".

Lêer "/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
}

Spesifikasie van sql-lêers vir magtiging.
En die lêer self - as 'n manier van magtiging.

Lêer "/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';

Dit stem ooreen met soortgelyke instellings vir postfix.

Lêer "/etc/dovecot/dovecot.conf"

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

Hoof konfigurasie lêer.
Wat belangrik is, is dat ons protokolle hier spesifiseer-voeg.

============= Spam Assassin ===============

apt-get install spamassassin spamc

Kom ons installeer die pakkette.

adduser spamd --disabled-login

Voeg 'n gebruiker namens wie by.

systemctl enable spamassassin.service

Aktiveer outomatiese laai spamassassin-diens tydens selflaai.

Lêer "/etc/default/spamassassin":

CRON=1

Deur outomatiese opdatering van reëls by verstek aan te skakel.

Lêer "/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

Dit is nodig om 'n databasis "sa" in mysql te maak met die gebruiker "sa" met die wagwoord "wagwoord" (vervang met iets voldoende).

report_safe - dit sal 'n spam-boodskapverslag in plaas van 'n brief stuur.
use_bayes is spamassassin-masjienleerinstellings.

Die res van die spamassassin-instellings is vroeër in die artikel toegepas.

Algemene instelling "spamassassin".
Oor die skuif van nuwe Spam-e-posse na die IMAP "Strooipos"-lêergids.
Oor 'n eenvoudige klomp Dovecot + SpamAssassin.
Ek beveel aan dat u die spamassasin-leerteorie lees wanneer u letters in imap-vouers skuif (en beveel dit nie aan vir gebruik nie).

============= Gemeenskapsappèl ===============

Ek wil ook graag 'n idee in die gemeenskap gooi oor hoe om die vlak van sekuriteit van aangestuurde briewe te verhoog. Aangesien ek so diep in die onderwerp van pos gedompel is.

Sodat die gebruiker 'n sleutelpaar op sy kliënt kan skep (outlook, thunderbird, browser-plugin, ...). Publiek en privaat. Publiek - stuur na DNS. Privaat - bespaar op die kliënt. Posbedieners sal die publieke sleutel kan gebruik om na 'n spesifieke ontvanger te stuur.

En om te beskerm teen strooipos met sulke briewe (ja, die posbediener sal nie die inhoud kan sien nie) - moet jy 3 reëls invoer:

  1. Verpligte ware DKIM-handtekening, verpligte SPF, verpligte rDNS.
  2. 'n Neurale netwerk oor die leer van anti-spam + 'n databasis daarvoor aan die kliëntkant.
  3. Die enkripsie-algoritme moet so wees dat die stuurkant 100 keer meer SVE-krag aan enkripsie moet spandeer as die ontvangkant.

Benewens openbare briewe, ontwikkel 'n standaard vir 'n aanbodbrief om "'n veilige korrespondensie te begin". Een van die gebruikers (posbus) stuur 'n brief met 'n aanhangsel na 'n ander posbus. In die brief, 'n tekssin om 'n veilige kommunikasiekanaal vir korrespondensie te begin en die publieke sleutel van die eienaar van die posbus (met die private sleutel aan die kliëntkant).

Jy kan selfs 'n paar sleutels spesifiek vir elke korrespondensie maak. Die ontvangergebruiker kan hierdie aanbod aanvaar en hul publieke sleutel stuur (ook spesifiek vir hierdie korrespondensie gemaak). Vervolgens stuur die eerste gebruiker 'n diensbeheerbrief (geïnkripteer met die tweede gebruiker se publieke sleutel), by ontvangs waarvan die tweede gebruiker die gevormde kommunikasiekanaal as betroubaar kan beskou. Dan stuur die tweede gebruiker 'n kontrolebrief - en dan kan die eerste gebruiker ook die gevormde kanaal as veilig beskou.

Om die onderskepping van sleutels op die pad te bekamp, ​​is dit nodig om voorsiening te maak vir die moontlikheid om ten minste een publieke sleutel met behulp van 'n flash drive in die protokol oor te dra.

En die belangrikste ding is dat dit alles werk (die vraag is "wie sal hiervoor betaal?"):
Stel possertifikate ter waarde van $10 vir 3 jaar bekend. Wat die sender sal toelaat om in dns te spesifiseer dat "my publieke sleutels daar is." En hulle sal die geleentheid bied om 'n veilige verbinding te begin. Terselfdertyd - om sulke verbindings gratis te aanvaar.
gmail verdien uiteindelik sy gebruikers. Vir $ 10 in 3 jaar - die reg om veilige korrespondensiekanale te skep.

============= Gevolgtrekking ===============

Om die hele artikel te toets, gaan ek 'n toegewyde bediener vir 'n maand huur en 'n domein met 'n ssl-sertifikaat koop.

Maar lewensomstandighede het ontwikkel sodat hierdie kwessie vir 2 maande gesloer het.
En toe vrye tyd weer verskyn, het ek besluit om die artikel te publiseer soos dit is, en nie te waag dat die publikasie nog ’n jaar sou sloer nie.

As daar baie vrae is soos "maar dit word nie hier in voldoende detail beskryf nie", dan sal daar waarskynlik die krag wees om steeds 'n toegewyde bediener met 'n nuwe domein en 'n nuwe SSL-sertifikaat te neem en dit in meer besonderhede te beskryf en, die meeste belangrik, identifiseer al die gemis belangrike besonderhede.

Ek wil ook graag terugvoer ontvang oor die idee van possertifikate. As jy van die idee hou, sal ek probeer om die krag te vind om 'n konsep vir rfc te skryf.

Wanneer groot stukke van 'n artikel gekopieer word, dui 'n skakel na hierdie artikel aan.
Wanneer jy in enige ander taal vertaal, verskaf 'n skakel na hierdie artikel.
Ek sal self probeer om in Engels te vertaal en kruisverwysings los.


Bron: will.com

Voeg 'n opmerking