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

> Межсетевой экран — фильтрация сетевых пакетов по правилам; в Linux реализован подсистемой netfilter и настраивается через iptables, nftables или обёртки ufw и firewalld.

Источник: https://llmdocs.ru/wiki/firewall/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Назначение**: пропускать или отбрасывать пакеты по правилам
- **Подсистема ядра Linux**: netfilter
- **Классический интерфейс**: iptables (с 2001, ядро 2.4)
- **Современный интерфейс**: nftables (с 2014, ядро 3.13)
- **Обёртки**: ufw (Ubuntu), firewalld (RHEL/Fedora)
- **Ключевая возможность**: отслеживание соединений (conntrack, stateful)
**Файрвол** (межсетевой экран, брандмауэр; англ. *firewall*) — программа или устройство, которое пропускает или отбрасывает сетевые пакеты по заданным правилам: по адресам, портам, протоколу и состоянию соединения. В [Linux](https://llmdocs.ru/wiki/linux.md) фильтрацию выполняет подсистема ядра **netfilter**, а правила задаются утилитами **iptables** (классический интерфейс) или **nftables** (современный).[1] Поверх них работают упрощённые обёртки — ufw и firewalld.

## Как устроен netfilter

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

- **prerouting** — сразу после получения, до решения о маршрутизации ([DNAT](https://llmdocs.ru/wiki/nat.md), проброс портов);
- **input** — пакеты, адресованные самой машине;
- **forward** — пакеты, проходящие транзитом (маршрутизатор, контейнеры);
- **output** — пакеты, созданные локальными процессами;
- **postrouting** — перед отправкой (SNAT, маскарадинг).

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

## iptables

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

```bash
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` для сервера:

```nft
#!/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; }
}
```

```bash
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 в одной системе не стоит.

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

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

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

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

## См. также

- [TCP](https://llmdocs.ru/wiki/tcp.md)
- [UDP](https://llmdocs.ru/wiki/udp.md)
- [IP-адрес и подсети (CIDR)](https://llmdocs.ru/wiki/ip-cidr.md)
- [NAT](https://llmdocs.ru/wiki/nat.md)

## Источники

1. [netfilter project — nftables wiki](https://wiki.nftables.org/)
2. [nft(8) — Linux manual page](https://www.netfilter.org/projects/nftables/manpage.html)
3. [iptables(8) — Linux manual page](https://man7.org/linux/man-pages/man8/iptables.8.html)
4. [Arch Wiki — nftables](https://wiki.archlinux.org/title/Nftables)
5. [Ubuntu — Uncomplicated Firewall (ufw)](https://documentation.ubuntu.com/server/how-to/security/firewalls/)
6. [firewalld documentation](https://firewalld.org/documentation/)
7. [Docker docs — Packet filtering and firewalls](https://docs.docker.com/engine/network/packet-filtering-firewalls/)
