O
Iptables consiste em um módulo do kernel do
Linux utilizado como front-end para configurar o
Netfilter. Na verdade, é o Netfilter que realiza toda a filtragem de pacotes no Linux. O Netfilter é implementado nativamente no kernel, o que faz com que o processamento dos pacotes seja feito de forma mais eficiente do que um processamento realizado por uma aplicação que roda em "user mode".
O Netfilter possui algumas tabelas de filtragem de pacotes, sendo que cada tabela possui determinadas chains. Trataremos neste tutorial basicamente da tabela mais comum: a
tabela Filter. Mostraremos ainda alguns exemplos de uso da tabela Nat. A terceira tabela (a Mangle) não será abordada.
A tabela Filter possui 3 chains: INPUT, OUTPUT e FORWARD. Uma chain pode ser pensada como uma fila onde o pacote será processado. Desta forma, qualquer pacote que chega à máquina local, e é destinado a essa máquina, é direcionado para a chain INPUT. Caso o pacote chegue à máquina local, mas seja destinado a outra máquina, este pacote será direcionado para a chain FORWARD, e não para a chain INPUT. Esta seria a situação de uma máquina Linux que esteja funcionando como um roteador, por exemplo.
Cabe observar, no entanto, que a opção de realizar roteamento vem desabilitada por padrão no Linux. Mostraremos mais adiante como checar se esta opção está habilitada e como ativar/desativar esta opção. Voltando às chains da tabela Filter, qualquer pacote cuja origem seja a máquina local, é direcionado para a chain OUTPUT.
A tabela Nat, por sua vez, possui 2 chains: a POSTROUTING e a PREROUTING. Qualquer pacote que chegue à máquina local é direcionado para a chain PREROUTING, independentemente do destino deste pacote. Portanto, é depois de passar por esta chain que o pacote irá para a chain INPUT ou para a chain FORWARD (isso se ele passar pela chain PREROUTING, ou seja, se não for descartado por uma das regras desta chain).
Qualquer pacote que deixe e máquina local é direcionado para a chain POSTROUTING, depois de ter passado pela chain OUTPUT, ou pela chain FORWARD. Vale ressaltar que a principal função de uma máquina que realiza o serviço de NAT (Network Address Translation) é alterar o endereço de origem e/ou de destino dos pacotes.
A tabela Mangle serve para especificar ações especiais para o tratamento do tráfego que atravessa os chains. Nesta tabela existem cincos chains: PREROUTING, POSTROUTING, INPUT, OUTPUT e FORWARD. Em geral, cada um deste chain é processado antes do chain correspondente na tabela Filter e Nat para definir opções especiais para o tráfego (por exemplo, o chain PREROUTING da tabela mangle é processado antes do PREROUTING da tabela Nat).
O chain OUTPUT da tabela mangle corresponde ao OUTPUT da tabela Nat. Mesmo após o tráfego ser estabelecido, os chains da tabela mangle continuam ativos para garantir que as opções especiais relacionadas com a conexão continuem fazendo efeito.
Portanto, a filtragem de pacotes é feita com base em regras que adicionamos a cada uma dessas chains. Desta forma, qualquer pacote que passe por uma chain será aceito ou rejeitado (entre outras ações possíveis) caso este pacote atenda a uma determinada regra desta chain. O Iptables nada mais é que uma ferramenta que nos permite adicionar e remover regras a cada uma dessas chains.