Redirecionamento de portas com Iptables
Dica publicada em Linux / Segurança
Redirecionamento de portas com Iptables
Nessa dica eu gostaria de apresentar o modo de redirecionamento de porta usando o Iptables.
Podemos imaginar uma rede que possui um firewall e um servidor Web, sendo que o servidor Web está dentro da subnet usando IP inválido.
Suposições:
IP Servidor Web: 172.16.0.2
IP Firewall (Iface interna): 172.16.0.1
IP Firewall (Iface externa): 200.200.200.200
Porta que será redirecionada: 80
Mão na massa:
1° passo: vamos criar uma regra para tratar o pacote quando ele chega no firewall.
Podemos imaginar uma rede que possui um firewall e um servidor Web, sendo que o servidor Web está dentro da subnet usando IP inválido.
Suposições:
IP Servidor Web: 172.16.0.2
IP Firewall (Iface interna): 172.16.0.1
IP Firewall (Iface externa): 200.200.200.200
Porta que será redirecionada: 80
Mão na massa:
1° passo: vamos criar uma regra para tratar o pacote quando ele chega no firewall.
iptables -t nat -A PREROUTING -d 200.200.200.200 -p tcp --dport 80 -j DNAT --to 172.16.0.2:80
O que essa regra faz?
Quando o pacote chega na interface externa para o IP 200.200.200.200, o firewall irá fazer um NAT no pacote para que ele tenha um novo destino, o IP 172.16.0.2. Mas isso só ocorrerá quando a requisição for para a porta 80.
Gostaria também de explicar o motivo que deixei no argumento para DNAT, nós temos "--to 172.16.0.2:80", note que novamente mencionamos a porta, nesse caso isso não é necessário, mas também não há problema, a idéia é que a porta de destino não precisa necessariamente ser a mesma da porta onde foi feita a requisição no firewall. O servidor Web poderia escutar por exemplo na porta 81 e mesmo assim conseguiríamos fazer o redirecionamento.
2° passo: pronto! O pacote foi encaminhado, mas e depois, como nós trataremos do retorno do pacote?
iptables -t nat -A POSTROUTING -d 172.16.0.2 -p tcp --dport 80 -j SNAT --to 200.200.200.200
Essa regra altera a origem do pacote apontando para o firewall, para que seja feito o retorno da requisição.
OBS: Só não podemos esquecer que o encaminhamento de pacotes deve ser ativado. Comando:
# echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -s faixa_ip_rede_interna -p tcp --dport 80 -j REDIRECT --to-port 3128
Não se preocupe com volta, o iptables é inteligente o bastante para saber para onde ele deve ir (ele usa uma tabela)
Claro que é necessário liberar o redirecionamento:
# echo 1 > /proc/sys/net/ipv4/ip_forward
Há sim... se sua regra padrão FORWARD for DROP, não se esqueça de permitir o redirecionamento nele também.
iptables -A FORWARD -s faixa_ip_rede_interna -p tcp --dport 80 -j ACCEPT