Файрвол (iptables, nftables)
| Назначение | пропускать или отбрасывать пакеты по правилам |
|---|---|
| Подсистема ядра Linux | netfilter |
| Классический интерфейс | 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). Хорошая практика — сочетать оба уровня.