Antes de implementar um firewall, é importante conhecer a sua lógica, se você entender as tabelas do iptables estará no caminho certo.
Se você já conferiu o nosso artigo sobre firewall corporativo, aprendeu que a configuração e a implementação a partir de ferramentas são essenciais para montar um sistema de segurança eficiente.
Pensando nisso, decidimos falar sobre algo muito relevante: as tabelas e camadas do iptables!
O iptables, para quem não sabe, é uma ferramenta usada para configurar o subsistema de processamento de pacotes presente nas distribuições Linux, o Netfilter.
A função primária do iptables é fazer a análise do tráfego de redes recebido pelo computador, no qual é feita uma comparação com o conjunto de regras preestabelecidas nas configurações.
Ou seja, ele inspeciona todos os pacotes, verifica o enquadramento de cada um às regras e aplica uma determinada ação. O processamento dos pacotes é feito pelo iptables a partir de uma estrutura que contém suas camadas (tabelas) e cadeias (chains).
Portanto, compreender a estrutura do iptables é um fundamento que pode contribuir para chegar a melhor especificação das regras de firewall. Então, sem mais delongas, vamos ao conteúdo!
As 3 principais tabelas do iptables
Dentro da estrutura do iptables podemos destacar 3 camadas (também chamadas “tabelas”) como as mais importantes para o seu funcionamento: filter, NAT e mangle.
Elas servem para organizar as regras de acordo com sua estrutura, isto é, as tabelas — e as cadeias nelas inseridas — determinarão os pacotes aos quais as regras serão aplicadas.
Quais são as diferenças entre as 3 tabelas aqui mencionadas? As tabelas possuem funções distintas, conforme veremos a seguir.
1. Filter
As regras contidas na tabela filter determinam a aceitação (ou não) de um pacote, portanto, estamos falando da tabela básica do iptables cujas regras podem ser usadas de modo geral. Dentro dessa camada existem três cadeias:
- INPUT – nele somente os pacotes destinados ao IP do computador em questão são avaliados pelas regras, caso elas existam;
- OUTPUT – os pacotes avaliados dentro desta regra se limitam aos processos locais do computador;
- FORWARD – aqui somente os pacotes repassados pela máquina são avaliados, ou seja, pacotes que não provém dela e nem são destinados a ela.
Quanto às ações que a tabela filter pode aplicar, temos as opções:
- REJECT – é aplicada ao pacote correspondente às regras. Quando isso acontece, todas as outras eventuais regras são ignoradas e o pacote é descartado;
- ACCEPT – diferentemente do REJECT, esta ação consiste em aceitar o pacote de maneira que ele não venha a ser avaliado posteriormente dentro desta mesma tabela;
- DROP – esta ação se assemelha ao REJECT, porém, se diferencia por não enviar mensagem de erro ao remetente. Pode ser a estratégia ideal para quando o firewall está atuando no modo bridge (transparente), visto que o remetente (às vezes um invasor) não identifique a causa do bloqueio ou o IP que está resultando no mesmo;
- LOG – a ação LOG consiste apenas em criar registros sobre um pacote, não dando término ao processo de avaliação, ou seja, os pacotes continuam sendo analisados pelas regras.
2. NAT
A tabela NAT (Network Address Translation), como a própria origem do acrônimo nos diz, realiza a tradução dos endereços que passam pelo roteador no qual ela opera.
Essa função pode trazer recursos úteis envolvendo endereços de IP, visto que as características de origem e destino dos pacotes podem ser alteradas. Da mesma forma que a tabela filter, a NAT possui 3 cadeias:
- PREROUTING – aplica as regras aos pacotes que entram no firewall, independentemente do seu destino. O nome PREROUTING não se dá por acaso, pois, caso o destino tenha que ser modificado, os parâmetros devem ser ajustados antes do roteamento;
- POSTROUTING – na lista PREROUTING estão inseridas as regras capazes de modificar o pacote após o roteamento, ou seja, quando estão saindo do firewall;
- OUTPUT – a proposta do OUTPUT é similar a do PREROUTING, sendo a única diferença o fato deste operar pacotes oriundos de processos locais.
Assim como no filter, as ações da tabela NAT também são 4:
- SNAT – realiza a troca dos endereços IP de origem;
- DNAT – altera os endereços de IP de destino;
- MASQUERADE – faz o mascaramento de IP;
- REDIRECT – redireciona o pacote para uma porta local.
3. Mangle
A tabela mangle, por sua vez, tem a função de especificar ações especiais que devem ser aplicadas no tráfego que passa pelas cadeias. No caso, tais ações ocorrem anteriormente aos chains das tabelas filter e NAT.
Para melhor compreendermos esse processo, vamos nos apegar ao fato de que as cadeias da tabela mangle são 5 (PREROUTING, POSTROUTING, INPUT, OUTPUT e FORWARD), isto é, correspondem às cadeias das outras camadas do iptables.
Supondo que a chain INPUT seja acionada na tabela mangle. Isso significa que regras especiais deverão ser aplicadas antes que os pacotes passem pela chain INPUT correspondente à tabela filter.
Vale salientar que a cadeia OUTPUT do mangle corresponde ao OUTPUT da tabela NAT.
Criando regras com o iptables no Ubuntu
Agora que você já conheceu as camadas do iptables, vamos tornar essa lição um pouco mais prática: que tal criar uma regra básica para o firewall usando o iptables na distro Ubuntu? Mas pode ser utilizado em qualquer distribuição do LINUX, OK?
Para começar você deve estar logado no sistema como root. Em seguida, ao utilizar o parâmetro –L, será possível visualizar as regras atualmente configuradas.
sudo iptables –L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Caso você tenha modificado ou criado regras e queira desfazer essas alterações, o parâmetro a se utilizar é o –F (sudo iptables –F). O parâmetro –P que podem ser visualizados em cada regra refere-se à política padrão.
Criando uma regra
Vamos supor que você queira liberar o acesso remoto de forma segura usando uma conexão SSH. Para isso, usa-se a regra:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Para aceitar conexões que serão cruciais para um determinado processo, o comando é:
sudo iptables -A INPUT -p tcp --dport X -j ACCEPT
O “X” no comando refere-se ao número da porta de destino para o pacote correspondente. É mais simples do que parece, não? Mas é preciso tomar cuidado com essas regras, pois elas podem tanto tornar o seu sistema mais protegido como também vulnerável.
Caso você queira que voltemos a abordar o assunto trazendo uma explicação didática a respeito dos comandos, contribuindo para o seu aprendizado, não deixe de comentar a respeito!
As dúvidas sobre as camadas do iptables foram solucionadas? Assine a nossa newsletter e fique por dentro dos próximos posts sobre o assunto!