Как сохранить правила iptables
Рабочую копию правил Netfilter хранит в пространстве ядра linux. Ядро по умолчанию разрешает все подключения, что мы видим при выполнении команды iptables с опцией -L При этом все изменения правил, сделанные нами во время работы операционной системы, автоматически обычно никуда не сохраняются при выключении компьютера. Поэтому после очередного включения вы обнаруживаете, что настроенных правил опять нет и везде установлены политики по умолчанию — ACCEPT.
Примечание: На практике это значит, что ваш компьютер по умолчанию открыт к любому доступу извне для любой машины, для этого только необходима работающая программа, которая будет отвечать по порту, к которому захочет подключиться любой удаленный компьютер. В этой статье мы рассмотрим как сохранить правила iptables.
Конечно, заново настраивать каждый раз после перезагрузки компьютера набор правил межсетевого экрана не выгодно, поэтому нам необходимы средства сохранения и восстановления параметров брандмауэра после включения нашей машины. Наиболее распространенных вариантов решения этой проблемы два:
- С помощью утилиты iptables-save и загружать их с помощью iptables-restore;
- С помощью утилиты iptables-persistent (данный вариант возможен в операционных системах Debian и Ubuntu).
Сохранить правила можно в любую доступную директорию, но лучше, конечно, использовать для этого системную директорию, например, директорию для конфигурационных файлов /etc/ или под-папку в ней, например, /etc/iptables-conf/
Как сохранить правила iptables
Для сохранения правил межсетевого экрана Netfilter в linux можно использовать пакет iptables-save. Данный пакет записывает текущую конфигурацию в файл с указанным именем. Существуют две версии данного пакета:
- iptables-save для протокола IPv4;
- ip6tables-save для протокола IPv6.
Синтаксис команд одинаковый, поэтому мы рассмотрим вариант ipv4.
iptables-save [ -m modprobe ] [ -c ] [ -t таблица ] [ -f имя файла ]
- -m modprobe: Указывает путь к программе modprobe. По умолчанию iptables-save проверяет /proc/sys/kernel/modprobe для определения пути к исполняемому файлу. modprobe — утилита управления модулями ядра. Существует несколько вариантов данной утилиты. Данный параметр можно проигнорировать;
- -c: включает в поток вывода программы все счетчики количества переданных байтов и пакетов;
- -t таблица: выводит в поток вывода только одну таблицу, которая была явно указана. При отсутствии флага выводит все таблицы настроек firewall;
- -f имя файла: Указывает имя файла записи настроек. Если файл не указан, то вывод происходит в поток вывода на экран STDOUT.
В самом простом варианте команда будет выглядеть, например, следующим образом:
sudo iptables-save -f /etc/iptables-conf/iptables_rules.ipv4
Вы можете использовать свою папку, имя файла и расширение. Возможно использование другого синтаксиса данной команды:
sudo iptables-save > /etc/iptables-conf/iptables_rules2.ipv4
В данном варианте команды iptables-save выводит оформленные правила в поток вывода на экран STDOUT, который мы перенаправляем в указанный нами файл. Предварительно необходимо создать директорию /etc/iptables-conf/:
sudo mkdir /etc/iptables-conf/
Просмотреть содержимое каталога можно с помощью команды:
Как загрузить правила iptables
Для ручного восстановления настроек можно использовать вызов утилиты iptables-restore. Она восстанавливает настройки брандмауэра Netfilter с указанного файла или из потока ввода STDIN, если файл не задан явно. Рассмотрим синтаксис iptables-restore:
iptables-restore [ -chntvV ] [ -w секунды ] [ -W миллисекунды ] [ -M modprobe ] [ -T таблица ] [ имя файла ]
- -c: восстанавливает значения всех счетчиков пакетов и байтов;
- -n: позволяет не сбрасывать содержимое правил обновляемой таблицы правил iptables. Если не указан — все текущие правила обновляемой таблицы сбрасываются. Получается, что правила из файла дописываются в конец таблиц рабочей конфигурации, если указан этот параметр;
- -t: происходит только сборка и тестирование набора правил из файла, без обновление рабочей таблицы правил iptables;
- -v: выводит дополнительную отладочную информацию в течении восстановления набора правил;
- -V: выводит номер версии программы;
- -w секунды: дождаться монопольной блокировки фильтра пакетов ядра linux xtables. Применяется, чтобы предотвратить одновременное выполнение нескольких экземпляров утилиты. Опция заставляет ждать программу в течении некоторого времени возможности монопольной блокировки xtables;
- -W миллисекунды: интервал ожидания для каждой попытки запуска пакета в монопольном режиме. Часто многие приложения системы критичны к времени запуска и выполнения, поэтому длительное ожидания для монопольной блокировки xtables часто является неприемлемым. Данный параметр в миллисекундах задает максимальное время такого ожидания. По умолчанию равно 1 секунде. Применяется только совместно с ключом -w;
- -M modprobe: Указывает путь к программе modprobe. По умолчанию iptables-restore проверяет /proc/sys/kernel/modprobe для определения пути к исполняемому файлу. modprobe — утилита управления модулями ядра. Существует несколько вариантов данной утилиты. Данный параметр можно проигнорировать;
- -T таблица: Восстанавливает только таблицу правил с указанным именем, даже если поток данных содержит другие таблицы;
- имя файла: путь до файла с восстанавливаемыми таблицами правил в файловой системе
Вот пример команды iptables-restore:
sudo iptables-restore -vV /etc/iptables-conf/iptables_rules.ipv4
Или вариант восстановления правил из файла без сброса содержимого текущих таблиц Netfilter:
sudo iptables-restore -nvV /etc/iptables-conf/iptables_rules.ipv4
Автозагрузка правил iptables
1. Загрузка правил с помощью скрипта
Сохраненные правила с помощью утилиты iptables-save можно восстанавливать с помощью скрипта, запускаемого при каждом запуске операционной системы. Для этого необходимо выполнить следующие действия:
Сохранить набор правил межсетевого экрана с помощью команды:
sudo iptables-save -f /etc/iptables-conf/iptables_rules.ipv4
Для запуска набора правил при старте операционной системы перед включением сетевого интерфейса мы создаем новый файл с помощью команды:
sudo vi /etc/network/if-pre-up.d/iptables
Заметим — в сети есть много вариантов места размещения скрипта на локальной машине, но я считаю именно размещение в папке if-pre-up.d наиболее верным, так как при этом скрипт будет выполнятся перед включением сетевого интерфейса. Добавляем в данный файл следующий скрипт:
Сохраняем файл iptables Ctrl+O. Выходим из editor Ctrl+X. Устанавливаем необходимые права для созданного файла:
sudo chmod +x /etc/network/if-pre-up.d/iptables
Перезагружаем компьютер и проверяем результат для таблицы filter с помощью команды:
Для обеспечения безопасности необходимо, чтобы конфигурация iptables применялась до запуска сетевых интерфейсов, сетевых служб и маршрутизации. Если данные условия не будут соблюдены — появляется окно уязвимости между загрузкой операционной системы и правил защиты межсетевого экрана. Для реализации такого варианта защиты можно использовать пакет iptables-persistent.
2. Автозагрузка правил iptables-persistent
По умолчанию данный пакет не установлен в операционной системе. Данный вариант реализации автозапуска конфигурации возможен в операционных системах Debian, Ubuntu. Для установки пакета требуется выполнить команду:
sudo apt-get install iptables-persistent
Этот пакет впервые стал доступен в Debian (Squeeze) и Ubuntu (Lucid). Используемые этим пакетом правила iptables хранятся в следующих директориях:
- /etc/iptables/rules.v4 для набора правил протокола IPv4;
- /etc/iptables/rules.v6 для набора правил протокола IPv6.
Но они должны быть сохранены в понятном утилите iptables-persistent виде.
Требования к формату данных файлах не задокументированны, что создает некоторые сложности для создания этих файлов вручную. Их можно создать с помощью dpkg-reconfigure:
sudo dpkg-reconfigure iptables-persistent
Или можно использовать iptables-save и ip6tables-save:
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
Если мы были внимательны при установке пакета, то мы должны были заметить в Debian 10 и последних версиях Ubuntu пакет-зависимость для iptables-persistent: netfilter-persistent, устанавливаемых с нужным нам пакетом. Можно по адресу https://packages.ubuntu.com посмотреть содержимое пакета iptables-persistent, и мы заметим, что на текущий момент пакет называется iptables-persistent, а основные файлы уже относятся к пакету netfilter-persistent.
Утилита netfilter-persistent тоже позволяет управлять автозагрузкой правил. Вот её синтаксис:
sudo netfilter-persistent [ действие ]
Где [действие] может принимать следующие значения:
- start — вызывает все плагины с параметром start, для загрузки правил в netfilter;
- stop — если настроена конфигурация сброса настроек Netfilter при остановке плагина, сбрасывает все настройки firewall на значения по умолчанию. Иначе просто выдает предупреждение;
- flush — плагины вызываются с параметром flush, что приводит к сбросу правил межсетевого экрана на значения по умолчанию;
- save — вызывает плагины с параметром save, позволяя сохранить значения правил брандмауэра в файлы на диске;
- reload — не задокументированный параметр, возникали случаи когда параметр start не срабатывал, помогал вызов этого параметра для загрузки правил из файла на диске;
Значит, чтобы сохранить правила мы можем вызвать следующую команду:
sudo netfilter-persistent save
Для загрузки же сохраненных правил мы можем использовать команду:
sudo netfilter-persistent start
Замечание: После установки netfilter-persistent система при использовании iptables и формата хранения файлов, связанного с ним, начинает при работе выдавать предупреждение
# Warning: iptables-legacy tables present, use iptables-legacy to see them.
Это связано с наличием новой утилиты настройки и редактирования правил Netfilter — nftables, для миграцию на эту утилиту старых правил iptables можно использовать автоматический транслятор правил iptables-translate. Но это уже тема для отдельной статьи.
Выводы
Итак, в этой статье мы рассмотрели где хранятся правила iptables а также как сохранить правила iptables после перезагрузки, разобрались с настройкой скрипта автозагрузки и пакета iptables-persistent.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
скрипт iptables, пересчет конфигурации без рестарта сервиса
Всем доброго времени суток. Помогите решить маленькую проблему. Есть скрипт настройки правил iptables, в качестве примера приведу его некоторые части:
#!/bin/bash #Подключаем необходимые модули# #Включить перенаправление пакетов через ядро echo 1 > /proc/sys/net/ipv4/ip_forward #Задаем настройки по умолчанию# #Очищаем все правила в таблицах filter, nat и mangle iptables -t filter -F iptables -t nat -F iptables -t mangle -F #Удаляем все пользовательские цепочки в таблицах filter, nat и mangle iptables -t filter -X iptables -t nat -X iptables -t mangle -X #Задаем политики по умолчанию iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD ACCEPT iptables -t filter -P OUTPUT ACCEPT #Разрешаем прохождение любого трафика по интерфейсу обратной петли iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT #Разрешим передачу трафика уже открытым соединениям iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #Открываем icmp iptables -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type 12 -j ACCEPT #Открываем DNS запросы iptables -A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT #Открываем 80 порт для апача iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT #Прокидываем RDP for IP in `cat /root/scripts/rdp`; do PROV=`grep -o "#" /etc/sysconfig/iptables #перезапускаем сервис iptables service iptables restart
Команда iptables-save > /etc/sysconfig/iptables позволяет как бы пересчитать конфигурацию фаервола без перезапуска службы, то есть все коннекты которые установлены и разрешены не будут сброшены при выполнении этой команды.
Но! При перезагрузки самого шлюза, в iptables нет правил, если не использовать в скрипте команду service iptables restart
Так вот вопрос: что же такое и куда прописать чтобы прописывать новые правила без перезапуска самого сервиса iptables и быть уверенным что если шлюз перезагрузится то все что в скрипте прописано применялась?