Linux & Administration

iptables / UFW

iptables — классический интерфейс к сетевому фильтру ядра Linux, UFW — простая надстройка над ним для типовых правил.

Что такое iptables

iptables — утилита для настройки netfilter, межсетевого экрана, встроенного в ядро Linux. Сам фильтр живёт в ядре и проверяет каждый проходящий пакет; iptables — способ сказать ему, какие пакеты пропускать, а какие отбрасывать.

Правила сгруппированы в цепочки (chains), цепочки — в таблицы (tables). На практике достаточно знать три цепочки таблицы filter:

Цепочка Какие пакеты
INPUT входящие, адресованные самому серверу
OUTPUT исходящие от сервера
FORWARD транзитные — сервер как маршрутизатор, NAT, Docker

Пакет идёт по цепочке сверху вниз до первого совпадения — порядок правил решает всё. Правило, разрешающее SSH, поставленное после DROP all, не сработает никогда.

iptables -L -n -v --line-numbers        # показать правила с номерами и счётчиками
iptables -A INPUT -p tcp --dport 22 -j ACCEPT       # дописать в конец
iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT    # вставить первым
iptables -D INPUT 3                                 # удалить правило №3

Ключевая ловушка: правила iptables живут в памяти и исчезают после перезагрузки. Сохранять их надо отдельно — пакетом iptables-persistent в Debian и Ubuntu или iptables-save > /etc/iptables/rules.v4. Отдельно ведутся правила для IPv6 — команда ip6tables, файл rules.v6. Забыть про IPv6 — распространённый способ оставить открытым порт, который считали закрытым.

Что такое UFW

UFW (Uncomplicated Firewall) — надстройка над тем же netfilter, созданная в Ubuntu, чтобы типовые задачи решались одной понятной строкой вместо простыни ключей. UFW не заменяет фильтр — он генерирует для него правила.

ufw default deny incoming        # всё входящее запрещено
ufw default allow outgoing       # исходящее разрешено
ufw allow 22/tcp                 # SSH — ДО включения!
ufw allow 80,443/tcp             # веб
ufw allow from 10.0.0.0/24 to any port 5432 proto tcp   # Postgres только из своей подсети
ufw limit 22/tcp                 # тормозить перебор: 6 попыток за 30 секунд с одного IP
ufw enable
ufw status numbered

Разрешите SSH до ufw enable. Иначе политика deny incoming вступит в силу вместе с включением, ваша текущая сессия оборвётся, и вернуться на сервер получится только через консоль провайдера или IPMI.

Что выбрать

UFW iptables / nftables
Порог входа минимальный высокий
Типовой сервер (web + SSH) достаточно избыточно
Сохранение после перезагрузки само вручную
IPv6 автоматически вместе с IPv4 отдельными командами
Сложный NAT, маркировка, лимиты неудобно всё возможно

Практическое правило: на одиночном VPS берите UFW и не усложняйте. iptables нужен, когда UFW перестаёт хватать — сложный NAT, проброс между интерфейсами, тонкий rate limiting.

Про смену поколений: netfilter давно переехал на nftables, и в свежих Debian, Ubuntu и RHEL команда iptables — это обёртка iptables-nft, транслирующая старый синтаксис в новый движок. Старые команды работают, но nft list ruleset покажет реальную картину правил.

Docker обходит UFW

Неприятный сюрприз, стоивший многим утёкшей базы: Docker при публикации порта (-p 5432:5432) пишет собственные правила в цепочку FORWARD и таблицу nat, минуя INPUT, куда пишет UFW. Контейнер оказывается доступен всему интернету, а ufw status при этом честно показывает, что порт закрыт.

Правильное решение — не публиковать порт наружу вовсе: -p 127.0.0.1:5432:5432. Тогда доступ есть только с самой машины, а снаружи — через SSH-туннель.

Firewall — не вся защита

Сетевой фильтр отсекает доступ по IP и портам. Он не спасёт от атаки на открытый по определению 443-й порт: SQL-инъекции и подбор паролей идут по разрешённому трафику. Для этого нужен WAF, а от DDoS объёмом в десятки гигабит iptables не поможет — канал забьётся до сервера, здесь работает только фильтрация на стороне провайдера.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер