Идея простая: разрешаем только то, что действительно нужно, все остальное блокируем. На бумаге это выглядит идеально. На практике одна неправильная команда - и SSH-сессия заканчивается вместе с доступом к серверу.
Поэтому default deny лучше внедрять не одной командой, а поэтапно.
▪️ Для
nftables базовая политика может выглядеть так:
table inet filter {
chain input {
type filter hook input priority 0;
policy drop;
iif lo accept
ct state established,related accept
tcp dport 22 ip saddr 10.20.0.0/16 accept
tcp dport { 80, 443 } accept
}
}
Критически важные строки:
iif lo accept
ct state established,related accept
Первая не ломает localhost-взаимодействия сервисов.
Вторая разрешает пакеты уже установленных соединений.
▪️ Перед включением
policy drop сначала выпишите все, что сервер реально принимает:
ss -lntup
Проверьте текущие соединения:
ss -nt
И не забудьте про инфраструктурный трафик:
SSH / RDP
мониторинг
бэкап
DNS
NTP
балансировщики
кластеры
▪️ Хороший порядок внедрения:
1. Создать явные allow-правила.
2. Проверить доступ из отдельной сессии.
3. Сохранить текущую SSH-сессию открытой.
4. Иметь доступ через console/IPMI/iDRAC/VM console.
5. Только после этого включать
drop.▪️ Перед применением конфигурации:
nft -c -f /etc/nftables.conf
Ключ
-c проверит синтаксис, не применяя правила.▪️ Еще полезнее - заранее сделать автооткат. Например:
echo "nft flush ruleset" | at now + 5 minutes
Применили firewall, проверили доступ - отменили задание:
atq
atrm <job_id>
Если сами себя отрезали, через несколько минут правила сбросятся.
#firewall #nftables
🧑💻 NetworkAdmin