Segurança com iptables

Neste artigo explico as funcionalidades do iptables de uma maneira simples. Desde o que é uma tabela, um chain, até fazer um SNAT. Assim utilizaremos o iptables para proteger nossa rede, ou até mesmo o nosso desktop.

[ Hits: 66.524 ]

Por: Leonardo Damasceno em 29/10/2009 | Blog: https://techcraic.wordpress.com


Sintaxe do iptables, chains e tabelas



Os chains são os locais onde as regras são armazenadas. Existem dois tipos de chains, os embutidos e os criados pelos próprios usuários. Sim, isso mesmo! Você pode criar o seu chain, definir o nome para ele e a sua funcionalidade.

Neste artigo vamos trabalhar mais com os chains INPUT, OUTPUT e FORWARD da tabela Filter.

Veja as tabelas existentes e seus chains:

Tabela: FILTER
Descrição: É a tabela padrão, ela não precisa ser especificada na sintaxe do iptables. Chains:
  • INPUT - Consultado para dados que chegam à máquina;
  • OUTPUT - Consultado para dados que saem da máquina ;
  • FORWARD - Consultado para dados que são redirecionados para outra interface de rede ou outra máquina.

Exemplo: iptables -A FORWARD -i eth0 -o eth2 -m pkttype --pkt-type multicast -j DROP

Tabela: NAT
Descrição: Usada para dados que geram outra conexão (masquerading, source nat, destination nat, port forwarding, proxy transparente são alguns exemplos).
Chains:
  • PREROUTING - Consultado quando os pacotes precisam ser modificados logo que chegam;
  • OUTPUT - Consultado quando os pacotes gerados localmente precisam ser modificados antes de serem roteados;
  • POSTROUTING - Consultado quando os pacotes precisam ser modificados após o tratamento de roteamento.

Exemplo: iptables -t nat -A POSTROUTING -s 192.168.1.2 -o eth0 -j SNAT --to 200.200.217.40

Tabela: MANGLE
Descrição: Utilizada para alterações especiais de pacotes, ele trabalha com TOS (Type Of Service), faz o controle da prioridade dos pacotes.
Chains:
  • INPUT - Consultado quando os pacotes precisam ser modificados antes de serem enviados para o chain INPUT da tabela filter;
  • FORWARD - Consultado quando os pacotes precisam ser modificados antes de serem enviados para o chain FORWARD da tabela filter;
  • PREROUTING - Consultado quando os pacotes precisam ser modificados antes de ser enviados para o chain PREROUTING da tabela nat;
  • POSTROUTING - Consultado quando os pacotes precisam ser modificados antes de serem enviados para o chain POSTROUTING da tabela nat;
  • OUTPUT - Consultado quando os pacotes precisam ser modificados antes de serem enviados para o chain OUTPUT da tabela nat.

Exemplo: iptables -t mangle -A PREROUTING -i eth0 -p tcp --sport 20 -j TOS --set-tos 8

Vamos criar o nosso chain, mas antes vamos ver a sintaxe do iptables:

Sintaxe:

iptables [-t tabela] [opção] [chain] [dados] -j [ação]

Exemplo:

# iptables -t filter -A INPUT -d 192.168.1.6 -j DROP

Caso você não especifique a tabela, o iptables usa a padrão, a tabela filter, por exemplo:

# iptables -A INPUT -d 192.168.1.6 -j DROP

Criando chain

Então vamos criar o nosso próprio chain, utilizando a opção -N:

iptables [-t tabela] [-N nomedochain]

Exemplo:

# iptables -t filter -N internet

Inserindo regra no novo chain "internet":

# iptables -t filter -A internet -s 192.168.0.102 -j DROP
# iptables -t filter -A INPUT -j internet


Obs.: Note que o colocamos como o "alvo".

Bem, vamos entender como um novo chain funciona, na verdade ele faz um redirecionamento, veja:

Na tabela INPUT temos apenas uma regra e agora temos a segunda regra, que é a do nosso chain:
  • -s 192.168.0.102 -j DROP
  • -j INTERNET -> -s 192.168.0.102 -j DROP

Então, criamos o chain internet, incluímos uma regra nele, e então adicionamos ele a outro chain, especificando-o como alvo.

Por que isso!? Bem, todo chain tem uma especificação, por exemplo, o chain INPUT aceita ou não pacotes de fora para dentro, e o nosso chain "internet" não tem função, então usamos o conhecido "pulo do gato", dizendo que ele tem a função de INPUT, incluindo ele dentro do chain INPUT.

Eu não acho correto, essa expressão "criar um chain", na verdade não estamos criando um chain com uma funcionalidade nova para o iptables na tabela que queremos, mas ele pode nos ajudar, um exemplo disso é quando temos muitas regras, criando os próprios chains faz a organização ficar ainda melhor.

Renomeando chain

Caso você tenha criado um chain e deseja renomeá-lo, podemos usar a opção -E:

iptables [-t tabela] -E chain-antigo chain-novo

Exemplo:

# iptables -t filter -E internet teste

Assim, mudei o nome do chain de "internet" para "teste".

Apagando chain

Podemos apagar o chain com a opção -X:

iptables [-t tabela] -X [chain]

Exemplo:

# iptables -t filter -X teste

Uma observação importante é que os chains embutidos (que já vem por default no iptables, como o INPUT, OUTPUT) não podem ser apagados pelo usuário.

No próximo passo vamos realmente entender as regras, passo a passo, então essa página serviu para que você entenda qual a funcionalidade dos chains e os ganhos que teremos ao criar o nosso próprio chain. Também precisamos entender que cada tabela possui os seus chains e note que o chain INPUT da tabela filter é diferente do INPUT da tabela mangle.

Veja a sintaxe do iptables, porque vamos começar a criar as nossas regras.

Página anterior     Próxima página

Páginas do artigo
   1. Conceito básico
   2. Sintaxe do iptables, chains e tabelas
   3. Regras e parâmetros
   4. IP Masquerade, SNAT e DNAT
Outros artigos deste autor

Desmistificando o GNU/Linux

Criando VPN com o PFSense

Qmail: simples e funcional

I-Educar no Gnu/Linux

Servidor de log no Debian com Syslog-ng

Leitura recomendada

IPtables - Trabalhando com Módulos

Instalando um firewall mínimo em Debian

Criando cluster com o PFSense

Servidor de internet a rádio no Debian

Iptables detalhado

  
Comentários
[1] Comentário enviado por tiagomb em 29/10/2009 - 17:30h

muito bom o artigo....

[2] Comentário enviado por andre.vmatos em 29/10/2009 - 18:23h

Muito bom mesmo, parabéns. Por incrível que pareça, mecho com linux e segurança há vários anos, e não tinha sacado ainda essa opção -I, pra adicionar as regras no começo. Sempre que precisava, escrevia um script e colocava a regra que queria que tivesse prioridade no começo, o que era muito chato. Mas com essa opção -I, fica muito mais simples. Obrigado mesmo. Lendo a man do iptables, vi também que essa opção -I suporta também a posição da regra. Assim, você pode fazer algo como:
iptables -I INPUT [posição] [regra]
para fazer com que a regra entre na posição específicada. Parabéns novamente. T+

[3] Comentário enviado por kelbel em 29/10/2009 - 18:25h

Cara, eu já trabalho com Iptables a tempos, mas este artigo está muito bom.
Muito bem escrito e de forma bem didática para os iniciantes.
Parabéns!

[4] Comentário enviado por hugoalvarez em 29/10/2009 - 19:47h

Gostei de rever a QUEUE e RETURN, são assunto de livro hehehe, pena não ter nenhuma amostra delas em uso, mesmo assim parabéns.

[5] Comentário enviado por mesaque em 29/10/2009 - 21:45h

Parabéns pelo artigo. Entendo pouca coisa de iptables, mas este artigo já melhorou um pouco minha compreensão. Tenho uma dúvida.
Tenho um servidor que uso como gateway da rede e gostaria de usá-lo apenas como firewall. Queria saber se é possível usar outro servidor da rede como proxy.

Na hora de fazer o proxy transparente encaminhar para a porta 3128 de outro pc.

Não sei se estou sendo ignorante.

Se puder me ajudar ficarei muito agradecido

Abraço

[6] Comentário enviado por grandmaster em 29/10/2009 - 22:26h

guardado nos favoritos :)

---
Renato de Castro Henriques
CobiT Foundation 4.1 Certified ID: 90391725
http://www.renato.henriques.nom.br

[7] Comentário enviado por y2h4ck em 30/10/2009 - 13:09h

mesaque, tanto 'e possivel quanto e recomendavel :)

Porem, nesse modo nao e possivel que o proxy seja transparente. Voce deve seta-lo no Browser dos hosts da rede, ou entao adicionar o proxy diretamente na configuracao do DHCP.


[8] Comentário enviado por mesaque em 30/10/2009 - 13:47h

Obrigado caro amigo.
Não sei como faz, vou dar uma pesquisada, mas se puder dar uma luz agradeço.

Teria algo a ver com a opção 252 do dhcp e configuração de um wpad.dat no apache?

Abraço,

Mesaque

[9] Comentário enviado por elgio em 31/10/2009 - 09:59h

Opa, y2h4ck e masaque. É possível sim!

Como o servidor de proxy está na mesma rede dos clientes, exige um pouco mais de perícia. Isto porque para fazer as conexões irem para o proxy é muito fácil. Apenas deve-se trocar uma linha que seja mais ou menos assim:

iptables -t nat -A PREROUTING -i INTERFACE -s IPS -p tcp --dport 80 -j REDIRECT --to 3128

Para uma outra mais ou menos assim:

iptables -t nat -A PREROUTING -i INTERFACE -s IPS -p tcp --dport 80 -j DNAT --to IPDOTEPROXY:3128

Só que se o proxy estiver na mesma rede dos clientes, vai dar problemas pois a resposta não irá para o roteador, mas sim direto ao cliente que o descartará (veja meus comentários em http://www.vivaolinux.com.br/topico/netfilter-iptables/Redirecionamento-de-portas-2/ e http://www.vivaolinux.com.br/topico/Squid-Iptables/Problema-com-redirect-em-Iptables/ )

Neste caso tu "resolve" com um duplo nat:

iptables -t nat -A POSTROUTING -d IPDOPROXY -p tcp --dport 3128 -j MASQUERADE

:-D

[10] Comentário enviado por mesaque em 03/11/2009 - 17:06h

Ok amigo, vou tentar hoje a noite e respondo para ver se deu certo.

Valeu!

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