Base de conhecimento

Uma linha de base nftables sensata

Um ruleset de negação padrão que permite o que uma instância realmente precisa, limita a taxa de SSH e não o bloqueia enquanto você ainda o escreve.

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 nftables

O 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_flood adiciona 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_addr e a regra com ip6 saddr. Conjuntos são de família única.
  • udp dport 443 está 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.conf

O 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.timer

Se 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 12

Contadores 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 trace

Apague 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 nftables

Coloque 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.

Pronto quando você estiver

Escolha uma cidade. Escolha um tamanho. Pague em cripto.

Sem formulários sobre quem você é, sem esperar aprovação de um humano, sem ligação para verificar nada. O pagamento é confirmado e as credenciais chegam na sua caixa de entrada.