Redirecionamento de portas com Iptables

Publicado por João Carlos em 29/01/2007

[ Hits: 86.703 ]

 


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.

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

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Squid - Bloqueando conexões externas definitivamente

Escondendo a versão do BIND

Permitir mudança de senha via SSH (e só!)

Não seja mais rastreado na web

fwbuilder - interface gráfica para iptables

  

Comentários
[1] Comentário enviado por edmafer em 29/01/2007 - 14:48h

Eu sempre fiz assim:
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

[2] Comentário enviado por removido em 29/01/2007 - 15:09h

estávamos precisando de algo assim. Outro dia tive que fazer um port forward aqui em casa e não sabia fazer com iptables. Fiz pelo config do router, mas sem dúvida, o iptables é bem melhor....

[3] Comentário enviado por robson..pba em 31/01/2007 - 11:23h

Bom dia e com a licenças de vcs
vou postar meu arquivo de iptables e vejam se podem me ajudar
#!/bin/bash

# ativa o modulo nat
modprobe iptable_nat
iptables -F
# Ativo roteamento
echo 1 > /proc/sys/net/ipv4/ip_forward


# redirecionamento de tudo que for da rede 10.0.0.0 para porta 80
# redirecionar para porta 3128 (proxy)
iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

# Liberando somente a porta 25 para envio de email pelo outlook express
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -p tcp -o eth1 --dport 25 -j MASQUERADE

# Liberando somente a porta 110 para receber email pelo outlook express
iptables -t nat -A POSTROUTING -d 10.0.0.0/24 -p tcp --dport 110 -o eth0 -j MASQUERADE

# Libero tudo que for de origem 10.0.0.0/24 para internet
# (posso cancelar a regra que libera a porta 25 para enviar email )
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE

# Libero tudo para entrar na rede 10.0.0.0/24
# (posso cancelar a regra que libera a porta 110 para receber)
iptables -t nat -A POSTROUTING -d 10.0.0.0/24 -o eth0 -j MASQUERADE


#############################################################################
# Proteção contra ping da morte
#iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j DROP



echo "iptables pronto"


O que pode ser melhorado em meu arquivo?

Eu preciso fazer um redirecionamento de porta (5912) para o ip 10.0.0.12 (VNC) como fica essa regra ?

Obrigado a todos e desculpe a falta de conhecimento em iptables.

[4] Comentário enviado por srf em 07/01/2008 - 22:44h

OLá

tenho a seguinte regra:

iptables -t nat -A PREROUTING -d 201.60.10.26 -p tcp --dport 8080 -j DNAT --to 192.168.0.252:80

Esta regras faz toda requisição que chega de fora do firewall na pota 8080 ser direcionada para o webserver 192.168.0.252 na porta 80

Esta funcionando 100% o povo de fora acessa http://201.60.10.26:8080/ Blz...

O que preciso é que fazer os usuários de dentro da rede interna acessarem o mesmo link...

Isso é possivel?

[5] Comentário enviado por rogerio_gentil em 19/03/2009 - 14:12h

Muito boa essa dica.. aposto que tem muita gente atrás dessa!

[6] Comentário enviado por GustavinhoO em 02/05/2011 - 11:06h

bom dia!

tenho uma duvida.

tenho o seguinte ambiente na minha empresa, 40 maquinas internas e 50 que acessam de fora pela intranet.

tem um adsl + router d-link (lixo) que esta fazendo virtual host, ou seja redirecionando.
tudo que chega na porta xx encaminha para 192.168.1.100:1433 = sql server
e tem algumas outras.
como ficaria a regra nesse caso?

iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j DNAT --to 192.168.1.100:1433

não testei ainda, gostaria de ter a certeza que esta certo!

[7] Comentário enviado por *mau* em 19/11/2011 - 11:10h

É possivel usar esse comando para direcionar a um DNS?

Eu quero que um servidor meu com IP valido e FIXO, direcione para um outro servidor o qual tambem tem um IP classe A valido porem com IP dinamico, portanto esse servidor tem um DNS.

Eu tentei esse comando não funcionou:

iptables -t nat -A PREROUTING -d 200.200.200.200 -p tcp --dport 80 -j DNAT --to teste.dyndns-web.com:8000


Seria possivel outro metodo?

[8] Comentário enviado por mcloh em 03/01/2012 - 11:00h

meu port forward não está funcionando... este é o retorno do iptables-save e do ip route... (123.123.123.123 é apenas um *** para o valor real do meu ip) alguma dica (sim, ativei o ip_forward)?


$iptables-save
# Generated by iptables-save v1.4.4 on Tue Jan 3 07:47:35 2012
*nat
:PREROUTING ACCEPT [698:38520]
:POSTROUTING ACCEPT [1122:89354]
:OUTPUT ACCEPT [1105:88470]
-A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.1.1.155:8080
-A POSTROUTING -d 10.1.1.155/32 -p tcp -m tcp --dport 8080 -j SNAT --to-source 123.123.123.123
COMMIT
# Completed on Tue Jan 3 07:47:35 2012
# Generated by iptables-save v1.4.4 on Tue Jan 3 07:47:35 2012
*mangle
:PREROUTING ACCEPT [8807:864273]
:INPUT ACCEPT [8671:857281]
:FORWARD ACCEPT [136:6992]
:OUTPUT ACCEPT [8352:1180725]
:POSTROUTING ACCEPT [8410:1181549]
COMMIT
# Completed on Tue Jan 3 07:47:35 2012
# Generated by iptables-save v1.4.4 on Tue Jan 3 07:47:35 2012
*filter
:INPUT ACCEPT [309:33618]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [147:14813]
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A FORWARD -d 10.1.1.155/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 8080 -j ACCEPT
COMMIT
# Completed on Tue Jan 3 07:47:35 2012


$ip route
10.1.1.0/24 via 123.123.123.123 dev venet0 scope link
127.0.0.0/8 dev lo scope link
default dev venet0 scope link

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

[9] Comentário enviado por zaeli em 13/07/2012 - 11:39h

Bom dia, sou novo no mundo livre linux, e gostaria de saber como irei criar essa regra e onde irei digitar ela, que foi passado pelo amigo Joao Carlos. Fico muito grato, abraços

[10] Comentário enviado por maringolo em 29/05/2013 - 18:50h

Amigo caso puder me ajudar.

O meu cenário é o seguinte, possuo um servidor de internet, com o debian 6 instalado, com ip fixo e gostaria de acessar uma pagina web, hospedada no tomcat em outro servidor de rede local windows server 2003.

Segue meu firewall

#!/bin/bash
#carregar modulos
modprobe iptable_nat
##############
# Limpar Regras
iptables -F
iptables -X
iptables -Z

iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z

iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -Z
#####################
# Definir Politica Padrao

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
#####################
# Liberar SSH

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#####################
# Liberar Loopback

iptables -A INPUT -i lo -j ACCEPT

#####################
# Liberar Resposta

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
######################################## Redirecionar para o Squid #########################################

iptables -t nat -A PREROUTING -i 192.168.0.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

#########################
# Redirecionamento (oque eu preciso)


#iptables -t nat -A PREROUTING -d (ip do servidor web) -p tcp -mtcp --dport 8080 -j DNAT --to-destination 192.168.0.254:8080

iptables -t nat -A PREROUTING -d (ip do servidor web) -i eth0 -p tcp --dport 8080 -j DNAT --to 192.168.0.254:8080

#FIM

esta regra acima foi oque eu tentei fazer mas sem sucesso!!!

Com este redirecionamento pretendo acessar este link do tomcat: http://ip do servidor:8080/dadosweb/loginWeb.jsp?execobj=XXPW20200 , de qualquer maquina web...








Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts