Знакомство с Netfilter/iptables
Совсем недавно, на работе, у нас с коллегой зашел разговор про отличия ядер и функционала FreeBSD и Fedora. Выяснилось, что отличий хватает, причем одним из самых сложных вопросов в настройке системы (FreeBSD в данном случае) стало написание правил для фаервола. Я бы хотел остановиться на этой теме и разобраться более подробно.
Давайте подумаем, почему Linux, зачастую, используют в качестве шлюза, т.е. маршрутизатора, соединяющего две или несколько сетей? Кто плотно сидит на Unix-е, знает или предполагает, что именно Linux изначально готова выполнять функции маршрутизатора, межсетевого фильтра и транслятора адресов. Для реализации аналогичных функций на других платформах требуется дополнительное программное обеспечение, а в частности и капиталовложения. Поэтому рентабельнее использовать Linux. А с появлением механизма Netfilter, который пришел на замену программе ipchains в ядре версии 2.4.x, гибкость и функциональность системы повышается больше.
Этот механизм представляет собой совокупность модулей и команд ядра, осуществляющих фильтрацию пакетов. Соответствующая утилита командной строки называется iptables.
На момент написания поста программа iptables имела версию 1.4.9.1 (про iptables 1.4.8). В зависимости от вносимых изменений в ядро, учитываются и возможные влияния на работу программы iptables, поэтому разработчикам всегда есть чем заняться.
Обзор системы Netfilter
В Netfilter добавлен новый уровень абстракции — таблицы, объединяющие в себе цепочки. Существуют три таблицы: filter, nat и mangle. Каждая из них содержит группу предопределенных цепочек. В программе iptables названия цепочек записываются прописными буквами.
Кроме таблиц в Netfilter появились и другие функциональные возможности. Имеются средства фильтрации пакетов с учетом состояния, переадресации портов, фильтрации на основе TCP-флагов и МАС-адресов отправителя, фильтрации исходящих пакетов на основе идентификатора пользователя, а также расширенные средства журнальной регистрации и защиты от атак типа «отказ от обслуживания» (DOS). В Netfilter реализован ряд механизмов, предназначенных для расширения функциональных возможностей. Имеется возможность подключать существующие правила программы ipchains.
Таблица filter
Таблица filter содержит три встроенные цепочки: INPUT, FORWARD и OUTPUT. Цепочка INPUT используется только для обработки пакетов, адресованных локальной системе, цепочка OUTPUT — для обработки пакетов, генерируемых локальной системой, цепочка FORWARD — для обработки пакетов, проходящих через систему.
На рисунке видно, что все входящие пакеты проверяются сначала подсистемой маршрутизации. Если пакет адресован локальному процессу, он предварительно фильтруется цепочкой INPUT. Если же он адресован другой системе, он передается в цепочку FORWARD. Наконец, если пакет генерируется локально и предназначается для отправки другому компьютеру, то после обработки подсистемой маршрутизации он передается в цепочку OUTPUT. На каждом этапе обработки проверяются CRC-код и правильность заголовка пакета.
Таблица nat
Таблица nat тоже содержит три встроенные цепочки: PREROUTING, OUTPUT и POSTROUTING. Эта таблица поддерживает не только IP-маскирование, но и более общие формы системы NAT, т.е. трансляцию как исходных, так и целевых IP-адресов. В частности, локальные компьютеры могут иметь зарегистрированные внешние IP-адреса.
Цепочка PREROUTING используется для трансляции адресов входящих пакетов; цепочка OUTPUT предназначена для трансляции адресов пакетов, генерируемых локально перед их маршрутизацией; цепочка POSTROUTING используется для трансляции адресов отправляемых пакетов. Как и в таблице filter, цепочка OUTPUT вызывается, только если пакет сгенерирован локальным процессом. Входящие пакеты проходят цепочку PREROUTING, прежде чем вызывается подсистема маршрутизации. Это позволяет выполнять трансляцию адресов прежде, чем будут приняты решения о маршрутизации пакета. Если пакет адресован локальному процессу, он будет передан по назначению (сначала он пройдет через цепочку INPUT таблицы filter). Если же пакет переадресуется или генерируется локальным процессом, он фильтруется цепочкой POSTROUTING, где выполняется необходимая трансляция адресов. Трансляция адресов происходит отдельно от операций фильтрации в других цепочках.
Таблица mangle
Таблица mangle содержит две встроенные цепочки: PREROUTING и OUTPUT. Первая из них применяется к входящим пакетам перед маршрутизацией, а вторая — к локально генерируемым пакетам (тоже перед маршрутизацией). Эта таблица предназначена для специализированной обработки пакетов, например для изменения битов поля TOS.
Порядок обработки таблиц
Упомянутые выше цепочки являются стандартными. С помощью опции -t программы iptables можно задать, к какой цепочке относится конкретное правило. Если эта опция не указана, подразумевается таблица filter.
Цепочки разных таблиц могут иметь одинаковые имена, но их содержимое отличается. Таким образом, полный перечень цепочек таков:
nat/PREROUTING, nat/OUTPUT, nat/POSTROUTING
mangle/PREROUTING, mangle/OUTPUT
Схема взаимодействия всех восьми цепочек изображена на рисунке выше. В двух случаях (OUTPUT и PREROUTING) в разных таблицах содержатся одноименные цепочки. На диаграмме таблицы указаны в порядке приоритета. Например, порядок обработки цепочек OUTPUT таков: сначала mangle/OUTPUT, потом nat/OUTPUT, затем filter/OUTPUT. Перед каждым из этапов, хоть это и не показано, проверяются CRC-код и правильность заголовка пакета. Пакет, проходящий через брандмауэр и, следовательно, через цепочку FORWARD, сохраняет исходный IP-адрес до самого конца. Это, в частности, означает, что в правилах цепочки filter/FORWARD указываются реальные, а не маскируемые IP-адреса и номер портов. Тем самым существенно упрощается написание и восприятие правил. Кроме того, функции трансляции адресов распределяются между двумя цепочками, PREROUTING и POSTROUTING.
Следует отметить, что по сравнению с ipchains значительно упростилась обработка пакетов. В то время как в программе ipchains цепочки input и output вызывались для каждого пакета, проходящего через соответствующий интерфейс, цепочки INPUT и OUTPUT программы iptables вызываются только тогда, когда пакет адресован локальной системе или сгенерирован в ней. В результате существенно снижаются затраты на обработку пакетов.
Также, из цепочек INPUT, OUTPUT и FORWARD можно вызывать пользовательские цепочки. Цепочки PREROUTING и POSTROUTING такую возможность не поддерживают.
Синтаксис программы iptables
Синтаксис вызова программ iptables и ipchains во многом схож. Поддерживаются похожие флаги (команды), опции и директивы. Но некоторые опции программы iptables имеют расширения. Все правила, задаваемые с помощью программы iptables, относятся к определенной таблице (filter, если не указано иное). Общий синтаксис вызова программы таков:
Флаги
Возможные флаги (называются также командами) можно скачать ниже, где я выложил ссылку на tutorial. В основном они совпадают с флагами программы ipchains, но есть и отличия, например флаг -t, предназначенный для выбора таблицы.
Опции
Большинство опций программы iptables совпадает с одноименными опциями программы ipchains, хотя ключевые возможности, например спецификация номеров портов и флаг SYN (ранее опция -y), теперь задаются посредством расширений. Важная опция -l, включающая журнальную регистрацию, превратилась в директиву LOG. Доступные опции также есть в tutorial (мануале).
Расширения
В программе iptables реализованы два основных типа расширений. Оба они обобщенно называются расширенными шаблонами сравнения. Они уточняют правило, которому должен подчиняться пакет. Необходимость в существовании этих расширений объясняется тем, что за каждым из них стоит отдельный модуль ядра. Это позволяет дополнять систему Netfilter новыми модулями.
Расширения первого типа зависят от протокола (протокольные расширения), вторые задаются с помощью опции -m (явные расширения). Для каждого из них вызывается свой модуль-обработчик. Параметры протокольных расширений напоминают опции программы ipchains. В программе iptables эти параметры сопоставлены определенным протоколам: TCP, UDP или ICMP. Поддерживаемые протокольные расширения можно найти в мануале ниже. Опция -p протокол указывает на то, какой именно модуль загружается.


- http://www.opennet.ru/docs/RUS/iptables/
- http://www.posix.ru/network/iptables/
- http://ru.wikipedia.org/wiki/Iptables
- http://pm4u.narod.ru/iptables.htm
Хорошо и понятно все изложено.Спасибо.
Статья понравилась, написано качественно, да и в целом хорошо… автор продолжай в том же духе.
Спасибо за интересную статью!
оо..как раз пригодиться.Спасибо за подробность.
Хорошая статья
все разложено по полочкам
сразу видно, что автор информацию не один час обрабатывал.
Статья отлична,но мне как начинающему в реально довольно много было не понятно,но гугл мнев помощь:)