Введение / Зачем это нужно
iptables — это стандартный инструмент фильтрации сетевого трафика в ядре Linux. Несмотря на постепенный переход экосистемы на nftables, он остаётся рабочим стандартом для управления пакетами на серверах и рабочих станциях. Правильная настройка файрвола блокирует несанкционированный доступ, скрывает неиспользуемые сервисы и снижает нагрузку на сеть. После выполнения этого руководства вы сможете вручную управлять цепочками правил, открывать нужные порты и применять политику «запрещено всё, кроме разрешённого».
Требования / Подготовка
Перед началом убедитесь, что у вас есть root-доступ или привилегии sudo. Все команды выполняются в терминале. Рекомендуется подключиться через SSH и проверить наличие утилиты:
iptables --version
Если команда не найдена, установите пакет через менеджер пакетов вашего дистрибутива (например, sudo apt install iptables или sudo dnf install iptables). Убедитесь, что вы не блокируете себя: держите под рукой доступ к веб-консоли хостинг-провайдера на случай потери соединения.
Шаг 1: Очистка текущей конфигурации
Начните с чистого состояния, чтобы старые правила не конфликтовали с новой политикой. Выполните команду для удаления всех правил из всех цепочек:
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
Опция -F очищает правила, а -X удаляет пользовательские цепочки. Команда с -t nat сбрасывает правила трансляции адресов. Это безопасный этап, так как по умолчанию политика обычно установлена в ACCEPT, и активные сессии не разорвутся.
Шаг 2: Установка политик по умолчанию
Задайте строгие правила для всего входящего трафика. Сервер будет отклонять пакеты, если для них нет явного разрешения.
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
Здесь DROP означает молчаливое отбрасывание пакетов, что усложняет сканирование портов злоумышленниками. ACCEPT для исходящего трафика позволяет серверу скачивать обновления и обращаться к внешним API без дополнительных правил.
Шаг 3: Разрешение установленных и SSH-подключений
Чтобы текущая SSH-сессия не прервалась, разрешите трафик для уже установленных соединений и явно откройте порт удалённого доступа.
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Параметр -m conntrack отслеживает состояние пакетов. Если соединение уже инициировано, оно пропустится. Вторая команда разрешает входящие TCP-запросы на порт 22. Если вы используете нестандартный порт SSH, замените 22 на ваш номер.
Шаг 4: Открытие веб-портов и локального доступа
Если на сервере работает веб-сервер или базу данных, добавьте соответствующие правила. Также важно разрешить трафик на локальном интерфейсе, чтобы системные утилиты могли взаимодействовать друг с другом.
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Флаг -i lo разрешает весь трафик на интерфейсе 127.0.0.1. Правила для 80 и 443 портов делают сайты доступными для посетителей. Для других сервисов (например, MySQL на порту 3306) используйте аналогичный синтаксис, но ограничьте доступ доверенными IP через -s 192.168.1.0/24.
Проверка результата
Убедитесь, что правила применились корректно, выведя текущую конфигурацию с номерами пакетов и объёмом трафика:
sudo iptables -L -n -v
Ключ -n ускоряет вывод, отключая обратное DNS-резолвинг, а -v показывает статистику прохождения пакетов. Вы должны увидеть цепочку INPUT с политикой DROP и строки ACCEPT для SSH, loopback и веб-портов. Попробуйте открыть сайт на сервере из браузера и подключиться по SSH с другого устройства. Оба действия должны пройти без задержек.
Возможные проблемы
Ошибка iptables v1.8.x: command not found или конфликты версий
В современных дистрибутивах iptables может быть симлинком на iptables-nft или iptables-legacy. Используйте sudo update-alternatives --config iptables для выбора нужной реализации, если сталкиваетесь с ошибками совместимости.
Потеря доступа после применения политик
Если политика INPUT DROP активирована до разрешения SSH, вы окажетесь вне сессии. Восстановите доступ через VNC-консоль и выполните sudo iptables -F. В будущем используйте утилиту iptables-apply с автоматическим таймаутом, которая откатит изменения при потере соединения.
Правила исчезают после перезагрузкиiptables хранит правила только в оперативной памяти. Для сохранения установите iptables-persistent:
sudo apt install iptables-persistent
sudo netfilter-persistent save
На системах с systemd сервис автоматически загружает правила из /etc/iptables/rules.v4 при старте операционной системы. Регулярно обновляйте этот файл после внесения изменений в работу сети.