Iptables: базовый файрвол на Ubuntu без риска потерять доступ
Iptables — стандартный инструмент управления файрволом в Linux, который фильтрует трафик по правилам в цепочках INPUT, OUTPUT и FORWARD. Главная опасность при настройке на удалённом VPS — заблокировать собственный SSH-доступ неправильным порядком правил. Эта статья построена так, чтобы этого не произошло: сначала разбираем безопасный порядок настройки, потом — сами правила.
Главное правило безопасности перед началом
Iptables обрабатывает правила сверху вниз, и первое совпадение побеждает. Если установить политику DROP для входящего трафика раньше чем разрешить SSH — соединение оборвётся мгновенно, и вернуть доступ можно будет только через консоль провайдера (VNC в панели управления), если она есть.
Прежде чем менять что-либо, сделайте две вещи.
Бэкап текущих правил:
sudo iptables-save > /tmp/iptables-backup.txt
Страховка через команду at — самая важная часть этого раздела, и её почти никто не упоминает в типичных гайдах. Команда at планирует одноразовое выполнение скрипта через заданное время. Если вы случайно заблокируете себе доступ, через 5 минут правила автоматически сбросятся:
sudo apt install at -y
echo "iptables -F" | sudo at now + 5 minutes
Если после применения правил SSH всё ещё работает — отмените отложенную задачу:
atq
sudo atrm НОМЕР_ЗАДАЧИ
Команда atq покажет список запланированных задач с их номерами. Если задача не отменена — через 5 минут iptables автоматически очистится, и можно будет начать настройку заново без необходимости обращаться в поддержку хостинга.
Установка iptables
На большинстве Ubuntu-серверов iptables уже установлен. Проверить:
sudo iptables -V
Если команда не найдена:
sudo apt update && sudo apt install iptables -y
На Ubuntu 20.04 и новее команда iptables фактически работает через современный backend nftables (iptables-nft), сохраняя привычный синтаксис. Для целей этой статьи разницы в командах нет.
Цепочки iptables
Три основные цепочки обрабатывают разные направления трафика:
| Цепочка | Что обрабатывает |
|---|---|
| INPUT | Входящий трафик к серверу |
| OUTPUT | Исходящий трафик от сервера |
| FORWARD | Транзитный трафик через сервер (актуально для роутеров и NAT, не для типичного VPS) |
Для большинства VPS-сценариев настраивается только INPUT — нужно контролировать кто может подключаться к серверу. OUTPUT обычно оставляют открытым.
Посмотреть текущие правила:
sudo iptables -L -v -n
Флаг -v показывает счётчики пакетов, -n отключает резолвинг DNS для ускорения вывода.
Базовая настройка: правильный порядок
Это последовательность которая не заблокирует доступ. Каждый шаг добавляет правило, политика DROP устанавливается строго в конце.
Шаг 1: Разрешить трафик на loopback-интерфейсе
sudo iptables -A INPUT -i lo -j ACCEPT
Без этого правила локальные сервисы которые общаются через 127.0.0.1 — например, приложение подключающееся к локальной базе данных — перестанут работать.
Шаг 2: Разрешить ответные пакеты для уже установленных соединений
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Без этого правила любой исходящий запрос с сервера (apt update, curl, обращение к внешнему API) не получит ответа — пакет ответа будет считаться новым входящим соединением и заблокируется.
Шаг 3: Разрешить SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Если SSH работает на нестандартном порту, замените 22 на нужный номер.
Шаг 4: Разрешить HTTP и HTTPS если сервер обслуживает веб-трафик
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Шаг 5: Только теперь установить политику DROP по умолчанию
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
Политику OUTPUT обычно оставляют ACCEPT — если её тоже закрыть, потребуется явно разрешать каждый исходящий тип трафика, включая DNS-запросы, что усложняет конфигурацию без существенной выгоды для типичного VPS.
Проверка перед сохранением
Откройте новое окно терминала и попробуйте подключиться по SSH, не закрывая текущую сессию:
ssh user@your-server-ip
Если новое подключение установилось — конфигурация безопасна. Если нет — у вас всё ещё есть текущая открытая сессия чтобы откатить изменения:
sudo iptables -F
sudo iptables -P INPUT ACCEPT
Или восстановить из бэкапа:
sudo iptables-restore < /tmp/iptables-backup.txt
Сохранение правил после перезагрузки
По умолчанию правила iptables живут только до перезагрузки сервера — после рестарта файрвол снова открыт. Чтобы сохранить конфигурацию, установите пакет для персистентности:
sudo apt install iptables-persistent -y
При установке появится диалоговое окно с вопросом сохранить ли текущие правила IPv4 и IPv6 — подтвердите.
Сохранить правила вручную в любой момент:
sudo netfilter-persistent save
Правила хранятся в файлах /etc/iptables/rules.v4 и /etc/iptables/rules.v6.
Ограничение попыток подключения к SSH
Дополнительная защита на уровне файрвола против перебора паролей — ограничение числа новых подключений к SSH за период времени:
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-адрес если с него поступило больше 4 новых подключений к SSH за 60 секунд. Это не заменяет Fail2ban — Fail2ban анализирует логи и блокирует надолго, тогда как это правило работает на уровне пакетов и сбрасывает счётчик через минуту. Используются они хорошо вместе, не взаимоисключающе.
Разрешить доступ только с конкретного IP
Если нужно ограничить SSH одним доверенным адресом — например, IP вашего офиса:
sudo iptables -A INPUT -p tcp --dport 22 -s 203.0.113.50 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
Первое правило разрешает доступ с указанного IP, второе блокирует все остальные попытки на порт 22. Порядок важен — разрешающее правило должно быть выше запрещающего.
Удаление отдельного правила
Если нужно убрать одно правило, не сбрасывая всю конфигурацию, посмотрите список с номерами строк:
sudo iptables -L INPUT --line-numbers
Удалите правило по номеру:
sudo iptables -D INPUT НОМЕР_ПРАВИЛА
Полный сброс правил
Если конфигурация запуталась и проще начать с нуля:
sudo iptables -F
sudo iptables -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
-F очищает все правила, -X удаляет пользовательские цепочки, последние три команды возвращают политики по умолчанию в ACCEPT — открытое состояние без файрвола.
Iptables, nftables и UFW: в чём разница
Все три инструмента решают одну задачу — фильтрацию трафика — но на разных уровнях.
iptables — прямой, низкоуровневый синтаксис, исторический стандарт. Команды которые видите в этой статье.
nftables — преемник iptables в современном ядре Linux, с 2014 года. На Ubuntu 20.04 и новее команда iptables уже работает как обёртка над nftables прозрачно для пользователя.
UFW (Uncomplicated Firewall) — упрощённая надстройка над iptables/nftables с человекочитаемым синтаксисом (ufw allow 22). Подходит для базовых сценариев, но не даёт той гибкости что прямой iptables — например, ограничение по частоте подключений сложнее выразить через UFW.
Для базового файрвола на личном проекте UFW часто достаточно. Для тонкой настройки правил, работы с conntrack-состояниями или нестандартными сценариями — iptables даёт больше контроля.
Часто задаваемые вопросы
Как не заблокировать себе SSH-доступ при настройке iptables?
Всегда разрешайте SSH ДО установки политики DROP для INPUT — порядок команд критичен, iptables применяет правила последовательно сверху вниз. Дополнительная страховка: запустите echo "iptables -F" | sudo at now + 5 minutes перед применением политики DROP — если что-то пойдёт не так, правила сбросятся автоматически через 5 минут.
Сохраняются ли правила iptables после перезагрузки сервера?
Нет, по умолчанию правила сбрасываются при перезагрузке. Установите пакет iptables-persistent и выполните sudo netfilter-persistent save чтобы сохранить текущую конфигурацию — правила будут восстанавливаться автоматически при каждом старте системы.
В чём разница между iptables и UFW?
UFW — упрощённая надстройка над iptables с понятным синтаксисом (ufw allow 80). iptables — более низкоуровневый инструмент с прямым доступом ко всем возможностям netfilter, включая ограничение частоты подключений и сложную фильтрацию по состояниям соединений. Для базовых задач достаточно UFW, для тонкой настройки — iptables.
Почему перестали работать локальные сервисы после настройки iptables?
Скорее всего не добавлено правило для loopback-интерфейса. Добавьте sudo iptables -A INPUT -i lo -j ACCEPT — без него трафик на 127.0.0.1 (например, подключение приложения к локальной базе данных) блокируется наравне с внешним трафиком.
Как разрешить доступ к серверу только с одного IP-адреса?
Добавьте разрешающее правило с флагом -s для конкретного IP, а затем запрещающее для всех остальных: sudo iptables -A INPUT -p tcp --dport 22 -s ВАШ_IP -j ACCEPT, затем sudo iptables -A INPUT -p tcp --dport 22 -j DROP. Порядок важен — разрешающее правило должно идти раньше запрещающего.
Настройка файрвола — один из первых шагов после получения VPS. На UFO.Hosting каждый сервер предоставляется с root-доступом и панелью управления, где можно временно открыть консольный доступ если что-то в настройке iptables пойдёт не так.
Официальная документация: netfilter.org/documentation
Похожее
Все статьи
Как на самом деле работает процессор и почему архитектура решает все
Процессор редко оказывается на виду, но именно он определяет, как быстро система реагирует на команды, справляется с вычислениями и выдерживает нагрузку. За небольшой железкой размером со спичечный коробок стоит сложная вычислительная архитектура, где важны не только частота и количество ядер,…
Что такое скрипт и почему без них не работает современный мир
Слово «скрипт» давно выбралось за пределы сугубо технических разговоров. Сегодня его можно услышать от маркетологов, дизайнеров, аналитиков и многих других специалистов. И иногда создается комичная ситуация, что вроде бы про слово все знают, все используют, но толком объяснить что оно…