Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Multi-Interfaces + SpamAssassin-Learn + Bind

In diesem Artikel wird beschrieben, wie Sie einen modernen Mailserver einrichten.
Postfix + Taubenschlag. SPF + DKIM + rDNS. Mit IPv6.
Mit TLS-Verschlüsselung. Mit Unterstützung für mehrere Domänen - Teil mit einem echten SSL-Zertifikat.
Mit Anti-Spam-Schutz und hoher Anti-Spam-Bewertung auf anderen Mailservern.
Mit Unterstützung für mehrere physische Schnittstellen.
Mit OpenVPN, das über IPv4 eine Verbindung herstellt und IPv6 bietet.

Wenn Sie nicht alle diese Technologien erlernen möchten, aber einen solchen Server konfigurieren möchten, ist dieser Artikel genau das Richtige für Sie.

Es gibt keine Versuche, jedes Detail im Artikel zu erklären. Die Erklärung bezieht sich auf das, was nicht standardmäßig konfiguriert ist oder aus Sicht des Verbrauchers wichtig ist.

Die Motivation, einen Mailserver einzurichten, ist mein alter Traum. Es mag albern klingen, aber meiner Meinung nach ist es viel besser, als von einem neuen Auto Ihrer Lieblingsmarke zu träumen.

Die Motivation, IPv6 zu konfigurieren, ist zwei. IT-Experten müssen ständig neue Technologien erlernen, um zu überleben. Ich möchte meinen bescheidenen Beitrag zum Kampf gegen die Zensur leisten.

Die Motivation zum Einrichten von OpenVPN besteht nur darin, dass IPv6 auf dem lokalen Computer funktioniert.
Die Motivation für die Einrichtung mehrerer physischer Schnittstellen besteht darin, dass auf meinem Server eine Schnittstelle "langsam, aber unbegrenzt" und die andere "schnell, aber mit einem Tarif" ist.

Die Motivation zum Einrichten der Bindungseinstellungen besteht darin, dass mein Provider einen instabilen DNS-Server bereitstellt und Google ebenfalls abstürzt. Ich möchte einen stabilen DNS-Server für den persönlichen Gebrauch.

Motivation, einen Artikel zu schreiben - ein Entwurf wurde vor 10 Monaten geschrieben, und ich habe ihn bereits zweimal geprüft. Wenn selbst der Autor dies regelmäßig benötigt, besteht eine hohe Wahrscheinlichkeit, dass andere es benötigen.

Es gibt keine universelle Lösung für den Mailserver. Aber ich werde versuchen, etwas zu schreiben wie "Mach es so und dann, wenn alles so funktioniert, wie es sollte - wirf den Überschuss weg".

Es gibt einen Colocation-Server von tech.ru. Es ist möglich, mit OVH, Hetzner, AWS zu vergleichen. Um dieses Problem zu lösen, wird die Zusammenarbeit mit tech.ru viel effektiver sein.

Debian 9 ist auf dem Server installiert.

Auf dem Server gibt es 2 Schnittstellen `eno1` und` eno2`. Der erste ist unbegrenzt und der zweite ist schnell.

Es gibt 3 statische IP-Adressen, XX.XX.XX.X0 und XX.XX.XX.X1 und XX.XX.XX.X2 auf der Schnittstelle "eno1" und XX.XX.XX.X5 auf der Schnittstelle "eno2".

Es gibt XXXX: XXXX: XXXX: XXXX :: / 64 einen Pool von IPv6-Adressen, die der Schnittstelle "eno1" und daraus XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 auf meine Anfrage "eno2" zugewiesen sind.

Es gibt 3 Domains "domain1.com", "domain2.com", "domain3.com". Für "domain1.com" und "domain3.com" gibt es ein SSL-Zertifikat.

Es gibt ein Google-Konto, an das Sie das Postfach "vasya.pupkin @ domain1.com" binden möchten (Empfangen von E-Mails und Senden von E-Mails direkt über die Google Mail-Oberfläche).
Es sollte ein Postfach "support @ domain2.com" vorhanden sein, eine Kopie der E-Mail, die ich in meinem Google Mail-Konto sehen möchte. Und es ist selten möglich, etwas im Namen von "support @ domain2.com" über die Weboberfläche zu senden.

Es sollte eine Mailbox "ivanov @ domain3.com" geben, die Ivanov von seinem iPhone aus verwenden wird.

Gesendete Briefe müssen allen aktuellen Anti-Spam-Anforderungen entsprechen.
In öffentlichen Netzwerken sollte die höchste Verschlüsselungsstufe bereitgestellt werden.
Es muss IPv6-Unterstützung für das Senden und Empfangen von E-Mails geben.
Es muss einen SpamAssassin geben, der niemals E-Mails löscht. Der Spam-Ordner wird entweder übersprungen oder übersprungen oder an IMAP gesendet.
Das automatische SpamAssassin-Lernen sollte konfiguriert werden: Wenn ich den Brief in den Spam-Ordner verschiebe, lerne ich daraus. Wenn ich den Brief aus dem Spam-Ordner verschiebe, lerne ich daraus. SpamAssassin-Lernergebnisse - sollten sich auf die Reichweite der Nachricht im Spam-Ordner auswirken.
PHP-Skripte sollten in der Lage sein, E-Mails für jede Domain auf diesem Server zu senden.
Es sollte einen openvpn-Dienst geben, der IPv6 auf einem Client ohne IPv6 verwenden kann.

Zuerst müssen Sie Schnittstellen und Routing einschließlich IPv6 konfigurieren.
Anschließend müssen Sie OpenVPN konfigurieren, das eine Verbindung über IPv4 herstellt und dem Client eine statisch-reale IPv6-Adresse zur Verfügung stellt. Dieser Client hat Zugriff auf alle IPv6-Dienste auf dem Server und auf alle IPv6-Ressourcen im Internet.
Dann muss Postfix so konfiguriert werden, dass Briefe + SPF + DKIM + rDNS und andere ähnliche Kleinigkeiten gesendet werden.
Dann müssen Sie Dovecot und Multidomain konfigurieren.
Dann müssen Sie SpamAssassin konfigurieren und das Training konfigurieren.
Installieren Sie abschließend Bind.

============== Multi-Interfaces ==============


Um die Schnittstellen zu konfigurieren, müssen Sie dies unter "/ etc / network / interfaces" registrieren.

# 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 

Diese Einstellungen können auf jedem Server in tech.ru angewendet werden (mit ein wenig Koordination mit dem Support) und funktionieren sofort wie gewünscht.

Wenn die Erfahrung, ähnliche Dinge für Hetzner, OVH - dort Freundin einzurichten. Härter.

eno1 ist der Name der Netzwerkkarte Nr. 1 (langsam, aber unbegrenzt).
eno2 ist der Name der Netzwerkkarte Nr. 2 (schnell, aber mit einem Tarif).
tun0 ist der Name der virtuellen Netzwerkkarte von OpenVPN.
XX.XX.XX.X0 - IPv4 # 1 auf eno1.
XX.XX.XX.X1 - IPv4 # 2 auf eno1.
XX.XX.XX.X2 - IPv4 # 3 auf eno1.
XX.XX.XX.X5 - IPv4 # 1 auf eno2.
XX.XX.XX.1 - IPv4-Gateway.
XXXX: XXXX: XXXX: XXXX :: / 64 - IPv6 für den gesamten Server.
XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 - IPv6 für eno2, alles andere geht von außen an eno1.
XXXX: XXXX: XXXX: XXXX :: 1 - IPv6-Gateway (es ist erwähnenswert, dass Sie hier einen Freund finden können / müssen. Geben Sie den IPv6-Switch an).
DNS-Nameserver - 127.0.0.1 werden angegeben (da bind lokal installiert ist) und 213.248.1.6 (dies ist von tech.ru).

"Tabelle eno1t" und "Tabelle eno2t" - die Bedeutung dieser Routenregeln ist, dass der Verkehr, der durch eno1 -> geht, und der Verkehr, der durch eno2 -> geht, durchgeht. Und auch vom Server initiierte Verbindungen würden über eno1 gehen.

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

Mit diesem Befehl setzen wir, dass jeder unverständliche Verkehr, der unter eine Regel fällt, mit "table eno1t" markiert ist -> an die eno1-Schnittstelle senden.

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

Mit diesem Befehl setzen wir, dass jeglicher vom Server initiierter Verkehr zur eno1-Schnittstelle geleitet wird.

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

Mit diesem Befehl legen wir die Regeln für das Markieren des Datenverkehrs selbst fest.

 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 

Dieser Block definiert das zweite IPv4 für die eno1-Schnittstelle.

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

Mit diesem Befehl legen wir die Route von OpenVPN-Clients zu lokalem IPv4 mit Ausnahme von XX.XX.XX.X0 fest.
Warum dieser Befehl für alle IPv4 ausreicht - verstehe ich immer noch nicht.

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

Hier legen wir die Adresse für die Schnittstelle selbst fest. Der Server verwendet es als "ausgehende" Adresse. Wird nicht mehr verwendet.

Warum ist ": 1: 1 ::" so kompliziert? Das OpenVPN hat richtig funktioniert und nur dafür. Dazu später mehr.

Zum Thema Gateway - so funktioniert es. Aber auf die richtige Weise - hier müssen Sie den IPv6-Switch angeben, mit dem der Server verbunden ist.

Aus irgendeinem Grund funktioniert IPv6 jedoch nicht mehr, wenn ich dies tue. Vielleicht sind dies einige tech.ru-Probleme.

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

Dadurch werden der Schnittstelle IPv6-Adressen hinzugefügt. Wenn Sie hundert Adressen benötigen, bedeutet dies hundert Zeilen in dieser Datei.

 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 

Markierte die Adressen und Subnetze aller Schnittstellen so, dass es klar war.
eno1 - es muss "/ 64" sein - weil dies unser gesamter Adresspool ist.
tun0 - das Subnetz muss größer als eno1 sein. Andernfalls können Sie das IPv6-Gateway nicht für OpenVPN-Clients konfigurieren.
eno2 - Das Subnetz muss größer als tun0 sein. Andernfalls können OpenVPN-Clients keine lokalen IPv6-Adressen abrufen.
Aus Gründen der Übersichtlichkeit habe ich den Subnetzschritt 16 gewählt, aber Sie können sogar den Schritt „1“ ausführen, wenn Sie dies wünschen.
Dementsprechend ist 64 + 16 = 80 und 80 + 16 = 96.

Für noch mehr Klarheit:
XXXX: XXXX: XXXX: XXXX: 1: 1: JJJJ: JJJJ - Dies sind Adressen, die bestimmten Sites oder Diensten auf der eno1-Schnittstelle zugewiesen werden sollten.
XXXX: XXXX: XXXX: XXXX: 1: 2: JJJJ: JJJJ - Dies sind Adressen, die bestimmten Sites oder Diensten auf der eno2-Schnittstelle zugewiesen werden sollten.
XXXX: XXXX: XXXX: XXXX: 1: 3: JJJJ: JJJJ sind Adressen, die OpenVPN-Clients zugewiesen oder als OpenVPN-Dienstadressen verwendet werden sollen.


Um das Netzwerk zu konfigurieren, sollte es möglich sein, den Server neu zu starten.
IPv4-Änderungen werden während der Ausführung erfasst (stellen Sie sicher, dass Sie sie in den Bildschirm einschließen - andernfalls löscht dieser Befehl einfach das Netzwerk auf dem Server):

 /etc/init.d/networking restart 

In der Datei "/ etc / iproute2 / rt_tables" am Ende hinzufügen:

 100 eno1t 101 eno2t 

Ohne dies können Sie keine benutzerdefinierten Tabellen in der Datei "/ etc / network / interfaces" verwenden.
Die Nummern müssen eindeutig und kleiner als 65535 sein.

IPv6-Änderungen können problemlos ohne Neustart geändert werden. Dazu müssen Sie jedoch mindestens drei Befehle lernen:

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

Einrichten von "/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 

Dies sind die Sysctl-Einstellungen meines Servers. Ich nehme das Wichtige zur Kenntnis.

 net.ipv4.ip_forward = 1 

Ohne dies funktioniert OpenVPN in keiner Weise.

 net.ipv6.ip_nonlocal_bind = 1 

Jeder, der versucht, IPv6 (z. B. nginx) direkt nach dem Hochfahren der Schnittstelle zu binden, erhält eine Fehlermeldung. Dass eine solche Adresse nicht verfügbar ist.

Um eine solche Situation zu vermeiden, wird eine solche Einstellung vorgenommen.

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

Ohne diese IPv6-Einstellungen gelangt der Datenverkehr vom OpenVPN-Client nicht in die Welt.

Andere Einstellungen sind entweder irrelevant oder ich kann mich nicht erinnern, warum sie so sind.
Aber nur für den Fall, ich lasse "wie es ist".

Damit die Änderungen in dieser Datei ohne Neustart des Servers übernommen werden können, müssen Sie den folgenden Befehl ausführen:

 sysctl -p 

Weitere Details zu den "Tabellen" -Regeln: habr.com/post/108690

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


OpenVPN IPv4 funktioniert nicht ohne iptables.

Ich habe diese iptables für VPN:

 iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0 ##iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p udp --dport 1194 -j DROP iptables -A FORWARD -p udp --dport 1194 -j DROP 

YY.YY.YY.YY ist meine statische IPv4-Adresse des lokalen Computers.
10.8.0.0/24 - IPv4-OpenVPN-Netzwerk. IPv4-Adressen für OpenVPN-Clients.
Die Reihenfolge der Regeln ist wichtig.

 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 

Dies ist eine Einschränkung, sodass nur ich OpenVPN von meiner statischen IP aus verwenden kann.

 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 

Um IPv4-Pakete zwischen OpenVPN-Clients und dem Internet weiterzuleiten, müssen Sie einen dieser Befehle registrieren.

Für verschiedene Fälle ist eine der Optionen nicht geeignet.
Beide Teams sind für meinen Fall geeignet.
Nachdem ich die Dokumentation gelesen hatte, entschied ich mich für die erste Option, da sie weniger CPU verbraucht.

Damit alle iptables-Einstellungen nach dem Neustart übernommen werden, müssen Sie sie irgendwo speichern.

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

Solche Namen wurden nicht zufällig gewählt. Das Paket iptables-persistent verwendet sie.

 apt-get install iptables-persistent 

Installieren des OpenVPN-Hauptpakets:

 apt-get install openvpn easy-rsa 

Richten Sie eine Vorlage für Zertifikate ein (ersetzen Sie Ihre Werte):

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

Lassen Sie uns die Einstellungen für die Zertifikatvorlage bearbeiten:

 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="admin@domain1.com" export KEY_OU="VPN" # X509 Subject Field export KEY_NAME="server" ... 

Erstellen Sie ein Serverzertifikat:

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

Wir bereiten die Möglichkeit vor, die resultierenden "client-name.opvn" -Dateien zu erstellen:

 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 

Wir werden ein Skript vorbereiten, das alle Dateien zu einer einzigen opvn-Datei zusammenfügt.

 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}/${1}.crt \ <(echo -e '</cert>\n<key>') \ ${KEY_DIR}/${1}.key \ <(echo -e '</key>\n<tls-auth>') \ ${KEY_DIR}/ta.key \ <(echo -e '</tls-auth>') \ > ${OUTPUT_DIR}/${1}.ovpn 

Wir erstellen den ersten OpenVPN-Client:

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

Die Datei "~ / client-configs / files / client-name.ovpn" wird an den Client gesendet.

Für iOS-Clients müssen Sie den folgenden Trick ausführen:
Der Inhalt des tls-auth-Tags sollte kommentarlos sein.
Und setzen Sie "key-direction 1" unmittelbar vor das Tag "tls-auth".

Konfigurieren Sie die OpenVPN-Serverkonfiguration:

 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 

Dies ist erforderlich, um für jeden Client eine statische Adresse festzulegen (nicht erforderlich, aber ich verwende):

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

Das schwierigste und wichtigste Detail.

Leider kann OpenVPN das IPv6-Gateway für Clients noch nicht unabhängig konfigurieren.
Wir müssen dies für jeden Kunden manuell weiterleiten.

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

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


Datei "/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 Skripte verwenden die Datei "/ etc / openvpn / variables":

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

Warum steht es hier geschrieben? Ich kann mich nur schwer daran erinnern.

Jetzt sieht es seltsam aus Netzmaske = 112 (genau dort sollte es 96 geben).
Und das Präfix ist komisch, passt nicht zum tun0-Netzwerk.
Aber okay, ich lasse es "wie es ist".

 cipher DES-EDE3-CBC 

Dies ist ein Amateur - ich habe diese Methode zum Verschlüsseln der Verbindung gewählt.

Weitere Informationen zum Einrichten von OpenVPN IPv4.

Weitere Informationen zum Einrichten von OpenVPN IPv6.

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


Hauptpaket installieren:

 apt-get install postfix 

Wählen Sie bei der Installation "Internetseite".

Mein "/etc/postfix/main.cf" sieht folgendermaßen aus:

 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 

Betrachten wir die Details dieser Konfiguration.

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



Laut den Bürgern von Chabrowsk enthält dieser Block "Fehlinformationen und falsche Thesen".
Nur 8 Jahre nach Beginn meiner Karriere begann ich zu verstehen, wie SSL funktioniert.

Daher erlaube ich mir, die Verwendung von SSL zu beschreiben (ohne die Fragen „Wie funktioniert es?“ Und „Warum funktioniert es?“ Zu beantworten).

Die Basis der modernen Verschlüsselung ist die Erstellung eines Schlüsselpaars (zwei sehr lange Zeilen von Zeichen).

Ein "Schlüssel" ist privat, der andere ist "öffentlich". Wir halten den privaten Schlüssel sehr sorgfältig geheim. Wir verteilen den öffentlichen Schlüssel an alle.

Mit einem öffentlichen Schlüssel können Sie eine Textzeichenfolge verschlüsseln, sodass nur der Eigentümer des privaten Schlüssels entschlüsseln kann.
Nun, das ist die ganze Grundlage der Technologie.

Schritt 1 - https-Sites.
Beim Zugriff auf die Site erfährt der Browser vom Webserver, dass die Site https ist, und fordert daher einen öffentlichen Schlüssel an.
Der Webserver gibt den öffentlichen Schlüssel an. Mit dem öffentlichen Schlüssel verschlüsselt der Browser die http-Anfrage und sendet sie.
Der Inhalt der http-Anfrage kann nur von jemandem gelesen werden, der über einen privaten Schlüssel verfügt, dh nur von dem Server, an den der Anruf erfolgt.
HTTP-Anfrage enthält mindestens eine URI. Wenn das Land versucht, den Zugriff nicht auf die gesamte Site, sondern auf eine bestimmte Seite zu beschränken, kann dies für https-Sites nicht durchgeführt werden.

Schritt 2 ist die verschlüsselte Antwort.
Der Webserver bietet eine Antwort, die auf dem Weg leicht gelesen werden kann.
Die Lösung ist äußerst einfach: Der Browser generiert lokal für jede https-Site dasselbe privat-öffentliche Schlüsselpaar.
Zusammen mit der Anforderung des öffentlichen Schlüssels der Site wird der lokale öffentliche Schlüssel gesendet.
Der Webserver merkt sich das und verschlüsselt beim Senden einer http-Antwort mit diesem öffentlichen Schlüssel eines bestimmten Clients.
Jetzt kann die http-Antwort nur vom Eigentümer des privaten Schlüssels des Client-Browsers (dh des Clients selbst) entschlüsselt werden.

Schritt Nummer 3 - Stellen Sie eine sichere Verbindung über einen öffentlichen Kanal her.
In Beispiel Nr. 2 liegt eine Sicherheitslücke vor - nichts hindert Gratulanten daran, die http-Anfrage abzufangen und die Informationen zum öffentlichen Schlüssel zu bearbeiten.
Somit sieht der Vermittler fast den gesamten Inhalt der gesendeten und empfangenen Nachrichten, bis sich der Kommunikationskanal ändert.
Dies zu bekämpfen ist extrem einfach - senden Sie einfach den öffentlichen Schlüssel des Browsers als Nachricht, die mit dem öffentlichen Schlüssel des Webservers verschlüsselt ist.
Der Webserver sendet dann zunächst eine Antwort wie "Ihr öffentlicher Schlüssel ist so" und verschlüsselt diese Nachricht mit demselben öffentlichen Schlüssel.
Der Browser überprüft die Antwort. Wenn die Meldung "Ihr öffentlicher Schlüssel ist so" empfangen wird, ist dies eine 100% ige Garantie dafür, dass dieser Kommunikationskanal sicher ist.
Wie sicher ist es?
Die Erstellung eines solchen sicheren Kommunikationskanals selbst erfolgt mit einer Ping * 2-Geschwindigkeit. Zum Beispiel 20ms.
Ein Angreifer muss entweder einen privaten Schlüssel der Partei im Voraus haben. Oder holen Sie sich einen privaten Schlüssel für ein paar Millisekunden.
Das Hacken eines modernen privaten Schlüssels wird auf einem Supercomputer Jahrzehnte dauern.

Schritt 4 - Öffentliche Datenbank mit öffentlichen Schlüsseln.
Offensichtlich besteht in dieser ganzen Geschichte die Möglichkeit, dass ein Angreifer auf dem Kommunikationskanal zwischen dem Client und dem Server sitzt.
Die Gelegenheit für den Client wird vom Server und für den Server vom Client bereitgestellt. Und emulieren Sie ein Schlüsselpaar in beide Richtungen.
Dann sieht der Angreifer den gesamten Datenverkehr und kann den Datenverkehr "bearbeiten".
Ändern Sie beispielsweise die Adresse, an die Geld gesendet werden soll, oder kopieren Sie das Passwort von der Online-Bank oder blockieren Sie „anstößige“ Inhalte.
Um solche Angreifer zu bekämpfen, haben sie eine öffentliche Datenbank mit öffentlichen Schlüsseln für jede https-Site erstellt.
Jeder Browser "kennt" die Existenz von etwa 200 dieser Datenbanken. Dies ist in jedem Browser vorinstalliert.
"Wissen" wird für jedes Zertifikat durch einen öffentlichen Schlüssel gesichert. Das heißt, es ist unmöglich, eine Verbindung mit jeder spezifischen Zertifizierungsstelle zu fälschen.

Jetzt gibt es ein einfaches Verständnis für die Verwendung von SSL für https.
Wenn Sie Ihr Gehirn bewegen, wird klar, wie die speziellen Dienste etwas in diesem Design knacken können. Aber es wird sie enorme Anstrengungen kosten.
Und Organisationen, die kleiner als die NSA oder die CIA sind - es ist fast unmöglich, das bestehende Schutzniveau zu knacken, selbst für VIPs.

Ich werde auch Informationen zu SSH-Verbindungen hinzufügen. Es gibt keine öffentlichen Schlüssel, was zu tun ist. Das Problem wird auf zwei Arten gelöst.
Ssh Passwort Option:
Bei der ersten Verbindung sollte der SSH-Client warnen, dass hier ein neuer öffentlicher Schlüssel vom SSH-Server vorhanden ist.
Wenn bei weiteren Verbindungen die Warnung "Ein neuer öffentlicher Schlüssel vom SSH-Server" angezeigt wird, bedeutet dies, dass sie versuchen, Ihnen zuzuhören.
Oder bei der ersten Verbindung, die Sie gehört haben, und jetzt sprechen Sie ohne Zwischenhändler mit dem Server.
Aufgrund der Tatsache, dass das Abhören einfach, schnell und mühelos aufgedeckt werden kann, wird dieser Angriff nur in besonderen Fällen für einen bestimmten Client verwendet.

Schlüssel ssh Option:
Wir nehmen ein Flash-Laufwerk, schreiben einen privaten Schlüssel für den SSH-Server darauf (dafür gibt es Begriffe und eine Reihe wichtiger Nuancen, aber ich schreibe ein Lernprogramm, keine Gebrauchsanweisung).
Wir belassen den öffentlichen Schlüssel auf dem Computer, auf dem sich der SSH-Client befindet, und halten ihn auch geheim.
Wir bringen das Flash-Laufwerk zum Server, stecken es ein, kopieren den privaten Schlüssel und verbrennen das Flash-Laufwerk und streuen den Staub im Wind (oder formatieren ihn zumindest mit Nullen).
Das ist alles - nach einer solchen Operation wird es unmöglich sein, eine solche SSH-Verbindung zu knacken. Natürlich kann man über 10 Jahre Verkehr auf einem Supercomputer sehen - aber das ist eine andere Geschichte.

Ich entschuldige mich für das offtopic.
Nun ist die Theorie bekannt. Ich erzähle Ihnen, wie Sie ein SSL-Zertifikat erstellen.

Mit "openssl genrsa" erstellen wir einen privaten Schlüssel und "Leerzeichen" für den öffentlichen Schlüssel.
Wir senden die "Rohlinge" an ein Drittunternehmen, an das wir für das einfachste Zertifikat ungefähr 9 US-Dollar zahlen.

In wenigen Stunden erhalten wir von diesem Drittanbieter unseren „öffentlichen“ Schlüssel und einen weiteren Satz mehrerer öffentlicher Schlüssel.

Warum sollte ein Drittunternehmen für die Ausgabe meines öffentlichen Schlüssels bezahlen - ein separates Problem, das wir hier nicht berücksichtigen werden.

Jetzt ist klar, was die Bedeutung der Inschrift ist:

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

Im Ordner "/ etc / ssl" werden alle Dateien für SSL-Fragen gespeichert.
domain1.com - Domainname.
2018 ist das Jahr der Schlüsselerstellung.
"Schlüssel" - Bezeichnung, dass die Datei ein privater Schlüssel ist.

Und die Bedeutung dieser Datei:

smtpd_tls_cert_file = / etc / ssl / domain1.com.2018.chained.crt
domain1.com - Domainname.
2018 ist das Jahr der Schlüsselerstellung.
verkettet - eine Bezeichnung dafür, dass es eine Kette öffentlicher Schlüssel gibt (der erste ist unser öffentlicher Schlüssel und der Rest stammt von dem Unternehmen, das den öffentlichen Schlüssel ausgestellt hat).
crt - Bezeichnung, dass ein fertiges Zertifikat vorhanden ist (öffentlicher Schlüssel mit technischen Erläuterungen).

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

Diese Einstellung wird in diesem Fall nicht verwendet, sondern als Beispiel geschrieben.

Weil ein Fehler in diesem Parameter dazu führt, dass Spam von Ihrem Server gesendet wird (ohne Ihren Willen).

Dann beweisen Sie allen, dass Sie nicht schuld sind.

 recipient_delimiter = + 

Vielleicht wissen es viele nicht, daher ist dies ein Standardsymbol für die Beweidung, und dies wird von den meisten modernen Mailservern unterstützt.

Wenn Sie beispielsweise ein Postfach "Benutzername@gmail.com" haben, senden Sie es an "Benutzername+ Spam@gmail.com" - sehen Sie, was passiert.

 inet_protocols = ipv4 

Vielleicht ist das verwirrend.

Das ist aber nicht nur so. Jede neue Domain ist standardmäßig nur IPv4, dann aktiviere ich IPv6 für jede einzeln.

 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 legen wir fest, dass alle eingehenden E-Mails an Dovecot gehen.
Und die Regeln für Domain, Mailbox, Alias ​​- schauen Sie in die Datenbank.

/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 

Jetzt weiß postfix, dass Sie E-Mails nur mit Genehmigung von dovecot zum weiteren Senden annehmen können.

Ich verstehe wirklich nicht wirklich, warum dies hier dupliziert wird. Wir haben bereits in virtual_transport alles angegeben, was benötigt wird.

Aber das Postfix-System ist sehr alt - es sind wahrscheinlich die Burgen aus alten Zeiten.

 smtpd_recipient_restrictions = ... smtpd_helo_restrictions = ... smtpd_client_restrictions = ... 

Dies wird für jeden Mailserver auf seine eigene Weise konfiguriert.

Ich habe 3 Mailserver zur Verfügung und diese Einstellungen sind aufgrund unterschiedlicher Nutzungsanforderungen sehr unterschiedlich.

Sie müssen sorgfältig konfigurieren - andernfalls wird Spam Sie überfluten oder schlimmer noch, Spam wird Sie überfluten.

 # SPF policyd-spf_time_limit = 3600 

Konfiguration für eine Art Plugin zur SPF-Überprüfung eingehender Nachrichten.

 # 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 

Um alle ausgehenden Briefe zu konfigurieren, müssen wir eine DKIM-Signatur bereitstellen.

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

Dies ist ein wichtiges Detail beim E-Mail-Routing beim Senden von E-Mails aus PHP-Skripten.

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

 /^www-domain1@domain1\.com$/ domain1: /^www-domain2@domain1\.com$/ domain2: /^www-domain3@domain1\.com$/ domain3: /@domain1\.com$/ domain1: /@domain2\.com$/ domain2: /@domain3\.com$/ domain3: 

— . — , .
Postfix — .

postfix — «master.cf».

4, 5, 6 — . — .
php «from». .

— nginx+fpm.

— linux-user . fpm-pool.

Fpm-pool verwendet eine beliebige Version von PHP (dies ist großartig, wenn Sie verschiedene Versionen von PHP und sogar verschiedene PHP.ini auf demselben Server für benachbarte Sites verwenden können).

Ein bestimmter Linux-Benutzer "www-domain2" hat also eine domain2.com-Site. Diese Site verfügt über einen Code zum Senden von Briefen, ohne das Feld from anzugeben.

Selbst in diesem Fall werden die Buchstaben korrekt entfernt und gelangen nie in Spam.
Mein "/etc/postfix/master.cf" sieht so aus:

 ... 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 - nn - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf spamassassin unix - nn - - 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 Datei ist nicht vollständig angegeben - sie ist bereits sehr groß.
Notiert nur, was geändert wurde.

 smtp inet n - y - - smtpd -o content_filter=spamassassin ... spamassassin unix - nn - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} 

Dies sind die Einstellungen, die sich später auf Spamassasin beziehen.

 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 

Sie können über Port 587 eine Verbindung zum Mailserver herstellen.
Melden Sie sich dazu unbedingt an.

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

Aktivieren Sie die SPF-Überprüfung.

 apt-get install postfix-policyd-spf-python 

Installieren Sie das Paket für SPF-Prüfungen oben.

 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 

. IPv4/IPv6 .

rDNS. rDNS — - IP .
, helo rDNS , email.

helo , — .

Helo rDNS — .
IP .
OVH — rDNS.
tech.ru — .
AWS — .
"Inet_protocols" und "smtp_bind_address6" - so aktivieren wir die IPv6-Unterstützung.
Für IPv6 müssen Sie auch rDNS registrieren.
"Syslog_name" - und dies dient zum bequemen Lesen von Protokollen.
Ich empfehle hier Zertifikate zu kaufen .

Hier ein paar Postfix + Dovecot einrichten .

SPF-Setup.

============== Dovecot ==============


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

Konfigurieren Sie MySQL und installieren Sie die Pakete selbst.

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

 disable_plaintext_auth = yes auth_mechanisms = plain login 

Die Autorisierung wird nur verschlüsselt.

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

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

Hier geben wir die Position der Buchstaben an.

Ich möchte, dass sie in Dateien gespeichert und nach Domänen gruppiert werden.

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

Dies ist die wichtigste Einstellungsdatei für Taubenschläge.
Hier trennen wir ungesicherte Verbindungen.
Und sichere Verbindungen aktivieren.

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

Konfigurieren Sie ssl. Wir weisen darauf hin, dass ssl erforderlich ist.
Und das Zertifikat selbst. Ein wichtiges Detail ist die „lokale“ Richtlinie. Gibt an, wenn eine Verbindung zu welchem ​​lokalen IPv4 hergestellt wird - welches SSL-Zertifikat verwendet werden soll.

IPv6 ist hier übrigens nicht konfiguriert, ich werde diese Auslassung später als Thread korrigieren.
XX.XX.XX.X5 (Domäne2) - kein Zertifikat. Um Clients zu verbinden, müssen Sie domain1.com angeben.
XX.XX.XX.X2 (Domäne3) - Es gibt ein Zertifikat. Sie können domain1.com oder domain3.com angeben, um Clients zu verbinden.
Datei "/etc/dovecot/conf.d/15-lda.conf"

 protocol lda { mail_plugins = $mail_plugins sieve } 

Dies wird in Zukunft für Spamassassin benötigt.

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

 protocol imap { mail_plugins = $mail_plugins antispam } 

Dies ist ein Antispam-Plugin. Es ist erforderlich, um Spamassasin zum Zeitpunkt der Übertragung in / aus dem Spam-Ordner zu trainieren.

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

 protocol pop3 { } 

Genau so eine Datei ist.

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

 protocol lmtp { mail_plugins = $mail_plugins sieve postmaster_address = admin@domain1.com } 

Konfigurieren Sie lmtp.

Datei "/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-Trainingseinstellungen zum Zeitpunkt der Übertragung in / aus dem Spam-Ordner.

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

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

Eine Datei, die angibt, was mit eingehenden E-Mails zu tun ist.

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

 require ["fileinto", "mailbox"]; if header :contains "X-Spam-Flag" "YES" { fileinto :create "Spam"; } 

Es ist notwendig, die Datei zu kompilieren: "sievec default.sieve".

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

Angeben von SQL-Dateien für die Autorisierung.
Und die Datei selbst ist eine Art der Autorisierung.

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

Dies entspricht den gleichen Einstellungen für Postfix.

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

Die Hauptkonfigurationsdatei.
Wichtig ist, dass wir hier angeben, Protokolle hinzuzufügen.

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


 apt-get install spamassassin spamc 

Installieren Sie die Pakete.

 adduser spamd --disabled-login 

Fügen Sie einen Benutzer hinzu, in dessen Namen.

 systemctl enable spamassassin.service 

Aktivieren Sie beim Booten den automatischen Download des Spamassassin-Dienstes.

Datei "/ etc / default / spamassassin":

 CRON=1 

Aktivieren Sie standardmäßig die automatische Aktualisierung von Regeln.

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

Es ist notwendig, die Datenbank "sa" in MySQL mit dem Benutzer "sa" mit dem Passwort "Passwort" zu machen (durch etwas Passendes zu ersetzen).

report_safe - Anstelle eines Briefes wird ein Bericht über die Spam-Nachricht gesendet.
use_bayes sind Spamassassin-Einstellungen für maschinelles Lernen.

Die verbleibenden Spamassassin-Einstellungen wurden früher in diesem Artikel angewendet.

Die allgemeine Einstellung ist Spamassassin .
Informationen zum Verschieben neuer Spam-E-Mails in den IMAP-Spam-Ordner .
Über einen einfachen Haufen Dovecot + SpamAssassin .
Ich empfehle, die Theorie des Lernens von Spamassasin zu lesen, wenn Buchstaben in IMAP-Ordnern verschoben werden (und empfehle sie nicht zur Verwendung) .

============== Kontaktaufnahme mit der Community ==============


Ich möchte auch eine Idee in die Community einbringen, wie das Sicherheitsniveau für weitergeleitete Briefe erhöht werden kann. Da bin ich so tief in das Thema Mail eingetaucht.

Damit der Benutzer auf seinem Client ein Schlüsselpaar erstellen kann (Outlook, Thunderbird, Browser-Plugin, ...). Öffentlich und privat. Öffentlich - an DNS senden. Privat - auf dem Client speichern. Mailserver können den öffentlichen Schlüssel verwenden, um an einen bestimmten Empfänger zu senden.

Und um sich mit solchen E-Mails vor Spam zu schützen (ja, der Mailserver kann den Inhalt nicht sehen), müssen Sie drei Regeln eingeben:

  1. Obligatorische echte DKIM-Signatur, obligatorischer SPF, obligatorischer rDNS.
  2. Ein neuronales Netzwerk zum Thema Antispam-Training + DB dazu auf der Client-Seite.
  3. Der Verschlüsselungsalgorithmus sollte so sein, dass die sendende Seite 100-mal mehr CPU-Leistung für die Verschlüsselung aufwenden muss als die empfangende Seite.

Zusätzlich zu öffentlichen Briefen - um ein Standard-Einladungsschreiben zu entwickeln, "um mit der sicheren Korrespondenz zu beginnen". Einer der Benutzer (Postfach) sendet einen Brief mit einem Anhang an das andere Postfach. In dem Brief der Textvorschlag zum Starten eines sicheren Kommunikationskanals für Korrespondenz und der öffentliche Schlüssel des Eigentümers der Mailbox (mit dem privaten Schlüssel auf der Clientseite).

Sie können sogar ein Schlüsselpaar speziell für jede Korrespondenz erstellen. Der Empfänger kann dieses Angebot annehmen und seinen öffentlichen Schlüssel senden (ebenfalls speziell für diese Korrespondenz erstellt). Als nächstes sendet der erste Benutzer einen Dienststeuerbrief (verschlüsselt mit dem öffentlichen Schlüssel des zweiten Benutzers) - nach dessen Empfang der zweite Benutzer den gebildeten Kommunikationskanal als zuverlässig betrachten kann. Dann sendet der zweite Benutzer einen Kontrollbrief - und dann kann der erste Benutzer auch den gebildeten Kanal als geschützt betrachten.

Um das Abfangen von Schlüsseln auf der Straße zu bekämpfen, muss im Protokoll die Möglichkeit vorgesehen werden, mindestens einen öffentlichen Schlüssel über ein Flash-Laufwerk zu übertragen.

Und vor allem, dass alles funktioniert (die Frage ist: Wer wird dafür bezahlen?):
Führen Sie E-Mail-Zertifikate im Wert von 10 USD für 3 Jahre ein. Dadurch kann der Absender in DNS angeben, dass "meine öffentlichen Schlüssel da draußen sind". Und sie geben die Möglichkeit, eine sichere Verbindung herzustellen. Nehmen Sie gleichzeitig solche Verbindungen kostenlos ein.
Google Mail monetarisiert schließlich seine Nutzer. Für 10 US-Dollar in 3 Jahren - das Recht, sichere Korrespondenzkanäle zu schaffen.

============== Fazit ==============


Um den gesamten Artikel zu testen, wollte ich einen dedizierten Server für einen Monat mieten und eine Domain mit einem SSL-Zertifikat kaufen.

Die Lebensumstände entwickelten sich jedoch, so dass sich dieses Problem zwei Monate hinzog.
Und als die Freizeit wieder auftauchte, beschloss ich, den Artikel so zu veröffentlichen, wie er ist, und nicht zu riskieren, dass sich die Veröffentlichung um ein weiteres Jahr verzögert.

Wenn es viele Fragen gibt wie "aber dies wird nicht ausführlich genug beschrieben" - dann wird es wahrscheinlich Kräfte geben, einen dedizierten Server mit einer neuen Domäne und einem neuen SSL-Zertifikat zu nehmen und detaillierter zu beschreiben und vor allem - alle fehlenden wichtigen Details zu identifizieren.

Ich möchte auch Feedback zum Thema Ideen zu Mail-Zertifikaten erhalten. Wenn Ihnen die Idee gefällt, werde ich versuchen, die Kraft zu finden, einen Entwurf für rfc zu schreiben.

— .
— .
.

Source: https://habr.com/ru/post/de413689/


All Articles