Использование пакета netfilter-persistent

Содержание

Введение

Впервые настроить фильтрацию трафика в Debian мне понадобилось тогда, когда ещё не существовало пакета netfilter-persistent для восстановления настроек при загрузки системы. На тот момент в моём распоряжении был сервер, настроенный до меня, где я и подсмотрел, как можно восстанавливать настройки фильтрации трафика. С тех пор у меня не было особой необходимости что-то менять в этой привычной схеме настройке, которая была попутно описана в статье Настройка MiniDLNA для цифрового мультимедийного плеера WD TV Play.

Но проблема в том, что есть общепринятый способ настройки, который не совпадает с привычным для меня, что может привести в замешательство других системных администраторов. Поэтому мне пришлось перейти на использование пакета netfilter-persistent, с помощью которого и реализуется общепринятый способ сохранения и восстановления настроек фильтрации трафика при перезагрузке системы.

Для меня основное неудобство этого пакета заключалось в том, что в нём не предусмотрена возможность вносить комментарии к правилам фильтрации. Однако утилиты iptables и ipset с помощью расширений comment позволяют добавить к правилам произвольное текстовое описание, которое никак не влияет на фильтрацию трафика и которое можно посмотреть в выводе обеих утилит.

Комментарии ipset

Для того, чтобы можно было добавлять комментарии к элементам множества, нужно создать это множество с расширением comment. Например, следующим образом:

# ipset create ata hash:net comment

Добавлять в это множество элементы с комментариями можно следующим образом:

# ipset add ata 192.168.254.9 comment "ata2.lo.stupin.su"

Если множество было создано без расширения comment, то попытка добавить элемент с комментарием приведёт к ошибке следующего вида:

ipset v7.10: Comment cannot be used: set was created without comment support

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

#!/bin/sh

ipset list -n \
        while read SETNAME ; do
                ipset save $SETNAME \
                        | awk -v SETNAME=$SETNAME '
                                /^create / {
                                        $0 = $0 " comment";
                                }

                                $2 == SETNAME {
                                        $2 = SETNAME "_tmp";
                                        print $0;
                                }' \
                        | ipset restore \
                        && ipset swap $SETNAME ${SETNAME}_tmp \
                        && ipset destroy ${SETNAME}_tmp
        done

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

Теперь можно, например, сохранить все существующие множества в файл с помощью следующей команды:

# ipset save > ipsets.txt

В отредактированном файле можно добавить поле comment к каждому из элементов множеств, а затем восстановить настройки множеств из файла:

# ipset restore -! < ipsets.txt

Комментарии iptables

Для комментирования правил iptables предусмотрен специальный модуль comment. Для его использования в произвольном месте правила можно добавить две опции: первая опция используется для включения расширения, а вторая - для указания его настроек, которыми и является сам комментарий. Например, соответствующая команда может выглядеть следующим образом:

# iptables -A FORWARD -d 128.116.0.0/17 -i wlan -p udp -m set --match-set phone src -m multiport --dports 49152:65535 -m comment --comment "Allow traffic from phones to Roblox" -j ACCEPT

В примере выше для включения расширения используется опция -m comment, а для указания самого комментария - опция --comment "Allow traffic from phones to Roblox". При просмотре правил фильтрации трафика комментарий будет выглядеть следующим образом:

# iptables -nvL | grep Roblox
0     0 ACCEPT     udp  --  wlan   *       0.0.0.0/0            128.116.0.0/17       match-set phone src multiport dports 49152:65535 /* Allow traffic from phones to Roblox */

К счастью, никаких дополнительных манипуляций для включения поддержки расширения на уровне цепочки правил не требуется. Можно сразу отредактировать файл, в котором уже имеются правила, добавив к ним комментарии с помощью двух дополнительных опций, после чего прибегнуть к обычной процедуре восстановления правил. В моём случае правила хранились в файле /etc/network/iptables, а для их восстановления я воспользовался следующей командой:

# iptables-restore < /etc/network/iptables

Установка пакетов

Для установки пакета netfilter-persistent вместе с необязательными пакетами iptables-persistent и ipset-persistent воспользуемся командой:

# apt-get install netfilter-persistent iptables-persistent ipset-persistent

Сохранение существующих правил

Для сохранения существующих правил предусмотрена следующая команда:

# netfilter-persistent save

Правила утилиты iptables сохраняются в файл /etc/iptables/rules.v4, а списки адресов утилиты ipset сохраняются в файл /etc/iptables/ipset.

После сохранения существующих правил можно отключить ранее использовавшиеся средства восстановления настроек фильтрации пакетов и удалить файлы, в которых хранились настройки. В моём случае это правил up в настройках сетевого интерфейса lo в файле /etc/network/interfaces и файлы /etc/network/iptables и /etc/network/ipsets.