Почему правила iptables не сохраняются и как это исправить
Представь, что ты настроил сложный набор правил фаервола, проверил их работу, перезагрузил сервер — и всё сбросилось. Знакомая ситуация? Правила iptables по умолчанию хранятся в оперативной памяти и теряются при перезагрузке. В этой статье мы разберем, как правильно сохранить настройки iptables, чтобы они пережили ребут системы.
Как сохранить настройки iptables в Ubuntu: пошаговое руководство
Давай разберем самый популярный и надежный метод для дистрибутивов на основе Debian, включая Ubuntu 20.04, 22.04 и более новые версии.
Метод 1: Используем iptables-persistent (рекомендуется для Ubuntu)
Этот пакет автоматически загружает сохраненные правила при старте системы. Вот как его настроить:
# 1. Устанавливаем пакет
sudo apt update
sudo apt install iptables-persistent -y
# Во время установки тебя спросят, сохранить ли текущие правила.
# Можешь ответить "Да" или позже сохранить вручную.
# 2. Если нужно сохранить текущие правила ПОСЛЕ установки:
sudo netfilter-persistent save
# Или альтернативная команда:
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
# 3. Проверяем, что правила сохранились:
cat /etc/iptables/rules.v4
# 4. Применяем правила без перезагрузки:
sudo netfilter-persistent reload
netfilter-persistent, но команды остаются совместимыми. Если iptables-persistent не находится, попробуй установить именно netfilter-persistent.
Метод 2: Ручное сохранение через iptables-save
Это универсальный метод, работающий на любом дистрибутиве Linux. Он дает полный контроль над процессом.
# Сохраняем правила IPv4 и IPv6 в файлы
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
# Создаем скрипт для автозагрузки (если нет systemd)
sudo nano /etc/network/if-pre-up.d/iptables
Содержимое скрипта:
#!/bin/bash
/sbin/iptables-restore < /etc/iptables/rules.v4
/sbin/ip6tables-restore < /etc/iptables/rules.v6
# Делаем скрипт исполняемым:
sudo chmod +x /etc/network/if-pre-up.d/iptables
Метод 3: Systemd сервис (для современных дистрибутивов)
Если твоя система использует systemd (как большинство современных дистрибутивов), можно создать собственный сервис:
# Создаем сервисный файл
sudo nano /etc/systemd/system/iptables.service
Содержимое файла:
[Unit]
Description=Restore iptables rules
Before=network-pre.target
Wants=network-pre.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
ExecStart=/sbin/ip6tables-restore /etc/iptables/rules.v6
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
# Активируем и запускаем сервис
sudo systemctl daemon-reload
sudo systemctl enable iptables.service
sudo systemctl start iptables.service
Сравнение методов сохранения настроек iptables
| Метод | Дистрибутивы | Сложность | Надежность | Рекомендация |
|---|---|---|---|---|
| iptables-persistent | Debian, Ubuntu | Низкая | Высокая | ⭐ Лучший выбор для Ubuntu |
| Ручной + systemd | Systemd-дистрибутивы | Средняя | Очень высокая | Для кастомных конфигураций |
| Ручной + init скрипт | Все дистрибутивы | Средняя | Средняя | Универсальный метод |
| firewalld | RHEL, CentOS, Fedora | Низкая | Высокая | Для RedHat-семейства |
Типичные проблемы и их решения
Правила не применяются после перезагрузки
Если ты всё сделал правильно, но правила не сохраняются, проверь следующее:
- Порядок загрузки: Правила должны загружаться ДО поднятия сетевых интерфейсов
- Права доступа: Файлы с правилами должны быть читаемы для root
- Синтаксис: Проверь файлы правил командой
sudo iptables-restore -t /etc/iptables/rules.v4 - Конфликты: Убедись, что нет других фаерволов (ufw, firewalld), которые перезаписывают правила
Как проверить, что правила сохранились
# 1. Посмотреть текущие правила в памяти
sudo iptables -L -n -v
# 2. Посмотреть сохраненные правила в файле
sudo cat /etc/iptables/rules.v4
# 3. Сравнить вывод (они должны совпадать после перезагрузки)
# 4. Тестовый ребут или применение правил:
sudo iptables-restore < /etc/iptables/rules.v4
sudo iptables -L -n -v # проверяем изменения
Дополнительные советы от Senior DevOps
Вот рабочий процесс, который я рекомендую для production-среды:
- Тестируй новые правила на не-production сервере
- Сохраняй их в файл
/etc/iptables/rules.v4 - Коммить этот файл в Git-репозиторий инфраструктуры
- Используй Ansible, Chef или Puppet для деплоя правил на сервера
- Всегда имей скрипт для быстрого отката к предыдущей версии
Часто задаваемые вопросы (FAQ)
В чем разница между iptables-save и netfilter-persistent?
iptables-save — это утилита для экспорта текущих правил в текстовый формат. netfilter-persistent (или iptables-persistent) — это пакет, который автоматически вызывает iptables-restore при загрузке системы из сохраненных файлов. Первый — инструмент, второй — решение для автоматизации.
Можно ли сохранить настройки iptables без перезагрузки?
Да, команда sudo netfilter-persistent save сохраняет текущие правила в файлы без перезагрузки. Но чтобы они применялись автоматически при следующей загрузке, нужно именно то, о чем мы говорили в статье — настройка персистентности через пакеты или systemd.
Что делать, если я использую ufw (Uncomplicated Firewall)?
UFW — это фронтенд для iptables. При включении (sudo ufw enable) он автоматически настраивает сохранение правил через iptables-persistent. Твои правила, добавленные через ufw allow и ufw deny, будут сохраняться автоматически.
Где физически хранятся сохраненные правила iptables в Ubuntu?
По умолчанию в Ubuntu с пакетом iptables-persistent правила хранятся в:
- /etc/iptables/rules.v4 — для IPv4 правил
- /etc/iptables/rules.v6 — для IPv6 правил
Почему после сохранения правил пропадает доступ к серверу по SSH?
Самая частая ошибка — не добавить правило для SSH перед тем, как дропать все остальные соединения. Всегда проверяй цепочку правил и убедись, что правило для SSH (обычно порт 22) идет ПЕРЕД правилом DROP в цепочке INPUT.
/etc/iptables/rules.v4 и выполни sudo netfilter-persistent reload.
Заключение
Теперь ты знаешь, как надежно сохранить настройки iptables в Ubuntu и других дистрибутивах Linux. Ключевые моменты:
- Для Ubuntu используй
iptables-persistent— это самый простой и надежный способ - Всегда проверяй правила перед сохранением и после перезагрузки
- Веди версионный контроль конфигураций фаервола
- Помни про правило SSH — оно должно быть первым в цепочке INPUT
Правильно настроенный и сохраненный фаервол — основа безопасности любого сервера. Не оставляй эту задачу на потом, настрой персистентность сразу после конфигурации правил.