Dovecot como proxy com envio

Dovecot como proxy com envio

Na minha infraestrutura tenho vários mailservers (mailcow) atendendo diferentes domínios por instância. Quero criar um proxy de correio na frente deles para reduzir o número de IPs usados ​​por serviço e permitir que os clientes tenham seus próprios nomes de domínio nas predefinições de cliente de qualquer maneira.

SMTP como MTA é tratado de forma diferente. As mensagens recebidas via Postfix são tratadas por um servidor central (porque os registros MX não são visíveis para o cliente). Então esse não é problema meu.

Então configurei um proxy de email baseado em Dovecot no Debian Buster com a seguinte configuração:

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
}

E o sql.conf é

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

O banco de dados contém:

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');

Este é mais ou menos o exemplo de

Os serviços IMAP e POP3 estão ativos e com

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

Consigo fazer login e o SNI também está funcionando bem. O back-end pode ser acessado via SSL. Com starttls (110, 143, 587) apenas o primeiro certificado é apresentado. Tudo bem e aceitável, porque eu não recomendaria isso ao cliente.

Mas agora submissão (e depois peneira).

Questão 1:

Dovecot é capaz de abrir 587 para envio. Isso só está disponível via STARTTLS. Mas o proxy então tenta se comunicar para envio no sistema back-end diretamente com SSL na porta 587 (o que não é correto, eu acho - ele deve começar simples e tornar STARTTLS). Eu acho que isso acontece porque o passdb retorna SSL global=any-cert. Isso é um inseto? Posso substituir esse comportamento para 587? E talvez exista uma maneira de enviar o certificado correto com STARTTLS (em vez do padrão/primeiro)?

Questão 2:

Em seguida, a porta 465. O Dovecot também pode abrir a porta de envio 465/SSL no meu caso para encaminhar todas as mensagens autenticadas para a porta de envio 465 no back-end. Mas como posso configurar isso? Não consegui encontrar nenhum exemplo.

Eu sei sobreInfraestrutura de correio com proxy dovecote a solução com postfix - mas não tenho certeza se a resposta com o dovecot-socket está funcionando neste cenário e não quero instalar um postfix apenas para envio, quando o Dovecot puder lidar com isso fora de - a Caixa.

Responder1

Ao retornar 'any-cert' AS 'ssl'ao seu passdb, você força o dovecot a usar TLS para conexões downstream. Infelizmente, não há nenhuma maneira que eu saiba de alterar o tipo de conexão entre starttlsou tlscom base em algo que o passdb retorna (https://dovecot.org/pipermail/dovecot/2018-September/112928.html)

Minha solução alternativa é forçar o downstream das conexões STARTTLS e sempre usá-las.

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';

A consulta "correta" seria algo assim:

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';

que mudaria starttls/tls com base na porta em que a conexão veio. Infelizmente, isso não é suportado atualmente pelo dovecot.

informação relacionada