iptables: Permitir conexões em uma porta apenas para hosts "seguros"

5

Eu tenho uma máquina centos e desejo apenas permitir conexões de saída para a porta 587 para determinadas máquinas remotas e descartar pacotes tentando se conectar a todos os outros hosts.

Eu só quero permitir o acesso na porta 587 se eles forem acessar os servidores SMTP do gmail (todos os IPs atrás de smtp.gmail.com ). Existe uma maneira de implementar isso?

    
por WantIt 15.01.2012 / 14:46

4 respostas

7

Você pode usar a opção -d para as regras de iptables, o que faz a regra funcionar apenas para o endereço fornecido e, em seguida, bloquear todo o resto.

iptables -I OUTPUT -p tcp --dport 587 -j DROP
iptables -I OUTPUT -d smtp.gmail.com -p tcp -m tcp --dport 587 -j ACCEPT

deve fazer o que quiser. Isso inicialmente insere um DROP em todas as conexões de saída na porta 587 para o início da cadeia OUTPUT. Em seguida, insere uma regra de permissão para a porta smtp.gmail.com 587 no início da cadeia OUTPUT. Isso tem o efeito de permitir conexões para smtp.gmail.com:587 e bloquear todo o resto na porta 587, por exemplo,

iptables -L OUTPUT -n
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            173.194.66.109      tcp dpt:587
ACCEPT     tcp  --  0.0.0.0/0            173.194.66.108      tcp dpt:587
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:587

Observe que smtp.gmail.com resolve dois endereços IP e é por isso que existem duas regras ACCEPT acima. O nome só é resolvido uma vez quando a regra é adicionada ao kernel, portanto, se os endereços forem alterados, as conexões para o gmail também serão bloqueadas e você precisará recarregar as regras.

    
por 15.01.2012 / 15:38
2

Você precisa permitir o Gmail antes de negar acesso. Caso contrário, você não chegará à regra de permissão.

O Google pode usar qualquer endereço em seus ASN para servidores do Gmail , você vai querer permitir todos os blocos. Você pode querer olhar usando um ipset para lidar com os blocos envolvidos. Você também pode encontrar seu registro SPF fornece uma lista decente de blocos de rede para suas necessidades. Se você reject , em vez de drop de solicitações de saída, seus usuários podem não notar alguns blocos ausentes.

Uma ferramenta como Shorewall permite implementar suas políticas com mais facilidade. No seu caso, eu teria uma política REJECT de saída e permitiria apenas o tráfego desejado. Nesse caso, você não precisaria de uma regra específica para impedir o acesso à porta de envio. O Shorewall também permite fácil configuração de registro para o seu firewall.

    
por 15.01.2012 / 16:25
2

Eu sugeriria automatizar essa coisa toda para que você não tenha que continuar se preocupando com isso.

O iptables -I OUTPUT -p tcp --dport 587 -j DROP deve ser incluído na configuração básica do sistema, que provavelmente fica em / etc / sysconfig / iptables na sua máquina.

Solte este script em um editor e salve-o em algum lugar, então marque-o como executável com chmod. Como exemplo, coloquei em /opt/sysadminscripts/iptables.smtp.gmail.sh

#!/bin/bash

IPLIST=$(host smtp.gmail.com | grep 'has address' | awk '{print $4}')

for x in $IPLIST
do
        $(iptables -L -nv | grep "$x" >> /dev/null)
        if [[ "$?" -ne '0' ]]; then
                $(iptables -I OUTPUT  -p tcp -m tcp -d "$x" --dport 587 -j ACCEPT)
        fi
done

Em seguida, adicione uma entrada no seu sistema crontab semelhante a este:

*/10 * * * * root /opt/sysadminscripts/iptables.smtp.gmail.sh

Certifique-se de que a linha NÃO seja a última linha do seu / etc / crontab. Se a linha não tiver um feed de linha de terminação, ela não será executada. (Eu recomendo manter um comentário como a última linha de / etc / crontab.)

    
por 16.01.2012 / 01:00
1

Você precisa ter regras como:

iptables -A FORWARD -p tcp -d smtp.gmail.com --dport 587 -j ACCEPT
iptables -A FORWARD -p tcp --dport 587 -j DROP

O problema é que você precisa encontrar os possíveis IPs para smtp.gmail.com . Não é recomendado usar o nome no iptables. Isso ocorre porque o iptables não reconhece as mudanças de mapeamento de nome de IP. Talvez seja necessário verificar continuamente a alteração do IP e atualizar suas regras de acordo.

Você precisa escolher a cadeia correta FORWARD no exemplo acima, dependendo do tráfego que deseja controlar.

    
por 15.01.2012 / 15:20

Tags