Пример выше показал как выглядит содержимое пустого набора правил, сохраненного утилитой 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. Можно было бы привести еще целый ряд команд, с помощью которых можно организовать загрузку набора правил из файла, но это выходит за рамки темы, поэтому оставлю читателю возможность самому найти более удобный для него вариант.
   После исполнения этой команды набор правил должен загрузиться и все должно работать. Если это не так, то скорее всего вы допустили ошибку при наборе команды.

Глава 6. Как строить правила

   В данной главе будет обсуждаться порядок построения собственных правил для iptables. Каждая строка, которую вы вставляете в ту или иную цепочку, должна содержать отдельное правило. Мы так же обсудим основные критерии и действия (targets) и порядок создания своих собственных действий (т.е. подцепочек правил).

6.1. Основы

   Как уже говорилось выше, каждое правило – это строка, содержащая в себе критерии определяющие, подпадает ли пакет под заданное правило, и действие, которое необходимо выполнить в случае выполнения критерия. В общем виде правила записываются примерно так:
    iptables[-t table] command [match] [target/jump]
   Нигде не утверждается, что описание действия (target/jump) должно стоять последним в строке, однако, такая нотация более удобочитаема. Как бы то ни было, но чаще всего вам будет встречаться именно такой способ записи правил.
   Если в правило не включается спецификатор [-t table], то по умолчанию предполагается использование таблицы filter, если же предполагается использование другой таблицы, то это требуется указать явно. Спецификатор таблицы так же можно указывать в любом месте строки правила, однако более или менее стандартом считается указание таблицы в начале правила.
   Далее, непосредственно за именем таблицы, должна стоять команда. Если спецификатора таблицы нет, то команда всегда должна стоять первой. Команда определяет действие iptables, например: вставить правило, или добавить правило в конец цепочки, или удалить правило и т.п.
   Раздел match задает критерии проверки, по которым определяется подпадает ли пакет под действие этого правила или нет. Здесь мы можем указать самые разные критерии – IP-адрес источника пакета или сети, IP-адрес места назначения,порт, протокол, сетевой интерфейс и т.д. Существует множество разнообразных критериев, но об этом – несколько позже.
   И наконец target указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле. Здесь можно заставить ядро передать пакет в другую цепочку правил, «сбросить» пакет и забыть про него, выдать на источник сообщение об ошибке и т.п.

6.2. Таблицы

   Опция -tуказывает на используемую таблицу. По умолчанию используется таблица filter. С ключом -tприменяются следующие опции.
    Таблица 6-1. Таблицы
   (Таблица – Описание)
 
    Таблица: nat
    Описание: Таблица natиспользуется главным образом для преобразования сетевых адресов ( Network Address Translation). Через эту таблицу проходит только первый пакет из потока. Преобразования адресов автоматически применяется ко всем последующим пакетам. Это один из факторов, исходя из которых мы не должны осуществлять какую-либо фильтрацию в этой таблице. Цепочка PREROUTINGиспользуется для внесения изменений в пакеты на входе в брандмауэр. Цепочка OUTPUTиспользуется для преобразования адресов в пакетах, созданных приложениями внутри брандмауэра, перед принятием решения о маршрутизации. И последняя цепочка в этой таблице – POSTROUTING, которая используется для преобразования пакетов перед выдачей их в сеть.
 
    Таблица: mangle
    Описание: Эта таблица используется для внесения изменений в заголовки пакетов. Примером может служить изменение поля TTL, TOSили MARK. Важно: в действительности поле MARKне изменяется, но в памяти ядра заводится структура, которая сопровождает данный пакет все время его прохождения через брандмауэр, так что другие правила и приложения на данном брандмауэре (и только на данной брандмауэре) могут использовать это поле в своих целях. Таблица имеет пять цепочек PREROUTING, POSTROUTING, INPUT, OUTPUTи FORWARD. PREROUTINGиспользуется для внесения изменений на входе в брандмауэр, перед принятием решения о маршрутизации. POSTROUTINGиспользуется для внесения изменений на выходе из брандмауэра, после принятия решения о маршрутизации. INPUT– для внесения изменений в пакеты перед тем как они будут переданы локальному приложению внутри брандмауэра. OUTPUT– для внесения изменений в пакеты, поступающие от приложений внутри брандмауэра. FORWARD– для внесения изменений в транзитные пакеты после первого принятия решения о ипршрутизации, но перед последним принятием решения о ипршрутизации. Замечу, что таблица mangleни в коем случае не должна использоваться для преобразования сетевых адресов или маскарадинга ( Network Address Translation, Masquerading), поскольку для этих целей имеется таблица nat.
 
    Таблица: filter
    Описание: Таблица filterиспользуется главным образом для фильтрации пакетов. Для примера, здесь мы можем выполнить DROP, LOG, ACCEPTили REJECTбез каких либо ограничений, которые имеются в других таблицах. Имеется три встроенных цепочки. Первая – FORWARD, используемая для фильтрации пакетов, идущих транзитом через брандмауэр. Цепочку INPUTпроходят пакеты, которые предназначены локальным приложениям (брандмауэру). И цепочка OUTPUT– используется для фильтрации исходящих пакетов, сгенерированных приложениями на самом брандмауэре.
 
   Выше мы рассмотрели основные отличия трех имеющихся таблиц. Каждая из них должна использоваться только в своих целях, и вы должны это понимать. Нецелевое использование таблиц может привести к ослаблению защиты брандмауэра и сети, находящейся за ним. Позднее, в главе Порядок прохождения таблиц и цепочек, мы подробнее остановимся на этом.

6.3. Команды

   Ниже приводится список команд и правила их использования. Посредством команд мы сообщаем iptablesчто мы предполагаем сделать. Обычно предполагается одно из двух действий – добавление нового правила в цепочку или удаление существующего правила из той или иной таблицы. Далее приведены команды, которые используются в iptables.
    Таблица 6-2. Команды
   (Команда – Пример – Описание)
 
    Команда: -A, –append
    Пример: iptables -A INPUT ...
    Описание: Добавляет новое правило в конец заданной цепочки.
 
    Команда: -D, –delete
    Пример: iptables -D INPUT –dport 80 -j DROP, iptables -D INPUT 1
    Описание: Удаление правила из цепочки. Команда имеет два формата записи, первый – когда задается критерий сравнения с опцией -D (см. первый пример), второй – порядковый номер правила. Если задается критерий сравнения, то удаляется правило, которое имеет в себе этот критерий, если задается номер правила, то будет удалено правило с заданным номером. Счет правил в цепочках начинается с 1.
 
    Команда: -R, –replace
    Пример: iptables -R INPUT 1 -s 192.168.0.1 -j DROP
    Описание: Эта команда заменяет одно правило другим. В основном она используется во время отладки новых правил.
 
    Команда: -I, –insert
    Пример: iptables -I INPUT 1 –dport 80 -j ACCEPT
    Описание: Вставляет новое правило в цепочку. Число, следующее за именем цепочки указывает номер правила, перед которым нужно вставить новое правило, другими словами число задает номер для вставляемого правила. В примере выше, указывается, что данное правило должно быть 1-м в цепочке INPUT.
 
    Команда: -L, –list
    Пример: iptables -L INPUT
    Описание: Вывод списка правил в заданной цепочке, в данном примере предполагается вывод правил из цепочки INPUT. Если имя цепочки не указывается, то выводится список правил для всех цепочек. Формат вывода зависит от наличия дополнительных ключей в команде, например -n, -v, и пр.
 
    Команда: -F, –flush
    Пример: iptables -F INPUT
    Описание: Сброс (удаление) всех правил из заданной цепочки (таблицы). Если имя цепочки и таблицы не указывается, то удаляются все правила, во всех цепочках. (Хочется от себя добавить, что если не указана таблица ключом -t (–table), то очистка цепочек производится только в таблице filter, прим. перев.)
 
    Команда: -Z, –zero
    Пример: iptables -Z INPUT
    Описание: Обнуление всех счетчиков в заданной цепочке. Если имя цепочки не указывается, то подразумеваются все цепочки. При использовании ключа -vсовместно с командой -L, на вывод будут поданы и состояния счетчиков пакетов, попавших под действие каждого правила. Допускается совместное использование команд -Lи -Z. В этом случае будет выдан сначала список правил со счетчиками, а затем произойдет обнуление счетчиков.
 
    Команда: -N, –new-chain
    Пример: iptables -N allowed
    Описание: Создается новая цепочка с заданным именем в заданной таблице В выше приведенном примере создается новая цепочка с именем allowed. Имя цепочки должно быть уникальным и не должно совпадать с зарезервированными именами цепочек и действий (такими как DROP, REJECTи т.п.)
 
    Команда: -X, –delete-chain
    Пример: iptables -X allowed
    Описание: Удаление заданной цепочки из заданной таблицы. Удаляемая цепочка не должна иметь правил и не должно быть ссылок из других цепочек на удаляемую цепочку. Если имя цепочки не указано, то будут удалены все цепочки заданной таблице кроме встроенных.
 
    Команда: -P, –policy
    Пример: iptables -P INPUT DROP
    Описание: Задает политику по-умолчанию для заданной цепочки. Политика по-умолчанию определяет действие, применяемое к пакетам не попавшим под действие ни одного из правил в цепочке. В качестве политики по умолчанию допускается использовать DROPи ACCEPT.
 
    Команда: -E, –rename-chain
    Пример: iptables -E allowed disallowed
    Описание: Команда -Eвыполняет переименование пользовательской цепочки. В примере цепочка allowed будет переименована в цепочку disallowed. Эти переименования не изменяют порядок работы, а носят только косметический характер.
 
   Команда должна быть указана всегда. Список доступных команд можно просмотреть с помощью команды iptables -hили, что тоже самое, iptables –help. Некоторые команды могут использоваться совместно с дополнительными ключами. Ниже приводится список дополнительных ключей и описывается результат их действия. При этом заметьте, что здесь не приводится дополнительных ключей, которые используются при построении критериев (matches) или действий (targets). Эти опции мы будем обсуждать далее.
    Таблица 6-3. Дополнительные ключи
   (Ключ – Команды, с которыми используется – Описание)
 
    Ключ: -v, –verbose
    Команды, с которыми используется: –list, –append, –insert, –delete, –replace
    Описание: Используется для повышения информативности вывода и, как правило, используется совместно с командой –list. В случае использования с командой –list, в вывод этой команды включаются так же имя интерфейса, счетчики пакетов и байт для каждого правила. Формат вывода счетчиков предполагает вывод кроме цифр числа еще и символьные множители K (x1000), M (x1,000,000) и G (x1,000,000,000). Для того, чтобы заставить команду –listвыводить полное число (без употребления множителей) требуется применять ключ -x, который описан ниже. Если ключ -v, –verboseиспользуется с командами –append, –insert, –deleteили –replace, то будет выведен подробный отчет о произведенной операции.
 
    Ключ: -x, –exact
    Команды, с которыми используется: –list
    Описание: Для всех чисел в выходных данных выводятся их точные значения без округления и без использования множителей K, M, G. Этот ключ используется только с командой –listи не применим с другими командами.
 
    Ключ: -n, –numeric
    Команды, с которыми используется: –list
    Описание: Заставляет iptables выводить IP-адреса и номера портов в числовом виде предотвращая попытки преобразовать их в символические имена. Данный ключ используется только с командой –list.
 
    Ключ: –line-numbers
    Команды, с которыми используется: –list
    Описание:Ключ –line-numbersвключает режим вывода номеров строк при отображении списка правил командой –list. Номер строки соответствует позиции правила в цепочке. Этот ключ используется только с командой –list.
 
    Ключ: -c, –set-counters
    Команды, с которыми используется: –insert, –append, –replace
    Описание: Этот ключ используется для установки начального значения счетчиков пакетов и байт в заданное значение при создании нового правила. Например, ключ –set-counters 20 4000 установит счетчик пакетов = 20, а счетчик байт = 4000.
 
    Ключ: –modprobe
    Команды, с которыми используется: Все
    Описание: Ключ –modprobeопределяет команду загрузки модуля ядра. Данный ключ может использоваться в случае, когда модули ядра находится вне пути поиска (search path). Этот ключ может использоваться с любой командой.

6.4. Критерии

   Здесь мы подробнее остановимся на критериях выделения пакетов. Я разбил все критерии на пять групп. Первая – общие критериикоторые могут использоваться в любых правилах. Вторая – TCP критериикоторые применяются только к TCPпакетам. Третья – UDP критериикоторые применяются только к UDPпакетам. Четвертая – ICMP критериидля работы с ICMPпакетами. И наконец пятая – специальные критерии, такие как state, owner, limit и пр.

6.4.1. Общие критерии

   Здесь мы рассмотрим Общие критерии. Общие критерии допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения. К этой группе я умышленно отнес критерий –protocolнесмотря на то, что он используется в некоторых специфичных от протокола расширениях. Например, мы решили использовать TCP критерий, тогда нам необходимо будет использовать и критерий –protocolкоторому в качестве дополнительного ключа передается название протокола – TCP. Однако критерий –protocolсам по себе является критерием, который используется для указания типа протокола.
    Таблица 6-4. Общие критерии
   (Критерий – Пример – Описание)
 
    Критерий: -p, –protocol
    Пример: iptables -A INPUT -p tcp
    Описание: Этот критерий используется для указания типа протокола. Примерами протоколов могут быть TCP, UDPи ICMP. Список протоколов можно посмотреть в файле /etc/protocols. Прежде всего, в качестве имени протокола в данный критерий можно передавать один из трех вышеупомянутых протоколов, а также ключевое слово ALL. В качестве протокола допускается передавать число – номер протокола, так например, протоколу ICMP соответствует число 1, TCP – 6 и UDP – 17. Соответствия между номерами протоколов и их именами вы можете посмотреть в файле /etc/protocols, который уже упоминался. Критерию может передаваться и список протоколов, разделенных запятыми, например так: udp,tcp (Хотя автор и указывает на возможность передачи списка протоколов, тем не менее вам врят ли удастся это сделать! Кстати, man iptables явно оговаривает, что в данном критерии может быть указан только один протокол. Может быть это расширение имеется в patch-o-matic? прим. перев.)Если данному критерию передается числовое значение 0, то это эквивалентно использованию спецификатора ALL, который подразумевается по умолчанию, когда критерий –protocolне используется. Для логической инверсии критерия, перед именем протокола (списком протоколов) используется символ !, например –protocol ! tcpподразумевает пакеты протоколов, UDPи ICMP.
 
    Критерий: -s, –src, –source
    Пример: iptables -A INPUT -s 192.168.1.1
    Описание: IP-адрес(а) источника пакета. Адрес источника может указываться так, как показано в примере, тогда подразумевается единственный IP-адрес. А можно указать адрес в виде address/mask, например как 192.168.0.0/255.255.255.0, или более современным способом 192.168.0.0/24, т.е. фактически определяя диапазон адресов Как и ранее, символ !, установленный перед адресом, означает логическое отрицание, т.е. –source ! 192.168.0.0/24означает любой адрес кроме адресов 192.168.0.x.
 
    Критерий: -d, –dst, –destination
    Пример: iptables -A INPUT -d 192.168.1.1
    Описание: IP-адрес(а) получателя. Имеет синтаксис схожий с критерием –source, за исключением того, что подразумевает адрес места назначения. Точно так же может определять как единственный IP-адрес, так и диапазон адресов. Символ ! используется для логической инверсии критерия.
 
    Критерий: -i, –in-interface
    Пример: iptables -A INPUT -i eth0
    Описание: Интерфейс, с которого был получен пакет. Использование этого критерия допускается только в цепочках INPUT, FORWARDи PREROUTING, в любых других случаях будет вызывать сообщение об ошибке. При отсутствии этого критерия предполагается любой интерфейс, что равносильно использованию критерия -i +. Как и прежде, символ ! инвертирует результат совпадения. Если имя интерфейса завершается символом +, то критерий задает все интерфейсы, начинающиеся с заданной строки, например -i PPP+обозначает любой PPP интерфейс, а запись -i ! eth+– любой интерфейс, кроме любого eth.
 
    Критерий: -o, –out-interface
    Пример: iptables -A FORWARD -o eth0
    Описание: Задает имя выходного интерфейса. Этот критерий допускается использовать только в цепочках OUTPUT, FORWARDи POSTROUTING, в противном случае будет генерироваться сообщение об ошибке. При отсутствии этого критерия предполагается любой интерфейс, что равносильно использованию критерия -o +. Как и прежде, символ ! инвертирует результат совпадения. Если имя интерфейса завершается символом +, то критерий задает все интерфейсы, начинающиеся с заданной строки, например -o eth+обозначает любой eth интерфейс, а запись -o ! eth+– любой интерфейс, кроме любого eth.
 
    Критерий: -f, –fragment
    Пример: iptables -A INPUT -f
    Описание: Правило распространяется на все фрагменты фрагментированного пакета, кроме первого, сделано это потому, что нет возможности определить исходящий/входящий порт для фрагмента пакета, а для ICMP-пакетов определить их тип. С помощью фрагментированных пакетов могут производиться атаки на ваш брандмауэр, так как фрагменты пакетов могут не отлавливаться другими правилами. Как и раньше, допускается использования символа ! для инверсии результата сравнения. только в данном случае символ ! должен предшествовать критерию -f, например ! -f. Инверсия критерия трактуется как «все первые фрагменты фрагментированных пакетов и/или нефрагментированные пакеты, но не вторые и последующие фрагменты фрагментированных пакетов».

6.4.2. Неявные критерии

   В этом разделе мы рассмотрим неявные критерии, точнее, те критерии, которые подгружаются неявно и становятся доступны, например при указании критерия –protocol tcp. На сегодняшний день существует три автоматически подгружаемых расширения, это TCP критерии, UDP критериии ICMP критерии (при построении своих правил я столкнулся с необходимостью явного указания ключа -m tcp, т.е. о неявности здесь говорить не приходится, поэтому будьте внимательнее при построении своих правил, если что-то не идет – пробуйте явно указывать необходимое расширение. прим. перев.). Загрузка этих расширений может производиться и явным образом с помощью ключа -m, -match, например -m tcp.

6.4.2.1. TCP критерии

   Этот набор критериев зависит от типа протокола и работает только с TCPпакетами. Чтобы использовать их, вам потребуется в правилах указывать тип протокола –protocol tcp. Важно: критерий –protocol tcpобязательно должен стоять перед специфичным критерием. Эти расширения загружаются автоматически как для tcpпротокола, так и для udpи icmpпротоколов. (О неявной загрузке расширений я уже упоминал выше прим. перев.).
    Таблица 6-5. TCP критерии
   (Критерий – Пример – Описание)
 
    Критерий: –sport, –source-port
    Пример: iptables -A INPUT -p tcp –sport 22
    Описание: Исходный порт, с которого был отправлен пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов вы сможете найти в файле /etc/services. При указании номеров портов правила отрабатывают несколько быстрее. однако это менее удобно при разборе листингов скриптов. Если же вы собираетесь создавать значительные по объему наборы правил, скажем порядка нескольких сотен и более, то тут предпочтительнее использовать номера портов. Номера портов могут задаваться в виде интервала из минимального и максимального номеров, например –source-port 22:80. Если опускается минимальный порт, т.е. когда критерий записывается как –source-port :80, то в качестве начала диапазона принимается число 0. Если опускается максимальный порт, т.е. когда критерий записывается как –source-port 22:, то в качестве конца диапазона принимается число 65535. Допускается такая запись –source-port 80:22, в этом случае iptablesпоменяет числа 22 и 80 местами, т.е. подобного рода запись будет преобразована в –source-port 22:80. Как и раньше, символ !используется для инверсии. Так критерий –source-port ! 22подразумевает любой порт, кроме 22. Инверсия может применяться и к диапазону портов, например –source-port ! 22:80. За дополнительной информацией обращайтесь к описанию критерия multiport.
 
    Критерий: –dport, –destination-port
    Пример: iptables -A INPUT -p tcp –dport 22
    Описание: Порт или диапазон портов, на который адресован пакет. Аргументы задаются в том же формате, что и для –source-port.
 
    Критерий: –tcp-flags
    Пример: iptables -p tcp –tcp-flags SYN,FIN,ACK SYN
    Описание: Определяет маску и флаги tcp-пакета. Пакет считается удовлетворяющим критерию, если из перечисленных флагов в первом списке в единичное состояние установлены флаги из второго списка. Так для вышеуказанного примера под критерий подпадают пакеты у которых флаг SYNустановлен, а флаги FINи ACKсброшены. В качестве аргументов критерия могут выступать флаги SYN, ACK, FIN, RST, URG, PSH, а так же зарезервированные идентификаторы ALLи NONE. ALL– значит ВСЕфлаги и NONE– НИ ОДИН флаг. Так, критерий –tcp-flags ALL NONEозначает – «все флаги в пакете должны быть сброшены». Как и ранее, символ !означает инверсию критерия Важно: имена флагов в каждом списке должны разделяться запятыми, пробелы служат для разделения списков.
 
    Критерий: –syn
    Пример: iptables -p tcp –syn
    Описание: Критерий –synявляется по сути реликтом, перекочевавшим из ipchains. Критерию соответствуют пакеты с установленным флагом