Voltar ao Diminua Blog

Artigo

Desvendando o `iptables` no Linux: Um Guia Prático para Firewall e Filtragem de Pacotes

Controle o tráfego de rede do seu servidor Linux com o poderoso `iptables`.

Desvendando o `iptables` no Linux: Um Guia Prático para Firewall e Filtragem de Pacotes

Introdução ao `iptables`

No mundo da administração de sistemas Linux, a segurança da rede é uma prioridade. Uma das ferramentas mais robustas e flexíveis para gerenciar firewalls e filtrar pacotes de rede é o `iptables`. Ele permite que administradores definam regras detalhadas sobre como o tráfego de rede deve ser tratado, protegendo servidores contra acessos não autorizados e controlando a comunicação.

Este artigo guiará você através dos conceitos fundamentais do `iptables`, desde a sua instalação até a configuração de regras básicas para proteger seu ambiente Linux.

O que é `iptables` e como funciona?

`iptables` é uma ferramenta de linha de comando que interage com o Netfilter, um subsistema do kernel Linux que inspeciona e manipula pacotes de rede. Ele opera com base em tabelas, cadeias (chains) e regras.

  • Tabelas: São coleções de cadeias. As tabelas mais comuns são:
    • filter: Usada para filtrar pacotes (permitir ou negar). É a tabela padrão.
    • nat: Usada para manipulação de Network Address Translation (NAT), permitindo que um único IP público sirva a múltiplos IPs privados.
    • mangle: Usada para modificações mais avançadas nos pacotes, como alterar campos de cabeçalho.
  • Cadeias (Chains): São sequências de regras que definem o que fazer com os pacotes que correspondem a um determinado critério. As cadeias padrão são:
    • INPUT: Regras aplicadas a pacotes destinados ao próprio host local.
    • OUTPUT: Regras aplicadas a pacotes originados do host local.
    • FORWARD: Regras aplicadas a pacotes que estão apenas passando pelo host (roteamento).
    • PREROUTING: Regras aplicadas assim que um pacote entra na rede, antes de qualquer decisão de roteamento (usada em nat e mangle).
    • POSTROUTING: Regras aplicadas logo antes de um pacote sair pela interface de rede (usada em nat).
  • Regras: Cada regra especifica um critério (como endereço IP de origem/destino, porta, protocolo) e uma ação (target) a ser tomada se o pacote corresponder ao critério. As ações comuns incluem:
    • ACCEPT: Permite que o pacote passe.
    • DROP: Descarta silenciosamente o pacote.
    • REJECT: Descarta o pacote e envia uma mensagem de erro ao remetente.
    • LOG: Registra o pacote em um log.

Instalação do `iptables`

Na maioria das distribuições Linux modernas, o `iptables` já vem pré-instalado. No entanto, se por algum motivo ele não estiver presente, você pode instalá-lo usando o gerenciador de pacotes da sua distribuição.

Para distribuições baseadas em Debian/Ubuntu:

sudo apt update
sudo apt install iptables

Para distribuições baseadas em Red Hat/CentOS/Fedora:

sudo yum update
sudo yum install iptables

Após a instalação, você pode começar a usar os comandos `iptables`.

Configurando Regras Básicas de Firewall

Vamos configurar um conjunto básico de regras para um servidor que precisa permitir tráfego SSH (porta 22), HTTP (porta 80) e HTTPS (porta 443), mas bloquear todo o resto.

1. Definir Políticas Padrão

É uma boa prática definir as políticas padrão para as cadeias de filtro como DROP. Isso significa que qualquer tráfego que não corresponda a uma regra explícita de ACCEPT será bloqueado.

Aviso: Executar estes comandos sem as regras de permissão adequadas pode bloquear seu acesso ao servidor. Certifique-se de ter acesso físico ou via console para reverter as alterações, se necessário.

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
  • -P INPUT DROP: Define a política padrão para a cadeia INPUT como DROP.
  • -P FORWARD DROP: Define a política padrão para a cadeia FORWARD como DROP (importante se o servidor não for roteador).
  • -P OUTPUT ACCEPT: Define a política padrão para a cadeia OUTPUT como ACCEPT. Geralmente, queremos permitir que o servidor inicie conexões de saída.

2. Permitir Conexões Estabelecidas e Relacionadas

Para permitir que o tráfego de resposta para conexões iniciadas pelo servidor seja aceito, e para permitir pacotes relacionados a conexões existentes (como em FTP ativo), usamos a seguinte regra:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  • -A INPUT: Adiciona a regra ao final da cadeia INPUT.
  • -m conntrack --ctstate ESTABLISHED,RELATED: Usa o módulo conntrack para verificar o estado da conexão. ESTABLISHED refere-se a pacotes que fazem parte de uma conexão já existente. RELATED refere-se a pacotes que estão relacionados a uma conexão existente, mas não são diretamente parte dela (ex: conexões FTP de dados).
  • -j ACCEPT: Se o pacote corresponder, ele será aceito.

3. Permitir Tráfego de Loopback

O tráfego na interface de loopback (localhost) é essencial para o funcionamento de muitos serviços. Permita-o:

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
  • -i lo: Especifica a interface de entrada como lo (loopback).
  • -o lo: Especifica a interface de saída como lo (loopback).

4. Permitir Tráfego SSH, HTTP e HTTPS

Agora, vamos permitir o tráfego nas portas que precisamos:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  • -p tcp: Especifica o protocolo TCP.
  • --dport 22: Especifica a porta de destino (destination port).
  • -j ACCEPT: Aceita o tráfego que chegar nessas portas.

5. Bloquear Tráfego Indesejado (Opcional, mas recomendado)

Embora a política padrão seja DROP, você pode querer adicionar regras explícitas para bloquear tráfegos específicos, por exemplo, tentativas de acesso a portas de serviços que não estão em uso ou que você deseja fechar explicitamente.

Exemplo: Bloquear tráfego para a porta 23 (Telnet), que é insegura:

sudo iptables -A INPUT -p tcp --dport 23 -j REJECT --reject-with tcp-reset
  • -j REJECT --reject-with tcp-reset: Rejeita o pacote e envia um reset TCP de volta ao remetente, informando que a porta está fechada. Isso é geralmente preferível a DROP em certos cenários, pois informa ao remetente que a conexão não foi estabelecida.

Salvando as Regras do `iptables`

As regras configuradas com o comando `iptables` são voláteis, o que significa que elas serão perdidas após uma reinicialização do sistema. Para torná-las persistentes, você precisa salvá-las.

A maneira de salvar as regras varia entre as distribuições Linux:

Para sistemas baseados em Debian/Ubuntu (usando `iptables-persistent`)

Primeiro, instale o pacote:

sudo apt update
sudo apt install iptables-persistent

Durante a instalação, ele perguntará se você deseja salvar as regras atuais. Após configurar suas regras, salve-as manualmente:

sudo netfilter-persistent save

Para carregar as regras salvas:

sudo netfilter-persistent reload

Para sistemas baseados em Red Hat/CentOS/Fedora (usando `iptables-services`)

Instale o pacote:

sudo yum install iptables-services

Habilite e inicie o serviço:

sudo systemctl enable iptables
sudo systemctl start iptables

Salve as regras atuais:

sudo service iptables save

Ou, alternativamente:

sudo /usr/libexec/iptables/iptables.init save

Listando e Removendo Regras

Para visualizar as regras atualmente ativas:

sudo iptables -L -v -n
  • -L: Lista as regras.
  • -v: Modo verboso, mostra mais detalhes como contadores de pacotes e bytes.
  • -n: Modo numérico, exibe IPs e portas como números em vez de tentar resolvê-los para nomes (mais rápido e claro).

Para remover uma regra específica, você precisa identificar seu número na lista ou usar a opção -D (Delete) com os mesmos parâmetros que usou para adicioná-la.

Exemplo: Remover a regra que permite tráfego na porta 80:

sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT

Para remover todas as regras de uma cadeia:

sudo iptables -F INPUT

Para remover todas as regras de todas as cadeias em todas as tabelas:

sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
  • -F: Flush (limpa) todas as regras de uma cadeia.
  • -X: Delete (remove) todas as cadeias customizadas (não padrão).

Considerações Finais e Boas Práticas

O `iptables` é uma ferramenta poderosa, mas sua complexidade pode ser um obstáculo. Para cenários mais simples, como a proteção de um servidor web, as regras básicas apresentadas aqui são um bom ponto de partida. Para configurações mais avançadas, como NAT, balanceamento de carga ou políticas de segurança mais granulares, é essencial estudar a documentação do `iptables` e testar exaustivamente as regras em um ambiente controlado.

Lembre-se sempre de:

  • Testar cuidadosamente: Altere as regras em um ambiente de teste antes de aplicá-las em produção.
  • Manter um acesso de emergência: Certifique-se de ter um método de acesso alternativo (como acesso físico ou via console) caso suas regras de firewall bloqueiem seu acesso SSH.
  • Documentar suas regras: Mantenha um registro claro das regras configuradas e o motivo de cada uma.
  • Considerar alternativas: Para gerenciar firewalls de forma mais simplificada, ferramentas como ufw (Uncomplicated Firewall) ou firewalld podem ser mais adequadas para iniciantes, pois abstraem parte da complexidade do `iptables`. No entanto, o `iptables` oferece o máximo de controle.

Dominar o `iptables` é um passo fundamental para quem deseja ter controle total sobre a segurança de rede em sistemas Linux.

Foto de panumas nikhomkhai no Pexels.