Aprenda a configurar firewalls do zero, desde comandos básicos até técnicas avançadas com exemplos práticos e explicações detalhadas.
O Linux oferece diferentes sistemas de firewall. O iptables é o clássico, o UFW é uma camada de facilidade sobre ele, e o nftables é o sucessor moderno. Abaixo você encontra explicações divididas em níveis de dificuldade para cada um.
Aprenda os comandos fundamentais para começar a usar firewall no Linux. Todos os exemplos são práticos e testados.
iptables -L -n -v
Lista todas as regras com contadores de pacotes e bytes.
A opção -n evita resolução de DNS (mais rápido).
iptables -F
Remove todas as regras das cadeias padrão (INPUT, OUTPUT, FORWARD). Cuidado: isso pode deixar o sistema desprotegido momentaneamente.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT adiciona no final da cadeia INPUT.
-p tcp protocolo TCP.
--dport 22 porta de destino 22 (SSH).
-j ACCEPT aceita o pacote.
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT
Define que todo tráfego de entrada (INPUT) e encaminhado (FORWARD) será bloqueado por padrão, exceto regras explícitas. Saída (OUTPUT) é permitida.
# Limpa regras iptables -F # Permite SSH (porta 22) e HTTP (porta 80) iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT # Permite respostas de conexões estabelecidas iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Permite loopback iptables -A INPUT -i lo -j ACCEPT # Bloqueia todo o resto iptables -P INPUT DROP
ufw status
Mostra se o UFW está ativo e as regras atuais.
ufw allow ssh
Equivalente a ufw allow 22/tcp. UFW entende nomes de serviços do arquivo /etc/services.
ufw allow 80/tcp # HTTP ufw allow 443/tcp # HTTPS
ufw enable
ATENÇÃO: Antes de ativar, certifique-se de que o SSH está permitido, ou você pode perder acesso remoto!
Sempre verifique as regras antes de ativar: ufw show added.
Para resetar: ufw reset.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Usa o módulo conntrack para rastrear conexões.
Permite respostas de conexões que iniciamos (ESTABLISHED) e conexões relacionadas (RELATED),
como FTP passive mode.
# Cria cadeia chamada LOGGING iptables -N LOGGING # Direciona pacotes para a cadeia LOGGING iptables -A INPUT -j LOGGING # Na cadeia LOGGING: faz log e depois descarta iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4 iptables -A LOGGING -j DROP
-m limit --limit 2/min limita o log a 2 mensagens por minuto
para não encher o disco. O prefixo ajuda a identificar no syslog.
tail -f /var/log/syslog | grep "IPTables-Dropped"
ufw logging on
Ativa logs no nível médio (padrão). Os logs vão para /var/log/ufw.log.
ufw limit ssh/tcp
Aplica um limitador de taxa: permite 6 conexões por 30 segundos. Útil para proteger contra força bruta.
ufw deny from 192.168.1.0/24 ufw deny from 10.0.0.0/8 to any port 22
Bloqueia toda a rede 192.168.1.0/24, ou bloqueia acesso SSH da rede 10.0.0.0/8.
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
A tabela mangle permite modificar pacotes.
Aqui marcamos pacotes HTTP com a marca 1, que pode ser usada para roteamento ou QoS.
iptables -t raw -A PREROUTING -p icmp -j NOTRACK
NOTRACK impede que o pacote seja rastreado pelo conntrack,
reduzindo overhead. Útil para tráfego de alta taxa como ICMP.
# Salvar iptables-save > /etc/iptables/rules.v4 # Restaurar iptables-restore < /etc/iptables/rules.v4 # Para ipv6 ip6tables-save > /etc/iptables/rules.v6
No Debian/Ubuntu, o pacote iptables-persistent automatiza isso.
O nftables é o firewall que substitui o iptables no Linux moderno. Oferece sintaxe mais limpa, performance melhor e maior flexibilidade.
nft list ruleset
Lista todas as regras ativas. Se aparecer vazio, o nftables está ativo sem regras.
nft add table inet filter
inet significa que a tabela funciona para IPv4 e IPv6.
filter é o nome da tabela.
nft add chain inet filter input { type filter hook input priority 0; }
Define a cadeia input com hook input
(pacotes de entrada) e prioridade 0.
nft add rule inet filter input tcp dport 22 accept
Sintaxe mais limpa que iptables: tcp dport 22 accept.
nft add rule inet filter input ct state established,related accept
nft add set inet filter allowed_ports { type inet_service\; }
Conjuntos permitem agrupar elementos para regras mais eficientes.
nft add element inet filter allowed_ports { 22, 80, 443 }
nft add rule inet filter input tcp dport @allowed_ports accept
Agora uma única regra aceita todas as portas do conjunto.
nft list ruleset -a
Mostra handles (identificadores) para referenciar regras.
nft delete rule inet filter input handle 3
# Salvar nft list ruleset > /etc/nftables.conf # Restaurar nft -f /etc/nftables.conf # Ativar no boot (Debian/Ubuntu) systemctl enable nftables systemctl start nftables
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Permitir loopback
iif lo accept
# Permitir conexões estabelecidas
ct state established,related accept
# Permitir SSH, HTTP, HTTPS
tcp dport {22, 80, 443} accept
# Log e drop do resto
log prefix "NFTables-Dropped: " limit rate 3/minute
drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
| Funcionalidade | iptables | UFW | nftables |
|---|---|---|---|
| Facilidade de uso | ⚡⚡ | ⚡⚡⚡⚡⚡ | ⚡⚡⚡ |
| Performance | ⚡⚡⚡ | ⚡⚡ | ⚡⚡⚡⚡⚡ |
| Flexibilidade | ⚡⚡⚡⚡ | ⚡ | ⚡⚡⚡⚡⚡ |
| Suporte a IPv4/IPv6 | Separado | Integrado | Integrado |