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

Cet article explique comment configurer un serveur de messagerie moderne.
Postfix + Dovecot. SPF + DKIM + rDNS. Avec IPv6.
Avec le cryptage TLS. Avec prise en charge de plusieurs domaines - partie avec un vrai certificat SSL.
Avec protection anti-spam et indice anti-spam élevé sur les autres serveurs de messagerie.
Avec prise en charge de plusieurs interfaces physiques.
Avec OpenVPN, qui se connecte via IPv4, et qui donne IPv6.

Si vous ne souhaitez pas apprendre toutes ces technologies, mais souhaitez configurer un tel serveur, cet article est pour vous.

Il n'y a aucune tentative d'expliquer chaque détail de l'article. L'explication va à ce qui n'est pas configuré de manière standard ou qui est important du point de vue du consommateur.

La motivation pour mettre en place un serveur de messagerie est mon vieux rêve. Cela peut sembler idiot, mais à mon humble avis, c'est bien mieux que de rêver d'une nouvelle voiture de votre marque préférée.

La motivation pour configurer IPv6 est de deux. Les informaticiens doivent constamment apprendre de nouvelles technologies pour survivre. Je voudrais apporter ma modeste contribution à la lutte contre la censure.

La motivation de la configuration d'OpenVPN est uniquement pour que IPv6 fonctionne sur la machine locale.
La motivation pour la mise en place de plusieurs interfaces physiques est que sur mon serveur une interface est "lente mais illimitée" et l'autre "rapide, mais avec un tarif".

La motivation pour la configuration des paramètres de liaison est que mon fournisseur fournit un serveur DNS instable, et Google se bloque également. Je veux un serveur DNS stable pour un usage personnel.

Motivation pour écrire un article - un brouillon a été écrit il y a 10 mois, et je l'ai déjà examiné deux fois. Si même l'auteur en a régulièrement besoin, il y a de fortes chances que d'autres en aient besoin.

Il n'y a pas de solution universelle pour le serveur de messagerie. Mais j’essaierai d’écrire quelque chose comme «fais-le comme ça et puis, quand tout fonctionnera comme il faut - jette l’excédent».

Il existe un serveur de colocation de tech.ru. Il est possible de comparer avec OVH, Hetzner, AWS. Pour résoudre ce problème, la coopération avec tech.ru sera beaucoup plus efficace.

Debian 9 est installée sur le serveur.

Sur le serveur, il y a 2 interfaces `eno1` et` eno2`. Le premier est illimité et le second est rapide, respectivement.

Il y a 3 adresses IP statiques, XX.XX.XX.X0 et XX.XX.XX.X1 et XX.XX.XX.X2 sur l'interface «eno1» et XX.XX.XX.X5 sur l'interface «eno2».

Il y a XXXX: XXXX: XXXX: XXXX :: / 64 un pool d'adresses IPv6 qui sont attribuées à l'interface `eno1` et à partir de celui-ci XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 à ma demande affecté à` eno2`.

Il existe 3 domaines `domain1.com`,` domain2.com`, `domain3.com`. Pour «domaine1.com» et «domaine3.com», il existe un certificat SSL.

Il existe un compte Google auquel vous souhaitez lier la boîte aux lettres `vasya.pupkin @ domain1.com` (recevoir du courrier et envoyer du courrier directement depuis l'interface gmail).
Il devrait y avoir une boîte aux lettres «support @ domain2.com», une copie du courrier dont je veux voir dans mon gmail. Et il est rarement possible d'envoyer quelque chose au nom de «support @ domain2.com» via l'interface Web.

Il devrait y avoir une boîte aux lettres «ivanov @ domain3.com», qu'Ivanov utilisera depuis son iPhone.

Les lettres envoyées doivent être conformes à toutes les exigences anti-spam actuelles.
Il devrait y avoir le plus haut niveau de cryptage fourni sur les réseaux publics.
Il doit y avoir une prise en charge IPv6 pour l'envoi et la réception d'e-mails.
Il doit y avoir un SpamAssassin qui ne supprimera jamais les e-mails. Et il rebondira ou sautera ou enverra le dossier Spam à IMAP.
L'apprentissage automatique de SpamAssassin doit être configuré: si je déplace la lettre dans le dossier Spam, j'en tirerai des leçons; si je déplace la lettre du dossier Spam, j'en tirerai des enseignements. Résultats d'apprentissage de SpamAssassin - devraient affecter la portée du message dans le dossier Spam.
Les scripts Php devraient pouvoir envoyer des messages au nom de n'importe quel domaine sur ce serveur.
Il devrait y avoir un service openvpn avec la possibilité d'utiliser IPv6 sur un client qui n'a pas IPv6.

Vous devez d'abord configurer les interfaces et le routage, y compris IPv6.
Ensuite, vous devrez configurer OpenVPN, qui se connectera via IPv4 et fournira au client une adresse IPv6 statique réelle. Ce client aura accès à tous les services IPv6 sur le serveur et à toutes les ressources IPv6 sur Internet.
Ensuite, il sera nécessaire de configurer Postfix pour envoyer des lettres + SPF + DKIM + rDNS et d'autres bagatelles similaires.
Ensuite, vous devrez configurer Dovecot et configurer Multidomain.
Ensuite, vous devrez configurer SpamAssassin et configurer la formation.
Enfin, installez Bind.

============== Multi-interfaces ==============


Pour configurer les interfaces, vous devez l'enregistrer dans "/ 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 

Ces paramètres peuvent être appliqués sur n'importe quel serveur de tech.ru (avec un peu de coordination avec le support) et cela fonctionnera immédiatement comme il se doit.

Si l'expérience de la mise en place de choses similaires pour Hetzner, OVH - il petite amie. Plus dur.

eno1 est le nom de la carte réseau # 1 (lente mais illimitée).
eno2 est le nom de la carte réseau # 2 (rapide, mais avec un tarif).
tun0 est le nom de la carte réseau virtuelle d'OpenVPN.
XX.XX.XX.X0 - IPv4 # 1 sur eno1.
XX.XX.XX.X1 - IPv4 # 2 sur eno1.
XX.XX.XX.X2 - IPv4 # 3 sur eno1.
XX.XX.XX.X5 - IPv4 # 1 sur eno2.
XX.XX.XX.1 - Passerelle IPv4.
XXXX: XXXX: XXXX: XXXX :: / 64 - IPv6 à l'ensemble du serveur.
XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 - IPv6 pour eno2, tout le reste va à eno1 de l'extérieur.
XXXX: XXXX: XXXX: XXXX :: 1 - Passerelle IPv6 (il convient de noter que vous pouvez / devez vous faire un ami ici. Indiquez le commutateur IPv6).
dns-nameservers - 127.0.0.1 sont spécifiés (car la liaison est installée localement) et 213.248.1.6 (cela vient de tech.ru).

«Table eno1t» et «table eno2t» - la signification de ces règles d'itinéraire est que le trafic passant par eno1 -> le traverse et que le trafic passant par eno2 -> le traverse. Et les connexions initiées par le serveur passeraient par eno1.

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

Avec cette commande, nous définissons que tout trafic incompréhensible tombant sous n'importe quelle règle avec «table eno1t» marqué -> envoyer à l'interface eno1.

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

Avec cette commande, nous définissons ce qui dirige tout trafic lancé par le serveur vers l'interface eno1.

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

Avec cette commande, nous définissons nous-mêmes les règles de marquage du trafic.

 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 

Ce bloc définit le deuxième IPv4 pour l'interface eno1.

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

Avec cette commande, nous définissons la route des clients OpenVPN vers IPv4 local sauf XX.XX.XX.X0.
Pourquoi cette commande est suffisante pour tous les IPv4 - je ne comprends toujours pas.

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

Ceci nous avons placé l'adresse pour l'interface elle-même. Le serveur l'utilisera comme adresse "sortante". Ne sera plus utilisé.

Pourquoi est-il indiqué ": 1: 1 ::" si compliqué? Cet OpenVPN a fonctionné correctement et uniquement pour cela. Plus d'informations à ce sujet plus tard.

Sur le sujet de la passerelle - c'est ainsi que cela fonctionne. Mais dans le bon sens - ici, vous devez spécifier le commutateur IPv6 auquel le serveur est connecté.

Cependant, pour une raison quelconque, IPv6 cesse de fonctionner si je le fais. C'est peut-être quelques problèmes tech.ru.

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

Cela ajoute des adresses IPv6 à l'interface. Si vous avez besoin d'une centaine d'adresses, cela signifie une centaine de lignes dans ce fichier.

 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 

A marqué les adresses et les sous-réseaux de toutes les interfaces pour que ce soit clair.
eno1 - il doit être "/ 64" - car il s'agit de l'ensemble de notre pool d'adresses.
tun0 - le sous-réseau doit être plus grand que eno1. Sinon, vous ne pouvez pas configurer la passerelle IPv6 pour les clients OpenVPN.
eno2 - le sous-réseau doit être plus grand que tun0. Sinon, les clients OpenVPN ne pourront pas obtenir les adresses IPv6 locales.
Pour plus de clarté, j'ai choisi l'étape de sous-réseau 16, mais vous pouvez même prendre l'étape «1» si vous le souhaitez.
En conséquence, 64 + 16 = 80 et 80 + 16 = 96.

Pour encore plus de clarté:
XXXX: XXXX: XXXX: XXXX: 1: 1: YYYY: YYYY - ce sont des adresses qui doivent être attribuées à des sites ou services spécifiques sur l'interface eno1.
XXXX: XXXX: XXXX: XXXX: 1: 2: YYYY: YYYY - ce sont des adresses qui doivent être attribuées à des sites ou services spécifiques sur l'interface eno2.
XXXX: XXXX: XXXX: XXXX: 1: 3: YYYY: YYYY sont des adresses qui doivent être attribuées aux clients OpenVPN ou utilisées comme adresses de service OpenVPN.


Pour configurer le réseau - il devrait être possible de redémarrer le serveur.
Les modifications IPv4 sont récupérées lors de l'exécution (assurez-vous de les envelopper à l'écran - sinon cette commande supprimera simplement le réseau sur le serveur):

 /etc/init.d/networking restart 

Dans le fichier "/ etc / iproute2 / rt_tables" ajoutez à la fin:

 100 eno1t 101 eno2t 

Sans cela, vous ne pouvez pas utiliser de tables personnalisées dans le fichier "/ etc / network / interfaces".
Les nombres doivent être uniques et inférieurs à 65535.

Les changements d'IPv6 changent facilement sans redémarrer, mais pour cela, vous devez apprendre au moins trois commandes:

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

Configuration de "/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 

Ce sont les paramètres sysctl de mon serveur. Je note l'important.

 net.ipv4.ip_forward = 1 

Sans cela, OpenVPN ne fonctionnera en aucune façon.

 net.ipv6.ip_nonlocal_bind = 1 

Quiconque essaie de lier IPv6 (par exemple nginx) juste après que l'interface est en place recevra une erreur. Qu'une telle adresse n'est pas disponible.

Pour éviter une telle situation, un tel réglage est effectué.

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

Sans ces paramètres IPv6, le trafic provenant du client OpenVPN ne va pas dans le monde.

D'autres paramètres ne sont pas pertinents ou je ne me souviens pas pourquoi ils le sont.
Mais juste au cas où, je laisse "tel quel".

Pour que les modifications de ce fichier soient récupérées sans redémarrer le serveur, vous devez exécuter la commande:

 sysctl -p 

Plus de détails sur les règles "table": habr.com/post/108690

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


OpenVPN IPv4 ne fonctionne pas sans iptables.

J'ai ces iptables pour 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 est mon adresse IPv4 statique de la machine locale.
10.8.0.0/24 - Réseau openvpn IPv4. Adresses IPv4 pour les clients openvpn.
La séquence de règles est importante.

 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 

Il s'agit d'une limitation afin que seul je puisse utiliser OpenVPN à partir de mon adresse IP statique.

 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 

Pour transférer des paquets IPv4 entre des clients OpenVPN et Internet, vous devez enregistrer l'une de ces commandes.

Pour différents cas, l'une des options ne convient pas.
Les deux équipes conviennent à mon cas.
Après avoir lu la documentation, j'ai choisi la première option, car elle consomme moins de CPU.

Pour que tous les paramètres iptables soient récupérés après le redémarrage - vous devez les enregistrer quelque part.

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

Ces noms n'ont pas été choisis par hasard. Le package iptables-persistent les utilise.

 apt-get install iptables-persistent 

Installation du package OpenVPN principal:

 apt-get install openvpn easy-rsa 

Configurez un modèle de certificats (remplacez vos valeurs):

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

Modifions les paramètres du modèle de certificat:

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

Créez un certificat de serveur:

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

Nous préparerons l'opportunité de créer les fichiers "client-name.opvn" résultants:

 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 

Nous préparerons un script qui assemblera tous les fichiers en un seul fichier opvn.

 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 

Nous créons le premier client OpenVPN:

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

Le fichier "~ / client-configs / files / client-name.ovpn" est envoyé au client.

Pour les clients iOS, vous devrez faire l'astuce:
Le contenu de la balise tls-auth doit être sans commentaire.
Et mettez également "key-direction 1" juste avant la balise "tls-auth".

Configurez la configuration du serveur OpenVPN:

 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 

Ceci est nécessaire afin de définir une adresse statique pour chaque client (pas nécessaire, mais j'utilise):

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

Le détail le plus difficile et le plus important.

Malheureusement, OpenVPN n'est pas encore en mesure de configurer indépendamment la passerelle IPv6 pour les clients.
Nous devons le transmettre manuellement pour chaque client.

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

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


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

Les deux scripts utilisent le fichier "/ etc / openvpn / variables":

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

Pourquoi est-il écrit ici - j'ai du mal à m'en souvenir.

Maintenant, il semble étrange masque de réseau = 112 (à droite, il devrait y avoir 96).
Et le préfixe est bizarre, ne correspond pas au réseau tun0.
Mais d'accord, je le laisse "tel quel".

 cipher DES-EDE3-CBC 

C'est un amateur - j'ai choisi cette méthode de cryptage de la connexion.

En savoir plus sur la configuration d'OpenvPN IPv4.

En savoir plus sur la configuration d'OpenVPN IPv6.

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


Installation du package principal:

 apt-get install postfix 

Lors de l'installation, sélectionnez "site Internet".

Mon "/etc/postfix/main.cf" ressemble à ceci:

 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 

Examinons les détails de cette config.

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



Selon les citoyens de Khabrovsk, ce bloc contient «de la désinformation et des fausses thèses».
Seulement 8 ans après le début de ma carrière, j'ai commencé à comprendre le fonctionnement de SSL.

Par conséquent, je me permettrai de décrire comment utiliser SSL (sans répondre aux questions «Comment ça marche?» Et «Pourquoi ça marche?»).

La base du cryptage moderne est la création d'une paire de clés (deux très longues lignes de caractères).

Une «clé» est privée, l'autre est «publique». Nous gardons la clé privée très soigneusement en secret. Nous distribuons la clé publique à tout le monde.

À l'aide d'une clé publique, vous pouvez crypter une chaîne de texte afin que seul le propriétaire de la clé privée puisse décrypter.
Eh bien, c'est tout le fondement de la technologie.

Étape # 1 - Sites https.
Lors de l'accès au site, le navigateur apprend du serveur Web que le site est https et demande donc une clé publique.
Le serveur Web donne la clé publique. À l'aide de la clé publique, le navigateur crypte la demande http et l'envoie.
Le contenu de la requête http ne peut être lu que par une personne possédant une clé privée, c'est-à-dire uniquement le serveur vers lequel l'appel est effectué.
La requête Http contient au moins un URI. Par conséquent, si le pays tente de restreindre l'accès non pas à l'ensemble du site, mais à une page spécifique, cela ne peut pas être fait pour les sites https.

L'étape # 2 est la réponse chiffrée.
Le serveur Web fournit une réponse qui peut être facilement lue en cours de route.
La solution est extrêmement simple - le navigateur génère localement la même paire de clés privée-publique pour chaque site https.
Et en même temps que la demande de clé publique du site, il envoie sa clé publique locale.
Le serveur Web s'en souvient et, lors de l'envoi de la réponse http, crypte avec cette clé publique d'un client spécifique.
Désormais, la réponse http ne peut être déchiffrée que par le propriétaire de la clé privée du navigateur du client (c'est-à-dire le client lui-même).

Étape numéro 3 - établir une connexion sécurisée via un canal public.
Dans l'exemple n ° 2, il existe une vulnérabilité - rien n'empêche les sympathisants d'intercepter la requête http et de modifier les informations de clé publique.
Ainsi, l'intermédiaire verra presque tout le contenu des messages envoyés et reçus jusqu'à ce que le canal de communication change.
Lutter contre cela est extrêmement simple - il suffit d'envoyer la clé publique du navigateur sous forme de message crypté avec la clé publique du serveur Web.
Le serveur Web envoie alors d'abord une réponse du type "votre clé publique est comme ça" et crypte ce message avec la même clé publique.
Le navigateur regarde la réponse - si le message "votre clé publique est comme ça" est reçu - alors c'est une garantie à 100% que ce canal de communication est sûr.
Est-ce sûr?
La création d'un tel canal de communication sécurisé se fait à une vitesse ping * 2. Par exemple, 20 ms.
Un attaquant doit disposer à l'avance d'une des clés privées de l'une des parties. Ou récupérez une clé privée pendant quelques millisecondes.
Le piratage d'une clé privée moderne prendra des décennies sur un supercalculateur.

Étape # 4 - base de données publique des clés publiques.
De toute évidence, dans toute cette histoire, il existe une possibilité pour un attaquant assis sur le canal de communication entre le client et le serveur.
L'opportunité pour le client est présentée par le serveur, et le serveur est présenté par le client. Et émuler une paire de clés dans les deux sens.
L'attaquant verra alors tout le trafic et pourra "éditer" le trafic.
Par exemple, changez l'adresse où envoyer de l'argent ou copiez le mot de passe de la banque en ligne ou bloquez le contenu «répréhensible».
Pour combattre de tels attaquants, ils ont créé une base de données publique avec des clés publiques pour chaque site https.
Chaque navigateur "connaît" l'existence d'environ 200 de ces bases de données. Ceci est préinstallé dans chaque navigateur.
La «connaissance» est sauvegardée par une clé publique pour chaque certificat. Autrement dit, il est impossible de simuler une connexion avec chaque autorité de certification spécifique.

Maintenant, il existe une compréhension simple de l'utilisation de SSL pour https.
Si vous bougez votre cerveau, il deviendra clair comment les services spéciaux peuvent casser quelque chose dans cette conception. Mais cela leur coûtera d'énormes efforts.
Et les organisations plus petites que la NSA ou la CIA - il est presque impossible de casser le niveau de protection existant, même pour vip.

J'ajouterai également des informations sur les connexions ssh. Il n'y a pas de clés publiques, que faire. Le problème est résolu de deux manières.
Option de mot de passe Ssh:
Lors de la première connexion, le client ssh doit avertir que nous avons ici une nouvelle clé publique du serveur ssh.
Et avec d'autres connexions, si l'avertissement «une nouvelle clé publique du serveur ssh» apparaît, cela signifie qu'ils essaient de vous écouter.
Ou à la première connexion, vous avez été écouté, et maintenant vous parlez au serveur sans intermédiaires.
En fait, du fait que le fait de l'écoute électronique est facilement, rapidement et sans effort révélé, cette attaque n'est utilisée que dans des cas spéciaux pour un client spécifique.

Option clé ssh:
Nous prenons un lecteur flash, écrivons une clé privée pour le serveur ssh dessus (pour cela, il y a des termes et un tas de nuances importantes, mais j'écris un programme éducatif, pas des instructions d'utilisation).
Nous laissons la clé publique sur la machine où sera le client ssh et nous la gardons également secrète.
Nous apportons le lecteur flash au serveur, collons, copions la clé privée et brûlons le lecteur flash et dispersons la poussière dans le vent (ou du moins formatez-le avec des zéros).
C'est tout - après une telle opération, il sera impossible de casser une telle connexion ssh. Bien sûr, sur 10 ans, vous pouvez voir le trafic sur un supercalculateur - mais c'est une autre histoire.

Je m'excuse pour l'offtopic.
Alors maintenant que la théorie est connue. Je vais vous parler du déroulement de la création d'un certificat SSL.

En utilisant "openssl genrsa", nous créons une clé privée et des "blancs" pour la clé publique.
Nous envoyons les «blancs» à une société tierce, à laquelle nous payons environ 9 $ pour le certificat le plus simple.

Dans quelques heures, nous recevons de cette société tierce notre clé «publique» et un autre jeu de plusieurs clés publiques.

Pourquoi une société tierce devrait-elle payer pour la délivrance de ma clé publique - une question distincte, nous ne l'examinerons pas ici.

Maintenant, la signification de l’inscription est claire:

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

Dans le dossier "/ etc / ssl" tous les fichiers pour les questions SSL sont stockés.
domain1.com - nom de domaine.
2018 est l'année de la création des clés.
"Clé" - désignation que le fichier est une clé privée.

Et la signification de ce fichier:

smtpd_tls_cert_file = / etc / ssl / domain1.com.2018.chained.crt
domain1.com - nom de domaine.
2018 est l'année de la création des clés.
enchaîné - une désignation qu'il existe une chaîne de clés publiques (la première est notre clé publique et le reste est ce qui est venu de la société qui a émis la clé publique).
crt - désignation qu'il existe un certificat prêt (clé publique avec explications techniques).

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

Ce paramètre n'est pas utilisé dans ce cas, mais est écrit à titre d'exemple.

Parce qu'une erreur dans ce paramètre entraînera l'envoi de spam depuis votre serveur (sans votre volonté).

Prouvez ensuite à tout le monde que vous n'êtes pas à blâmer.

 recipient_delimiter = + 

Beaucoup ne le savent peut-être pas, c'est donc un symbole standard pour le pâturage, et cela est pris en charge par la plupart des serveurs de messagerie modernes.

Par exemple, si vous avez une boîte aux lettres «username@gmail.com», essayez de l'envoyer à «username+spam@gmail.com» - voyez ce qui se passe.

 inet_protocols = ipv4 

Ce sera peut-être déroutant.

Mais ce n'est pas juste. Chaque nouveau domaine est par défaut uniquement IPv4, puis j'active IPv6 pour chacun individuellement.

 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 

Ici, nous définissons que tout le courrier entrant est envoyé à pigeonnier.
Et les règles pour le domaine, la boîte aux lettres, l'alias - regardez dans la base de données.

/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 

Postfix sait maintenant que vous ne pouvez accepter le courrier que pour un envoi ultérieur par autorisation avec dovecot.

Je ne comprends vraiment pas pourquoi cela est reproduit ici. Nous avons déjà indiqué dans virtual_transport tout ce qui est nécessaire.

Mais le système postfix est très ancien - ce sont probablement les châteaux d'autrefois.

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

Ceci est configuré pour chaque serveur de messagerie à sa manière.

J'ai 3 serveurs de messagerie à ma disposition et ces paramètres sont très différents en raison des différentes exigences d'utilisation.

Vous devez configurer soigneusement - sinon le spam vous inondera ou pire, le spam vous inondera.

 # SPF policyd-spf_time_limit = 3600 

Configuration d'un type de plugin lié à la vérification SPF des messages entrants.

 # 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 

En configurant toutes les lettres sortantes, nous devons fournir une signature DKIM.

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

Il s'agit d'un détail clé dans le routage des e-mails lors de l'envoi d'e-mails à partir de scripts php.

Fichier "/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 utilise n'importe quelle version de php (c'est génial lorsque vous pouvez utiliser une version différente de php et même un php.ini différent sur le même serveur pour les sites voisins).

Ainsi, un utilisateur Linux particulier "www-domain2" a un site domain2.com. Ce site a un code pour envoyer des lettres sans spécifier le champ from.

Ainsi, même dans ce cas, les lettres disparaîtront correctement et n'entreront jamais dans le spam.
Mon "/etc/postfix/master.cf" ressemble à ceci:

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

Le fichier n'est pas complètement fourni - il est déjà très volumineux.
N'a noté que ce qui a été changé.

 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} 

Ce sont les paramètres liés au spamassasin, à ce sujet plus tard.

 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 

Nous vous permettons de vous connecter au serveur de messagerie via le port 587.
Pour ce faire, assurez-vous de vous connecter.

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

Activez la vérification SPF.

 apt-get install postfix-policyd-spf-python 

Installez le package pour les vérifications SPF ci-dessus.

 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" et "smtp_bind_address6" - c'est ainsi que nous activons la prise en charge IPv6.
Pour IPv6, vous devez également enregistrer rDNS.
"Syslog_name" - et ceci pour la commodité de la lecture des journaux.
Je recommande d' acheter des certificats ici .

Mise en place d'un tas de postfix + pigeonnier ici .

Configuration SPF.

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


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

Configurez mysql, installez les packages eux-mêmes.

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

 disable_plaintext_auth = yes auth_mechanisms = plain login 

L'autorisation est uniquement cryptée.

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

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

Ici, nous indiquons l'emplacement des lettres.

Je veux qu'ils soient stockés dans des fichiers et regroupés par domaine.

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

Il s'agit du fichier de paramètres principal de pigeonnier.
Ici, nous déconnectons les connexions non sécurisées.
Et activez des connexions sécurisées.

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

Configurez ssl. Nous indiquons que SSL est requis.
Et le certificat lui-même. Et un détail important est la directive «locale». Indique lors de la connexion à quel IPv4 local - quel certificat SSL utiliser.

Par ailleurs, IPv6 n'est pas configuré ici, je corrigerai cette omission en tant que thread plus tard.
XX.XX.XX.X5 (domaine2) - aucun certificat. Pour connecter des clients, vous devez spécifier domain1.com.
XX.XX.XX.X2 (domaine3) - il existe un certificat, vous pouvez spécifier domaine1.com ou domaine3.com pour connecter les clients.
Fichier "/etc/dovecot/conf.d/15-lda.conf"

 protocol lda { mail_plugins = $mail_plugins sieve } 

Cela sera nécessaire à l'avenir pour spamassassin.

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

 protocol imap { mail_plugins = $mail_plugins antispam } 

Il s'agit d'un plugin antispam. Il est nécessaire pour la formation de spamassasin au moment du transfert vers / depuis le dossier Spam.

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

 protocol pop3 { } 

Un tel fichier l'est.

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

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

Configurez lmtp.

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

Paramètres d'entraînement Spamassasin au moment du transfert vers / depuis le dossier Spam.

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

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

Un fichier qui indique quoi faire avec les e-mails entrants.

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

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

Il est nécessaire de compiler le fichier: "sievec default.sieve".

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

Spécification des fichiers SQL pour l'autorisation.
Et le fichier lui-même est un moyen d'autorisation.

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

Cela correspond aux mêmes paramètres pour postfix.

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

Le fichier de configuration principal.
La chose importante est que nous spécifions ici, ajoutons des protocoles.

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


 apt-get install spamassassin spamc 

Installez les packages.

 adduser spamd --disabled-login 

Ajoutez un utilisateur au nom duquel.

 systemctl enable spamassassin.service 

Activez le service de téléchargement automatique de spamassassin au démarrage.

Fichier "/ etc / default / spamassassin":

 CRON=1 

Activez la mise à jour automatique des règles par défaut.

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

Il est nécessaire de faire de la base de données «sa» dans mysql avec l'utilisateur «sa» avec le mot de passe «mot de passe» (remplacer par quelque chose d'adéquat).

report_safe - au lieu d'une lettre, un rapport sur le spam sera envoyé.
use_bayes sont des paramètres de machine learning spamassassin.

Les paramètres de spamassassin restants ont été appliqués plus haut dans l'article.

Le paramètre général est spamassassin .
À propos du déplacement de nouveaux e-mails de spam dans le dossier de spam IMAP .
À propos d'un simple groupe de Dovecot + SpamAssassin .
Je recommande de lire la théorie de l'apprentissage du spamassasin lors du déplacement de lettres dans des dossiers imap (et je ne le recommande pas pour une utilisation) .

============== Contacter la communauté ==============


Je voudrais également lancer une idée dans la communauté sur la façon d'augmenter le niveau de sécurité des lettres transférées. Depuis que je suis tellement plongé dans le sujet du courrier.

Afin que l'utilisateur puisse créer une paire de clés sur son client (Outlook, Thunderbird, plugin de navigateur, ...). Public et privé. Public - envoyer au DNS. Privé - enregistrer pour le client. Les serveurs de messagerie pourraient utiliser la clé publique pour envoyer à un destinataire spécifique.

Et pour vous protéger contre le spam avec de tels e-mails (oui, le serveur de messagerie ne pourra pas voir le contenu) - vous devrez entrer 3 règles:

  1. Signature DKIM réelle obligatoire, SPF obligatoire, rDNS obligatoire.
  2. Un réseau de neurones sur le thème de la formation antispam + DB sur celui-ci côté client.
  3. L'algorithme de chiffrement doit être tel que le côté émetteur doit dépenser 100 fois plus de puissance CPU sur le chiffrement que le côté récepteur.

En plus des lettres publiques - pour développer une lettre d'invitation standard "pour commencer la correspondance sécurisée." L'un des utilisateurs (boîte aux lettres) envoie une lettre à l'autre boîte aux lettres avec une pièce jointe. Dans la lettre, la proposition de texte pour démarrer un canal de communication sécurisé pour la correspondance et la clé publique du propriétaire de la boîte aux lettres (avec la clé privée côté client).

Vous pouvez même créer une paire de clés spécifiquement pour chaque correspondance. L'utilisateur destinataire peut accepter cette offre et envoyer sa clé publique (également faite spécialement pour cette correspondance). Ensuite, le premier utilisateur envoie une lettre de contrôle de service (cryptée avec la clé publique du deuxième utilisateur) - à la réception de laquelle le deuxième utilisateur peut considérer le canal de communication formé comme fiable. Ensuite, le deuxième utilisateur envoie une lettre de contrôle - puis le premier utilisateur peut également considérer le canal formé comme protégé.

Pour lutter contre l'interception de clés sur la route - il est nécessaire dans le protocole de prévoir la possibilité de transmettre au moins une clé publique à l'aide d'une clé USB.

Et surtout, que tout fonctionne (la question est «qui va payer pour ça?»):
Introduisez des certificats de messagerie d'une valeur de 10 $ pour 3 ans. Ce qui permettra à l'expéditeur d'indiquer en DNS que "mes clés publiques sont là". Et ils donneront l'occasion de démarrer une connexion sécurisée. En même temps, prenez ces composés gratuitement.
gmail monétise enfin ses utilisateurs. Pour 10 $ en 3 ans - le droit de créer des canaux de correspondance sécurisés.

============== Conclusion ==============


Pour tester l'intégralité de l'article, j'allais louer un serveur dédié pendant un mois et acheter un domaine avec un certificat SSL.

Mais les circonstances de la vie se sont développées, ce problème a donc traîné pendant 2 mois.
Et lorsque le temps libre est à nouveau apparu - j'ai décidé de publier l'article tel quel, sans risquer que la publication soit retardée d'un an.

S'il y a beaucoup de questions comme «mais cela n'est pas décrit suffisamment en détail» - alors il y aura probablement des forces pour prendre un serveur dédié avec un nouveau domaine et un nouveau certificat SSL et décrire plus en détail et surtout - identifier tous les détails importants manquants.

J'aimerais également recevoir des commentaires sur le sujet des idées sur les certificats de courrier. Si vous aimez l'idée, je vais essayer de trouver la force d'écrire un brouillon pour rfc.

— .
— .
.

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


All Articles