Base de conocimientos

Una línea base sensata de nftables

Un conjunto de reglas de denegación por defecto que permite lo que una instancia realmente necesita, limita la tasa de SSH y no lo bloquea mientras todavía lo está escribiendo.

Un firewall, no dos

Debian 13 incluye nftables con un /etc/nftables.conf y un servicio que lo carga. AlmaLinux 10 incluye firewalld sobre nftables, y su servicio lee lo que /etc/sysconfig/nftables.conf incluye. Elija uno. Ejecutar firewalld junto con un conjunto de reglas escrito a mano produce un conjunto de reglas que ninguno de los dos escribió.

systemctl disable --now firewalld     # AlmaLinux, if going manual
systemctl enable --now nftables

El conjunto de reglas

#!/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;
  }
}

Las partes que la gente entiende mal:

  • ICMPv6 se acepta al por mayor a propósito. El descubrimiento de vecinos y el paquete demasiado grande viven allí, y filtrarlos a mano rompe IPv6 de maneras que se presentan como un error de aplicación durante un día y medio.
  • El conjunto ssh_flood agrega cualquier dirección que exceda seis conexiones nuevas por minuto a una lista de tiempo de espera de una hora. Sin analizador de registros, sin cron job, sin segundo demonio.
  • Para IPv6, duplique el conjunto con type ipv6_addr y la regla con ip6 saddr. Los conjuntos son de una sola familia.
  • udp dport 443 está ahí para QUIC. Elimínelo si no lo sirve.

Cárguelo sin bloquearse

systemd-run --on-active=120 nft flush ruleset
nft -f /etc/nftables.conf

El primer comando programa una unidad transitoria que borra el conjunto de reglas en dos minutos e imprime su nombre. Abra una sesión nueva. Si funciona, detenga el temporizador:

systemctl stop run-u1234.timer

Si no funciona, espere, y la máquina lo dejará entrar de nuevo por sí sola. Un conjunto de reglas vacío significa sin filtrado, así que termine el trabajo en lugar de dejarlo allí durante la noche.

Verifique lo que realmente está haciendo

nft list ruleset
nft -a list chain inet filter input
nft list set inet filter ssh_flood

-a imprime handles, que es cómo se elimina una sola regla sin reescribir el archivo:

nft delete rule inet filter input handle 12

Los contadores responden a la pregunta que nadie hace: una regla en cero después de una semana es o incorrecta o innecesaria, y ambas cosas vale la pena saberlas.

Rastreo

Cuando un paquete se niega a comportarse como el conjunto de reglas dice que debería:

nft add rule inet filter input tcp dport 8443 meta nftrace set 1
nft monitor trace

Elimine la regla de rastreo después. Es barata, no gratis.

Para qué no es un firewall de host

Filtra política, no inundaciones. Los ataques volumétricos se descartan en el borde mucho antes de llegar a su puerto, y una regla en la instancia solo gastaría su CPU en paquetes que ya fueron manejados. Detalles sobre protección DDoS.

Persistirlo

nft list ruleset > /etc/nftables.conf
systemctl restart nftables

Ponga el shebang y la línea flush ruleset de nuevo en la parte superior del archivo exportado. Sin ellos, la próxima carga se agrega al conjunto de reglas en ejecución en lugar de reemplazarlo, y cada regla que tiene aparece dos veces.

Listo cuando tú lo estés

Elige una ciudad. Elige un tamaño. Paga con monedas.

Sin fórmulas sobre quién eres, sin esperar a que un humano te apruebe, sin llamada telefónica para verificar nada. La factura se liquida y las credenciales llegan a tu bandeja de entrada.