Здравствуйте читатели и гости моего блога. Продолжаем наше знакомство с фаерволом Net­fil­ter & Ipt­a­bles. Во второй части статьи речь пойдет об управлении правилами ipt­a­bles. Мы научимся добавлять правила в межсетевой экран, сохранять их и восстанавливать. Рассмотрим утилиты для управления правилами и напишем свой скрипт управления.

Отключение Selinux и Firewalld в CentOS/RHEL системах

Если вы хотите начать использовать ipt­a­bles в Cen­tOS или других Red Hat производных системах, то перед настройкой необходимо отключить Selin­ux и fire­walld.

Для отключения selin­ux отредактируем файл /etc/sysconfig/selinux.

Fire­walld - надстройка над ipt­a­bles, играющая роль брандмауэра, применяется в RHEL системах по умолчанию. Так как управлять фаерволом мы будем при помощи собственных правил, то fire­walld необходимо отключить.

Добавление и сохранение правил iptables

Добавляются правила несколькими способами, можно вводить правила через консоль, а можно править файл в котором они записываются.

Для примера добавим какое-нибудь безобидное правило, чтобы не затрагивать подключение. Например запретим прохождение транзитных пакетов.

Проверим текущие настройки межсетевого экрана командой ipt­a­bles -L -n -v.

В цепочке FORWARD действием по умолчанию значится DROP, следовательно правило работает.

В данный момент новые настройки фаервола хранятся в оперативной памяти и находиться там они будут ровно до момента перезагрузки или выключения компьютера. Если состояние правил не сохранить, то после перезапуска будут загружены настройки по умолчанию и все опять будет открыто.

Изменения в правилах сохраняются/записываются посредством встроенной утилиты ipt­a­bles-save. Необходимо создать файл в который будут записываться правила.

Так-как я нахожусь в системе под root, то команда создаст файл в домашней директории root-пользователя /root/iptables_rules. Для создания файла в другом каталоге, команда должна выглядеть так:

Воспользуемся ipt­a­bles-save и сохраним изменения, записав их в созданный файл iptables_rules.

Cодержимое файла iptables_rules, в который были записаны правила, будет выглядеть так:

Утилита ipt­a­bles-save считала текущие настройки правил из оперативной памяти и записала их в указанный файл, в форме понятной для пользователя, то есть в форме правил.

Можно править файл и добавлять правила непосредственно в него. Правила не относящиеся ни к одной из таблиц заносятся в таблицу fil­ter и добавляются между строками *fil­ter и COMMIT.

Политики по умолчанию записываются после знака двоеточия (:).

  • ipt­a­bles -P FORWARD DROP будет записано как :FORWARD DROP

Обычные правила записываются после политик по умолчанию, без слова ipt­a­bles. Например нужно запретить любые подключения с машины под адресом 192.168.1.100, добавляем нужное правило (ipt­a­bles -A INPUT -s 192.168.1.100 -j DROP) в файл iptables_rules.

Если правила добавляются сразу в файл минуя консоль, то их нужно применить в фаерволе, для этого существует утилита ipt­a­bles-restore.

Правила из файла переносятся в настройки фаервола и применяются. Если следом выполнить команду для просмотра действующих правил, то можно увидеть что правило добавлено.

Применение и восстановление правил iptables

Правило добавленное через консоль, применяется в фаерволе, но не сохраняется в дальнейшем, поэтому сохранять правила нужно вручную.

Если правило добавлено сразу в файл, то оно не применяется в фаерволе и его надо применить.

Для восстановления правил после перезагрузки или включения системы необходимо применять ipt­a­bles-restore. Чтобы не проделывать процедуру восстановления правил каждый раз, правила можно добавить в автозагрузку.

CentOS

В Cen­tOS добавить правила в автозагрузку можно посредством правки файла rc.local.

Теперь правила будут применяться в фаерволе при запуске системы. Для того чтобы запретить загрузку через rc.local, уберите добавленную строку или закомментируйте ее.

Debian & Ubuntu

В Debian & Ubun­tu все работает также, только rc.local расположен в каталоге /etc, загрузку можно прописать здесь. Можно сделать иначе, в Debian & Ubun­tu запуск правил удобнее прописать в конф. файле сетевых интерфейсов /etc/network/interfaces.

Теперь правила будут стартовать совместно с сетевым интерфейсом. Можно делать перезапуск правил путем перезагрузки сетевого интерфейса, для применения внесенных правок.

Можно пойти дальше и прописать команду для сохранения текущего состояния правил при выключении/перезапуске компьютера или при перезапуске интерфейса.

Теперь, даже если вы забудете сохранить внесенные изменения в правила, система сделает это автоматически. Файл интерфейсов должен выглядеть примерно так:

Данные схемы рабочие, но неудобные, делать сохранение и восстановление правил можно по другому, при помощи специальных утилит. Теперь когда мы знаем механизм работы, можно переходить к изучению утилит помогающих управлять правилами ipt­a­bles.

iptables-services в CentOS/RHEL системах

В Cen­tOS существует утилита управления правилами ipt­a­bles, делающая все вышеописанное, она создает файл для записи, сохраняет изменения, загружает правила при запуске системы. Эта утилита называется ipt­a­bles-ser­vices.

После установки в директории /etc/sysconfig появляются файлы ipt­a­bles и ip6tables, в эти файлы производится запись правил. В файл ipt­a­bles производится запись правил для протокола IPv4, в файл ip6tables для протокола IPv6.

Конфигурационный файл находится в /etc/syscon­fig/ipt­a­bles-con­fig. Здесь нас интересуют два параметра:

  • IPTABLES_SAVE_ON_STOP="no" - сохранение текущих правил при остановке демона ipt­a­bles, по умолчанию отключено.
  • IPTABLES_SAVE_ON_RESTART="no" - сохранение текущих правил при перезапуске/перезагрузке системы, по умолчанию отключено.

Включим сохранение текущих правил, нужно заменить значения с "no" на "yes". Правила будут сохраняться автоматически в файл /etc/sysconfig/iptables, при перезагрузке системы/службы ipt­a­bles. Также правила можно сохранять командой restart.

Остальные параметры оставляем по умолчанию, без веской причины трогать их не следует.

  • IPTABLES_MODULES="" - здесь указываются дополнительные модули ipt­a­bles, которые будут загружаться при старте.
  • IPTABLES_MODULES_UNLOAD="yes" - выгрузка модулей ipt­a­bles, при перезагрузке или остановке межсетевого экрана.
  • IPTABLES_SAVE_COUNTER="no" - сохранение счетчиков правил и цепочек, при остановке или перезагрузке.
  • IPTABLES_STATUS_NUMERIC="yes" - вывод значений ip-адресов и портов в числовом виде.
  • IPTABLES_STATUS_VERBOSE="no" - расширенный вывод информации.
  • IPTABLES_STATUS_LINENUMBERS="yes" - вывод информации в пронумерованных строках.
  • #IPTABLES_SYSCTL_LOAD_LIST=".nf_conntrack .bridge-nf" - перезагрузка параметров ядра при старте или перезапуске.

iptables-persistent в Debian & Ubuntu

Почти то же, что и ipt­a­bles-ser­vices, только немного неудобнее.

Во время установки будет задано два вопроса, на которые следует ответить положительно.

iptables debian ubuntu

После установки в каталоге /etc/iptables появятся файлы rules.v4 и rules.v6. В эти файлы будут записываться правила межсетевого экрана.

Управление правилами при помощи ipt­a­bles-per­sis­tent немного отличается от ipt­a­bles-ser­vices в более неудобную сторону. После добавления новых правил через консоль, следует выполнять команду для их сохранения.

Команда записывает изменения правил в файл /etc/iptables/rules.v4, в процессе выполнения запрашивается подтверждение. Если после добавления нового правила вы не выполните эту команду, то оно будет работать только до первой перезагрузки или отключения системы.

Автоматически сохранять текущие правила при перезагрузке ipt­a­bles-per­sis­tent не может.

Для подстраховки можно воспользоваться рассмотренным выше способом и добавить в файл /etc/network/interfaces, команду для автоматического сохранения правил.

Также после установки пакета появляется демон net­fil­ter-per­sis­tent при помощи которого можно управлять правилами ipt­a­bles.

При выполнении команды --help можно посмотреть список доступных команд для управления.

Выполняться они могут через команду - ser­vice

  • ser­vice net­fil­ter-per­sis­tent start - запустить сервис
  • ser­vice net­fil­ter-per­sis­tent stop - остановить сервис
  • ser­vice net­fil­ter-per­sis­tent restart - перезапустить сервис
  • ser­vice net­fil­ter-per­sis­tent reload - восстановить правила из файлов rules.v4/rules.v6
  • ser­vice net­fil­ter-per­sis­tent save -  сохранить правила в файлы rules.v4/rules.v6
  • ser­vice net­fil­ter-per­sis­tent flush - полностью очищает текущие правила, все становится открыто, но не очищает файл с записанными правилами. Поэтому после перезагрузки, правила из файла считаются и загрузятся снова, если его предварительно не очистить.

Таким образом для сохранения правил можно пользоваться как dpkg-recon­fig­ure так и ser­vice net­fil­ter-per­sis­tent save, например.

Скрипт для правил iptables

Самый удобный, надежный, самый легкий способ управления правилами, я как всегда приберег для конца статьи. Помимо всех вышеописанных способов правила можно добавлять скриптом.

Перед написанием скрипта, установите ipt­a­bles-ser­vices в Cen­tOS, ipt­a­bles-per­sis­tent в Debian. На самом деле можно обойтись и без них, но с ними немного удобнее.

Создаем скрипт, по привычке я называю его ipt.sh, скрипт можно назвать как угодно, например myname.sh, где myname это имя скрипта.

В начале скрипта всегда указывается интерпретатор, в нашем случае /bin/bash, он указывается после так называемого sha-bang "#!". Не стоит путать с "#", строки начинающиеся с символа "#" являются комментариями, такие строки не выполняются.

Теперь можно добавлять необходимые правила, правила записываются обычным образом, без каких-либо дополнительных требований. В качестве примера приведу свой минимальный набор правил, которым пользуюсь повсеместно, добавляя в него необходимые правила в зависимости от обстоятельств.

Данный набор правил закрывает любые подключения извне, кроме подключений к работающим на сервере службам через разрешенные порты.

Примечание: обязательно смените имя сетевого интерфейса ens3 на свое (eth0 или enp0s3) в правиле разрешающем выходной трафик.

Теперь надо прописать команду для сохранения правил в файл из которого будут считываться при загрузке. Делается это при помощи утилиты ipt­a­bles-save, как видите ничего нового, все это мы уже проходили выше.

Если вы пишете скрипт в Cen­tOS, то указываем /etc/sysconfig/iptables, если в Debian или Ubun­tu, то /etc/iptables/rules.v4. Именно поэтому в начале я говорил, что должны стоять ipt­a­bles-ser­vices и ipt­a­bles-per­sis­tent, соответственно.

Сохранение правил.

Основная часть скрипта готова.  В конец скрипта я еще дописываю какую-нибудь фразу, чтобы знать что скрипт выполнился, например - Правила обновлены!.

В конечном виде скрипт выглядит так.

Скрипт написан. Теперь его надо сделать исполняемым.

После чего его необходимо выполнить.

Если после выполнения скрипта проверить состояние фаервола, можно увидеть следующее.

Межсетевой экран в порядке, правила применены и работают. А что с файлом для сохранения?

Здесь тоже порядок, все правила на месте. Как можно видеть, скриптом убиваются два зайца, правила одновременно заносятся и в межсетевой экран, и в файл из которого будут загружаться при старте системы. Именно поэтому я считаю данный способ самым надежным, здесь нельзя забыть сохранить правила.

Сама работа скрипта очень проста. Скрипт имитирует ввод правил в консоль, с последующим сохранением в файл. Если нужно добавить или убрать правила, то редактируйте скрипт и заново выполняйте его.

На этом вторая часть статьи подошла к концу. В третьей части я опишу некоторые практические примеры, которые можно использовать в соответствующих ситуациях.