Защита сервера с помощью iptables на Ubuntu

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).

Источники и ссылки


Комментарии загружаются…