Dovecot como proxy con presentación

Dovecot como proxy con presentación

En mi infraestructura tengo varios servidores de correo (mailcow) que atienden diferentes dominios por instancia. Quiero crear un proxy de correo delante de ellos para reducir la cantidad de IP utilizadas por servicio y permitir que los clientes tengan sus propios nombres de dominio en los ajustes preestablecidos de su cliente de todos modos.

SMTP como MTA se maneja de manera diferente. Los mensajes entrantes a través de Postfix son manejados por un servidor central (porque los registros MX no son visibles para el cliente). Entonces este no es mi problema.

Así que configuré un proxy de correo basado en Dovecot en Debian Buster con la siguiente configuración:

ssl_cert = </etc/dovecot/ssl/default.pem
ssl_key = </etc/dovecot/ssl/default.key

# just an example for different domains via SNI
local_name mail.domain1.tld {
  ssl_cert = </etc/dovecot/ssl/mail.domain1.tld.pem
  ssl_key = </etc/dovecot/ssl/mail.domain1.tld.key
}

# just an example for different domains via SNI
local_name mail.domain2.tld {
  ssl_cert = </etc/dovecot/ssl/mail.domain2.tld.pem
  ssl_key = </etc/dovecot/ssl/mail.domain2.tld.key
}

auth_cache_size = 4 k
disable_plaintext_auth = no

passdb {
  args = /etc/dovecot/sql.conf
  driver = sql
}
protocols = "imap pop3 submission"
service auth {
  user = root
}
userdb {
  args = static uid=5000 gid=5000 home=/dev/null
  driver = static
}

Y el sql.conf es

## SQL passdb configuration
driver = mysql

# Database options
connect = host=localhost dbname=dovecot user=dovecot password=dovecot

# Query
password_query = SELECT NULL AS password, NULL AS destuser, host, 'Y' AS nologin, 'Y' AS nodelay, 'Y' AS nopassword, 'Y' AS proxy, 'any-cert' AS `ssl` FROM proxy_domain WHERE domain = '%d'
# eof

La base de datos contiene:

CREATE TABLE `proxy_domain` (
  `domain` varchar(255) NOT NULL,
  `host` varchar(255) NOT NULL,
  PRIMARY KEY (`domain`)
);

insert into proxy_domain (domain, host) values ('domain1.tld','mailhost1');
insert into proxy_domain (domain, host) values ('domain2.tld','mailhost2');

Éste es más o menos el ejemplo de

Los servicios IMAP y POP3 están activos y con

openssl s_client -connect ac-hcn0002.acoby.net:993

Puedo iniciar sesión y también SNI funciona bien. Se puede acceder al backend a través de SSL. Con starttls (110, 143, 587) sólo se presenta el primer certificado. Eso está bien y es aceptable, porque no se lo recomendaría al cliente.

Pero ahora sumisión (y luego tamiz).

Pregunta 1:

Dovecot puede abrir 587 para su envío. Esto sólo está disponible a través de STARTTLS. Pero el proxy luego intenta comunicarse para su envío en el sistema backend directamente con SSL en el puerto 587 (lo cual no es correcto, creo; debería comenzar simple y hacer STARTTLS). Creo que esto sucede porque passdb devuelve SSL global = cualquier certificado. ¿Es esto un error? ¿Puedo anular ese comportamiento para 587? ¿Y tal vez haya alguna manera de enviar el certificado correcto con STARTTLS (en lugar del predeterminado/primero)?

Pregunta 2:

Luego el puerto 465. Dovecot también podría abrir el puerto de envío 465/SSL en mi caso para reenviar todos los mensajes autenticados al puerto de envío 465 en el backend. ¿Pero cómo puedo configurar eso? No pude encontrar ningún ejemplo.

Se acerca deInfraestructura de correo con proxy dovecoty la solución con postfix, pero no estoy muy seguro de si la respuesta con el dovecot-socket funciona en este escenario y no quiero instalar un postfix solo para el envío, cuando Dovecot puede manejar eso fuera de servicio. la caja.

Respuesta1

Al regresar 'any-cert' AS 'ssl'a su passdb, obliga a dovecot a usar TLS para conexiones descendentes. Desafortunadamente, no conozco ninguna forma de cambiar el tipo de conexión entre starttlso tlsen función de algo que devuelve passdb (https://dovecot.org/pipermail/dovecot/2018-September/112928.html)

Mi solución es forzar las conexiones STARTTLS en sentido descendente y usarlas siempre.

password_query = SELECT NULL as password, 'y' as nopassword, 'y' as proxy, NULL as destuser, 'y' as proxy_nopipelining, host, 'y' as nodelay, 'y' as nologin, 'any-cert' as 'starttls';

La consulta "correcta" sería algo como esto:

password_query = SELECT NULL as password, 'y' as nopassword, 'y' as proxy, NULL as destuser, 'y' as proxy_nopipelining, host, 'y' as nodelay, 'y' as nologin, IF(%{real_lport}=587, 'any-cert', 'no') as 'starttls', IF(%{real_lport}<>587, 'any-cert', 'no') as 'ssl';

lo que cambiaría starttls/tls según el puerto por el que entró la conexión. Desafortunadamente, actualmente eso no es compatible con dovecot.

información relacionada