
Правила iptables по умолчанию не сохраняются после перезагрузки системы. Это критично для серверов, где сетевая безопасность зависит от стабильности конфигурации файрвола. Существует несколько методов решения этой проблемы, каждый из которых имеет свои особенности в зависимости от дистрибутива Linux и используемых инструментов.
В системах на базе Debian/Ubuntu стандартным решением является пакет iptables-persistent. После установки (apt install iptables-persistent) правила автоматически сохраняются в файлах /etc/iptables/rules.v4 и /etc/iptables/rules.v6 при выполнении команды netfilter-persistent save. При загрузке системы они восстанавливаются через сервис netfilter-persistent. Важно: если правила изменяются вручную, их необходимо повторно сохранять, иначе при перезагрузке будет загружена последняя сохранённая версия.
Для RHEL/CentOS и производных дистрибутивов используется утилита iptables-services. Установите её (yum install iptables-services), затем активируйте сервис: systemctl enable iptables. Правила сохраняются в /etc/sysconfig/iptables командой service iptables save. В CentOS 7+ с firewalld этот метод не работает – вместо него применяйте firewall-cmd --permanent или отключайте firewalld в пользу iptables.
Альтернативный подход – использование скриптов инициализации. Создайте файл /etc/network/if-pre-up.d/iptables (Debian) или /etc/rc.local (RHEL) с командой iptables-restore < /path/to/rules. Убедитесь, что файл имеет права на выполнение (chmod +x). Этот метод гибкий, но требует ручного контроля за актуальностью правил и не подходит для систем с динамической конфигурацией сети.
Для автоматизации процесса рекомендуется использовать cron с заданием на периодическое сохранение правил. Добавьте в crontab строку: @reboot /sbin/iptables-restore < /etc/iptables/rules.v4. Однако этот способ не гарантирует сохранение изменений, внесённых после загрузки. Более надёжный вариант – комбинация inotify-tools для отслеживания изменений в правилах и автоматического сохранения при модификации.
Сохранение правил с помощью команды iptables-save и восстановление через iptables-restore

iptables-save и iptables-restore – инструменты для экспорта и импорта правил брандмауэра в Linux. Они работают напрямую с ядром, сохраняя текущую конфигурацию в текстовом формате или загружая её обратно. В отличие от ручного копирования правил, эти команды фиксируют все цепочки, политики по умолчанию и счётчики пакетов, что критично для точного восстановления.
Для сохранения текущих правил в файл используйте:
iptables-save > /etc/iptables/rules.v4– стандартный путь для IPv4.ip6tables-save > /etc/iptables/rules.v6– аналогично для IPv6.
Файл создаётся в формате, пригодном для последующего разбора iptables-restore. Важно: права доступа к файлу должны быть ограничены (chmod 600), чтобы исключить утечку конфиденциальных данных, например, IP-адресов или портов.
Восстановление правил выполняется командой:
iptables-restore < /etc/iptables/rules.v4– загружает IPv4-правила.- Добавьте флаг
-n, чтобы не сбрасывать существующие правила перед загрузкой:iptables-restore -n < rules.v4.
Для автоматического восстановления при загрузке системы добавьте скрипт в /etc/network/if-pre-up.d/ или используйте сервис systemd. Пример для systemd:
- Создайте файл
/etc/systemd/system/iptables-restore.serviceс содержимым:[Unit] Description=Restore iptables rules Before=network.target [Service] Type=oneshot ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4 ExecStart=/sbin/ip6tables-restore /etc/iptables/rules.v6 [Install] WantedBy=multi-user.target
- Активируйте сервис:
systemctl enable iptables-restore.
Этот метод гарантирует загрузку правил до поднятия сетевых интерфейсов, предотвращая уязвимости в момент старта системы.
iptables-save -t filter | grep -E '^\*filter|^:INPUT|^-A INPUT' > input_rules.
Это полезно для резервного копирования отдельных частей конфигурации или отладки. Однако при восстановлении таких фрагментов убедитесь, что зависимости между цепочками не нарушены – например, FORWARD может ссылаться на пользовательские цепочки.
При работе с iptables-restore учитывайте порядок правил. Команда загружает их последовательно, поэтому критически важные правила (например, блокировка трафика) должны идти первыми. Для проверки порядка используйте:
iptables-save | less– просмотр текущей конфигурации.- Флаг
-cвiptables-saveсохраняет счётчики пакетов, что полезно для анализа трафика после восстановления.
Если правила зависят от динамических данных (например, IP-адресов DHCP), используйте скрипты с подстановкой переменных или интегрируйте iptables-restore с ifup-хуками.
Для дистрибутивов с nftables (например, Debian 11+, RHEL 8+) iptables-save может работать через трансляцию. В этом случае добавьте флаг -f для сохранения в формате, совместимом с nft:
iptables-save -f /etc/iptables/rules.v4.nft.
Однако прямой экспорт в nftables через nft list ruleset > rules.nft надёжнее, так как избегает промежуточных преобразований.
Регулярно тестируйте восстановление правил на тестовой машине. Создайте скрипт, который:
- Сохраняет текущие правила:
iptables-save > test_rules. - Сбрасывает все правила:
iptables -F. - Восстанавливает из файла:
iptables-restore < test_rules. - Проверяет конфигурацию:
iptables -L -v -n.
Этот подход выявляет ошибки в файлах правил до их применения на продакшене. Храните резервные копии в /etc/iptables/backups/ с временными метками, чтобы иметь возможность отката.
Использование системного сервиса iptables-persistent для автоматического сохранения
Для ручного сохранения правил после их изменения используйте команду: sudo netfilter-persistent save. Она перезаписывает содержимое файлов rules.v4 и rules.v6 актуальными правилами. Важно: сервис не отслеживает изменения в реальном времени – сохранять правила нужно вручную после каждого редактирования. Пример типичного рабочего процесса: sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT && sudo netfilter-persistent save.
На системах с systemd сервис управляется через systemctl. Основные команды:
sudo systemctl enable netfilter-persistent |
Включает автозагрузку сервиса |
sudo systemctl restart netfilter-persistent |
Перезапускает сервис с загрузкой правил |
sudo systemctl status netfilter-persistent |
Проверяет состояние сервиса |
Если сервис не запускается, убедитесь, что файлы rules.v4 и rules.v6 существуют и содержат корректный синтаксис. Пустые файлы или синтаксические ошибки приводят к сбою загрузки.
Для кастомизации поведения сервиса отредактируйте файл /etc/default/netfilter-persistent. Параметр IPTABLES_SAVE_ON_STOP="yes" позволяет автоматически сохранять правила при остановке сервиса, но эта опция отключена по умолчанию из соображений безопасности. Включайте её только в доверенных средах, где перезапуск сервиса не несёт рисков потери критичных правил.
Альтернатива для систем без iptables-persistent – скрипт /etc/network/if-pre-up.d/iptables с содержимым:
#!/bin/sh /sbin/iptables-restore < /etc/iptables/rules.v4 /sbin/ip6tables-restore < /etc/iptables/rules.v6
Скрипт должен быть исполняемым (chmod +x) и размещён в указанной директории. Этот метод работает на большинстве дистрибутивов Linux, но менее надёжен, чем iptables-persistent, так как не обрабатывает ошибки загрузки правил.
Настройка cron-задачи для периодического резервного копирования правил

Для автоматического резервного копирования правил iptables через cron создайте скрипт с фиксированным именем, например, /usr/local/bin/backup_iptables.sh. Внутри скрипта используйте команду iptables-save > /var/backups/iptables/iptables_rules_$(date +\%Y\%m\%d_\%H\%M\%S).bak для сохранения текущих правил в файл с временной меткой. Назначьте права на выполнение: chmod +x /usr/local/bin/backup_iptables.sh. Храните резервные копии в отдельной директории, например, /var/backups/iptables/, предварительно создав её с правами 750.
Добавьте задачу в cron через crontab -e. Для ежедневного резервного копирования в 3:00 утра используйте строку: 0 3 * * * /usr/local/bin/backup_iptables.sh. Если требуется более частая синхронизация, например, каждые 6 часов, укажите: 0 */6 * * * /usr/local/bin/backup_iptables.sh. Убедитесь, что пользователь, от имени которого выполняется задача, имеет права на запись в целевую директорию и выполнение iptables-save.
Для ротации резервных копий добавьте в скрипт удаление старых файлов. Например, чтобы хранить только последние 7 копий, используйте: find /var/backups/iptables/ -type f -name "iptables_rules_*.bak" -mtime +7 -delete. Альтернативно, настройте logrotate для управления файлами резервных копий, создав конфигурацию /etc/logrotate.d/iptables_backups с параметрами rotate 7 и daily.
Проверьте корректность работы cron-задачи вручную: выполните /usr/local/bin/backup_iptables.sh и убедитесь, что файл резервной копии создаётся в целевой директории. Для отладки добавьте логирование в скрипт: echo "$(date) - Резервное копирование выполнено" >> /var/log/iptables_backup.log. При возникновении ошибок проверьте системные логи cron: grep CRON /var/log/syslog или journalctl -u cron.
Интеграция сохранения правил в скрипты инициализации системы (init.d, systemd)
Для систем с init.d создайте скрипт в /etc/init.d/iptables-restore с правами 755. Внутри пропишите:
#!/bin/sh– шебанг для POSIX-совместимости;iptables-restore < /etc/iptables/rules.v4– путь к сохранённым правилам;exit 0– завершение с кодом успеха.
Зарегистрируйте скрипт в автозагрузке командой update-rc.d iptables-restore defaults. Убедитесь, что зависимости (iptables, netfilter-persistent) установлены и порядок запуска скрипта после сетевых сервисов (# Required-Start: $network).
В systemd создайте юнит /etc/systemd/system/iptables-restore.service:
[Unit] Description=Restore iptables rules After=network.target [Service] Type=oneshot ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4 RemainAfterExit=yes [Install] WantedBy=multi-user.target
Для динамических окружений (например, контейнеры или облачные инстансы) добавьте в юнит systemd секцию [Service] с параметром EnvironmentFile=/etc/iptables/environment, где файл может содержать переменные для разных сред. Пример содержимого файла:
RULES_FILE=/etc/iptables/rules-$(hostname).v4– подстановка имени хоста;IPTABLES_CMD=/usr/sbin/iptables– путь к бинарнику для совместимости.
Обновите ExecStart на ${IPTABLES_CMD}-restore ${RULES_FILE}. Такой подход позволяет централизованно управлять правилами через Ansible/Puppet, изменяя только environment-файл без редактирования юнита.
Применение утилиты netfilter-persistent для управления правилами в Debian и Ubuntu

Утилита netfilter-persistent – часть пакета iptables-persistent в Debian и Ubuntu, предназначенная для автоматического сохранения и восстановления правил iptables и ip6tables при загрузке системы. В отличие от ручного сохранения в файл, она интегрируется с системными сервисами и использует механизм systemd для запуска скриптов в нужный момент. Установка выполняется командой sudo apt install iptables-persistent, после чего в директории /etc/iptables/ появятся файлы rules.v4 и rules.v6 для IPv4 и IPv6 соответственно.
Для сохранения текущих правил достаточно выполнить sudo netfilter-persistent save. Команда записывает активные настройки в конфигурационные файлы, которые затем автоматически применяются при старте системы. Важно учитывать, что netfilter-persistent не отслеживает изменения в реальном времени – после редактирования правил через iptables или ip6tables необходимо повторно вызывать команду сохранения. В противном случае после перезагрузки система загрузит устаревшие настройки.
Скрипты netfilter-persistent запускаются через юниты systemd: netfilter-persistent.service и netfilter-persistent-start. Первый отвечает за сохранение правил при выключении системы, второй – за их восстановление при загрузке. Проверить статус можно командой systemctl status netfilter-persistent. Если правила не применяются, стоит убедиться, что сервис включен: sudo systemctl enable netfilter-persistent. Логи работы доступны через journalctl -u netfilter-persistent.
В случае необходимости кастомизации процесса, например, для добавления дополнительных проверок или интеграции с другими сетевыми инструментами, можно редактировать скрипты в /usr/share/netfilter-persistent/plugins.d/. Каждый плагин – это исполняемый файл, который вызывается при сохранении или восстановлении правил. Например, для поддержки nftables вместо iptables потребуется создать отдельный плагин или заменить стандартные скрипты на собственные реализации.
При работе с netfilter-persistent важно помнить о конфликтах с другими инструментами, такими как ufw или firewalld. Эти утилиты могут перезаписывать правила iptables, игнорируя сохраненные конфигурации. Решение – либо отключить конкурирующие сервисы (sudo systemctl disable ufw), либо интегрировать их с netfilter-persistent через пользовательские плагины. Для отладки полезно временно отключить автоматическое восстановление правил, добавив параметр --noflush в строку запуска сервиса.
Создание пользовательских скриптов для экспорта и импорта конфигурации iptables

Скрипты для автоматизации экспорта и импорта правил iptables позволяют избежать ручного ввода команд после перезагрузки системы. Основной инструмент – iptables-save и iptables-restore, которые сохраняют текущую конфигурацию в файл и восстанавливают её соответственно. Для экспорта используйте команду: iptables-save > /etc/iptables/rules.v4. Файл rules.v4 будет содержать все активные правила в текстовом формате, включая цепочки, политики и параметры.
При импорте конфигурации применяйте iptables-restore < /etc/iptables/rules.v4. Важно учитывать, что iptables-restore по умолчанию сбрасывает текущие правила перед загрузкой новых. Чтобы сохранить существующие цепочки, добавьте флаг -n (--noflush). Для IPv6 используйте аналогичные команды с ip6tables-save и ip6tables-restore, сохраняя данные в rules.v6.
Создайте скрипт /usr/local/bin/save_iptables.sh с содержимым:
#!/bin/bash
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
chmod 600 /etc/iptables/rules.v*
Назначьте права на выполнение: chmod +x /usr/local/bin/save_iptables.sh. Этот скрипт сохраняет оба набора правил и ограничивает доступ к файлам конфигурации.
Для автоматического восстановления правил при загрузке системы добавьте скрипт /etc/network/if-pre-up.d/restore_iptables:
#!/bin/sh
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptables/rules.v6
exit 0
Убедитесь, что файл исполняемый: chmod +x /etc/network/if-pre-up.d/restore_iptables. Этот механизм работает в Debian-подобных дистрибутивах. Для RHEL/CentOS используйте /etc/sysconfig/iptables и сервис iptables.
Для систем с systemd создайте юнит-файл /etc/systemd/system/iptables-restore.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
[Install]
WantedBy=multi-user.target
Активируйте сервис: systemctl enable iptables-restore.service. Этот метод гарантирует загрузку правил до инициализации сети, предотвращая уязвимости в момент старта системы.
