Это качество трассировщика может быть использовано для избыточного файерволлинга (firewalling), но для случая домашней локальной сети, в которой используется только один брандмауэр это очень плохо. Эта проблема более подробно обсуждается в разделе
Пакеты со статусом NEW и со сброшенным битом SYNприложения
Общие проблемы и вопросы. Альтернативным вариантом решения этой проблемы может служить установка заплаты
tcp-window-trackingиз
patch-o-matic, которая сделает возможным принятие решений в зависимости от значения
TCP window.
4.5. UDP соединения
По сути своей,
UDPсоединения не имеют признака состояния. Этому имеется несколько причин, основная из них состоит в том, что этот протокол не предусматривает установления и закрытия соединения, но самый большой недостаток – отсутствие информации об очередности поступления пакетов. Приняв две датаграммы
UDP, невозможно сказать точно в каком порядке они были отправлены. Однако, даже в этой ситуации все еще возможно определить состояние соединения. Ниже приводится рисунок того, как выглядит установление соединения с точки зрения трассировщика.
Из рисунка видно, что состояние
UDPсоединения определяется почти так же как и состояние
TCPсоединения, с точки зрения из пользовательского пространства. Изнутри же это выглядит несколько иначе, хотя во многом похоже. Для начала посмотрим на запись, появившуюся после передачи первого пакета
UDP.
udp 17 20 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 \ [UNREPLIED] src=192.168.1.5 dst=192.168.1.2 sport=1025 \ dport=137 use=1
Первое, что мы видим – это название протокола (udp) и его номер (см. /etc/protocols прим. перев.). Третье значение – оставшееся «время жизни» записи в секундах. Далее следуют характеристики пакета, прошедшего через брандмауэр – это адреса и порты отправителя и получателя. Здесь же видно, что это первый пакет в сессии (флаг [UNREPLIED]). И завершают запись адреса и порты отправителя и получателя ожидаемого пакета. Таймаут такой записи по умолчанию составляет 30 секунд.
udp 17 170 src=192.168.1.2 dst=192.168.1.5 sport=137 \ dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 \ dport=137 use=1
После того как сервер «увидел» ответ на первый пакет, соединение считается
ESTABLISHED(установленным), единственное отличие от предыдущей записи состоит в отсутствии флага [UNRREPLIED] и, кроме того, таймаут для записи стал равным 180 секундам. После этого может только добавиться флаг [ASSURED] (уверенное соединение), который был описан выше. Флаг [ASSURED] устанавливается только после прохождения некоторого количества пакетов через соединение.
udp 17 175 src=192.168.1.5 dst=195.22.79.2 sport=1025 \ dport=53 src=195.22.79.2 dst=192.168.1.5 sport=53 \ dport=1025 [ASSURED] use=1
Теперь соединение стало «уверенным». Запись в таблице выглядит практически так же как и в предыдущем примере, за исключением флага [ASSURED]. Если в течение 180 секунд через соединение не пройдет хотя бы один пакет, то запись будет удалена из таблицы. Это достаточно маленький промежуток времени, но его вполне достаточно для большинства применений. «Время жизни» отсчитывается от момента прохождения последнего пакета и при появлении нового, время переустанавливается в свое начальное значение, это справедливо и для всех остальных типов внутренних состояний.
4.6. ICMP соединения
ICMPпакеты используются только для передачи управляющих сообщений и не организуют постоянного соединения. Однако, существует 4 типа
ICMPпакетов, которые вызывают передачу ответа, поэтому они могут иметь два состояния:
NEWи
ESTABLISHED. К этим пакетам относятся
ICMP Echo Request/Echo Reply,
ICMP Timestamp Request/Timestamp Reply,
ICMP Information Request/Information Replyи
ICMP Address Mask Request/Address Mask Reply. Из них –
ICMP Timestamp Request/Timestamp Replyи
ICMP Information Request/Information Replyсчитаются устаревшими и поэтому, в большинстве случаев, могут быть безболезненно сброшены (
DROP). Взгляните на рисунок ниже.
Как видно из этого рисунка, сервер выполняет
Echo Request(эхо-запрос) к клиенту, который (запрос) распознается брандмауэром как
NEW. На этот запрос клиент отвечает пакетом
Echo Reply, и теперь пакет распознается как имеющий состояние
ESTABLISHED. После прохождения первого пакета (
Echo Request) в ip_conntrack появляется запись:
icmp 1 25 src=192.168.1.6 dst=192.168.1.10 type=8 code=0 \ id=33029 [UNREPLIED] src=192.168.1.10 dst=192.168.1.6 \ type=0 code=0 id=33029 use=1
Эта запись несколько отличается от записей, свойственных протоколам
TCPи
UDP, хотя точно так же присутствуют и название протокола и время таймаута и адреса передатчика и приемника, но далее появляются три новых поля – type, code и id. Поле type содержит тип
ICMP, поле code – код
ICMP. Значения типов и кодов
ICMPприводятся в приложении
Типы ICMP. И последнее поле id содержит идентификатор пакета. Каждый
ICMP–пакет имеет свой идентификатор. Когда приемник, в ответ на
ICMP–запрос посылает ответ, он подставляет в пакет ответа этот идентификатор, благодаря чему, передатчик может корректно распознать в ответ на какой запрос пришел ответ.
Следующее поле – флаг [UNREPLIED], который встречался нам ранее. Он означает, что прибыл первый пакет в соединении. Завершается запись характеристиками ожидаемого пакета ответа. Сюда включаются адреса отправителя и получателя. Что касается типа и кода
ICMPпакета, то они соответствуют правильным значениям ожидаемого пакета
ICMP Echo Reply. Идентификатор пакета-ответа тот же, что и в пакете запроса.
Пакет ответа распознается уже как
ESTABLISHED. Однако, мы знаем, что после передачи пакета ответа, через это соединение уже ничего не ожидается, поэтому после прохождения ответа через netfilter, запись в таблице трассировщика уничтожается.
В любом случае запрос рассматривается как
NEW, а ответ как
ESTABLISHED.
ПРИМЕЧАНИЕ: Заметьте при этом, что пакет ответа должен совпадать по своим характеристикам (адреса отправителя и получателя, тип, код и идентификатор) с указанными в записи в таблице трассировщика, это справедливо и для всех остальных типов трафика.
ICMP запросы имеют таймаут, по-умолчанию, 30 секунд. Этого времени, в большинстве случаев, вполне достаточно. Время таймаута можно изменить в /proc/sys/net/ipv4/netfilter/ip_ct_icmp_timeout. ( Напоминаю, что переменные типа /proc/sys/net/ipv4/netfilter/ip_ct_* становятся доступны только после установки «заплаты» tcp-window-tracking из patch-o-matic прим. перев.).
Значительная часть
ICMPиспользуется для передачи сообщений о том, что происходит с тем или иным
UDPили
TCPсоединением. Всвязи с этим они очень часто распознаются как связанные (
RELATED) с существующим соединением. Простым примером могут служить сообщения
ICMP Host Unreachableили
ICMP Network Unreachable. Они всегда порождаются при попытке соединиться с узлом сети когда этот узел или сеть недоступны, в этом случае последний маршрутизатор вернет соответствующий
ICMPпакет, который будет распознан как
RELATED. На рисунке ниже показано как это происходит.
В этом примере некоторому узлу передается запрос на соединение (
SYNпакет). Он приобретает статус
NEWна брандмауэре. Однако, в этот момент времени, сеть оказывается недоступной, поэтому роутер возвращает пакет
ICMP Network Unreachable. Трассировщик соединений распознает этот пакет как
RELATED, благодаря уже имеющейся записи в таблице, так что пакет благополучно будет передан клиенту, который затем оборвет неудачное соединение. Тем временем, брандмауэр уничтожит запись в таблице, поскольку для данного соединения было получено сообщение об ошибке.
То же самое происходит и с
UDPсоединениями – если обнаруживаются подобные проблемы. Все сообщения
ICMP, передаваемые в ответ на
UDPсоединение, рассматриваются как
RELATED. Взгляните на следующий рисунок.
Датаграмма
UDPпередается на сервер. Соединению присваивается статус
NEW. Однако доступ к сети запрещен (брандмауэром или роутером), поэтому обратно возвращается сообщение
ICMP Network Prohibited. Брандмауэр распознает это сообщение как связанное с открытым
UDPсоединением, присваивает ему статус
RELATEDи передает клиенту. После чего запись в таблице трассировщика уничтожается, а клиент благополучно обрывает соединение.
4.7. Поведение по-умолчанию
В некоторых случаях механизм определения состояния не может распознать протокол обмена и, соответственно, не может выбрать стратегию обработки этого соединения. В этом случае он переходит к заданному по-умолчанию поведению. Поведение по-умолчанию используется, например при обслуживании протоколов
NETBLT,
MUXи
EGP. Поведение по-молчанию во многом схоже с трассировкой
UDPсоединений. Первому пакету присваивается статус
NEW, а всем последующим – статус
ESTABLISHED.
При использовании поведения по-умолчанию, для всех пакетов используется одно и то же значение таймаута, которое можно изменить в /proc/sys/net/ipv4/netfilter/ip_ct_generic_timeout. По-умолчанию это значение равно 600 секундам, или 10 минутам В зависимости от типа трафика, это время может меняться, особенно когда соединение устанавливается по спутниковому каналу.
4.8. Трассировка комплексных протоколов
Имеется ряд комплексных протоколов, корректная трассировка которых более сложна. Прмером могут служить протоколы
ICQ,
IRCи
FTP. Каждый из этих протоколов несет дополнительную информацию о соединении в области данных пакета. Соответственно корректная трассировка таких соединений требует подключения дополнительных вспомогательных модулей.
В качестве первого примера рассмотрим протокол
FTP. Протокол
FTPсначала открывает одиночное соединение, которое называется «сеансом управления FTP» (
FTP control session). При выполнении команд в пределах этого сеанса, для передачи сопутствующих данных открываются дополнительные порты. Эти соединения могут быть активными или пассивными. При создании активного соединения клент передает
FTPсерверу номер порта и
IPадрес для соединения. Затем клент открывает порт, сервер подключает к заданному порту клиента свой порт с номером 20 (известный как
FTP-Data) и передает данные через установленное соединение.
Проблема состоит в том, что брандмауэр ничего не знает об этих дополнительных подключениях, поскольку вся информация о них передается через область данных пакета. Из-за этого брандмауэр не позволит серверу соединиться с указанным портом клиента.
Решение проблемы состоит в добавлении специального вспомогательного модуля трассировки, который отслеживает, специфичную для данного протокола, информацию в области данных пакетов, передаваемых в рамках сеанса управления. При создании такого соединения, вспомогательный модуль корректно воспримет передаваемую информацию и создаст соответствующую запись в таблице трассировщика со статусом
RELATED, благодаря чему соединение будет установлено. Рисунок ниже поясняет порядок выполнения подобного соединения.
Пассивный
FTPдействует противоположным образом. Клиент посылает запрос серверу на получение данных, а сервер возвращает клиенту
IPадрес и номер порта для подключения. Клиент подключает свой 20-й порт (
FTP-data) к указанному порту сервера и получает запрошенные данные. Если ваш FTP сервер находится за брандмауэром, то вам потребуется этот вспомогательный модуль для того, чтобы сервер смог обслуживать клиентов из Интернет. То же самое касается случая, когда вы хотите ограничить своих пользователей только возможностью подключения к
HTTPи
FTPсерверам в Интернет и закрыть все остальные порты. Рисунок ниже показывает как выполняется пассивное соединение
FTP.
Некоторые вспомогательные модули уже включены в состав ядра. Если быть более точным, то в состав ядра включены вспомогательные модули для протоколов
FTPи
IRC. Если в вашем распоряжении нет необходимого вспомогательного модуля, то вам следует обратиться к
patch-o-matic, который содержит большое количество вспомогательных модулей для трассировки таких протоколов, как
ntalkили
H.323. Если и здесь вы не нашли то, что вам нужно, то у вас есть еще варианты: вы можете обратиться к CVS iptables, если искомый вспомогательный модуль еще не был включен в
patch-o-matic, либо можете войти в контакт с разработчиками netfilter и узнать у них – имеется ли подобный модуль и планируется ли он к выпуску. Если и тут вы потерпели неудачу, то наверное вам следует прочитать Rusty Russell's Unreliable Netfilter Hacking HOW-TO.
Вспомогательные модули могут быть скомпилированы как в виде подгружаемых модулей ядра, так и статически связаны с ядром. Если они скомпилированы как модули, то вы можете загрузить их командой:
modprobe ip_conntrack_*
Обратите внимание на то, что механизм определения состояния не имеет никакого отношения к трансляции сетевых адресов (
NAT), поэтому вам может потребоваться большее количество дополнительных модулей, если вы выполняете такую трансляцию. Допустим, что вы выполняете трансляцию адресов и трассировку
FTPсоединений, тогда вам необходим так же и соответствующий вспомогательный модуль
NAT. Имена вспомогательных модулей
NATначинаются с ip_nat_, в соответствии с соглашением об именах. В данном случае модуль называется
ip_nat_ftp. Для протокола
IRCтакой модуль будет называться
ip_nat_irc. Тому же самому соглашению следуют и названия вспомогательных модулей трассировщика, например:
ip_conntrack_ftpи
ip_conntrack_irc.
Глава 5. Сохранение и восстановление больших наборов правил
В состав пакета
iptablesвходят две очень удобные утилиты, особенно если вам приходится иметь дело с большими наборами правил. Называются они
iptables-saveи
iptables-restore. Первая из них сохраняет, а вторая восстанавливает наборы правил в/из файла. По своему формату файл с набором правил похож на обычные файлы сценариев командной оболочки (shell), в чем вы сможете убедиться чуть ниже.
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. Можно было бы привести еще целый ряд команд, с помощью которых можно организовать загрузку набора правил из файла, но это выходит за рамки темы, поэтому оставлю читателю возможность самому найти более удобный для него вариант.
После исполнения этой команды набор правил должен загрузиться и все должно работать. Если это не так, то скорее всего вы допустили ошибку при наборе команды.
Глава 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.