Один файрвол, а не два
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 в начало экспортированного файла. Без них следующая загрузка добавит к работающему набору правил вместо замены, и каждое ваше правило появится дважды.