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.