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

Este artículo trata sobre cómo configurar un servidor de correo moderno.
Postfijo + Palomar. SPF + DKIM + rDNS. Con IPv6.
Con cifrado TSL. Con soporte para múltiples dominios, parte con un certificado SSL real.
Con protección antispam y una alta calificación antispam de otros servidores de correo.
Admite múltiples interfaces físicas.
Con OpenVPN, cuya conexión es vía IPv4, y que proporciona IPv6.

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

El artículo no intenta explicar todos los detalles. La explicación va a aquello que no está configurado de serie o es importante desde el punto de vista del consumidor.

La motivación para configurar un servidor de correo ha sido un sueño que tuve desde hace mucho tiempo. Esto puede parecer estúpido, pero en mi humilde opinión, es mucho mejor que soñar con un auto nuevo de tu marca favorita.

Hay dos motivaciones para configurar IPv6. Un especialista en TI necesita aprender nuevas tecnologías constantemente para poder sobrevivir. Me gustaría hacer mi modesta contribución a la lucha contra la censura.

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

La motivación para configurar los ajustes de Bind es que mi ISP proporciona un servidor DNS inestable y, a veces, Google también falla. Quiero un servidor DNS estable para uso personal.

Motivación para escribir un artículo: escribí un borrador hace 10 meses y ya lo leí dos veces. Incluso si el autor lo necesita con regularidad, existe una alta probabilidad de que otros también lo necesiten.

No existe una solución universal para un servidor de correo. Pero intentaré escribir algo como "haz esto y luego, cuando todo funcione como debería, desecha el material sobrante".

La empresa tech.ru tiene un servidor de colocación. Es posible comparar con OVH, Hetzner, AWS. Para solucionar este problema, la cooperación con tech.ru será mucho más eficaz.

Debian 9 está instalado en el servidor.

El servidor tiene 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` .

Disponible XXXX:XXXX:XXXX:XXXX::/64 un grupo de direcciones IPv6 que están asignadas a la interfaz `eno1` y desde allí XXXX:XXXX:XXXX:XXXX:1:2::/96 se asignó a `eno2` a petición mía.

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

Tengo una cuenta de Google a la que me gustaría vincular mi buzón de correo[email protected]` (recibir y enviar correo directamente desde la interfaz de Gmail).
Debe haber un buzón`[email protected]`, una copia del correo electrónico que quiero ver en mi gmail. Y es raro poder enviar algo en nombre de `[email protected]` a través de la interfaz web.

Debe haber un buzón`[email protected]`, que Ivanov utilizará desde su iPhone.

Los correos electrónicos enviados deben cumplir con todos los requisitos antispam modernos.
Debe existir el nivel más alto de cifrado proporcionado en las redes públicas.
Debería haber soporte IPv6 tanto para enviar como para recibir cartas.
Debería haber un SpamAssassin que nunca borre los correos electrónicos. Y rebotará, saltará o enviará a la carpeta IMAP “Spam”.
Se debe configurar el autoaprendizaje de SpamAssassin: si muevo una carta a la carpeta Spam, aprenderá de esto; si muevo una carta de la carpeta Spam, aprenderá de esto. Los resultados de la formación de SpamAssassin deberían influir en si la carta acaba en la carpeta Spam.
Los scripts PHP deben poder enviar correo en nombre de cualquier dominio en un servidor determinado.
Debería haber un servicio openvpn, con la capacidad de usar IPv6 en un cliente que no tenga IPv6.

Primero necesitas 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.
Luego necesitarás configurar Postfix para enviar cartas + SPF + DKIM + rDNS y otras pequeñas cosas similares.
Luego necesitarás configurar Dovecot y configurar Multidomain.
Luego necesitarás configurar SpamAssassin y configurar la capacitación.
Finalmente, instale Bind.

============= Múltiples interfaces ==============

Para configurar interfaces, debe escribir 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

Estas configuraciones se pueden aplicar en cualquier servidor de tech.ru (con un poco de coordinación con el soporte) e inmediatamente funcionará como debería.

Si tiene experiencia configurando cosas similares para Hetzner, OVH, allí es diferente. Más difícil.

eno1 es el nombre de la tarjeta de red n.° 1 (lenta pero ilimitada).
eno2 es el nombre de la tarjeta de red n.° 2 (rápida, pero con 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 para todo el servidor.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 para eno2, todo lo demás desde el exterior va a eno1.
XXXX:XXXX:XXXX:XXXX::1 — Puerta de enlace IPv6 (vale la pena señalar que esto puede/debe hacerse de manera diferente. Especifique el conmutador IPv6).
dns-nameservers: se indica 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 ingresa por eno1 -> saldría por él, y el tráfico que ingresa por eno2 -> saldría por él. 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 especificamos que cualquier tráfico incomprensible que caiga bajo cualquier regla marcada como "tabla eno1t" -> se envíe a la interfaz eno1.

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

Con este comando especificamos que cualquier tráfico iniciado por el servidor debe dirigirse 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 fijamos las reglas para marcar el tráfico.

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 especifica un 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 configuramos la ruta desde los clientes OpenVPN al IPv4 local excepto XX.XX.XX.X0.
Todavía no entiendo por qué este comando es suficiente para todos los IPv4.

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

Aquí es donde configuramos la dirección de la propia interfaz. El servidor la utilizará como dirección "saliente". No se volverá a utilizar de ninguna manera.

¿Por qué ":1:1::" es tan complicado? Para que OpenVPN funcione correctamente y sólo para esto. Más sobre esto más adelante.

Sobre el tema de la puerta de enlace: así es como funciona y está bien. Pero la forma correcta es indicar aquí la IPv6 del switch al que está conectado el servidor.

Sin embargo, por alguna razón IPv6 deja de funcionar si hago esto. Probablemente se trate de algún tipo de problema de tech.ru.

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

Esto es agregar una dirección IPv6 a la interfaz. Si necesita cien direcciones, eso 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

Anoté las direcciones y subredes de todas las interfaces para que quede claro.
eno1 - debe ser "/64" - porque este es nuestro conjunto completo de direcciones.
tun0: la subred debe ser mayor que eno1. De lo contrario, no será posible configurar una puerta de enlace IPv6 para clientes OpenVPN.
eno2: la subred debe ser mayor que tun0. De lo contrario, los clientes OpenVPN no podrán acceder a las direcciones IPv6 locales.
Para mayor claridad, elegí un paso de subred de 16, pero si lo deseas, puedes incluso realizar el paso “1”.
En consecuencia, 64+16 = 80 y 80+16 = 96.

Para una claridad aún mayor:
XXXX:XXXX:XXXX:XXXX:1:1:YYYY:YYYY son direcciones que deben asignarse a sitios o servicios específicos en la interfaz eno1.
XXXX:XXXX:XXXX:XXXX:1:2:YYYY:YYYY son direcciones que deben asignarse a sitios o servicios específicos en la interfaz eno2.
XXXX:XXXX:XXXX:XXXX:1:3:YYYY:YYYY 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 cuando se ejecutan (asegúrese de incluirlos en la pantalla; de lo contrario, este comando simplemente bloqueará la red en el servidor):

/etc/init.d/networking restart

Agregue al final del archivo “/etc/iproute2/rt_tables”:

100 eno1t
101 eno2t

Sin esto, no puede utilizar tablas personalizadas en el archivo “/etc/network/interfaces”.
Los números deben ser únicos y menores que 65535.

Los cambios de IPv6 se pueden cambiar fácilmente sin reiniciar, pero para hacerlo necesitas 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. Permítanme señalar algo importante.

net.ipv4.ip_forward = 1

Sin esto, OpenVPN no funcionará en absoluto.

net.ipv6.ip_nonlocal_bind = 1

Cualquiera que intente vincular IPv6 (por ejemplo, nginx) inmediatamente después de que la interfaz esté activa recibirá un error. Que esta 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 esta configuración de IPv6, el tráfico del cliente OpenVPN no sale al mundo.

Otras configuraciones no son relevantes o no recuerdo para qué sirven.
Pero por si acaso lo dejo “como está”.

Para poder realizar cambios en este archivo sin reiniciar el servidor, debe ejecutar el comando:

sysctl -p

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

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

OpenVPN IPv4 no funciona sin iptables.

Mis iptables son así 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 coherencia de las 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 sólo 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 comandos son adecuados para mi caso.
Después de leer la documentación, elegí la primera opción porque usa menos CPU.

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

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

Estos nombres no fueron elegidos por casualidad. Son utilizados por el paquete "iptables-persistent".

apt-get install iptables-persistent

Instalación del paquete principal de OpenVPN:

apt-get install openvpn easy-rsa

Configuremos 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="[email protected]"
export KEY_OU="VPN"

# X509 Subject Field
export KEY_NAME="server"
...

Cree 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

Preparemos la capacidad de crear los archivos finales "nombre-cliente.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

Preparemos un script que fusionará 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}/.crt 
    <(echo -e '</cert>n<key>') 
    ${KEY_DIR}/.key 
    <(echo -e '</key>n<tls-auth>') 
    ${KEY_DIR}/ta.key 
    <(echo -e '</tls-auth>') 
    > ${OUTPUT_DIR}/.ovpn

Creando 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 dispositivo del cliente.

Para clientes de iOS necesitarás hacer el siguiente truco:
El contenido de la etiqueta "tls-auth" debe estar sin comentarios.
Y también coloque "key-direction 1" inmediatamente antes de la etiqueta "tls-auth".

Configuremos 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 lo uso):

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

El detalle más difícil y clave.

Desafortunadamente, OpenVPN aún no sabe cómo configurar de forma independiente una puerta de enlace IPv6 para los clientes.
Tienes 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 utilizan el archivo “/etc/openvpn/variables”:

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

Me cuesta recordar por qué está escrito así.

Ahora netmask = 112 parece extraño (debería ser 96 ahí mismo).
Y el prefijo es extraño, no coincide con la red tun0.
Pero bueno, lo dejaré como está.

cipher DES-EDE3-CBC

Esto no es para todos: elegí este método para cifrar la conexión.

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

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

============= Sufijo =============

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

Veamos 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 residentes de Khabrovsk, este bloque contiene "desinformación y tesis incorrectas".Sólo 8 años después del inicio de mi carrera comencé a comprender cómo funciona SSL.

Por lo tanto, me tomaré la libertad de describir cómo utilizar 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 cadenas de caracteres muy largas).

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

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

Paso 1: sitios https.
Al acceder a un sitio, el navegador aprende del servidor web que el sitio es https y, por tanto, solicita una clave pública.
El servidor web proporciona la clave pública. El navegador utiliza la clave pública para cifrar la solicitud http y enviarla.
El contenido de una solicitud http solo puede ser leído por quienes tienen la clave privada, es decir, solo el servidor al que se realiza la solicitud.
La solicitud HTTP contiene al menos un URI. Por lo tanto, si un país intenta restringir el acceso no a todo el sitio, sino a una página específica, entonces esto es imposible para los sitios https.

Paso 2: respuesta cifrada.
El servidor web proporciona una respuesta que se puede leer fácilmente mientras se viaja.
La solución es extremadamente simple: el navegador genera localmente el mismo par de claves públicas y privadas 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, al enviar la respuesta http, la cifra con la 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 No. 3: establecer una conexión segura a través de un canal público.
Hay una vulnerabilidad en el ejemplo número 2: nada impide que los simpatizantes intercepten una solicitud http y editen información sobre la clave pública.
Así, el intermediario verá claramente todo el contenido de los mensajes enviados y recibidos hasta que cambie el canal de comunicación.
Lidiar con 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.
Luego, el servidor web primero 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í", entonces esto es una garantía del 100% de que este canal de comunicación es seguro.
¿Qué tan seguro es?
La creación misma de un canal de comunicación tan seguro se produce a una velocidad de ping*2. Por ejemplo 20 ms.
El atacante debe disponer de antemano de la clave privada de una de las partes. O encuentre una clave privada en 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 siente en el canal de comunicación entre el cliente y el servidor.
El cliente puede hacerse pasar por el servidor y el servidor puede hacerse pasar por el cliente. Y emular un par de claves en ambas direcciones.
Entonces el atacante verá todo el tráfico y podrá "editarlo".
Por ejemplo, cambiar la dirección a la que enviar dinero o copiar la contraseña de la banca online o bloquear contenido “objetable”.
Para combatir a estos atacantes, crearon una base de datos pública con claves públicas para cada sitio https.
Cada navegador "conoce" la existencia de unas 200 bases de datos de este tipo. Viene preinstalado en todos los navegadores.
El “conocimiento” está respaldado por una clave pública de cada certificado. Es decir, no se puede falsificar la conexión con cada autoridad de certificación específica.

Ahora existe una comprensión sencilla de cómo utilizar SSL para https.
Si usa su cerebro, quedará claro cómo los servicios especiales pueden piratear algo en esta estructura. Pero les costará esfuerzos monstruosos.
Y organizaciones más pequeñas que la NSA o la CIA: es casi imposible piratear el nivel de protección existente, incluso para los VIP.

También agregaré sobre las conexiones ssh. No hay claves públicas allí, entonces, ¿qué puedes hacer? La cuestión se resuelve de dos maneras.
Opción ssh-por-contraseña:
Durante la primera conexión, el cliente ssh debería avisar que tenemos una nueva clave pública del servidor ssh.
Y durante conexiones posteriores, si aparece la advertencia "nueva clave pública del servidor ssh", significará que están intentando espiarte.
O te escucharon en tu primera conexión, pero ahora te comunicas con el servidor sin intermediarios.
En realidad, debido a que el hecho de las escuchas telefónicas se revela de forma fácil, rápida y sin esfuerzo, este ataque se utiliza sólo en casos especiales para un cliente específico.

Opción ssh-por-clave:
Tomamos una unidad flash, escribimos en ella la clave privada para el servidor ssh (hay términos y muchos matices importantes para esto, 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.
Llevamos la unidad flash al servidor, la insertamos, copiamos la clave privada, quemamos la unidad flash y esparcimos las cenizas al viento (o al menos la formateamos con ceros).
Eso es todo: después de tal operación, será imposible piratear dicha conexión ssh. Por supuesto, dentro de 10 años será posible ver el tráfico en una supercomputadora, pero esa es otra historia.

Pido disculpas por el offtopic.

Ahora que se conoce la teoría. Te contaré sobre el proceso de creación de un 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 dólares por el certificado más simple.

Después de un par de horas, recibimos nuestra clave "pública" y un conjunto de varias claves públicas de esta empresa externa.

Por qué una empresa externa debería pagar por el registro de mi clave pública es una cuestión aparte, no la consideraremos aquí.

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

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

La carpeta “/etc/ssl” contiene todos los archivos para problemas de SSL.
domain1.com: nombre de dominio.
2018 es el año de la creación de claves.
“clave”: designación de que el archivo es una clave privada.

Y el significado de este archivo:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com: nombre de dominio.
2018 es el año de la creación de claves.
encadenado: designación de que existe una cadena de claves públicas (la primera es nuestra clave pública y el resto son las que provienen de la empresa que emitió la clave pública).
crt: designación de que existe un certificado ya preparado (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 está escrita como ejemplo.

Porque un error en este parámetro provocará que se envíe spam desde tu servidor (sin tu voluntad).

Luego demuestra a todos que no eres culpable.

recipient_delimiter = +

Puede que mucha gente no lo sepa, pero este es un carácter estándar para clasificar correos electrónicos y es compatible con la mayoría de los servidores de correo modernos.

Por ejemplo, si tienes un buzón "[email protected]"intenta enviar a"[email protected]"- mira lo que resulta de esto.

inet_protocols = ipv4

Esto podría resultar confuso.

Pero no es sólo así. Cada nuevo dominio es por defecto solo IPv4, luego activo IPv6 para cada uno por separado.

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í especificamos que todo el correo entrante va al 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 se puede aceptar correo para su posterior envío sólo después de la autorización de Dovecot.

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

Pero el sistema Postfix es muy antiguo; probablemente sea un retroceso de los viejos tiempos.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

Esto se puede configurar de forma diferente para cada servidor de correo.

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

Debe configurarlo con cuidado; de lo contrario, recibirá spam o, peor aún, saldrá de usted.

# SPF
policyd-spf_time_limit = 3600

Configuración de algún complemento relacionado con la verificación del SPF de las cartas 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

La configuración es que debemos proporcionar una firma DKIM con todos los correos electrónicos salientes.

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

Este es un detalle clave en el enrutamiento de cartas cuando se envían cartas desde scripts PHP.

Archivo “/etc/postfix/sdd_transport.pcre”:

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

A la izquierda están las expresiones regulares. A la derecha hay una etiqueta que marca la letra.
Postfix de acuerdo con la etiqueta: tendrá en cuenta algunas líneas de configuración más para una letra específica.

En “master.cf” se indicará exactamente cómo se reconfigurará el sufijo para una letra específica.

Las líneas 4, 5, 6 son las principales. En nombre de qué dominio enviamos la carta, ponemos esta etiqueta.
Pero el campo "de" no siempre se indica en los scripts PHP en el código antiguo. Entonces el nombre de usuario viene al rescate.

El artículo ya es extenso: no me gustaría distraerme configurando nginx+fpm.

Brevemente, para cada sitio configuramos su propio propietario de usuario de Linux. Y en consecuencia su grupo de fpm.

Fpm-pool usa cualquier versión de php (es genial cuando en el mismo servidor puedes usar diferentes versiones de php e incluso diferentes php.ini para sitios vecinos sin problemas).

Entonces, un usuario de Linux específico “www-domain2” tiene un sitio web domain2.com. Este sitio tiene un código para enviar correos electrónicos sin especificar el campo de.

Así, incluso en este caso, las cartas se enviarán correctamente y nunca acabarán en spam.

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

...
smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin
...
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
...
policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

spamassassin unix -     n       n       -       -       pipe
    user=spamd argv=/usr/bin/spamc -f -e
    /usr/sbin/sendmail -oi -f ${sender} ${recipient}
...
domain1  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X1
   -o smtp_helo_name=domain1.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
   -o syslog_name=postfix-domain1

domain2  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X5
   -o smtp_helo_name=domain2.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:2:1:1
   -o syslog_name=postfix-domain2

domain3  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X2
   -o smtp_helo_name=domain3
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:5:1
   -o syslog_name=postfix-domain3

El archivo no se proporciona completo; ya es muy grande.
Sólo noté lo que fue cambiado.

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

Estas son configuraciones relacionadas con spamassasin, hablaremos de eso 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, debe iniciar sesión.

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

Habilite la verificación de SPF.

apt-get install postfix-policyd-spf-python

Instalemos el paquete para las comprobaciones de SPF anterior.

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

Y esto es lo más interesante. Esta es la capacidad de enviar cartas para un dominio específico desde una dirección IPv4/IPv6 específica.

Esto se hace por el bien de rDNS. rDNS es el proceso de recibir una cadena por dirección IP.
Y para el correo, esta función se utiliza para confirmar que el helo coincide exactamente con el rDNS de la dirección desde la que se envió el correo electrónico.

Si el helo no coincide con el dominio de correo electrónico en cuyo nombre se envió la carta, se otorgan puntos de spam.

Helo no coincide con rDNS: se otorgan muchos puntos de spam.
En consecuencia, cada dominio debe tener su propia dirección IP.
Para OVH, en la consola es posible especificar rDNS.
Para tech.ru: el problema se resuelve a través del soporte.
Para AWS, el problema se resuelve a través del soporte.
“inet_protocols” y “smtp_bind_address6”: habilitamos la compatibilidad con IPv6.
Para IPv6 también es necesario registrar rDNS.
“syslog_name” - y esto es para facilitar la lectura de los registros.

Comprar certificados recomiendo aquí.

Configurando el enlace postfix+dovecot aquí.

Configuración de SPF.

============= Palomar =============

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

Configurando mysql, instalando los propios paquetes.

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

disable_plaintext_auth = yes
auth_mechanisms = plain login

La autorización sólo está cifrada.

Archivo “/etc/dovecot/conf.d/10-mail.conf”

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

Aquí indicamos la ubicación de almacenamiento de las cartas.

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 Dovecot.
Aquí desactivamos las conexiones no seguras.
Y habilite 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
}

Configurando ssl. Indicamos que se requiere ssl.
Y el certificado en sí. Y un detalle importante es la directiva “local”. Indica qué certificado SSL usar al conectarse a qué IPv4 local.

Por cierto, IPv6 no está configurado aquí, corregiré esta omisión más adelante.
XX.XX.XX.X5 (dominio2): sin certificado. Para conectar clientes, debe especificar dominio1.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 para spamassassin en el futuro.

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

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Este es un complemento antispam. Necesario para entrenar spammassasin en el momento de la transferencia hacia/desde la carpeta "Spam".

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

protocol pop3 {
}

Existe tal archivo.

Archivo “/etc/dovecot/conf.d/20-lmtp.conf”

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

Configurando 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 especifica qué hacer con las cartas entrantes.

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

require ["fileinto", "mailbox"];

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

Debe 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í se utiliza como método 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 configuraciones similares para postfix.

Archivo "/etc/dovecot/dovecot.conf"

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

Archivo de configuración principal.
Lo importante es lo que indicamos aquí: agregar protocolos.

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

apt-get install spamassassin spamc

Instalemos los paquetes.

adduser spamd --disabled-login

Agreguemos un usuario en cuyo nombre.

systemctl enable spamassassin.service

Habilitamos el servicio spamassassin de carga automática al cargar.

Archivo "/etc/default/spamassassin":

CRON=1

Habilitando la actualización automática de reglas “por defecto”.

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

Necesitas crear una base de datos “sa” en mysql con el usuario “sa” con la contraseña “contraseña” (reemplazar con algo adecuado).

report_safe: esto enviará un informe de correo electrónico no deseado en lugar de una carta.
use_bayes son configuraciones de aprendizaje automático de spamassassin.

Las configuraciones restantes de spamassassin se utilizaron anteriormente en este artículo.

Configuración general "spamassassin".
Acerca de mover nuevos correos electrónicos no deseados a la carpeta IMAP “Spam”.
Acerca de una combinación simple de Dovecot + SpamAssassin.
Recomiendo leer la teoría de aprendizaje de spamassasin al mover letras en carpetas imap (y no recomiendo usarla).

============= Llamamiento a la comunidad =============

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

Para que el usuario pueda crear un par de claves en su cliente (Outlook, Thunderbird, complemento del navegador, ...). Pública y privada. Público: enviar a DNS. Privado: guardar en el cliente. Los servidores de correo podrían utilizar una clave pública para enviarla a un destinatario específico.

Y para protegerse contra el spam con este tipo de cartas (sí, el servidor de correo no podrá ver el contenido), deberá introducir 3 reglas:

  1. Firma DKIM real obligatoria, SPF obligatorio, rDNS obligatorio.
  2. Red neuronal sobre el tema de formación antispam + base de datos para ello en el lado del cliente.
  3. El algoritmo de cifrado debe ser tal que el lado emisor deba gastar 100 veces más potencia de CPU en cifrado que el lado receptor.

Además de las cartas públicas, desarrolle una carta de propuesta estándar "para iniciar una correspondencia segura". Uno de los usuarios (buzón) envía una carta con un archivo adjunto a otro buzón. La carta contiene una 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 una clave privada del lado del cliente).

Incluso puedes crear un par de claves específicas para cada correspondencia. El usuario destinatario puede aceptar esta oferta y enviar su clave pública (también hecha específicamente para esta correspondencia). A continuación, el primer usuario envía una carta de control del servicio (cifrada con la clave pública del segundo usuario), tras recibirla el segundo usuario puede considerar fiable el canal de comunicación formado. A continuación, el segundo usuario envía una carta de control y el primer usuario también puede considerar seguro el canal formado.

Para combatir la interceptación de claves en la carretera, el protocolo debe prever la posibilidad de transmitir al menos una clave pública mediante una unidad flash.

Y lo más importante es que todo funcione (la pregunta es “¿quién lo pagará?”):
Ingrese certificados postales desde $10 por 3 años. Lo que permitirá al remitente indicar en el dns que “mis claves públicas están ahí”. Y te darán la oportunidad de iniciar una conexión segura. Al mismo tiempo, aceptar dichas conexiones es gratuito.
Gmail finalmente está monetizando a sus usuarios. Por 10 dólares cada 3 años: derecho a crear canales de correspondencia seguros.

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

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

Pero las circunstancias de la vida se desarrollaron, por lo que este problema se prolongó durante 2 meses.
Y así, cuando volví a tener tiempo libre, decidí publicar el artículo tal cual, en lugar de arriesgarme a que la publicación se prolongara un año más.

Si hay muchas preguntas como "pero esto no se describe con suficiente detalle", entonces probablemente será necesario tomar un servidor dedicado con un nuevo dominio y un nuevo certificado SSL y describirlo con más detalle y, sobre todo, Lo más importante es identificar todos los detalles importantes que faltan.

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

Al copiar grandes partes de un artículo, proporcione un enlace a este artículo.
Al traducir a cualquier otro idioma, proporcione un enlace a este artículo.
Intentaré traducirlo yo mismo al inglés y dejar referencias cruzadas.


Fuente: habr.com

Añadir un comentario