Impede o envio de e-mail do Postfix pela interface de rede incorreta

2

Eu tenho um servidor de email Postfix, em execução em um host com vários adaptadores de rede, um dos quais é um dispositivo tun0 virtual. Eu preciso deste servidor de e-mail para aceitar conexões em qualquer adaptador - e enviar e-mail apenas no dispositivo tun virtual.

Eu tenho uma configuração, alinhada com a resposta a esta pergunta , que define smtp_bind_address = 10.20.30.40 - onde 10.20.30.40 é o endereço associado ao dispositivo tun0. Este servidor não suporta o IPV6.

Durante anos, isso pareceu funcionar perfeitamente - até que, um dia, o dispositivo tun0 morreu - e o Postfix enviou e-mail pelo dispositivo de rede padrão, eth0 (10.0.0,1) não tun0.

Esse comportamento é esperado? Existem configurações que eu possa alterar para garantir que o Postfix apenas envie emails por tun0 (10.20.30.40) - deixando mensagens na fila se o tun0 não estiver disponível?

Caso seja relevante, isso é no Ubuntu 16.04.2 LTS com a versão Postfix 3.1.0-3. O tun0 é implementado usando o OpenVPN versão 2.3.10-1ubuntu2.1

- Editar para adicionar detalhes extras -

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.20.30.40     0.0.0.0         255.255.255.255 UH    0      0        0 tun0

Este servidor executa vários serviços - dos quais o Postfix é apenas um. Somente e-mail precisa ser roteado sobre 10.20.30.40 - todos os outros serviços precisam ser roteados através do gateway padrão.

    
por aSteve 11.07.2017 / 00:08

3 respostas

1

O que acontece é que o postfix usará o smtp_bind_address configurado primeiro. No seu caso, é um ip estático ligado ao tun0. Ele vai passar por tun0 quando estiver no ar. Se tun0 estiver inativo, o cliente bind falhará, fazendo com que o postfix retorne ao comportamento padrão de não vincular o ponto de extremidade tcp do cliente e, portanto, usará a rota padrão que está conectada a eth0.

Parece que o postfix não fornece uma substituição adequada para a falha smtp_bind_address.

Portanto, a resposta é simplesmente bloquear o email de saída na porta 25 na interface eth0 usando uma regra de tabelas IP. Isso fará com que todos os e-mails fiquem em fila por um tempo antes de falhar ou até que o tun0 volte.

Algo como o seguinte deve funcionar:

iptables -A OUTPUT -i eth0 -p tcp --dport 25 -j DROP

Isso impedirá que todos os e-mails sejam enviados pela porta 25 via eth0 e originados diretamente de seu servidor (não encaminhados). Ele não bloqueará o tráfego de e-mail enviado pelo tun0.

    
por 12.07.2017 / 00:16
0

Pelo que pude reunir e testar em um laboratório, isso parece estar funcionando conforme o esperado. O smtp_bind_address fará o failover para outra inet_interface se não estiver disponível.

Talvez você possa configurar outra instância do Postfix que tenha apenas uma única interface inet de 10.20.30.40 , e postmap / relay seja enviada para isso? Talvez você possa receber por meio de vários adaptadores e forçar o envio de um único IP.

    
por 11.07.2017 / 19:10
0

Tem sido um tempo desde que eu tive que mexer com postfix. Mas Eu acho que você deveria estar usando um relé de host inteligente.

A smart host is a type of email message transfer agent that allows a Simple Mail Transfer Protocol (SMTP) server to route email to an intermediate mailserver rather than directly to the recipient's server.

O relé seria o servidor de e-mail que corresponde a um registro SPF do remetente no seu domínio de e-mail. Seu provedor de serviços de Internet deve ser capaz de agir como um retransmissor de e-mail inteligente para você.

Da memória, pode ser tão simples quanto definir uma configuração em /etc/postfix/main.cf

por exemplo. relayhost = mx1.mydomain.com:587

Então você não precisaria se preocupar com o envio de mensagens da interface.

    
por 11.07.2017 / 23:34