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: 68.104 ]

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

Instalando o WebHTB

Desmistificando o GNU/Linux

Segurança em seu Linux

Segurança em seu Linux (parte 2)

PFSense com Snort

Leitura recomendada

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

Balanceamento de link + redundância

Iptables em modo gráfico

Um pouco sobre IPtables

Squid + iptables (método ninja)

  
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