Configuração segura de NAT com iptables

5

Eu tenho um dispositivo Debian que precisa agir como um gateway de internet. Além disso, desejo fornecer um firewall que não apenas bloqueie o tráfego de entrada, mas também o tráfego de saída. E eu percebi que o iptables deveria ser capaz de fazer o trabalho.

O problema: configurei o NAT corretamente (acho?), mas depois que defino a política padrão como DROP e adiciono regras para, por exemplo, permitir tráfego HTTP de dentro da LAN, o HTTP é não passando. Então, basicamente, minhas regras parecem não funcionar.

Abaixo está o script de inicialização que eu uso para o iptables. O dispositivo tem dois NICs, respectivamente eth0 (a interface WAN) e eth1 (a interface LAN).

echo 1 > /proc/sys/net/ipv4/ip_forward

# Flush tables
iptables -F
iptables -t nat -F

# Set policies
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow outbound HTTP from LAN? 
iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

Alguém pode lançar alguma luz sobre isso?

Resolvido: Mike sugeriu usar telnet e um IP em vez de nome de domínio para testar o tráfego HTTP, e isso levou a duas descobertas: o DNS não estava funcionando corretamente e a filtragem de saída também não funcionava (eu poderia fazer telnet para a porta 8080).

Então, primeiro de tudo, adicionei regras para permitir que os clientes da LAN usassem os serviços do gateway, o DNS, por exemplo. (E sim, não se preocupe, vou restringir isso aos serviços oferecidos)

iptables -A INPUT -i eth1 -d 172.16.0.1 -j ACCEPT
iptables -A OUTPUT -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Você acha que eu seria capaz de fazer solicitações de DNS agora. E eu realmente poderia, mas as solicitações estavam expirando porque o gateway não podia fazer as solicitações de DNS em si. Regras para o DNS de saída foram adicionadas:

iptables -A OUTPUT -o eth0 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp --dport 53 -j ACCEPT

Por fim, defino a política padrão da FORWARD chain como DROP . E voltamos à estaca zero.

Eu estava prestes a postar uma atualização quando vi a resposta de Ram sugerindo que eu permitisse o tráfego de entrada para as conexões existentes. Eu também apliquei esse princípio na cadeia OUTPUT acima.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Então agora parece estar funcionando exatamente como eu quero. Script completo aqui . Obrigado!

    
por TheBigB 16.06.2012 / 22:44

2 respostas

3

Você precisa permitir respostas para suas solicitações de saída.

    
por 16.06.2012 / 23:40
2

Eu adicionaria isso como uma resposta depois que obtivesse uma resposta ao comentário, mas parece que você seguiu minha linha de pensamento ... Percebi que você não tinha DNS permitido na interface interna. Boa sorte com seus serviços.

    
por 17.06.2012 / 01:09