Há algum tempo estou inclinado a escrever um post com os conceitos básicos sobre o iptables, mas porque? Participo de algumas listas de discussão e muitas vezes percebo que existem pessoas iniciantes que precisam saber o que estão fazendo com seus servidores, pois a maioria deles não vão além da “receita de bolo” que encontrou no Google. Sendo assim, segue abaixo uma breve introdução dessa poderossíma ferramenta que é o Iptables.
IPTABLES
O iptables nada mais é que uma interface utilizada para inserir regras de filtragens e modificação de pacotes, pois com base nessas regras o kernel efetua as ações devidas, mas necessariamente o módulo ip_tables.
Como é uma ferramenta em linha de comando, muitos dos iniciantes sentem um certo temor ao aprender, mas não há o que temer. É bem simples, basta ler e entender.
A linha de comando do iptables escrita é como uma ação que você deseja que seja tomada com um determinado pacote, para isso deverá fornecer parâmetros para o kernel identificar que pacote deseja fazer tal ação.
Exemplo:
Desejo que todos pacotes do ip 192.168.0.2 sejam bloqueados.
iptables -t filter -A INPUT -s 192.168.0.2 -j DROP
Entendeu? Não conhece as sintaxes do iptables ainda? Vamos para as básicas:
Tabelas
O parâmetro -t informa qual tabela será usada. Nesse post só tratarei de filter e em outro post NAT.
Filter é a tabela responsável por armazenar as regras para filtragem de pacotes propriamente dita. Bloqueio ou liberação.
Nat é a tabela responsável por armazenara as regras para modificação do pacote. Modificar a porta de destino, origem e afins.
sendo assim se desejar criar uma regra de filtragem apenas coloque -t filter, se for NAT coloque -t nat
Tipo de inserção
Se houver duas regras com ações distintas para o mesmo tipo de pacote? Depende da ordem de inserção.
Para adicionar uma regra há dois tipos de parâmetros que podem ser utilizados:
-A adiciona a regra no final da fila. Assim se houver muitas, essa será a ultima e se houver regra com parâmetro idênticos, essa nem será lida.
-I adiciona a linha onde desejar. Se omitir o local, será sempre adicionada no topo da fila.
Exemplo:
iptables -I INPUT 3 ….
Será adicionada na linha 3 da fila do INPUT.
Chain ou Fila
O nome correto é chain, mas vou chamar de fila para facilitar o entendimento.
Existem três tipo de fila na tabela filter; INPUT, OUTPUT e FORWARD.
INPUT
—> | Interface |
É a fila que é checada para pacotes que acessam o servidor por uma determinada interface.
OUTPUT
| interface | —->
É a fila que é checada para pacotes que saem do servidor por uma determinada interface.
FORWARD
—–|–interface–|—–>
É fila que é checada para pacotes que passam pelo servidor, ou seja, apenas são redirecionados.
Agora vamos a alguns parâmetros de identificação de pacotes.
O parâmetro abaixo determina:
– i interface utilizada
-s ip de origem do pacote
-d ip de destino do pacote
-p protocolo utilizado (tcp,udp,icmp)
Obs: Após o parâmetro -p é possível especificar portas. Tanto de destino, como de origem.
–sport porta de origem
–dport porta de destino
Existem outros parâmetros que podem ser utilizados, para maiores detalhes acesse essa página(Em inglês).
e por fim é necessário informar qual a ação a ser tomada pelo pacote.
Para isso utilizamos o -j
As ações mais usadas na tabela filter são ACCEPT e DROP.
ACCEPT aceita os pacotes que encaixam nos parâmetros especificados no comando e DROP ignora os pacotes, por fim rejeitando, mas com DROP o usuário não receberá retorno informando que está bloqueada, a requisição apenas será ignorada.
Por fim vamos fazer uma regra para assimilar:
iptables -A INPUT -s 192.168.0.10 -i eth1 -p tcp –dport 80 -j DROP
Traduzindo a regra; Todos os pacotes que têm como objetivo o servidor, como ip de origem 192.168.0.10, que acessarem pela interface eth1, utilizando o protocolo tcp, com porta de destino 80 (web) serão ignorados.
Pronto!
Agora vamos a alguns adendos da tabela filter.
o iptables tem algumas regras padrões, que se chamam políticas. Por padrão as políticas são totalmente permissívas. Assim todas elas já estão com a ação ACCEPT.
Para modificar é simples
iptables -P <chain ou fila> <ação>
exemplo:
iptables -P INPUT DROP
Dessa forma qualquer pacote que acessar a fila INPUT e não tiver nenhuma regra específica será aplicada a regra padrão descita na política. Nesse caso ignorar. Note que não é preciso utilizar o argumento “-j”, antes do DROP.
Maiores informações sobre o desenvolvimento do Iptables pode ser encontrado no site do projeto.