Um firewall, não dois
O Debian 13 traz nftables com um /etc/nftables.conf e um serviço que o carrega. O AlmaLinux 10 traz firewalld em cima de nftables, e seu serviço lê o que /etc/sysconfig/nftables.conf inclui. Escolha um. Executar firewalld ao lado de um ruleset escrito à mão produz um ruleset que nenhum de vocês escreveu.
systemctl disable --now firewalld # AlmaLinux, if going manual
systemctl enable --now nftablesO ruleset
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set ssh_flood {
type ipv4_addr
flags dynamic, timeout
timeout 1h
}
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif lo accept
ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded } accept
ip6 nexthdr ipv6-icmp accept
tcp dport 22 ct state new add @ssh_flood { ip saddr limit rate over 6/minute } drop
tcp dport 22 accept
tcp dport { 80, 443 } accept
udp dport 443 accept
counter comment "dropped by policy"
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}As partes que as pessoas erram:
- ICMPv6 é aceito por completo de propósito. Descoberta de vizinhos e packet-too-big vivem lá, e filtrá-los manualmente quebra o IPv6 de maneiras que se apresentam como um bug de aplicativo por um dia e meio.
- O conjunto
ssh_floodadiciona qualquer endereço que exceda seis novas conexões por minuto a uma lista de timeout de uma hora. Nenhum parser de log, nenhum cron job, nenhum segundo daemon. - Para IPv6, duplique o conjunto com
type ipv6_addre a regra comip6 saddr. Conjuntos são de família única. udp dport 443está lá para QUIC. Apague-o se você não o servir.
Carregue sem se trancar para fora
systemd-run --on-active=120 nft flush ruleset
nft -f /etc/nftables.confO primeiro comando agenda uma unit transitória que limpa o ruleset em dois minutos e imprime seu nome. Abra uma nova sessão. Se funcionar, pare o timer:
systemctl stop run-u1234.timerSe não funcionar, espere, e a máquina deixa você voltar sozinha. Um ruleset vazio significa sem filtragem, então termine o trabalho em vez de deixá-lo lá durante a noite.
Verifique o que ele está realmente fazendo
nft list ruleset
nft -a list chain inet filter input
nft list set inet filter ssh_flood-a imprime handles, que é como uma única regra é removida sem reescrever o arquivo:
nft delete rule inet filter input handle 12Contadores respondem à pergunta que ninguém faz: uma regra em zero depois de uma semana está errada ou desnecessária, e ambos valem a pena saber.
Rastreamento
Quando um pacote se recusa a se comportar como o ruleset diz que deveria:
nft add rule inet filter input tcp dport 8443 meta nftrace set 1
nft monitor traceApague a regra de rastreamento depois. É barato, mas não grátis.
Para que um firewall de host não serve
Ele filtra política, não inundações. Ataques volumétricos são descartados na borda muito antes de chegarem à sua porta, e uma regra na instância só gastaria sua CPU em pacotes que já foram tratados. Detalhes em proteção DDoS.
Persistir
nft list ruleset > /etc/nftables.conf
systemctl restart nftablesColoque o shebang e a linha flush ruleset de volta no topo do arquivo exportado. Sem eles, o próximo carregamento anexa ao ruleset em execução em vez de substituí-lo, e cada regra que você tem aparece duas vezes.