Port Forwarding com iptables não está funcionando

3

Estou usando um Ubuntu Server Box (10.04) para direcionar minha rede para a internet. Esta caixa tem 2 placas ethernet (eth0 para conexão com a internet, eth1 para lan - 192.168.1.1) e eu gostaria de encaminhar a porta 80 para o meu servidor (192.168.1.254). Então, eu configurei o seguinte:

iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
iptables -t mangle -F

# default route:
ip route add default via 200.160.111.67
# www tunnel:
iptables -I FORWARD -p tcp -d 192.168.1.254 --dport 80 -i eth0 -j ACCEPT
# this line locks up internet access for all users:
#iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.254:80

# ssh tunnel
iptables -I FORWARD -p tcp -d 192.168.1.254 --dport 22 -i eth0 -j ACCEPT
# this line uncommented locks all my accesses to external ssh servers:
#iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.1.254:22

# NAT
modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

O NAT para conexões dentro da minha rede está em execução, mas o encaminhamento de portas (ssh e www) não está funcionando e não sei o que estou fazendo de errado. Você poderia me ajudar?

    
por LucasBr 30.03.2011 / 21:58

1 resposta

4

Suas regras DNAT precisam ser um pouco mais específicas para funcionar corretamente. Uma maneira de proceder é adicionar uma condição --destination (ou -d ) a cada uma delas, por exemplo,

iptables -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 80 -j DNAT \
    --to-destination 192.168.1.254

iptables -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 22 -j DNAT \
    --to-destination 192.168.1.254

em que $EXT_IP é o endereço IP externo (globalmente roteável) do seu roteador.

Ressalva: Se os clientes internos tentarem se conectar aos serviços www ou ssh em 192.168.1.254 através do endereço IP externo (globalmente roteável), suas tentativas de conexão falharão (enquanto as conexões diretamente para 192.168.1.254 teriam sido bem-sucedidas).

Para resolver isso, é melhor informar seus clientes internos para acessar o servidor através de seu endereço IP interno. Alternativamente, você pode configurar um "hairpin NAT" adicionando mais algumas regras de iptables, da seguinte maneira:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.254 -p tcp \
    --dport 80 -j SNAT --to-source $INT_IP

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.254 -p tcp \
    --dport 22 -j SNAT --to-source $INT_IP

em que $INT_IP é o endereço IP interno do roteador (por exemplo, 192.168.1.1). Com essas regras, as conexões dos clientes internos para o endereço IP externo fluirão pelo roteador. É melhor evitar fazer NAT hairpin sempre que possível, pois é um uso bastante ineficiente dos recursos do sistema de rede e roteador.

    
por 30.03.2011 / 22:52