Fundamentos do netfilter
O firewall no Linux é implementado pelo netfilter, um framework de filtragem de pacotes no kernel. As ferramentas em espaço de usuário — iptables, nftables e ufw — são interfaces para configurar as regras do netfilter.
Entender a ordem de processamento das regras é essencial para evitar configurações que parecem corretas mas deixam brechas:
- PREROUTING: pacotes chegando antes do roteamento (NAT de destino)
- INPUT: pacotes destinados ao próprio servidor
- FORWARD: pacotes sendo roteados pelo servidor
- OUTPUT: pacotes originados no servidor
- POSTROUTING: pacotes saindo após o roteamento (NAT de origem)
iptables avançado
Além das regras básicas de ACCEPT/DROP, o iptables oferece módulos que permitem construir proteção em camadas:
Proteger contra port scanning
# Bloquear scans SYN flood iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP # Bloquear scans NULL, FIN, XMAS iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # Logar e bloquear pacotes inválidos iptables -A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "INVALID: " iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Controle de estado de conexão
# Política mais restritiva com conntrack iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j ACCEPT iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j ACCEPT iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 443 -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -j DROP # bloquear todo o resto
Whitelist de IPs para acesso SSH
# Permitir SSH apenas de IPs específicos iptables -A INPUT -p tcp --dport 22 -s 200.200.200.200 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
nftables: o moderno
O nftables é o sucessor do iptables, presente por padrão no Debian 10+ e Ubuntu 20.04+. Oferece sintaxe mais clara e melhor performance.
#!/usr/sbin/nft -f
# /etc/nftables.conf — configuração básica com proteções
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Loopback sempre aceito
iifname "lo" accept
# Conexões estabelecidas
ct state established,related accept
# Rejeitar inválidos
ct state invalid drop
# ICMP e ICMPv6
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# SSH com rate limit (5 novas conexões por minuto)
tcp dport 22 ct state new limit rate 5/minute accept
# HTTP e HTTPS
tcp dport { 80, 443 } accept
# Log e drop do resto
log prefix "nft-drop: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
Rate limiting e proteção DDoS leve
Para servidores expostos à internet, rate limiting é essencial para absorver ataques de força bruta e floods de conexão sem derrubar o serviço:
# Limitar novas conexões HTTP por IP (proteção básica anti-flood)
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW \
-m limit --limit 60/min --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j DROP
# Limitar pings (anti-ICMP flood)
iptables -A INPUT -p icmp --icmp-type echo-request \
-m limit --limit 1/s --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
Para proteção DDoS de maior escala, combine firewall no servidor com Cloudflare na camada de DNS/CDN — as regras no servidor protegem contra floods direcionados ao IP, enquanto o Cloudflare absorve ataques volumétricos antes de chegarem ao servidor.
Logging estratégico
# Logar pacotes bloqueados para análise
iptables -A INPUT -j LOG --log-prefix "iptables-DROP: " --log-level 4
# Monitorar em tempo real
tail -f /var/log/kern.log | grep "iptables-DROP"
# Analisar IPs que mais tentam conexões bloqueadas
grep "iptables-DROP" /var/log/kern.log | \
grep -oP 'SRC=\K[0-9.]+' | sort | uniq -c | sort -rn | head -20
Conclusão
Um firewall bem configurado é a primeira linha de defesa de qualquer servidor Linux. A diferença entre regras básicas e regras avançadas está na profundidade da proteção: controle de estado, rate limiting, logging e whitelist por IP transformam o firewall em um mecanismo de segurança ativo, não apenas um portão aberto ou fechado.