Для тех, кто только начинает изучать iptables неприятной неожиданностью оказывается тот факт, что правила брандмауэра не сохраняются и не восстанавливаются при перезагрузке системы. Фактически это означает полностью открытый брандмауэр и такое положение дел нас, естественно, не устраивает. К счастью, в Linux существует несколько способов сохранения единожды введенных правил iptables, поэтому следует изучить их и выбрать наиболее подходящий для вашей конфигурации. А о всех плюсах и минусах мы расскажем в данной статье.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
В свое время один из основателей UNIХ Деннис Ритчи сказал: "UNIX прост. Но надо быть гением, чтобы понять его простоту." Все это в полной мере можно применить и к преемнику UNIX-систем - Linux и иногда эта простота ставит в тупик. Хорошим примером здесь является iptables - простой и мощный брандмауэр, уже не первый год, стоящий на страже сетевых рубежей системы. И когда выясняется, что он не умеет сохранять и восстанавливать правила, то многие испытывают весьма противоречивые ощущения.
Вопреки распространенному заблуждению iptables не является брандмауэром, а предоставляет удобный интерфейс к netfilter, который является настоящим брандмауэром Linux-систем, его задача - интерпретировать команды пользователя на более низкие уровни и вывести информацию оттуда в удобном для восприятия варианте. Единственный способ взаимодействия с iptables - это интерфейс командной строки - CLI. Мы можем создавать, изменять, удалять правила, а также получать информацию о состоянии брандмауэра, но в любом случае все взаимодействие строится по форме запрос - ответ. Реальную работу выполняет спрятанный далеко внутри системы netfilter, а iptables только лишь позволяет удобно общаться с ним.
Понимание этого во многом проливает свет на сложившуюся ситуацию, iptables - всего лишь интерфейс и своих настроек у него быть не может, но именно он позволяет передать правила сетевого взаимодействия в netfilter и получать от него удобочитаемые ответы и именно этим его свойством мы и воспользуемся.
Существует несколько способов сохранить введенные нами в iptables правила, а затем и восстановить их при загрузке системы. Разберем их подробнее.
Скрипты
Самый старый, но не потерявший эффективности способ. Если единственная возможность взаимодействия с iptables - это интерфейс командной строки, то скрипт - самый первый способ автоматизации, если мы не хотим постоянно повторять одни и те же действия вручную.
Скрипт для настройки iptables мы можем расположить где угодно, но лучше следовать стандартным расположениям Linux и разместить его в /etc. Создадим для этого отдельную директорию iptables, создадим в ней файл скрипта и сделаем его исполняемым:
mkdir /etc/iptables
touch /etc/iptables/iptables.rules
chmod +x /etc/iptables/iptables.rules
Теперь можем открыть его любым доступным редактором и внести минимальную конфигурацию брандмауэра, разрешающую только подключения по SSH:
#!/bin/sh
# Сбрасываем настройки брандмауэра
iptables -F
iptables -X# Разрешаем установленные и связанные соединения
iptables -A INPUT -i ens33 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT# Запрещаем не принадлежащие ни одному соединению пакеты
iptables -A INPUT -i ens33 -m conntrack --ctstate INVALID -j DROP# Разрешаем подключения по SSH
iptables -A INPUT -i ens33 -p tcp --dport 22 -j ACCEPT#Запрещаем входящие извне
iptables -A INPUT -i ens33 -j DROP
Здесь следует обратить ваше внимание на самую первую секцию - сброс настроек, в приведенном примере сброшены будут только настройки таблицы filter и если вы используете другие таблицы, то их также нужно будет сбросить, так для nat добавьте:
iptables -t nat -F
iptables -t nat -X
А для mangle:
iptables -t mangle -F
iptables -t mangle -X
Для чего это делается? Смысл в том, что данный скрипт может быть запущен как вручную, так и при перезапуске сетевых служб, а команда iptables -A просто добавляет правило в конец указанной цепочки и если не выполнять предварительной очистки, то итоговые правила могут стать бесконечно далеки от того, что задумал администратор.
Хорошо, но как теперь запускать данный скрипт? Для систем использующих ifupdown перейдем в /etc/network/interfaces и добавим в конце секции с нужным сетевым адаптером или вообще в самом конце файла:
pre-up /etc/iptables/iptables.rules
Данное правило выполнит указанный нами скрипт перед инициализацией сетевого интерфейса.
Все изменения в конфигурацию брандмауэра следует вносить в указанный скрипт, а для их применения достаточно выполнить:
/etc/iptables/iptables.rules
или перезагрузить систему.
Просмотреть текущее состояние брандмауэра можно командой:
iptables -L -vn
Ключ -v выводит дополнительную информацию и счетчики, а -n отвечает за вывод IP-адресов и портов в виде чисел, а не DNS-адресов и имен служб.
Внимательный читатель заметит, что вывод команды показывает нам только таблицу filter и это действительно так. Как мы помним, filter - таблица по умолчанию и используется если мы явно не задали таблицу, чтобы просмотреть, скажем, таблицу nat, выполните:
iptables -t nat -L -vn
Где ключ -t позволяет указать интересующую таблицу.
iptables-save / iptables-restore
Это штатная утилита, выполняющая ту же самую задачу: сохранить правила iptables в файл и потом загрузить их оттуда. Использование предельно простое, чтобы сохранить правила используйте:
iptables-save > /etc/iptables/rules.v4
Результатом выполнения данной команды будет текстовый файл с набором всех используемых правил.
Сначала идет имя таблицы, в нашем случае правила заданы только для filter, затем политики по умолчанию для цепочек (везде ACCEPT), за которыми следуют сами правила. Обратите внимание, что синтаксис записей несколько другой, если в скрипте мы писали:
iptables -A INPUT -i ens33 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
то в файле просто:
-A INPUT -i ens33 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Потому что скрипт сначала вызывал iptables, а потом уже передавал ему команду, в нашем же случае вызывать iptables нет необходимости.
Впоследствии данный файл можно редактировать, добавляя в него дополнительные правила, также можно делать это интерактивно, через командный CLI-интерфейс. С этим будет связан один тонкий момент, и мы вернемся к нему позже.
Для восстановления следует использовать:
iptables-restore < /etc/iptables/rules.v4
Куда прописать эту команду? Можно точно также в /etc/network/interfaces, в конце файла добавляем:
pre-up iptables-restore < /etc/iptables/rules.v4
А теперь зададимся вопросом: чтобы сохранить правила iptables их нужно предварительно ввести. Да, это можно сделать либо вручную, выполнив указанные в скрипте команды, либо выполнив сам скрипт, второе удобнее, особенно если у вас сложная конфигурация брандмауэра. Этот же способ позволяет просто и удобно перейти от скриптов к iptables-restore: загружаем систему, сохраняем правила через iptables-save и заменяем вызов скрипта на iptables-restore.
В некоторых материалах в сети также рекомендуют добавить в /etc/network/interfaces
post-down iptables-save > /etc/iptables/rules.v4
На первый взгляд - вполне грамотное решение, но не рекомендуем этого делать не подумав. Почему? Редко кто управляет брандмауэром интерактивно: добавляя, удаляя или изменяя записи через командную строку, потому что более удобно и наглядно это можно сделать, внося изменения непосредственно в файл. Однако если вы после этого выключите или перезагрузите систему, то все ваши изменения будут перезаписаны текущим состоянием брандмауэра и будут потеряны.
Поэтому лучше ограничиться только iptables-restore, а если вы все-таки внесли изменения интерактивно, то можно сразу после этого вручную выполнить iptables-save.
iptables-persistent
Время не стоит на месте, все течет, все меняется. На смену старому доброму ifupdown приходят новые системы: NetworkManager, netplan, systemd-networkd и прописывать вызов скриптов или iptables-restore в их конфигурацию становится проблематичным занятием, если вообще возможным. Но и разработчики тоже держат руку на пульсе, в Debian и Ubuntu появился новый пакет - iptables-persistent, который позволяет сохранять и автоматически загружать правила брандмауэра, не оглядываясь на используемую систему инициализации сети.
Установить его очень просто:
apt install iptables-persistent
В процессе установки будет предложено сохранить текущие правила iptables, поэтому очень желательно, чтобы они к этому времени существовали. Внести их можно как интерактивно, так и с помощью скрипта.
Одновременно с этим будут сохранены правила для IPv6 и в итоге в директории /etc/iptables у вас будет два набора правил для четвертой и шестой версии протоколов. Синтаксис файла ничем не отличается от того, что создает iptables-save и точно также его можно редактировать, внося новые правила.
Также в системе появляется новая служба - netfilter-persistent, которая позволяет удобно управлять брандмауэром, так если вы внесли изменения в файл с правилами и хотите их применить, то выполните:
netfilter-persistent reload
Для сохранения текущей конфигурации отдайте команду:
netfilter-persistent save
А если вам надо полностью очистить конфигурацию брандмауэра, то наберите:
netfilter-persistent flush
Это удобно если вам нужно проверить, не является ли брандмауэр причиной каких-либо проблем, быстро сбрасываем конфигурацию, проверяем и загружаем ее заново.
Заключение
Какой из трех предложенных вариантов является наиболее предпочтительным? Если мы говорим о современных системах, то это iptables-persistent, который позволяет полностью автоматизировать процесс и вообще более не беспокоиться о правилах брандмауэра. Но это решение доступно только пользователям Debian или Ubuntu.
Также не стоит списывать со счетов скрипты или iptables-save / iptables-restore, эти методы продолжают работать и делают это просто и надежно. В любом случае помните, что Linux предоставляет множество путей решений одной и той же задачи и выбирайте решение исходя из собственной ситуации, требований и имеющихся знаний, и опыта.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии