• Категории
  • Подписка
  • Разместить статью
30/08/10 6 4031 Iptables
-

Знакомство с 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.

Цепочки разных таблиц могут иметь одинаковые имена, но их содержимое отличается. Таким образом, полный перечень цепочек таков:

filter/INPUT, filter/FORWARD, filter/OUTPUT

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, OUT­PUT и FORWARD можно вызывать пользовательские цепочки. Цепочки PREROUTING и POSTROUTING такую возможность не поддерживают.

Синтаксис программы iptables

Синтаксис вызова программ iptables и ipchains во многом схож. Поддержива­ются похожие флаги (команды), опции и директивы. Но некоторые опции программы iptables имеют расширения. Все правила, задаваемые с помощью программы ipt­ables, относятся к определенной таблице (filter, если не указано иное). Общий синтаксис вызова программы таков:

iptables   [-флаги]   [цепочка]   [опции   [расширения]]   [ДИРЕКТИВА]

Флаги

Возможные флаги (называются также командами) можно скачать ниже, где я выложил ссылку на tutorial. В основ­ном они совпадают с флагами программы ipchains, но есть и отличия, например флаг -t, предназначенный для выбора таблицы.

Опции

Большинство опций программы iptables совпадает с одноименными опциями про­граммы ipchains, хотя ключевые возможности, например спецификация номеров пор­тов и флаг SYN (ранее опция -y), теперь задаются посредством расширений. Важная опция -l, включающая журнальную регистрацию, превратилась в директиву LOG. До­ступные опции также есть в tutorial (мануале).

Расширения

В программе iptables реализованы два основных типа расширений. Оба они обоб­щенно называются расширенными шаблонами сравнения. Они уточняют правило, которо­му должен подчиняться пакет. Необходимость в существовании этих расширений объяс­няется тем, что за каждым из них стоит отдельный модуль ядра. Это позволяет дополнять систему Netfilter новыми модулями.

Расширения первого типа зависят от протокола (протокольные расширения), вторые задаются с помощью опции -m (явные расширения). Для каждого из них вызывается свой модуль-обработчик. Параметры протокольных расширений напоминают опции про­граммы ipchains. В программе iptables эти параметры сопоставлены определенным протоколам: TCP, UDP или ICMP. Поддерживаемые протокольные расширения можно найти в мануале ниже. Опция -p протокол указывает на то, какой именно модуль загружается.

Скачать мануал по iptables:

Дополнительные источники информации:

  • 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

6 комментариев на «“Знакомство с Netfilter/iptables”»

  1. Хорошо и понятно все изложено.Спасибо.

  2. Статья понравилась, написано качественно, да и в целом хорошо… автор продолжай в том же духе.

  3. Working:

    Спасибо за интересную статью!

  4. оо..как раз пригодиться.Спасибо за подробность.

  5. окнаrus:

    Хорошая статья
    все разложено по полочкам
    сразу видно, что автор информацию не один час обрабатывал.

  6. Статья отлична,но мне как начинающему в реально довольно много было не понятно,но гугл мнев помощь:)

Добавить комментарий

Яндекс.Метрика