Você tem uma regra para liberar o tráfego, mas não tem uma regra para permitir o retorno do tráfego.
Suponho que você quis dizer que essas duas regras seriam -A INPUT
:
iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 587 -j ACCEPT
No entanto, usar a porta de origem como um método de permitir o tráfego de retorno é uma maneira ruim de proteger o sistema. Tudo o que alguém precisa fazer é usar uma dessas portas de origem e o conjunto de regras do seu firewall se torna inútil.
Uma ideia muito melhor seria remover todas as regras de -A INPUT ... --sport
e usar apenas essa regra única:
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
A maneira como essa regra funciona é que, quando o sistema faz uma conexão de saída, o kernel registra a conexão em uma tabela de rastreamento. Então, quando os pacotes do sistema remoto retornam, ele verifica se esses pacotes estão associados a alguma conexão na tabela de controle.
O ESTABLISHED
bit é o que permite o tráfego diretamente relacionado à sessão. Isso será pacotes TCP voltando no fluxo.
O RELATED
bit permite o tráfego relacionado à conexão, mas não faz parte da conexão propriamente dita. Isso pode ser coisas como pacotes ICMP, como "ICMP não pode fragmentar". Esses pacotes não fazem parte do fluxo TCP, mas são de vital importância para manter o fluxo ativo (o que também é outra coisa que seu conjunto de regras não cobre, e sem o qual você verá problemas e perdas de conexão estranhos).
Esta regra também funciona para o tráfego UDP, mas como o UDP é sem estado, não é exatamente o mesmo. Em vez disso, o kernel precisa controlar os pacotes UDP que saem, e apenas assume que quando os pacotes UDP retornam na mesma combinação host / porta, e dentro de um curto período de tempo, eles estão relacionados.