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.