iptables – классический интерфейс к netfilter: правила фильтрации пакетов по цепочкам INPUT, OUTPUT, FORWARD. На Ubuntu пакет обычно уже есть (часто как iptables-nft поверх nftables). Ниже – базовая политика, allow для SSH и веба, rate-limit, логи и сохранение правил после перезагрузки.
Важно: если уже включён UFW или firewalld, не смешивайте ручные правки iptables «поверх» без понимания, кто чем владеет. На чистом netfilter порядок такой: сначала allow для SSH, потом policy DROP на INPUT, иначе можно отрезать себе доступ.
Проверка и установка
sudo iptables -L sudo apt update sudo apt install iptables
Список цепочек без ошибок означает, что утилита доступна. На свежих Ubuntu часто установлен iptables + backend nft; команды ниже те же.
Цепочки filter
- INPUT – пакеты, адресованные самому хосту.
- OUTPUT – исходящие с хоста.
- FORWARD – транзитные (роутер, bridge, иногда Docker).
Правила в цепочке идут сверху вниз до первого match с целевым действием (ACCEPT, DROP, LOG и т.д.). Политика цепочки (-P) срабатывает, если ни одно правило не подошло.
Просмотр и сброс
sudo iptables -L -v -n sudo iptables -F
-v -n – счётчики и адреса без DNS. -F очищает правила в filter (политики -P не сбрасывает). На проде перед flush имейте консоль провайдера: при DROP по умолчанию и пустых правилах вход закроется.
Политика по умолчанию
Сначала добавьте allow для loopback, established и SSH, и только потом DROP на INPUT. Упрощённый каркас:
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo iptables -P OUTPUT ACCEPT
Без ESTABLISHED/RELATED ответы на ваши исходящие соединения (apt, DNS и т.п. с точки зрения ответных пакетов на INPUT) могут ломаться. На очень старых системах вместо conntrack встречается -m state --state.
Типовые правила
SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # нестандартный порт: sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
HTTP / HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Блок IP и allow подсети
sudo iptables -A INPUT -s 203.0.113.50 -j DROP sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
DROP «шумных» адресов имеет смысл ставить выше общих allow, если порядок правил конфликтует. Для постоянного бана удобнее отдельная цепочка или fail2ban.
Лимит новых SSH-сессий (recent)
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
Идея: более трёх новых подключений с одного IP за 60 секунд – DROP. Нужен модуль xt_recent. Это грубый rate-limit, не замена Fail2Ban.
Ограничение SYN
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT sudo iptables -A INPUT -p tcp --syn -j DROP
Глобальный лимит SYN на весь INPUT агрессивен: на busy-хосте легко резать легитимный трафик. Чаще limit вешают на конкретный порт или опираются на sysctl (syn cookies) и upstream firewall.
Логирование
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables: " --log-level 4
LOG не останавливает пакет: после записи обработка идёт дальше. Ставьте LOG перед финальным DROP, иначе в journal/syslog попадёт шум. Префикс упрощает grep.
Сохранение после reboot
Правила в ядре живут до перезагрузки. Удобный путь – пакет iptables-persistent / netfilter-persistent:
sudo apt install iptables-persistent sudo netfilter-persistent save # или вручную: sudo iptables-save | sudo tee /etc/iptables/rules.v4
При старте rules.v4 подхватывается сервисом persistent. Альтернатива через rc.local (iptables-restore < /etc/iptables/rules.v4) на systemd-системах менее удобна: сервис может стартовать позже сети или не вызываться вовсе.
Краткий чеклист
- Не ставьте
-P INPUT DROP, пока нет allow loopback, established и SSH. - Проверяйте счётчики:
iptables -L -v -n. - Сохраняйте rules.v4 после удачной настройки.
- Не смешивайте слепо UFW и ручные iptables.
- Для бана по логам лучше Fail2Ban, iptables – как backend бана.
iptables даёт полный контроль над filter, но цена – дисциплина порядка правил и persistence. Для многих VPS проще начать с UFW; iptables остаётся нужен, когда нужна точная политика или отладка чужих правил (Docker, панели, cloud-agent).
