• 5.2. И минусы
  • 5.3. iptables-save
  • 5.4. iptables-restore
  • 5.1. Плюсы

    Один из плюсов использования утилит iptables-save и iptables-restore состоит в высокой скорости загрузки и сохранения больших наборов правил. Главный недостаток, связанный с установкой наборов правил из сценариев командной оболочки состоит в том, что команда iptables копирует набор правил из пространства ядра в пространство пользователя, вставляет, добавляет или изменяет правило и, наконец, весь набор правил копируется обратно в пространство ядра. Эта последовательность действий выполняется для каждого правила, которое вставляется или изменяется в наборе правил.

    Эта проблема легко решается с помощью iptables-save и iptables-restore Утилита iptables-save записывает набор правил в обычный текстовый файл в особом формате. Утилита iptables-restore загружает набор правил из файла. Главное преимущество этих утилит состоит в том, что они производят сохранение/восстановление всего набора правил за одно обращение. iptables-save «в один присест» получает из пространства ядра и записывает в файл весь набор правил, а iptables-restore загружает из файла и переписывает за одно обращение в пространство ядра набор правил для каждой таблицы. Или другими словами – вместо того, чтобы обращаться огромное число раз к ядру для того чтобы получить набор правил, а затем опять записать его в пространство ядра не меньшее число раз, можно просто сохранить набор правил в файл, а затем загружать его из файла, при этом число перемещений наборов в ядро будет зависеть только от числа используемых таблиц.

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

    5.2. И минусы

    У вас может сложиться впечатление, что iptables-restore может обрабатывать своего рода сценарии. Пока не может и вероятнее всего – никогда не сможет. В этом и состоит главный недостаток iptables-restore. Чтобы было более понятно – представьте себе случай, когда брандмауэр получает динамический IP-адрес и вы хотите вставить его значение в свои правила во время загрузки системы. Решить эту проблему с помощью iptables-restore практически невозможно.

    Как одно из решений можно предложить написать небольшой скрипт, который определяет значение IP-адреса и затем вставляет его в набор правил (например, с помощью sed) на место некоторого ключевого слова. Здесь вам потребуется создать временный файл, в котором производятся изменения и который затем загружается с помощью iptables-restore. Однако такой вариант решения порождает свои проблемы – вам придется отказаться от утилиты iptables-save поскольку она может затереть, созданную вручную, заготовку файла с правилами для iptables-restore. Вобщем – довольно неуклюжее решение.

    Еще один вариант – хранить в файле для iptables-restore только статические правила, а затем с помощью небольшого скрипта добавлять правила с динамическими параметрами. Конечно же вы уже поняли, что это решение такое же неуклюжее как и первое. Вам придется смириться с тем, что iptables-restore не очень хорошо подходит для случая с динамически назначаемым IP-адресом и вообще для случаев, когда вам потребуется динамически изменять набор правил в зависимости от конфигурации системы и т.п..

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

    5.3. iptables-save

    Утилита iptables-save, как я уже упоминал, предназначена для сохранения текущего набора правил в файл, который затем может быть использован утилитой iptables-restore. Эта команда очень проста в использовании и имеет всего два аргумента.

    iptables-save [-c] [-t table]

    Первый аргумент -c (допустимо использовать более длинный вариант –counters) заставляет iptables-save сохранить знчения счетчиков байт и пакетов. Это делает возможным рестарт брандмауэра без потери счетчиков, которые могут использоваться для подсчета статистики. По-умолчанию, при запуске без ключа , сохранение счетчиков не производится.

    С помощью ключа -t (более длинный вариант –table) можно указать имя таблицы для сохранения. Если ключ -t не задан, то сохраняются все таблицы. Ниже приведен пример работы команды iptables-save в случае, когда набор не содержит ни одного правила.

    # Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002

    *filter

    :INPUT ACCEPT [404:19766]

    :FORWARD ACCEPT [0:0]

    :OUTPUT ACCEPT [530:43376]

    COMMIT

    # Completed on Wed Apr 24 10:19:17 2002

    # Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002

    *mangle

    :PREROUTING ACCEPT [451:22060]

    :INPUT ACCEPT [451:22060]

    :FORWARD ACCEPT [0:0]

    :OUTPUT ACCEPT [594:47151]

    :POSTROUTING ACCEPT [594:47151]

    COMMIT

    # Completed on Wed Apr 24 10:19:17 2002

    # Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002

    *nat

    :PREROUTING ACCEPT [0:0]

    :POSTROUTING ACCEPT [3:450]

    :OUTPUT ACCEPT [3:450]

    COMMIT

    # Completed on Wed Apr 24 10:19:17 2002

    Строки, начинающиеся с символа #, являются комментариями. Имена таблиц начинаются с символа * (звездочка), например: *mangle. После каждого имени таблицы следуют описания цепочек и правил. Описания цепочек записываются в формате :<chain-name> <chain-policy> [<packet-counter>:<byte-counter>], где <chain-name> – это название цепочки (например PREROUTING), <chain-policy> – политика по-умолчанию (например ACCEPT). Завершают описание цепочки значения счетчиков пакетов и байт, те самые счетчики, которые вы получите в результате выполнения команды iptables -L -v. Описание каждой таблицы завершает ключевое слово COMMIT, которое означает, что в этой точке набор правил для данной таблицы будет передан в пространство ядра.

    Пример выше показал как выглядит содержимое пустого набора правил, сохраненного утилитой iptables-save. Ниже показан результат сохранения небольшого набора правил (Iptables-save ruleset) :

    # Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002

    *filter

    :INPUT DROP [1:229]

    :FORWARD DROP [0:0]

    :OUTPUT DROP [0:0]

    [0:0] -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

    [0:0] -A FORWARD -i eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT

    [0:0] -A FORWARD -i eth1 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT

    [0:0] -A OUTPUT -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT

    COMMIT

    # Completed on Wed Apr 24 10:19:55 2002

    # Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002

    *mangle

    :PREROUTING ACCEPT [658:32445]

    :INPUT ACCEPT [658:32445]

    :FORWARD ACCEPT [0:0]

    :OUTPUT ACCEPT [891:68234]

    :POSTROUTING ACCEPT [891:68234]

    COMMIT

    # Completed on Wed Apr 24 10:19:55 2002

    # Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002

    *nat

    :PREROUTING ACCEPT [1:229]

    :POSTROUTING ACCEPT [3:450]

    :OUTPUT ACCEPT [3:450]

    [0:0] -A POSTROUTING -o eth0 -j SNAT –to-source 195.233.192.1

    COMMIT

    # Completed on Wed Apr 24 10:19:55 2002

    Из примера виден результат действия аргумента -c – перед каждым правилом и в строке описания каждой цепочки имеются числа, отображающие содержимое счетчиков пакетов и байт. Сразу замечу, что набор правил утилита iptables-save выдает на стандартный вывод, поэтому, при сохранении набора в файл команда должна выглядеть примерно так:

    iptables-save -c > /etc/iptables-save

    Эта команда запишет весь набор правил, вместе с содержимым счетчиков, в файл с именем /etc/iptables-save.

    5.4. iptables-restore

    Утилита iptables-restore используется для восстановления (загрузки) набора правил, который ранее был сохранен утилитой iptables-save. Набор правил утилита получает со стандартного ввода и не может загружать его из файла напрямую. Команда имеет следующий синтаксис:

    iptables-restore [-c] [-n]

    Ключ -c (более длинный вариант –counters) заставляет восстанавливать значения счетчиков.

    Указание ключа -n (более длинный вариант –noflush) сообщает iptables-restore о том, что правила должны быть добавлены к имеющимся. По-умолчанию утилита iptables-restore (без ключа -n) очистит содержимое таблиц и цепочек перед загрузкой нового набора правил.

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

    cat /etc/iptables-save | iptables-restore -c

    В результате выполнения этой команды содержимое файла /etc/iptables-save будет прочитано утилитой cat и перенаправленно на стандартный ввод утилиты iptables-restore. Можно было бы привести еще целый ряд команд, с помощью которых можно организовать загрузку набора правил из файла, но это выходит за рамки темы, поэтому оставлю читателю возможность самому найти более удобный для него вариант.

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









    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх