Top.Mail.Ru

Iptables: базовый файрвол на Ubuntu без риска потерять доступ

0
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

Похожее

Все статьи
36672

Как на самом деле работает процессор и почему архитектура решает все

Процессор редко оказывается на виду, но именно он определяет, как быстро система реагирует на команды, справляется с вычислениями и выдерживает нагрузку. За небольшой железкой размером со спичечный коробок стоит сложная вычислительная архитектура, где важны не только частота и количество ядер,…

5169

Что такое скрипт и почему без них не работает современный мир

Слово «скрипт» давно выбралось за пределы сугубо технических разговоров. Сегодня его можно услышать от маркетологов, дизайнеров, аналитиков и многих других специалистов. И иногда создается комичная ситуация, что вроде бы про слово все знают, все используют, но толком объяснить что оно…