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

Este artículo trata sobre cómo configurar un servidor de correo moderno.
Postfix + Dovecot. SPF + DKIM + rDNS. Con IPv6.
Con cifrado TLS. Con soporte para múltiples dominios, parte con un certificado SSL real.
Con protección antispam y alta calificación antispam en otros servidores de correo.
Con soporte para múltiples interfaces físicas.
Con OpenVPN, que se conecta a través de IPv4 y que proporciona IPv6.

Si no desea aprender todas estas tecnologías, pero desea configurar dicho servidor, este artículo es para usted.

No hay intentos de explicar cada detalle en el artículo. La explicación va a lo que no está configurado de manera estándar o es importante desde el punto de vista del consumidor.

La motivación para configurar un servidor de correo es mi viejo sueño. Puede sonar tonto, pero en mi humilde opinión, es mucho mejor que soñar con un auto nuevo de su marca favorita.

La motivación para configurar IPv6 es dos. Los profesionales de TI necesitan aprender nuevas tecnologías constantemente para sobrevivir. Quisiera hacer mi modesta contribución a la lucha contra la censura.

La motivación para configurar OpenVPN es solo para que IPv6 funcione en la máquina local.
La motivación para configurar varias interfaces físicas es que en mi servidor una interfaz es "lenta pero ilimitada" y la otra es "rápida, pero con una tarifa".

La motivación para configurar los ajustes de Bind es que mi proveedor proporciona un servidor DNS inestable y Google también se bloquea. Quiero un servidor DNS estable para uso personal.

Motivación para escribir un artículo: un borrador se escribió hace 10 meses y ya lo he examinado dos veces. Si incluso el autor necesita esto regularmente, existe una alta probabilidad de que otros lo necesiten.

No hay una solución universal para el servidor de correo. Pero intentaré escribir algo como "hazlo así y luego, cuando todo funcione como debería, tira el exceso".

Hay un servidor de Colocación de tech.ru. Es posible comparar con OVH, Hetzner, AWS. Para resolver este problema, la cooperación con tech.ru será mucho más efectiva.

Debian 9 está instalado en el servidor.

En el servidor hay 2 interfaces `eno1` y` eno2`. El primero es ilimitado y el segundo es rápido, respectivamente.

Hay 3 direcciones IP estáticas, XX.XX.XX.X0 y XX.XX.XX.X1 y XX.XX.XX.X2 en la interfaz `eno1` y XX.XX.XX.X5 en la interfaz` eno2`.

Hay XXXX: XXXX: XXXX: XXXX :: / 64 un conjunto de direcciones IPv6 que se asignan a la interfaz `eno1` y desde allí XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 a mi solicitud asignado a` eno2`.

Hay 3 dominios `dominio1.com`,` dominio2.com`, `dominio3.com`. Para `dominio1.com` y`dominio3.com` hay un certificado SSL.

Hay una cuenta de Google a la que desea vincular el buzón `vasya.pupkin @ domain1.com` (recibir correo y enviar correo directamente desde la interfaz de gmail).
Debería haber un buzón `support @ domain2.com`, una copia del correo desde el que quiero ver en mi correo. Y rara vez es posible enviar algo en nombre de `support @ domain2.com` a través de la interfaz web.

Debería haber un buzón `ivanov @ domain3.com`, que Ivanov usará desde su iPhone.

Las cartas enviadas deben cumplir con todos los requisitos actuales contra correo no deseado.
Debe haber el nivel más alto de cifrado proporcionado en las redes públicas.
Debe haber compatibilidad con IPv6 para enviar y recibir correos electrónicos.
Debe haber un SpamAssassin que nunca borre correos electrónicos. Y rebotará, saltará o enviará la carpeta Spam a IMAP.
El autoaprendizaje de SpamAssassin debe configurarse: si muevo la letra a la carpeta Spam, aprenderé de esto; Si muevo la carta de la carpeta Spam, aprenderé de esto. Resultados de aprendizaje de SpamAssassin: deben afectar el alcance del mensaje en la carpeta Spam.
Los scripts PHP deberían poder enviar correo en nombre de cualquier dominio en este servidor.
Debe haber un servicio openvpn con la capacidad de usar IPv6 en un cliente que no tiene IPv6.

Primero debe configurar las interfaces y el enrutamiento, incluido IPv6.
Luego, deberá configurar OpenVPN, que se conectará a través de IPv4 y proporcionará al cliente una dirección IPv6 estática-real. Este cliente tendrá acceso a todos los servicios IPv6 en el servidor y acceso a cualquier recurso IPv6 en Internet.
Entonces será necesario configurar Postfix para enviar cartas + SPF + DKIM + rDNS y otras bagatelas similares.
Luego deberá configurar Dovecot y configurar Multidominio.
Luego deberá configurar SpamAssassin y configurar el entrenamiento.
Finalmente, instale Bind.

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


Para configurar las interfaces, debe registrar esto en "/ 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 

Esta configuración se puede aplicar en cualquier servidor en tech.ru (con una pequeña coordinación con el soporte) e inmediatamente funcionará como debería.

Si la experiencia de configurar cosas similares para Hetzner, OVH - hay novia. Más duro

eno1 es el nombre de la tarjeta de red n. ° 1 (lenta pero ilimitada).
eno2 es el nombre de la tarjeta de red # 2 (rápido, pero con una tarifa).
tun0 es el nombre de la tarjeta de red virtual de OpenVPN.
XX.XX.XX.X0 - IPv4 # 1 en eno1.
XX.XX.XX.X1 - IPv4 # 2 en eno1.
XX.XX.XX.X2 - IPv4 # 3 en eno1.
XX.XX.XX.X5 - IPv4 # 1 en eno2.
XX.XX.XX.1: puerta de enlace IPv4.
XXXX: XXXX: XXXX: XXXX :: / 64 - IPv6 a todo el servidor.
XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 - IPv6 para eno2, todo lo demás va a eno1 desde el exterior.
XXXX: XXXX: XXXX: XXXX :: 1 - Puerta de enlace IPv6 (vale la pena señalar que puede / necesita hacer un amigo aquí. Indique el interruptor IPv6).
dns-nameservers: se especifican 127.0.0.1 (porque bind está instalado localmente) y 213.248.1.6 (esto es de tech.ru).

“Table eno1t” y “table eno2t”: el significado de estas reglas de ruta es que el tráfico que pasa por eno1 -> lo atraviesa y el tráfico que pasa por eno2 -> lo atraviesa. Y también las conexiones iniciadas por el servidor pasarían por eno1.

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

Con este comando establecemos que cualquier tráfico incomprensible que se encuentre bajo cualquier regla con "tabla eno1t" marcado -> enviar a la interfaz eno1.

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

Con este comando configuramos que dirija cualquier tráfico iniciado por el servidor a la interfaz eno1.

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

Con este comando, establecemos las reglas para marcar el tráfico nosotros mismos.

 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 

Este bloque define el segundo IPv4 para la interfaz eno1.

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

Con este comando establecemos la ruta desde clientes OpenVPN a IPv4 local, excepto XX.XX.XX.X0.
¿Por qué este comando es suficiente para todos los IPv4? Todavía no lo entiendo.

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

Esto establecemos la dirección de la interfaz en sí. El servidor lo usará como una dirección "saliente". Ya no se utilizará.

¿Por qué se indica ": 1: 1 ::" tan complicado? Que OpenVPN funcionó correctamente y solo para esto. Más sobre esto más tarde.

Sobre el tema de la puerta de enlace: así es como funciona. Pero de la manera correcta: aquí debe especificar el conmutador IPv6 al que está conectado el servidor.

Sin embargo, por alguna razón, IPv6 deja de funcionar si hago esto. Tal vez estos sean algunos problemas de tech.ru.

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

Esto está agregando direcciones IPv6 a la interfaz. Si necesita cien direcciones, significa cien líneas en este archivo.

 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 

Marcó las direcciones y subredes de todas las interfaces para que quedara claro.
eno1 - debe ser "/ 64" - porque este es nuestro grupo completo de direcciones.
tun0: la subred debe ser mayor que eno1. De lo contrario, no puede configurar la puerta de enlace IPv6 para clientes OpenVPN.
eno2: la subred debe ser más grande que tun0. De lo contrario, los clientes de OpenVPN no podrán obtener direcciones IPv6 locales.
Para mayor claridad, elegí el paso 16 de subred, pero incluso puede tomar el paso "1" si lo desea.
En consecuencia, 64 + 16 = 80 y 80 + 16 = 96.

Para mayor claridad:
XXXX: XXXX: XXXX: XXXX: 1: 1: AAAA: AAAA: estas son direcciones que deben asignarse a sitios o servicios específicos en la interfaz eno1.
XXXX: XXXX: XXXX: XXXX: 1: 2: AAAA: AAAA: estas son direcciones que deben asignarse a sitios o servicios específicos en la interfaz eno2.
XXXX: XXXX: XXXX: XXXX: 1: 3: AAAA: AAAA son direcciones que deben asignarse a clientes OpenVPN o usarse como direcciones de servicio OpenVPN.


Para configurar la red, debería ser posible reiniciar el servidor.
Los cambios de IPv4 se recogen durante la ejecución (asegúrese de incluirlo en la pantalla; de lo contrario, este comando simplemente dejará caer la red en el servidor):

 /etc/init.d/networking restart 

En el archivo "/ etc / iproute2 / rt_tables" agregue al final:

 100 eno1t 101 eno2t 

Sin esto, no puede usar tablas personalizadas en el archivo "/ etc / network / interfaces".
Los números deben ser únicos e inferiores a 65535.

Los cambios de IPv6 cambian fácilmente sin reiniciar, pero para esto necesita aprender al menos tres comandos:

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

Configuración 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 

Estas son las configuraciones sysctl de mi servidor. Tomo nota de lo importante.

 net.ipv4.ip_forward = 1 

Sin esto, OpenVPN no funcionará de ninguna manera.

 net.ipv6.ip_nonlocal_bind = 1 

Cualquier persona que intente vincular IPv6 (por ejemplo nginx) justo después de que la interfaz esté activada recibirá un error. Que tal dirección no está disponible.

Para evitar tal situación, se realiza dicha configuración.

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

Sin estas configuraciones de IPv6, el tráfico del cliente OpenVPN no va al mundo.

Otras configuraciones son irrelevantes o no recuerdo por qué lo son.
Pero por si acaso, lo dejo "como está".

Para que los cambios en este archivo se recojan sin reiniciar el servidor, debe ejecutar el comando:

 sysctl -p 

Más detalles sobre las reglas de "tabla": habr.com/post/108690

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


OpenVPN IPv4 no funciona sin iptables.

Tengo estas iptables para 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 es mi dirección IPv4 estática de la máquina local.
10.8.0.0/24: red IPv4 openvpn. Direcciones IPv4 para clientes openvpn.
La secuencia de reglas es 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 

Esta es una limitación para que solo yo pueda usar OpenVPN desde mi IP estática.

 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 

Para reenviar paquetes IPv4 entre clientes OpenVPN e Internet, debe registrar uno de estos comandos.

Para diferentes casos, una de las opciones no es adecuada.
Ambos equipos son adecuados para mi caso.
Después de leer la documentación, elegí la primera opción, porque consume menos CPU.

Para que todas las configuraciones de iptables se recojan después del reinicio, debe guardarlas en algún lugar.

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

Tales nombres no fueron elegidos por casualidad. El paquete iptables-persistent los usa.

 apt-get install iptables-persistent 

Instalación del paquete principal de OpenVPN:

 apt-get install openvpn easy-rsa 

Configure una plantilla para certificados (sustituya sus valores):

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

Editemos la configuración de la plantilla de certificado:

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

Crear un certificado de servidor:

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

Prepararemos la oportunidad de crear los archivos resultantes "client-name.opvn":

 mkdir -p ~/client-configs/files chmod 700 ~/client-configs/files cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf mcedit ~/client-configs/base.conf 

 # Client mode client # Interface tunnel type dev tun # TCP protocol proto tcp-client # Address/Port of VPN server remote XX.XX.XX.X0 1194 # Don't bind to local port/address nobind # Don't need to re-read keys and re-create tun at restart persist-key persist-tun # Remote peer must have a signed certificate remote-cert-tls server ns-cert-type server # Enable compression comp-lzo # Custom ns-cert-type server tls-auth ta.key 1 cipher DES-EDE3-CBC 

Prepararemos un script que unirá todos los archivos en un solo archivo 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 

Creamos el primer cliente OpenVPN:

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

El archivo "~ / client-configs / files / client-name.ovpn" se envía al cliente.

Para los clientes de iOS, deberá hacer el truco:
El contenido de la etiqueta tls-auth debe estar sin comentarios.
Y también ponga "key-direction 1" inmediatamente antes de la etiqueta "tls-auth".

Configure la configuración del servidor 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 

Esto es necesario para establecer una dirección estática para cada cliente (no es necesario, pero yo uso):

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

El detalle más difícil y clave.

Desafortunadamente, OpenVPN aún no puede configurar de manera independiente la puerta de enlace IPv6 para los clientes.
Tenemos que reenviar esto manualmente para cada cliente.

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

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


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

Ambos scripts usan el archivo "/ etc / openvpn / variables":

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

¿Por qué está escrito aquí? Me resulta difícil recordarlo.

Ahora parece extraño netmask = 112 (justo debería haber 96).
Y el prefijo es extraño, no coincide con la red tun0.
Pero está bien, lo dejo "como está".

 cipher DES-EDE3-CBC 

Este es un aficionado: elegí este método de cifrar la conexión.

Más información sobre cómo configurar OpenVPN IPv4.

Más información sobre cómo configurar OpenVPN IPv6.

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


Instalación del paquete principal:

 apt-get install postfix 

Al instalar, seleccione "sitio de internet".

Mi "/etc/postfix/main.cf" se ve así:

 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 

Consideremos los detalles de esta configuración.

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



Según los ciudadanos de Khabrovsk, este bloque contiene "información errónea y tesis falsas".
Solo 8 años después del comienzo de mi carrera, comencé a entender cómo funciona SSL.

Por lo tanto, me tomaré la libertad de describir cómo usar SSL (sin responder las preguntas “¿Cómo funciona?” Y “¿Por qué funciona?”).

La base del cifrado moderno es la creación de un par de claves (dos líneas muy largas de caracteres).

Una "clave" es privada, la otra es "pública". Mantenemos la clave privada con mucho cuidado en secreto. Distribuimos la clave pública a todos.

Con una clave pública, puede cifrar una cadena de texto para que solo el propietario de la clave privada pueda descifrar.
Bueno, esa es toda la base de la tecnología.

Paso # 1 - sitios https.
Al acceder al sitio, el navegador aprende del servidor web que el sitio es https y, por lo tanto, solicita una clave pública.
El servidor web da la clave pública. Usando la clave pública, el navegador encripta la solicitud http y la envía.
El contenido de la solicitud http solo puede ser leído por alguien que tenga una clave privada, es decir, solo el servidor al que se realiza la llamada.
Http-request contiene al menos un URI. Por lo tanto, si el país está tratando de restringir el acceso no a todo el sitio, sino a una página específica, entonces para los sitios https esto no se puede hacer.

El paso 2 es la respuesta encriptada.
El servidor web proporciona una respuesta que se puede leer fácilmente en el camino.
La solución es extremadamente simple: el navegador genera localmente el mismo par de claves pública-privada para cada sitio https.
Y junto con la solicitud de la clave pública del sitio, envía su clave pública local.
El servidor web lo recuerda y, cuando envía una respuesta http, se cifra con esta clave pública de un cliente específico.
Ahora, la respuesta http solo puede ser descifrada por el propietario de la clave privada del navegador del cliente (es decir, el propio cliente).

Paso número 3: establecer una conexión segura a través de un canal público.
En el ejemplo No. 2 hay una vulnerabilidad: nada impide que los simpatizantes intercepten la solicitud http y editen la información de clave pública.
Por lo tanto, el intermediario verá casi todo el contenido de los mensajes enviados y recibidos hasta que cambie el canal de comunicación.
Combatir esto es extremadamente simple: simplemente envíe la clave pública del navegador como un mensaje cifrado con la clave pública del servidor web.
El servidor web envía una respuesta como "su clave pública es así" y cifra este mensaje con la misma clave pública.
El navegador mira la respuesta: si se recibe el mensaje "su clave pública es así", esta es una garantía del 100% de que este canal de comunicación es seguro.
¿Qué tan seguro es?
La creación de un canal de comunicación tan seguro ocurre a una velocidad ping * 2. Por ejemplo, 20ms.
Un atacante debe tener la clave privada de una de las partes por adelantado. O tome una clave privada por un par de milisegundos.
Hackear una clave privada moderna llevará décadas en una supercomputadora.

Paso # 4: base de datos pública de claves públicas.
Obviamente, en toda esta historia existe la posibilidad de que un atacante se sienta en el canal de comunicación entre el cliente y el servidor.
El servidor presenta la oportunidad para el cliente y el cliente debe presentar el servidor. Y emule un par de claves en ambas direcciones.
Luego, el atacante verá todo el tráfico y podrá "editar" el tráfico.
Por ejemplo, cambie la dirección donde enviar dinero o copie la contraseña del banco en línea o bloquee el contenido "objetable".
Para combatir a estos atacantes, crearon una base de datos pública con claves públicas para cada sitio https.
Cada navegador "sabe" acerca de la existencia de aproximadamente 200 de estas bases de datos. Esto está preinstalado en cada navegador.
El "conocimiento" está respaldado por una clave pública para cada certificado. Es decir, es imposible simular una conexión con cada autoridad de certificación específica.

Ahora hay una comprensión simple de cómo usar SSL para https.
Si mueve sus cerebros, quedará claro cómo los servicios especiales pueden descifrar algo en este diseño. Pero les costará enormes esfuerzos.
Y organizaciones más pequeñas que la NSA o la CIA: es casi imposible romper el nivel de protección existente, incluso para vip.

También agregaré sobre conexiones ssh. No hay claves públicas, qué hacer. El problema se resuelve de dos maneras.
Opción de contraseña ssh:
En la primera conexión, el cliente ssh debería advertir que aquí tenemos una nueva clave pública del servidor ssh.
Y con más conexiones, si aparece la advertencia "una nueva clave pública del servidor ssh", significará que están tratando de escucharlo.
O en la primera conexión que le escucharon, y ahora está hablando con el servidor sin intermediarios.
En realidad, debido al hecho de que las escuchas telefónicas se revelan fácil, rápidamente y sin esfuerzo, este ataque se usa solo en casos especiales para un cliente específico.

Opción ssh clave:
Tomamos una unidad flash, escribimos una clave privada para el servidor ssh (para esto hay términos y muchos matices importantes, pero estoy escribiendo un programa educativo, no instrucciones de uso).
Dejamos la clave pública en la máquina donde estará el cliente ssh y también la mantenemos en secreto.
Traemos la unidad flash al servidor, pegamos, copiamos la clave privada y la quemamos y dispersamos el polvo en el viento (o al menos formateamos con ceros).
Eso es todo: después de tal operación, será imposible descifrar una conexión ssh de este tipo. Por supuesto, durante 10 años puedes ver el tráfico en una supercomputadora, pero esta es una historia diferente.

Pido disculpas por el tema.
Así que ahora que se conoce la teoría. Le contaré sobre el flujo de creación del certificado SSL.

Usando "openssl genrsa" creamos una clave privada y "espacios en blanco" para la clave pública.
Enviamos los "espacios en blanco" a una empresa externa, a la que pagamos aproximadamente $ 9 por el certificado más simple.

En un par de horas, recibimos de esta compañía de terceros nuestra clave "pública" y otro conjunto de varias claves públicas.

¿Por qué una compañía de terceros debe pagar por la emisión de mi clave pública? Un tema separado que no consideraremos aquí.

Ahora está claro cuál es el significado de la inscripción:

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

En la carpeta "/ etc / ssl" se almacenan todos los archivos para las preguntas SSL.
dominio1.com: nombre de dominio.
2018 es el año de la creación de claves.
"Clave": designación de que el archivo es de clave privada.

Y el significado de este archivo:

smtpd_tls_cert_file = / etc / ssl / domain1.com.2018.chained.crt
dominio1.com: nombre de dominio.
2018 es el año de la creación de claves.
encadenado: una designación de que hay una cadena de claves públicas (la primera es nuestra clave pública y el resto es lo que proviene de la empresa que emitió la clave pública).
crt: designación de que hay un certificado listo (clave pública con explicaciones técnicas).

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

Esta configuración no se utiliza en este caso, pero se escribe como un ejemplo.

Debido a que un error en este parámetro conducirá al envío de spam desde su servidor (sin su voluntad).

Luego demuestre a todos que no tiene la culpa.

 recipient_delimiter = + 

Quizás muchos no lo saben, por lo que este es un símbolo estándar para el pastoreo, y esto es compatible con la mayoría de los servidores de correo modernos.

Por ejemplo, si tiene un buzón "username@gmail.com" intente enviarlo a "username+spam@gmail.com" - vea qué sucede.

 inet_protocols = ipv4 

Quizás esto sea confuso.

Pero esto no es justo. Cada nuevo dominio es por defecto solo IPv4, luego habilito IPv6 para cada uno individualmente.

 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 

Aquí establecemos que todo el correo entrante va a palomar.
Y las reglas para dominio, buzón, alias: busque en la base de datos.

/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 

Ahora, Postfix sabe que solo puede aceptar correo para su posterior envío mediante autorización con Dovecot.

Realmente no entiendo por qué esto se duplica aquí. Ya hemos indicado en virtual_transport todo lo que se necesita.

Pero el sistema de postfix es muy antiguo, probablemente sean los castillos de los viejos tiempos.

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

Esto se configura para cada servidor de correo a su manera.

Tengo 3 servidores de correo a mi disposición y estas configuraciones son muy diferentes debido a los diferentes requisitos de uso.

Debe configurar con cuidado; de lo contrario, el spam lo inundará o, lo que es peor, el spam lo inundará.

 # SPF policyd-spf_time_limit = 3600 

Configuración para algún tipo de complemento relacionado con la verificación SPF de mensajes entrantes.

 # 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 

Configurando que todas las cartas salientes debemos proporcionar una firma DKIM.

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

Este es un detalle clave en el enrutamiento de correo electrónico al enviar correos electrónicos desde scripts php.

Archivo "/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 usa cualquier versión de php (esto es genial cuando puedes usar una versión diferente de php e incluso un php.ini diferente en el mismo servidor para sitios vecinos).

Por lo tanto, un usuario de Linux en particular "www-domain2" tiene un sitio domain2.com. Este sitio tiene un código para enviar cartas sin especificar el campo de origen.

Entonces, incluso en este caso, las letras desaparecerán correctamente y nunca entrarán en el correo basura.
Mi "/etc/postfix/master.cf" tiene este aspecto:

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

El archivo no está completamente dado, ya es muy grande.
Notó solo lo que ha cambiado.

 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} 

Estos son los ajustes relacionados con spamassasin, sobre esto más adelante.

 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 

Le permitimos conectarse al servidor de correo a través del puerto 587.
Para hacer esto, asegúrese de iniciar sesión.

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

Activa la verificación SPF.

 apt-get install postfix-policyd-spf-python 

Instale el paquete para verificaciones SPF anteriores.

 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" y "smtp_bind_address6": así es como habilitamos el soporte de IPv6.
Para IPv6, también debe registrar rDNS.
"Syslog_name", y esto es para la conveniencia de leer registros.
Recomiendo comprar certificados aquí .

Configurando un montón de postfix + dovecot aquí .

Configuración de SPF.

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


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

Configure mysql, instale los paquetes ellos mismos.

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

 disable_plaintext_auth = yes auth_mechanisms = plain login 

La autorización solo está encriptada.

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

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

Aquí indicamos la ubicación de las letras.

Quiero que se almacenen en archivos y se agrupen por dominio.

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

Este es el archivo de configuración principal de palomar.
Aquí desconectamos las conexiones no seguras.
Y permitir conexiones seguras.

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

Configurar ssl. Indicamos que se requiere ssl.
Y el certificado en sí. Y un detalle importante es la directiva "local". Indica cuando se conecta a qué IPv4 local, qué certificado SSL usar.

Por cierto, IPv6 no está configurado aquí, corregiré esta omisión como un hilo más adelante.
XX.XX.XX.X5 (dominio2): sin certificado. Para conectar clientes, debe especificar domain1.com.
XX.XX.XX.X2 (dominio3): hay un certificado, puede especificar dominio1.com o dominio3.com para conectar clientes.
Archivo "/etc/dovecot/conf.d/15-lda.conf"

 protocol lda { mail_plugins = $mail_plugins sieve } 

Esto será necesario en el futuro para spamassassin.

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

 protocol imap { mail_plugins = $mail_plugins antispam } 

Este es un complemento antispam. Es necesario para entrenar spamassasin en el momento de la transferencia hacia / desde la carpeta Spam.

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

 protocol pop3 { } 

Solo ese archivo es.

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

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

Configurar lmtp.

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

Configuración de entrenamiento de Spamassasin en el momento de la transferencia hacia / desde la carpeta Spam.

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

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

Un archivo que indica qué hacer con los correos electrónicos entrantes.

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

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

Es necesario compilar el archivo: "sievec default.sieve".

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

Especificación de archivos sql para autorización.
Y el archivo en sí es una forma de autorización.

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

Esto corresponde a la misma configuración para postfix.

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

El archivo de configuración principal.
Lo importante es que especificamos aquí, agregamos protocolos.

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


 apt-get install spamassassin spamc 

Instala los paquetes.

 adduser spamd --disabled-login 

Agregue un usuario en cuyo nombre.

 systemctl enable spamassassin.service 

Active el servicio de descarga automática spamassassin en el arranque.

Archivo "/ etc / default / spamassassin":

 CRON=1 

Active la actualización automática de reglas de forma predeterminada.

Archivo "/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 necesario hacer la base de datos "sa" en mysql con el usuario "sa" con la contraseña "contraseña" (reemplazar con algo adecuado).

report_safe: en lugar de una carta, se enviará un informe sobre el mensaje de spam.
use_bayes son configuraciones de aprendizaje automático de spamassassin.

Las configuraciones restantes de spamassassin se aplicaron anteriormente en el artículo.

El escenario general es spamassassin .
Acerca de mover nuevos correos electrónicos no deseados a la carpeta de correo no deseado IMAP .
Sobre un simple grupo de Dovecot + SpamAssassin .
Recomiendo leer la teoría de aprender spamassasin al mover letras en carpetas imap (y no lo recomiendo para su uso) .

============== Contactando a la comunidad ==============


También me gustaría lanzar una idea a la comunidad sobre cómo aumentar el nivel de seguridad de las cartas enviadas. Ya que estoy tan profundamente inmerso en el tema del correo.

Para que el usuario pueda crear un par de claves en su cliente (Outlook, Thunderbird, navegador-plugin, ...). Público y privado. Público: enviar a DNS. Privado: guardar en el cliente. Los servidores de correo podrían usar la clave pública para enviar a un destinatario específico.

Y para protegerse contra el correo no deseado con dichos correos electrónicos (sí, el servidor de correo no podrá ver el contenido), será necesario introducir 3 reglas:

  1. Firma DKIM real obligatoria, SPF obligatorio, rDNS obligatorio.
  2. Una red neuronal sobre el tema del entrenamiento antispam + DB en el lado del cliente.
  3. El algoritmo de cifrado debe ser tal que el lado emisor debe gastar 100 veces más potencia de CPU en el cifrado que el lado receptor.

Además de las cartas públicas, para desarrollar una carta de invitación estándar "para comenzar una correspondencia segura". Uno de los usuarios (buzón) envía una carta al otro buzón con un archivo adjunto. En la carta, la propuesta de texto para iniciar un canal de comunicación seguro para la correspondencia y la clave pública del propietario del buzón (con la clave privada en el lado del cliente).

Incluso puede hacer un par de claves específicamente para cada correspondencia. El usuario receptor puede aceptar esta oferta y enviar su clave pública (también hecha específicamente para esta correspondencia). Luego, el primer usuario envía una carta de control de servicio (encriptada con la clave pública del segundo usuario), al recibirla, el segundo usuario puede considerar confiable el canal de comunicación formado. Luego, el segundo usuario envía una carta de control, y luego el primer usuario también puede considerar el canal formado como protegido.

Para combatir la interceptación de claves en el camino, es necesario en el protocolo proporcionar la posibilidad de transmitir al menos una clave pública utilizando una unidad flash.

Y lo más importante, que todo funciona (la pregunta es "¿quién pagará por ello?"):
Introduzca certificados por correo con un valor de $ 10 por 3 años. Lo que permitirá al remitente indicar en dns que "mis claves públicas están ahí afuera". Y le darán la oportunidad de iniciar una conexión segura. Al mismo tiempo, tome tales compuestos de forma gratuita.
gmail finalmente monetiza a sus usuarios. Por $ 10 en 3 años: el derecho a crear canales seguros de correspondencia.

============== Conclusión ==============


Para probar todo el artículo, iba a alquilar un servidor dedicado durante un mes y comprar un dominio con un certificado SSL.

Pero las circunstancias de la vida se desarrollaron, por lo que este problema se prolongó durante 2 meses.
Y cuando apareció nuevamente el tiempo libre, decidí publicar el artículo tal cual y no arriesgarme a que la publicación se retrase un año más.

Si hay muchas preguntas como "pero esto no se describe con suficiente detalle", entonces probablemente habrá fuerzas para tomar un servidor dedicado con un nuevo dominio y un nuevo certificado SSL y describir con más detalle y lo más importante: identificar todos los detalles importantes que faltan.

También me gustaría recibir comentarios sobre el tema de ideas sobre certificados de correo. Si te gusta la idea, intentaré encontrar la fuerza para escribir un borrador para rfc.

— .
— .
.

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


All Articles