# nft - современный файрвол (nftables) _Команды · LinuxLab Knowledge Base_ **TL;DR:** `nft` - единый CLI для современного netfilter. Заменяет iptables/ip6tables/ arptables/ebtables. Структура: tables → chains → rules. ## Иерархия Nftables устроен как: ``` table (имя+family: ip, ip6, inet, arp, bridge, netdev) └── chain (тип + hook + priority) └── rule (matches + verdict) ``` - **table** - namespace для правил. `inet` family покрывает и 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 ``` Что мы сделали: 1. Создали таблицу `inet filter` (для v4+v6) и цепочку input с **policy drop** 2. Разрешили существующие соединения (без этого ответы на наш исходящий не дойдут) 3. Loopback всегда разрешён 4. Открыли SSH (порт 22) 5. Разрешили 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](/kb/nat.md) нужна цепочка с `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` конвертирует старые конфиги ## Команды ```bash sudo nft list ruleset ``` Полный текущий конфиг файрвола ```bash sudo nft -a list ruleset ``` С handle ID - нужны для точечного удаления правила ```bash sudo nft add rule inet filter input tcp dport 8080 drop ``` Заблокировать входящий TCP 8080 ```bash sudo nft delete rule inet filter input handle 5 ``` Удалить конкретное правило по handle ```bash sudo nft monitor ``` Live-стрим изменений (полезно при дебаге автоматизации) ## См. также - [iptables - правила netfilter (legacy)](/kb/cmd-iptables.md) - [firewalld vs nftables - что выбрать](/kb/firewalld-vs-nftables.md) - [NAT и masquerade](/kb/nat.md) - [Conntrack - память Linux о всех сетевых соединениях](/kb/conntrack.md) - [TCP three-way handshake](/kb/tcp-handshake.md) - [Kubernetes Service и Ingress - сетевая публикация подов](/kb/kubernetes-services-and-ingress.md)