iptables no Linux: Configurar Firewall com Regras Práticas
O iptables é o firewall padrão do kernel Linux. Presente em praticamente todas as distribuições, ele inspeciona e filtra cada pacote de rede que entra, sai ou passa pelo sistema. Entender o iptables é fundamental para proteger servidores em produção, configurar redes e passar em certificações como LPIC-2 e CompTIA Linux+.
Neste guia você vai aprender a sintaxe, as principais regras e os casos de uso mais comuns — com exemplos prontos para usar.
Como o iptables funciona: tabelas e chains
O iptables organiza as regras em tabelas, cada uma com um propósito diferente:
| Tabela | Uso |
|---|---|
filter | Filtragem de pacotes (padrão — usada na maioria das regras) |
nat | Tradução de endereços (NAT, masquerade, port forwarding) |
mangle | Modificação de cabeçalhos de pacotes (QoS, TTL) |
raw | Controle de rastreamento de conexão (conntrack) |
Cada tabela tem chains (cadeias) que determinam quando as regras são avaliadas:
| Chain | Quando é avaliada |
|---|---|
INPUT | Pacotes destinados ao próprio servidor |
OUTPUT | Pacotes gerados pelo próprio servidor |
FORWARD | Pacotes que passam pelo servidor (roteamento) |
PREROUTING | Antes do roteamento (nat/mangle) |
POSTROUTING | Após o roteamento (nat/mangle) |
Comandos básicos do iptables
# Listar regras com detalhes (números de linha, contadores)
iptables -L -n -v --line-numbers
# Listar regras de uma tabela específica
iptables -t nat -L -n -v
# Adicionar regra no final da chain (-A = append)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Inserir regra em posição específica (-I = insert)
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
# Deletar regra pelo número da linha
iptables -D INPUT 3
# Deletar regra pela especificação
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
# Limpar todas as regras de uma chain (-F = flush)
iptables -F INPUT
# Limpar todas as regras de todas as chains
iptables -F
# Definir política padrão de uma chain
iptables -P INPUT DROP
Alvos (targets) mais comuns
| Target | Comportamento |
|---|---|
ACCEPT | Aceita o pacote |
DROP | Descarta silenciosamente (sem resposta) |
REJECT | Descarta e envia mensagem de erro ao remetente |
LOG | Registra o pacote no syslog e continua |
RETURN | Volta para a chain que chamou esta |
MASQUERADE | NAT dinâmico (tabela nat) |
DNAT | Redireciona para outro IP/porta (tabela nat) |
Exemplos práticos
1. Configuração básica de servidor: política DROP + exceções
A abordagem mais segura: bloqueia tudo por padrão e libera apenas o necessário.
# Salva as regras atuais antes de começar
iptables-save > /tmp/iptables_backup.rules
# Define política padrão: DROP em INPUT e FORWARD, ACCEPT em OUTPUT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Permite tráfego loopback (necessário para o sistema funcionar)
iptables -A INPUT -i lo -j ACCEPT
# Permite conexões já estabelecidas e relacionadas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Libera SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Libera HTTP e HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
2. Liberar porta para IP específico apenas
# Permite SSH apenas do escritório (192.168.1.100)
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# Libera acesso ao banco de dados apenas do servidor de aplicação
iptables -A INPUT -p tcp --dport 3306 -s 10.0.1.50 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
3. Bloquear IP ou faixa de IPs
# Bloquear IP específico
iptables -A INPUT -s 203.0.113.99 -j DROP
# Bloquear faixa de IPs (CIDR)
iptables -A INPUT -s 203.0.113.0/24 -j DROP
# Bloquear e registrar tentativas antes de dropar
iptables -A INPUT -s 203.0.113.0/24 -j LOG --log-prefix "BLOCKED: "
iptables -A INPUT -s 203.0.113.0/24 -j DROP
4. Proteger contra ataques comuns
# Bloquear pacotes inválidos
iptables -A INPUT -m state --state INVALID -j DROP
# Limitar tentativas de conexão SSH (anti-brute force)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --set --name SSH_BRUTE
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 4 --name SSH_BRUTE -j DROP
# Limitar ping (ICMP) para evitar flood
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# Bloquear pacotes SYN suspeitos (SYN flood)
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
5. NAT e compartilhamento de internet (Masquerade)
Para que máquinas na rede interna acessem a internet através do servidor Linux:
# Habilitar IP forwarding no kernel
echo 1 > /proc/sys/net/ipv4/ip_forward
# Para tornar permanente, adicione no /etc/sysctl.conf:
# net.ipv4.ip_forward = 1
# Masquerade: toda saída pela interface eth0 usa o IP do servidor
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Permite o tráfego entre as interfaces
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
6. Port forwarding (redirecionamento de porta)
# Redirecionar porta 80 pública para porta 8080 interna
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
# Redirecionar para outro servidor interno
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT
7. Registrar pacotes para debug
# Registrar e depois aceitar
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-ENTRADA: " --log-level 4
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Ver logs em tempo real
tail -f /var/log/syslog | grep "SSH-ENTRADA"
# ou
journalctl -f | grep "SSH-ENTRADA"
Salvar e restaurar regras
As regras do iptables são perdidas na reinicialização. Para torná-las persistentes:
# Salvar regras atuais
iptables-save > /etc/iptables/rules.v4 # Debian/Ubuntu
iptables-save > /etc/sysconfig/iptables # CentOS/RHEL
# Restaurar manualmente
iptables-restore < /etc/iptables/rules.v4
# No Ubuntu/Debian: instalar o pacote que restaura automaticamente no boot
apt install iptables-persistent
netfilter-persistent save
# No CentOS/RHEL: usar o serviço
systemctl enable iptables
systemctl start iptables
Verificar regras e diagnóstico
# Listar tudo com contadores (quantos pacotes cada regra processou)
iptables -L -v -n
# Listar com números de linha (útil para deletar por posição)
iptables -L INPUT --line-numbers
# Zerar contadores sem apagar regras
iptables -Z
# Ver regras da tabela NAT
iptables -t nat -L -n -v
iptables vs nftables
O nftables é o substituto moderno do iptables, disponível desde o kernel 3.13. Em distros mais recentes (Debian 10+, Ubuntu 20.04+, RHEL 8+) ele já é o padrão por baixo, com o comando iptables sendo um wrapper sobre o nftables.
# Ver se você está usando iptables-legacy ou nftables
iptables --version
# iptables v1.8.7 (nf_tables) ← já usa nftables por baixo
# iptables v1.8.2 (legacy) ← iptables clássico
# Equivalente nftables de uma regra iptables:
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
nft add rule inet filter input tcp dport 22 accept
Para fins de certificação LPIC-2, o conteúdo cobrado ainda é o iptables clássico. Para novas instalações, considere aprender nftables.
Referência rápida
# Ver regras
iptables -L -n -v --line-numbers
# Regra básica de servidor seguro
iptables -P INPUT DROP && iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Anti-brute force SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
# NAT simples
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Salvar (Debian/Ubuntu)
iptables-save > /etc/iptables/rules.v4