Um pouco sobre IPtables

IPtables é um firewall a nível de pacotes e funciona baseado no endereço/porta de origem/destino do pacote, prioridade etc. Ele funciona através da comparação de regras para saber se um pacote tem ou não permissão para passar. Em firewalls mais restritivos, o pacote é bloqueado e registrado para que o administrador do sistema tenha conhecimento sobre o que está acontecendo em seu sistema.

[ Hits: 63.486 ]

Por: Douglas Q. dos Santos em 08/12/2012 | Blog: http://wiki.douglasqsantos.com.br


NAT



O NAT (Network Address Translation) é o responsável por traduzir endereços para que as redes distintas consigam se comunicar, ou seja, é responsável pela comunicação dos hosts de uma empresa com o mundo, a Internet, por exemplo.

Também serve para que o acesso externo chegue a seu servidor Web localizado em sua rede interna, DMZ. Na prática, usamos muito o NAT para mascarar conexões, proxies transparentes, fazer SNAT (NAT Origem) e DNAT (NAT destino), redirecionamentos de portas etc.

Antes de começarmos a analisar as regras de NAT, devemos lembrar das nossas redes privadas.

Mas, para quê precisamos relembrar redes privadas?

Como visto anteriormente, uma das funções do NAT é compartilhar a Internet com uma rede privada, desta forma só para relembrar, podemos ver a seguir as redes privadas disponíveis:
  • 10.0.0.0 - 10.255.255.255 ou 10.0.0.0/8 (máscara de rede 255.0.0.0)
  • 172.16.0.0 - 172.31.255.255 ou 172.16.0.0/16 (máscara de rede 255.255.0.0)
  • 192.168.0.0 - 192.168.255.255 ou 192.168.0.0/24 (máscara de rede 255.255.255.0)

As redes privadas não trafegam na Internet. Para isso, precisamos de um dispositivo que atue entre a rede privada e a Internet. Neste momento, entra em cena o nosso roteador GNU/Linux com NAT. A solução com Linux é bem mais econômica do que outras soluções, como usar ferramentas proprietárias ou até hardwares. Assim, torna-se viável o uso do Linux com sistema de NAT.

O NAT trabalha reescrevendo os IPs de origem ou destino, que atravessam o firewall, então, quando um pacote é encaminhado para um servidor Web, o firewall reescreve o endereço IP de origem para que os pacotes possam chegar até o destino.

E quando este pacotes voltar, ele retornará como sendo endereço de destino, o nosso servidor (não teria como saber para quem realmente é este pacote sem as connection tracks). Como o servidor já tem armazenadas informações sobre esta conexão, então ele reescreve os IPs de destino e os encaminha para quem os solicitou.

O nosso IPtables pode trabalhar em vários cenários diferentes, por exemplo:
  • 1:1 - Um para um → Quando traduzimos um IP privado para um IP público;
  • 1:N - Um para muitos → Quando traduzimos um IP privado por vários IPs públicos, por exemplo, se temos várias conexões com a Internet ou pelo menos mais de uma.
  • N:1 - Muitos para um → Esse é o mais comum, pois temos uma rede privada para um IP público;
  • N:N - Muitos para muitos → neste caso específico, temos mitos IPs privados ou uma rede, onde será traduzido para vários IPs públicos.

Após termos visto todos estes itens, podemos verificar os alvos comuns utilizados na tabela NAT. No NAT trabalhamos com três chains: PREROUTING, POSTROUTING e OUTPUT, e temos também alguns alvos específicos, como: DNAT, SNAT e MASQUERADE.

Utilizando SNAT

O SNAT faz parte da tabela NAT, ele faz a tradução de endereços e altera os endereços de origem (source nat).

Então, o SNAT é responsável por alterar os endereços de uma rede, e enviar para outra rede. Esta tradução poderá ser feita nos cenários que citamos: 1:1, 1:N etc.

Habilitando forwarding no kernel

Um item importantíssimo é habilitar o nosso kernel para permitir o encaminhamento de pacotes (IPv4 forward). Este item pode ser habilitado através da inserção do número 1 dentro do arquivo /proc/sys/net/ipv4/ip_forward.

Podemos usar também o comando:

# sysctl -w net.ipv4.ip_forward=1

É importante atentar que, nas duas situações, as habilitações são perdidas após reiniciarmos as máquinas, desta forma devemos criar um script do tipo:

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

Podemos fazer da seguinte forma também:

systcl -w net.ipv4.ip_forward=1

Também podemos editar o arquivo /etc/sysctl.conf e adicionar a seguinte linha:

net.ipv4.ip_forward=1

Assim não teremos problemas quando houver necessidade de reiniciarmos o GNU/Linux, não perdendo a ativação de encaminhamentos de pacotes.

Compartilhando a Internet para uma máquina

Vamos supor que precisamos dar acesso a um IP na rede privada através da nossa interface de rede com "IP FIXO" público no GNU/Linux.

# iptables -t nat -A POSTROUTING -s 192.168.0.4 -d 0/0 -j SNAT --to 200.200.200.1

Neste exemplo, os pacotes que passarem pelo nosso firewall de origem 192.168.0.4 com destino a qualquer lugar, serão alterados com endereço de origem para 200.200.200.1.

Note que usamos a opção "-t nat", que indica que a tabela que será adicionada à regra, será a tabela NAT. Temos que especificar a tabela, pois caso contrário, o IPtables iria inserir na tabela filter, que não possui chain POSTROUTING e geraria um erro.

Compartilhando a Internet para uma rede

Neste exemplo, iremos fazer a alteração do endereço de destino para uma rede inteira:

# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 200.200.200.1

No exemplo anterior, todos os pacotes com origem na rede privada 192.168.0.0 que irão sair pela interface eth0, terão seus endereços de origem alterados para 200.200.200.1.

Comunicação entre redes privadas

Podemos nos utilizar dessa regra para fazer duas redes distintas privadas comunicarem-se.

# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 10.0.0.1

A nossa rede inteira 192.168.0.0 poderá comunicar-se com a rede 10.0.0.0 através da alteração do endereço de origem para 10.0.0.1.

Usando SNAT para um range de IPs

Podemos utilizar o esquema N:N, ou seja, vários IPs para vários IPs.

# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 10.0.0.1-10.0.0.10

Os pacotes de origem 10.0.0.0/8 terão seus endereços de origem alterados para os endereços entre 10.0.0.1 até 10.0.0.10.

Usando exceções

As exceções também funcionam na tabela NAT. Utilizando normalmente o "!" para fazer uma exceção.

# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j SNAT --to 200.200.200.1

Neste exemplo, estamos utilizando o sinal "!". Seu significado quer dizer "diferente de", por exemplo, 192.168.0.1 significa todos menos o endereço 192.168.0.1.

A regra anterior especifica que os pacotes com origem da rede 192.168.0.0/24, e destino, que não seja ela mesma (diferente de 192.168.0.0/24), especificado através do item "! -d 192.168.0.0/24", terão a origem alterada para 200.200.200.1 (utilizando-se da tabela NAT).

Esta alteração de endereço de 192.168.0.0/24 para 200.200.0.1 é necessária, pois endereços desse tipo não podem acessar a rede pública da Internet.

Página anterior     Próxima página

Páginas do artigo
   1. Um pouco de história
   2. Adicionando e inserindo regras
   3. Deletando e substituindo regra
   4. Listando e limpando regras
   5. Zerando contadores - Criando chain
   6. Renomeando e deletando chain - Política default
   7. Opções e parâmetros do IPtables
   8. Ações padrões
   9. Usando o IPtables
   10. NAT
   11. Utilizando MASQUERADING
Outros artigos deste autor

Alta disponibilidade com Debian Lenny + Heartbeat + DRBD8 + OCFS2 + MONIT + LVS

Apache em chroot + MySQL + PHP + mod_security + mod_evasive + vsftpd + Fail2ban + Debian Squeeze

Bind9 slave em chroot no Debian Lenny

Debian Lenny com Kernel 2.6.28 + Layer7 + Firewall

Bind9 em chroot no Debian Lenny

Leitura recomendada

Criando cluster com o PFSense

Bloqueando programas P2P com iptables

Shorewall - Firewall passo a passo no Linux

IPFire - Um Firewall Open Source

Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).

  
Comentários
[1] Comentário enviado por fabio em 08/12/2012 - 10:39h

Se esse aqui é "Um pouco sobre IPtables", fico imaginando como seria o artigo "Um muito sobre IPtables" :)

Meus parabéns, ótimo artigo!

[2] Comentário enviado por douglas_dksh em 10/12/2012 - 13:12h

Obrigado,

O pior que isso ai é a base para poder se virar com o iptables.

Tem muito mais que pode ser abordado :D

[3] Comentário enviado por removido em 10/12/2012 - 17:08h

Realmente @fabio, fico imaginando também. Está ótimo o artigo.

['s]

[4] Comentário enviado por phrich em 10/12/2012 - 19:16h

Muito bom o artigo, está de parabéns!

[5] Comentário enviado por thyagobrasileiro em 11/12/2012 - 10:19h

PQP, seu blog é do caralh$#$@#@#%@

Bem organizado e aborda tudo, bem limpo e sem propagandas!!!
http://www.douglas.wiki.br


Otimo artigo!!

[6] Comentário enviado por douglas_dksh em 11/12/2012 - 11:31h

Obrigado galera :D

[7] Comentário enviado por dalveson em 11/12/2012 - 13:03h

douglashx otimo artigo,
veja se vc poderia me da uma ajuda, tenho o seguinte:
meu sistema é web e tem o ip 1.2.3.4 e roda porta 443, queria utilizar o modulos TOS junto com MANGLE para dar prioridade a este ip antes de qualquer outra conexao na minha rede 192.168.0.0/24 para upload e download sabe dizer como faço isso pois ja tentei, pesquisei bastante e ainda nao consegui
abraços

[8] Comentário enviado por douglas_dksh em 11/12/2012 - 13:41h

E ai colega,

Tipo de Prioridade TOS

Espera Mínima 0×10 ou 16
Máximo Processamento 0×08 ou 8
Máxima Confiança 0×04 ou 4
Custo Mínimo 0×02 ou 2
Prioridade Normal 0×00 ou 0

Conforme tabela acima, a Espera mínima tem a maior prioridade entre todos,

Se o servidor web estiver virado direto para a internet você pode fazer da seguinte forma

#Para Liberar o acesso na porta 443 com Máximo Processamento na entrada
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j TOS --set-tos 8

#Para Liberar o acesso na porta 443 com Máximo Processamento na saída
iptables -t mangle -A POSTROUTING -p tcp --dport 443 -j TOS --set-tos 8


#Se o servidor web estiver atras de um fw no fw tem que configurar da seguinte forma

#Para Liberar o acesso de origem da maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -s 1.2.3.4 -j TOS --set-tos 8

#Para Liberar o acesso de destino a maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8


Caso você queira utilizar a espera miníma troque o --set-tos 8 por --set-tos 10


[9] Comentário enviado por andrericsouza em 11/12/2012 - 13:50h

ótimo artigo

[10] Comentário enviado por dalveson em 11/12/2012 - 15:12h


[8] Comentário enviado por douglashx em 11/12/2012 - 13:41h:

E ai colega,

Tipo de Prioridade TOS

Espera Mínima 0×10 ou 16
Máximo Processamento 0×08 ou 8
Máxima Confiança 0×04 ou 4
Custo Mínimo 0×02 ou 2
Prioridade Normal 0×00 ou 0

Conforme tabela acima, a Espera mínima tem a maior prioridade entre todos,

Se o servidor web estiver virado direto para a internet você pode fazer da seguinte forma

#Para Liberar o acesso na porta 443 com Máximo Processamento na entrada
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j TOS --set-tos 8

#Para Liberar o acesso na porta 443 com Máximo Processamento na saída
iptables -t mangle -A POSTROUTING -p tcp --dport 443 -j TOS --set-tos 8


#Se o servidor web estiver atras de um fw no fw tem que configurar da seguinte forma

#Para Liberar o acesso de origem da maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -s 1.2.3.4 -j TOS --set-tos 8

#Para Liberar o acesso de destino a maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8


Caso você queira utilizar a espera miníma troque o --set-tos 8 por --set-tos 10



*na realidade o servidor 1.2.3.4 nao ta minha rede interna, esta em 1 cidade diferente, entao bastaria eu usar?
#Para Liberar o acesso de origem da maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -s 1.2.3.4 -j TOS --set-tos 8

#Para Liberar o acesso de destino a maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8

*outra coisa, não é necessario fazer referencia a chain INPUT o OUTPUT tambem?

*outra duvida se eu quero que o sistema com ip 1.2.3.4 me de respostas mais rapidas aos usuarios, eu devo configura-lo com qual dos parametros TOS:
Espera Mínima 0×10 ou 16
Máximo Processamento 0×08 ou 8

*e a ultima duvida como voce faz para saber que realmente o ip 1.2.3.4 esta com o TOS configurado corretamente?
aqui eu criava uma regra de log e começava a monitorar com cat e sempre me mostrava um TOS diferente do que eu tinha configurado, por isso sempre achei que tinha algo errado.

[11] Comentário enviado por douglas_dksh em 11/12/2012 - 15:32h

Você usaria com o FORWARD

e liberaria as regras na tabela filter para o FORWARD desse servidor de origem e destino, pois INPUT seria se fosse no servidor local, e OUTPUT saida do servidor local com isso você vai precisar somente da FORWARD para repasse.

iptables -t filter -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8

dai a regra de mangle para priorizar os pacotes

iptables -t mangle -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8

A espera mínima o seu pacote vai entrar logo em processamento mais não vai ter prioridade de processamento sobre os outros, no 8 temos o processamento máximo possível.

Para saber se está configurado certo mande listar com as flags vão aparecer em hexadecimal.
iptables -t mangle -L -n -v

[12] Comentário enviado por danilotm em 12/12/2012 - 11:17h

Parabéns Douglas, agora que voltarei a utilizar o IPTABLES que tanto gostava me deparo com este artigo, muito bem explicado e organizado.
Obrigado e um grande abraço!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts