Файрвол (iptables, nftables)

Материал из llmdocs — справочник разработчика
Файрвол (iptables, nftables)
Назначениепропускать или отбрасывать пакеты по правилам
Подсистема ядра Linuxnetfilter
Классический интерфейсiptables (с 2001, ядро 2.4)
Современный интерфейсnftables (с 2014, ядро 3.13)
Обёрткиufw (Ubuntu), firewalld (RHEL/Fedora)
Ключевая возможностьотслеживание соединений (conntrack, stateful)

Файрвол (межсетевой экран, брандмауэр; англ. firewall) — программа или устройство, которое пропускает или отбрасывает сетевые пакеты по заданным правилам: по адресам, портам, протоколу и состоянию соединения. В Linux фильтрацию выполняет подсистема ядра netfilter, а правила задаются утилитами iptables (классический интерфейс) или nftables (современный).[1] Поверх них работают упрощённые обёртки — ufw и firewalld.

Как устроен netfilter

Netfilter встраивает в сетевой стек ядра точки перехвата (hooks), через которые проходит каждый пакет:

  • prerouting — сразу после получения, до решения о маршрутизации (DNAT, проброс портов);
  • input — пакеты, адресованные самой машине;
  • forward — пакеты, проходящие транзитом (маршрутизатор, контейнеры);
  • output — пакеты, созданные локальными процессами;
  • postrouting — перед отправкой (SNAT, маскарадинг).

Ключевой механизм — conntrack, отслеживание соединений. Благодаря ему файрвол работает «с состоянием» (stateful): достаточно разрешить входящий запрос, а ответные пакеты того же соединения пропускаются правилом established,related. Без этого пришлось бы вручную описывать трафик в обе стороны.

iptables

Iptables появился в ядре 2.4 (2001). Правила организованы в таблицы (filter, nat, mangle, raw) и цепочки (INPUT, FORWARD, OUTPUT и т. д.); пакет проходит правила цепочки сверху вниз до первого совпадения, а если ни одно не сработало — применяется политика цепочки.[3]

iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

Для IPv6 используется отдельная утилита ip6tables с дублирующими правилами. В современных дистрибутивах команда iptables обычно является совместимым интерфейсом iptables-nft, который транслирует правила в nftables.

nftables

Nftables вошёл в ядро 3.13 (2014) и заменяет iptables, ip6tables, arptables и ebtables одной утилитой nft с единым синтаксисом.[2] Преимущества: общие правила для IPv4 и IPv6 (семейство inet), встроенные множества (sets) и словари, атомарная загрузка всего набора правил из файла, более быстрая обработка больших списков. Таблицы и цепочки не предопределены — их создаёт администратор.[4]

Типовой конфигурационный файл /etc/nftables.conf для сервера:

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

table inet filter {
  set admin_ips { type ipv4_addr; elements = { 203.0.113.10 } }

  chain input {
    type filter hook input priority 0; policy drop;
    iif lo accept
    ct state established,related accept
    ct state invalid drop
    meta l4proto { icmp, ipv6-icmp } accept
    ip saddr @admin_ips tcp dport 22 accept
    tcp dport { 80, 443 } accept
    udp dport 443 accept            # HTTP/3 (QUIC)
  }
  chain forward { type filter hook forward priority 0; policy drop; }
  chain output  { type filter hook output priority 0; policy accept; }
}
nft -c -f /etc/nftables.conf     # проверить синтаксис
systemctl enable --now nftables  # загрузить и включить при старте
nft list ruleset                 # показать действующие правила

Обёртки

  • ufw (Uncomplicated Firewall) в Ubuntu: ufw allow 22/tcp, ufw allow 443, ufw enable.[5]
  • firewalld в RHEL, Fedora, openSUSE оперирует зонами (public, internal) и сервисами: firewall-cmd --permanent --add-service=https, затем --reload.[6]

Обёртки удобны для типовых задач; смешивать их с ручными правилами nft в одной системе не стоит.

Практические правила

  • Политика по умолчанию для входящих — запрет, разрешения — явные (см. Принцип наименьших привилегий).
  • Перед применением правил на удалённой машине убедиться, что SSH остаётся разрешённым, и держать запасной путь: консоль провайдера или отложенный откат (at now + 5 min с командой восстановления старых правил).
  • Не забывать про IPv6: открытый по IPv6 порт так же доступен из интернета.
  • Сервисы, которые нужны только локально (базы данных, Redis), лучше слушать на 127.0.0.1, а не полагаться только на файрвол.
  • Для защиты от перебора паролей файрвол дополняют Fail2ban или ограничением частоты (limit rate в nftables).
  • Docker сам добавляет правила в netfilter, и проброшенные порты (-p 8080:80) обходят правила ufw в цепочке INPUT; фильтровать их нужно в цепочке DOCKER-USER или публиковать порты только на 127.0.0.1.[7]

Облачные и сетевые файрволы

Помимо файрвола на хосте, есть файрволы уровня сети: группы безопасности в облаках, правила у хостинг-провайдера, аппаратные шлюзы, а в Kubernetes — NetworkPolicy, которые реализуют сетевые плагины (CNI). Хорошая практика — сочетать оба уровня.

См. также

Источники

  1. netfilter project — nftables wiki
  2. nft(8) — Linux manual page
  3. iptables(8) — Linux manual page
  4. Arch Wiki — nftables
  5. Ubuntu — Uncomplicated Firewall (ufw)
  6. firewalld documentation
  7. Docker docs — Packet filtering and firewalls