INPUT, OUTPUT, PREROUTING, POSTROUTING... Afinal, o que são estes nomes e em quais circunstâncias uma regra deve ir em um ou outro? E as tabelas filter, nat e mangle? Como o iptables é estruturado?
Entram nesta tabela o conjunto de regras com finalidades gerais, como bloquear, negar, realizar logs. As regras existentes nesta tabela não tem poder de alterar as configurações dos pacotes. Basicamente todas as regras de filtragem estão nesta tabela, pois ela é de uso geral.
Para inserir uma regra em uma lista, pode-se usar -A para APPEND, inserindo-a no final, ou -I para INSERT, inserindo-a NO INÍCIO (a sintaxe profunda das regras não é o foco deste artigo).
A tabela filter possui três conjuntos de regras, ou seja, três listas sendo que cada uma delas está associada a um gancho:
INPUT: esta fila de regras recebe este nome justamente por ser aplicada aos pacotes na posição do gancho 4. Logo apenas os pacotes destinados ao ip da máquina atual serão avaliados por eventuais regras existentes nesta tabela. Sintaticamente para inserir regras nesta lista usa-se os parâmetros de iptables (o comando está incompleto):
iptables -t filter -A INPUT [regra]
OUTPUT: esta fila de regras recebe este nome justamente por atuar no gancho 5 (também chamado pelo kernel de OUTPUT). Logo serão avaliados pelas regras presentes nesta lista apenas os pacotes originados por processos locais da máquina. Sintaticamente para inserir uma regra nesta lista usa-se o comando:
iptables -t filter -A OUTPUT [regra]
FORWARD: esta fila de regras recebe este nome justamente por atuar no gancho 2 (também chamado pelo kernel de FORWARD). Logo serão avaliados por estas regras os pacotes que estão sendo repassados por esta máquina, não são para ela e nem originados por ela. Sintaticamente para inserir uma regra nesta lista usa-se o comando:
iptables -t filter -A FORWARD [regra]
A tabela filter é a tabela básica do iptables e são em suas listas que devem ser inseridas regras de filtragens gerais, que não são complexas, como proibir ou permitir ips, portas, etc. Na Figura 3 pode ser observado a atuação do conjunto de regras desta tabela sobre os ganchos.
Cada regra pode realizar uma determinada ação ao pacote (representado graficamente por -j), sendo que na filter as seguintes ações são possíveis:
REJECT: o pacote, uma vez que casou com a regra, é rejeitado. Demais regras existentes são ignoradas e o pacote definitivamente já teve seu destino selado: será descartado. Se for usado REJECT o remetente do pacote será avisado com uma mensagem de erro, normalmente um ICMP de "porta inatingível" (mas o iptables permite ao usuário mudar o tipo de retorno se ele quiser). Em termos de segurança pode não ser interessante devolver uma resposta ao remetente, pois isto iria inevitavelmente dar a conhecer a ele o número IP do firewall.
DROP: o DROP tem o mesmo efeito do REJECT e a mesma aplicação, com a diferença de que não é retornado nenhuma mensagem de erro ao remetente (ele não saberá o que aconteceu com o pacote). Em se tratando de FORWARD (repasse) pode ser conveniente usar DROP ao invés de REJECT para que um possível atacante não saiba o IP do firewall que rejeitou o seu pacote. Mas isto deve ser bem analisado, pois se o remetente não souber o que ocorreu, ele poderá ficar ainda tentando várias vezes até desistir por time out. Se o teu firewall é o roteador principal, não tem porque escondê-lo, pois ele é um ponto de rota mesmo. Mas se ele for transparente (atuando em modo bridge), aí pode ser uma boa estratégia não dar nada ao remetente.
ACCEPT: Aceita um pacote, deixando que ele siga o seu percurso. O ACCEPT, como os anteriores, causa o término de teste nesta tabela, ou seja, o pacote já foi aceito e não será mais testado por nenhuma outra regra posterior nesta tabela (mas ainda poderá ser testado por outra tabela, como pela mangle ou nat, por exemplo. Acredito que o único exemplo onde isto possa acontecer é ele ser ACEITO no filter FORWARD, mas ser DROPADO no nat POSTROUTING, já que o nat tem também o poder de realizar DROP).
LOG: realiza um log deste pacote no sistema (geralmente no /var/log/syslog ou messages). Ao contrário das demais ações (DROP, ACCEPT e REJECT), ao aplicar um log no pacote o mesmo ainda continua sendo testado pelas regras seguintes da fila atual. Uma ação do tipo LOG não causa o término do teste. Caso seja do interesse do usuário ele pode configurar uma mensagem de log que aparecerá nos logs facilitando a análise.
[2] Comentário enviado por loammy em 13/07/2007 - 08:53h
Otimo artigo. Elgio, pode ter certeza que o seu artigo vai ajudar muitos usuarios iniciantes a entender como funciona o Netfilter/Iptables, fazendo com que eles mesmos criem regras personalizadas para cada caso. E muitos deles não precisaram ficar copiando scripts sobre Netfilter/Iptables de terceiros.
E finalmente alguem escreveu um artigo com muita clareza sobre a essencia do Netfilter/Iptables. Parabens...
[10] Comentário enviado por an_drade em 13/07/2007 - 17:07h
Muito bom artigo!!! Muito explicativo, simples, conciso e curto. Excelente material p/ quem está começando a aprender iptables, e até mesmo noções de roteamente.
[18] Comentário enviado por forkd em 17/07/2007 - 11:50h
Cara,
muito bom o tutorial de IPTables, heim? Tô lendo ele aqui!
Agora sim! Excelente referência pra um ótimo artigo!
Era isso que eu estava querendo há algum tempo!
Aguardo os próximos artigos da série!
[22] Comentário enviado por elgio em 17/01/2008 - 11:23h
Julio.
Tá bom, tá bom.
Tu realmente não gostou de minha manifestação no seu artigo (http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=7393)
Faz um favor para o Vol: manda ai o link de onde "eu copiei" este meu artigo que escrevi. Sim, porque linha por linha do que está aqui eu escrevi de meu próprio punho.
Agora tu vai começar a me perseguir no Vol?
Vai ser divertido... :-D
[29] Comentário enviado por jonathan bispo em 02/01/2009 - 14:44h
Excelente artigo.
Era justamente essa explicação que eu estava buscando na internet.
Agora ficou muito mais simples entender as regras do iptables e configurá-las da forma que eu precisar.
Parabéns!!!
[32] Comentário enviado por jose.freitas.rj em 24/04/2009 - 12:16h
olá elgio! pelo que tenho visto, você saca muito de iptables e eu estou começando agora e estou com dúvidas. tenho 1 ADSL velox com ip dinâmico. tenho um servidor de internet com duas placas de rede. meu servidor está normalíssimo, mas meu único problemas é fazer meu ssh ser acessado pelo pessoal de fora da empresa, ou seja, pela internet, coisa que não estou conseguindo! neste servidor tenho uma placa de rede interna ligada na rede com o ip 192.168.3.252. já na placa que está ligada direto no modem ADSL o ip é 192.168.254.1 e o modem tem o ip 192.168.254.254.
minha dúvida é:
qual seria a regra de iptables pra liberar o pessoal de fora da empresa pela internet pra acessar meu servidor de vendas na porta 22 ssh que está atrás de servidor firewall? pelo fato de eu ter 2 placas rede, sendo uma ligada direto na rede e outra direto na porta WAN do modem não estou conseguindo cara! meu ajuda pelo amor de DEUS... ah! não tenho nem noção de como seria essa regra de direcionamento já que tenho 2 placas de rede!
[33] Comentário enviado por jose.freitas.rj em 29/04/2009 - 13:45h
elgio, não precisa! já fiz e funcionou! :D
o comando "echo 1 > /proc/sys/net/ipv4/ip_forward" já faz o que eu quero!
ele é quem manda no DNAT e SNAT, sendo assim coloquei essas regras com a ajuda de um parceiro de linux chamado sylvio que me passou esses regras:
#DIRECIONANDO SSH DA INTERNET
iptables -A INPUT -i eth0 -s 0/0 -d 0/0 -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A FORWARD -i eth0 -s 0/0 -d 0/0 -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -s 0/0 -p tcp --dport 22 -j DNAT --to 192.168.3.1:22
[38] Comentário enviado por removido em 20/01/2014 - 21:10h
So para complementar,
O iptables possui uma caracteristica interessante que o seu antecessor ipchains não possuia, que a capacidade de STATE-FULL dos pocotes que correm nas chains que torna o firewall mais seguro entre outros beneficios.
Recentemente tive a oportunidade de estudar algumas ferramentas desenvolvidas pelo pessoal da netfilter.org e gostei muito das ferramentas de extenção do iptables para sincronismo de estados de conexões, muito util em ambiente de firewalls balanceados.