База знаний

Разумный базовый nftables

Правила запрета по умолчанию, которые разрешают то, что действительно нужно инстансу, ограничивают скорость SSH и не блокируют вас, пока вы их пишете.

Один файрвол, а не два

Debian 13 поставляется с nftables с /etc/nftables.conf и службой, которая его загружает. AlmaLinux 10 поставляет firewalld поверх nftables, и его служба читает то, что включает /etc/sysconfig/nftables.conf. Выберите одно. Запуск firewalld вместе с правилами, написанными вручную, дает набор правил, который не писал никто из вас.

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

Набор правил

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

То, что люди делают неправильно:

  • ICMPv6 принимается целиком намеренно. Обнаружение соседей и packet-too-big живут там, и фильтрация их вручную ломает IPv6 способами, которые выглядят как ошибка приложения в течение полутора дней.
  • Набор ssh_flood добавляет любой адрес, превышающий шесть новых подключений в минуту, в список с таймаутом в один час. Ни парсера логов, ни cron-задачи, ни второго демона.
  • Для IPv6 продублируйте набор с помощью type ipv6_addr и правило с помощью ip6 saddr. Наборы односемейные.
  • udp dport 443 существует для QUIC. Удалите его, если вы его не обслуживаете.

Загрузка без блокировки самого себя

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

Первая команда планирует временный юнит, который сбрасывает набор правил через две минуты и печатает его имя. Откройте новую сессию. Если все работает, остановите таймер:

systemctl stop run-u1234.timer

Если не работает, подождите — машина сама пустит вас обратно. Пустой набор правил означает отсутствие фильтрации, так что закончите работу, а не оставляйте её на ночь.

Проверьте, что оно на самом деле делает

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

-a печатает хэндлы, что нужно для удаления одного правила без переписывания файла:

nft delete rule inet filter input handle 12

Счетчики отвечают на вопрос, который никто не задает: правило, показывающее ноль после недели, либо неправильное, либо ненужное, и оба варианта стоит знать.

Трассировка

Когда пакет отказывается вести себя так, как должен по правилам:

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

Удалите правило трассировки после. Оно дешевое, но не бесплатное.

Для чего хост-файрвол не предназначен

Он фильтрует политику, а не флуд. Объемные атаки отсекаются на границе задолго до того, как достигнут вашего порта, и правило на экземпляре будет только тратить ваш CPU на пакеты, которые уже обработаны. Подробности в защите от DDoS.

Сохранить его

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

Верните shebang и строку flush ruleset в начало экспортированного файла. Без них следующая загрузка добавит к работающему набору правил вместо замены, и каждое ваше правило появится дважды.

Готовы, когда вы готовы

Выберите город. Выберите размер. Оплатите монетой.

Никаких форм о том, кто вы, никакого ожидания одобрения человеком, никаких звонков для проверки. Счёт оплачен — и учётные данные приходят на почту.