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

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


Regras e parâmetros



Agora que vimos os chains e tabelas e ainda temos a sintaxe do iptables, nos resta entender como as regras funcionam para podemos implementar as nossas próprias regras.

Todas regras possuem um "alvo", existem alguns tipos de alvos que podem ser listados dessa maneira:
  • ACCEPT - Aceita o pacote;
  • DROP - "Dropa", ou simplesmente não aceita o pacote;
  • REJECT - Rejeita o pacote, enviando uma mensagem;
  • LOG - Envia uma mensagem ao syslog caso a regra confira;
  • RETURN - Para o processamento do chain atual, e retorna;
  • QUEUE - Passa para o processamento de programas externos.

Os alvos, ficam na última parte do "comando", ou da linha do iptables, veja:

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

Então podemos ver que o DROP é o alvo, que tem a ação de "dropa", ou simplesmente não aceitar o pacote.

Agora, para finalizar a formação de uma regra, precisamos entender os seus parâmetros e opções.

O que são regras

Uma regra pode ser definida como o espaço para o usuário implementar o que deseja que o firewall faça, ou ainda, uma regra pode ser um comando passado ao iptables para que ele interprete e realize uma determinada ação.

Obs.: As regras são armazenadas dentro dos chains e processadas na ordem que são inseridas.

Agora vamos entender os parâmetros e opções que usamos nas regras, como por exemplo:

# iptables -A INPUT -s 200.222.256.63 -j DROP

Por que esse "-s"? Por que "-A"? Vamos ver isso agora!

Adicionando regras

Opção -A:

As regras são executadas em ordem "crescente", ou seja, na ordem que são inseridas. Com a opção -A a regra é inserida no final da lista de regras. Se eu tenho 4 regras e adiciono mais uma com a opção -A, a minha nova regra, será inserida na quinta posição.

Sintaxe: iptables [-t tabela] -A [chain] [dados] -j [ação]

Opção -I:

Com opção -I inserimos a regra no topo, assim, se temos 4 regras e vamos adicionar uma nova regra utilizando a opção -I, essa minha nova regra será a primeira a ser executada.

Sintaxe: iptables [-t tabela] -I [chain] [dados] -j [ação]

Listando regras

Opção -L:

Com essa opção podemos listar todas as regras inseridas até o momento e podemos fazer isso de várias maneiras, exibindo o número de cada regra, exibindo o endereço das máquinas e muito mais.

Opções:
  • -v - Exibe mais detalhes sobre as regras criadas nos chains;
  • -n - Exibe endereços de máquinas/portas como números;
  • -x - Exibe números exatos. Mostra a faixa de portas de uma regra;
  • --line-numbers - Exibe o número da posição da regra.

Sintaxe: iptables [-t tabela] -L [chain] [opções]

Exemplo:

# iptables -t filter -L INPUT --line-numbers

Apagando uma regra

Pode apagar todas as regras usando iptables -F, porém, se queremos apagar apenas uma regra e não todas, podemos utilizar a opção -D.

Opção -D:

Sintaxe:

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


Exemplos:

# iptables -t filter -D INPUT 1
# iptables -t filter -D INPUT -d 127.0.0.1 -j DROP

Substituindo uma regra

Podemos substituir uma regra já existente, ou seja, podemos "editar".

Opção -R:

Sintaxe: iptables [-t tabela] -R [chain] [posição] [regra] -j [ação]

Exemplo:

# iptables -R INPUT 1 -d 127.0.0.1 -p icmp -j DROP

Limpando uma regra

Aprendemos a deletar uma única regra, mas podemos limpar todas as regras de um chain utilizando a opção -F.

Opção -F:

Sintaxe: iptables [-t tabela] -F [chain]

Exemplo:

# iptables -F (como não foi especificado a tabela, ele irá limpar as regras da tabela filter)

# iptables -t filter -F INPUT

Parâmetros

Parâmetro -s:

Usado para especificar endereços de origem. Também é usado como --src ou --source.

Parâmetro -d:

Usado para especificar endereços de destino. Também usado como --dst e --destination

Exemplo:

# iptables -t filter -A INPUT -s 192.168.0.104 -d 192.168.0.102 -p icmp -j DROP

Parâmetro -i:

Usado para especificar a interface de entrada.

Parâmetro -o:

Usado para especificar a interface de saída

Exemplo:

# iptables -t filter -A INPUT -s 192.168.0.104 -i ppp+ -j DROP

Exemplo2:

# iptables -A FORWARD -i ppp0 -o eth1 -j DROP

Obs.: O sinal de "+" funciona como um coringa, assim a regra terá efeito em qualquer interface de ppp0 a ppp9.

Parâmetro -p:

Usado para especificar um protocolo. Podem ser especificados os procolos TCP, UDP e ICMP.

Exemplo:

# iptables -A INPUT -s 192.168.0.104 -p icmp -j DROP

Parâmetro --dport:

Especifica uma porta ou faixa de portas de destino.

Exemplo:

# iptables -A OUTPUT -d 200.200.200.200 -p tcp --dport :1023 -j DROP

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

Criando DMZ com o PFSense

PFSense com Snort

Segurança em seu Linux

Servidor de log no Debian com Syslog-ng

Desmistificando o GNU/Linux

Leitura recomendada

Criando firewalls dinâmicos com Iptables Recent

Criando um Firewall transparente com Bridges no Debian Etch

Bloqueando o UltraSurf e o WebMessenger do Hotmail com Proxy Transparente

L7-filter (funcionando) no Slackware 10.2

Endian Firewall - Solução completa para um servidor de internet

  
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