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.544 ]

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


Utilizando MASQUERADING



Agora você deve estar se perguntando: se meu IP é dinâmico, com conexões ADSL que trabalham com PPPoE, ou o próprio PPP, como eu vou fazer um SNAT, já que tenho que especificar o IP?

Neste caso, podemos utilizar o masquerading para mascarar nossas conexões.

O masquerading é como um SNAT, compartilha a Internet, mas é usado para casos de IP dinâmico, como conexões PPP, PPPoE, entre outras. No caso do SNAT, atua com a chain POSTROUTING. Da mesma forma que no SNAT, é necessário habilitar o encaminhamento de pacotes através da alteração do arquivo "ip_forward", ou utilizando a configuração do arquivo /etc/sysctl.conf.

Usando como alvo o MASQUERADE:

# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE

Estamos mascarando toda a rede 192.168.0.0 que sai pela interface de saída (notem o -o) ppp0. Com isso, todas as nossas máquinas internas vão conseguir usar a conexão PPP, no caso de precisarem utilizar a internet. Ainda sim, poderíamos permitir apenas alguns IPs ou protocolos específicos.

# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -p tcp --dport 53 -j MASQUERADE

O exemplo acima segue o mesmo conceito dos itens vistos anteriormente, ou seja, haverá um NAT. Mas neste exemplo, só permitiremos o NAT quando a porta TCP for específica, neste exemplo a porta 53 está relacionada a DNS.

Utilizando DNAT

O DNAT, similar ao SNAT, é responsável por trocar os endereços de destino dos pacotes (destination nat). É muito usado para acesso à aplicações internas ou até balanceamento de carga de servidores.

Normalmente as solicitações têm origem de um meio externo (IP público) para o firewall, então o firewall, antes de rotear para o destino final, altera as informações de destino. Todas as informações do SNAT são válidas para o DNAT, como portas, endereços de origem e destino, protocolos, interfaces etc.

Mas a chain utilizada pelo DNAT é do pré-roteamento, ou seja, PREROUTING. Lembre-se de que o roteamento ocorre em dois momentos destintos:
  • Quando os pacotes estão entrando no firewall;
  • E quando estão saindo do firewall.

Então, se estamos utilizando SNAT e MASQUERADE, usamos POSTROUTING. No caso do DNAT, utilizamos PREROUTING.

Usando DNAT para um único servidor

Todas as solicitações de conexões providas da Internet em nosso roteador serão encaminhadas para um IP específico, indiferente do tipo de protocolo ou serviço (porta).

# iptables -t nat -A PREROUTING -s 200.200.200.1 -i eth1 -j DNAT --to 192.168.10.1

Quando os pacotes chegarem de 200.200.200.1 pela interface de entrada eth1, todos eles serão enviados para 192.168.10.1.

Fazendo DNAT para um web server

Quando utilizamos o DNAT, podemos utilizar para uma porta específica, por exemplo, um servidor web:

# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.10.1

Fazendo DNAT para um terminal service

Para fazermos DNAT para um terminal service, é necessário especificarmos a porta 3389:

# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3389 -j DNAT --to 192.168.10.2

Como podemos verificar, existem duas regras de DNAT:
  • Encaminhando solicitações HTTP para o servidor 192.168.10.1;
  • Encaminhando pacotes para um servidor terminal service.

Isso é interessante, pois os usuários solicitantes da conexão só terão acesso ao serviço específico, não podendo explorar falhas de outros serviços, tais como banco de dados, SSH, telnet, e-mail etc.

Utilizando REDIRECT

O alvo REDIRECT é usado para redirecionar pacotes em uma mesma máquina. Muito utilizado no redirecionamento de pacotes com destino à porta 80, quando temos um proxy (o Squid, por exemplo) que utiliza a porta 3128.

Então, redirecionamos todos os pacotes da porta 80 para a porta 3128, e fazemos com isso um proxy transparente, onde os usuários nem imaginam que estão utilizando um proxy, e que tudo que é feito é logado ou bloqueado no próprio proxy.

Os pacotes têm a sua porta destino reescrita para poderem ser encaminhados.

Os alvos do REDIRECT são válidos nas chains de PREROUTING e OUTPUT, e nas chains criadas. Essas chains foram as que o administrador criou.

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128

Neste exemplo, estamos redirecionando os pacotes com destino à porta 80 do nosso firewall para a porta 3128, que comumente é do proxy Squid.

Mas não tratamos de onde provêm os pacotes, deixando uma brecha para que todos tenham acesso (até endereços de fora da nossa rede local). Podemos utilizar o esquema de interface, no caso usando a interface de entrada como sendo a da nossa rede local, ou especificando diretamente nossa rede local.

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

Utilizando o NETMAP

Este target é utilizado para mapear uma rede em outra. Por exemplo, temos uma rede 192.168.0.0/24 e queremos que cada IP seja enviado como um SNAT para um IP 192.168.1.0/24, ou ainda IPs públicos.

Quando usaríamos isso?

Podemos ter situações onde estas redes têm que se comunicar, por exemplo, em uma VPN. De um lado 192.168.0 e de outro, 192.168.1.

O uso é bem simples:

# iptables -t nat -A PREROUTING -s 192.168.0.0/24 -j NETMAP --to 192.168.1.0/24

Note que a rede origem e destino tem 254 hosts. Isso ocorre para podermos mapear corretamente, sendo assim, o IP 192.168.0.4 será mapeado para 192.168.1.4.

Referências


Espero que esse HOWTO consiga tirar as dúvidas do pessoal que apanha um pouco do IPtables. ;)

Artigo também publicado em:
Página anterior    

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

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

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

Bind9 slave em chroot no Debian Lenny

Debian Lenny com Kernel 2.6.28 + Layer7 + Firewall

Bonding para Heartbeat + Bonding para DRBD + OCFS2 + Debian Squeeze

Leitura recomendada

Trabalhando com CARP nos BSD's

Como construir um firewall de baixo custo para sua empresa (parte 2)

Entendendo TCP/IP (Parte 5) - Portas TCP/UDP

Fusion Firewall - Uma alternativa para Firewall-Proxy gerenciado via web

Port Scan Attack Detector (PSAD) com iptables

  
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