Иерархия
Nftables устроен как:
table (имя+family: ip, ip6, inet, arp, bridge, netdev)
└── chain (тип + hook + priority)
└── rule (matches + verdict)
- table - namespace для правил.
inetfamily покрывает и IPv4 и IPv6 - chain - точка hooking'а в netfilter:
prerouting(до маршрутизации)input(для нас, после маршрутизации)forward(через нас, не нам)output(мы исходящий)postrouting(после маршрутизации, перед отправкой)
- rule - условия + действие (
accept,drop,reject,jump,log,masquerade,dnat, ...)
Минимальный файрвол
Сделать input-фильтр который дропает всё кроме SSH:
bash
sudo nft add table inet filter
sudo nft 'add chain inet filter input { type filter hook input priority 0; policy drop; }'sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif lo accept
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input ip protocol icmp icmp type echo-request accept
Что мы сделали:
- Создали таблицу
inet filter(для v4+v6) и цепочку input с policy drop - Разрешили существующие соединения (без этого ответы на наш исходящий не дойдут)
- Loopback всегда разрешён
- Открыли SSH (порт 22)
- Разрешили ping (echo-request)
Всё остальное - drop по policy.
Чтение и удаление
bash
sudo nft list ruleset # ВСЁ что есть
sudo nft list table inet filter # одна таблица
sudo nft -a list ruleset # с handle (нужен для удаления)
sudo nft delete rule inet filter input handle 5
sudo nft delete table inet filter # снести всё в таблице
sudo nft flush ruleset # СНЕСТИ ВСЁ (опасно - может остаться без SSH)
NAT - отдельный тип цепочки
Для nat нужна цепочка с type nat, не filter:
bash
sudo nft add table inet nat
sudo nft 'add chain inet nat postrouting { type nat hook postrouting priority 100; }'sudo nft add rule inet nat postrouting oifname eth0 masquerade
Persistence
Правила в памяти. Чтобы пережить ребут - сохранить в файл:
bash
sudo nft list ruleset > /etc/nftables.conf
sudo systemctl enable nftables # на Debian/Ubuntu
Файл потом читается init-скриптом.
Iptables vs nftables
- iptables - старый, но всё ещё повсеместно (Docker, k8s до недавнего)
- nftables - новый, по дизайну быстрее, единый CLI для всех family
- На современных Ubuntu
iptables- это шим: команды транслируются в nft - При миграции:
iptables-restore-translateконвертирует старые конфиги