С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Файрвол — nftables / ufw

5 мин Ubuntu 24.04 · nftables · ufw

Файрвол в Linux: фильтрация трафика простым ufw и низкоуровневым nftables, проверка правил.

Шпаргалка

4 команды Версия для печати
  • sudo ufw allow 22/tcp СНАЧАЛА SSH
  • sudo ufw status verbose правила
  • sudo ufw default deny incoming
  • sudo nft list ruleset низкий уровень

Обзор

В Ubuntu фильтрацией пакетов занимается nftables (ядро). Поверх него — удобная обёртка ufw (Uncomplicated Firewall) для типовых правил.

  • Начинающим/типовым серверам — ufw.
  • Сложные политики (NAT, наборы, форвардинг) — nftables напрямую.

Опасно. Настраивая файрвол удалённо, сначала разреши SSH (22/tcp), иначе закроешь себе доступ. Держи второй сеанс открытым.

Рецепты

2

ufw

bash
sudo ufw status verbose           # текущие правила
sudo ufw allow 22/tcp             # разрешить SSH (СНАЧАЛА!)
sudo ufw allow 80,443/tcp         # веб
sudo ufw allow from 192.168.1.0/24 to any port 5432  # из подсети
sudo ufw deny 23/tcp
sudo ufw delete allow 80/tcp
sudo ufw enable                   # включить, политика по умолчанию
sudo ufw default deny incoming    # запретить входящее по умолчанию

Постоянный набор nftables

Правила из nft add живут до перезагрузки. Постоянный набор — файл /etc/nftables.conf: его загружает служба nftables (ExecStart=/usr/sbin/nft -f /etc/nftables.conf). На учебной машине служба выключена (disabled), а файл из пакета пускает всё: в его цепочках нет ни правил, ни политики.

Базовый набор «всё, что не разрешено, — drop»:

text
#!/usr/sbin/nft -f
flush ruleset

table inet filter {
	chain input {
		type filter hook input priority filter; policy drop;
		iif lo accept
		ct state established,related accept
		meta l4proto { icmp, ipv6-icmp } accept
		tcp dport { 22, 80 } accept
		counter
	}
}
Строка Зачем
policy drop всё, что не разрешено ниже, отбрасывается
iif lo accept машина говорит сама с собой: база и админка на 127.0.0.1 работают
ct state established,related accept ответы на соединения, которые машина открыла сама
meta l4proto { icmp, ipv6-icmp } accept ping и служебные сообщения ICMP
tcp dport { 22, 80 } accept порты, открытые наружу, списком
counter сколько пакетов дошло до политики drop
bash
sudo nft -c -f /etc/nftables.conf      # проверить, не применяя
sudo systemctl enable --now nftables   # загрузить сейчас и при загрузке
sudo nft list ruleset

nft -c печатает ошибку с местом в строке и кодом 1:

text
/tmp/bad.nft:1:54-54: Error: syntax error, unexpected '}'
table inet filter { chain input { tcp dport 22 acept } }
                                                     ^

Снаружи — из другого пространства имён или с другой машины — закрытые порты видны как filtered: пакет отброшен без ответа (см. nmap):

text
PORT     STATE    SERVICE
22/tcp   open     ssh
80/tcp   open     http
5432/tcp filtered postgresql
8080/tcp filtered http-proxy

flush ruleset в начале файла удаляет все таблицы, и чужие тоже: таблица, созданная руками, после systemctl enable --now nftables пропала. Таблицы fail2ban и Docker после restart nftables вернутся только с перезапуском этих служб.

Неполадки

4

Закрыл себе SSH

Зайди через консоль гипервизора/serial; ufw disable или поправь набор и перезагрузи правила.

Правило не действует

  • Порядок важен: в nftables до policy drop нужен accept для нужного трафика.
  • ufw и ручной nft могут конфликтовать — используй что-то одно.
  • Проверь, что трафик вообще доходит: ss -tlnp (служба слушает?) до выводов о файрволе.

Снаружи не доступен порт, хотя служба слушает

sudo ufw status / nft list ruleset — разрешён ли порт; не забудь про внешний NAT/маршрутизатор.

С самой машины порт открыт, хотя его закрыли

curl http://192.0.2.1:8080/ на самой машине отвечает 200, хотя порт закрыт политикой drop. Пакет на свой же адрес идёт через интерфейс lo, и его пропускает iif lo accept. Проверяй фильтр снаружи: с другой машины или из отдельного сетевого пространства (ip netns exec … nmap).

Опасно

2

ufw default deny incoming / enable без правила для SSH

Обе команды применяются сразу, разрывая уже открытую сессию, если для неё нет разрешающего правила. На удалённой машине без консоли гипервизора это означает полную потерю доступа до физического/консольного вмешательства. Порядок обязателен: сначала ufw allow 22/tcp, потом default deny incoming и enable.

Замена всего набора nftables (nft -f)

sudo nft -f /etc/nftables.conf загружает файл как есть, не спрашивая подтверждения. Ошибка в файле (например, policy drop без accept для SSH-порта) применится немедленно и оборвёт удалённую сессию так же, как ufw.

Термины

6
таблица nftables nftables table
Именованная группа цепочек и других объектов в определённом семействе nftables.
цепочка nftables nftables chain
Упорядоченная последовательность правил; базовая цепочка привязана к hook обработки пакетов.
hook Netfilter Netfilter hook
Этап сетевой обработки, к которому можно подключить базовую цепочку фильтрации.
вердикт фильтра firewall verdict
Решение при обработке правила, например разрешить, отбросить или явно отклонить пакет.
политика цепочки chain policy
Решение по умолчанию при достижении конца базовой цепочки без завершающего вердикта. Ещё встречается в: Классический файрвол iptables, nmap: какие порты видны снаружи
счётчик пакетов packet counter
Число пакетов, прошедших через действие counter; обычно сопровождается счётчиком байтов. Ещё встречается в: ip, Классический файрвол iptables

См. также

  • ss — Кто слушает порты и какие соединения открыты — современная замена netstat.
  • ip — Управление интерфейсами, адресами и маршрутами (iproute2) — замена ifconfig/route.
  • sshd — Сервер SSH — удалённый доступ по ключам, конфиг и хардненинг.
Загрузка…