Linux: IPTABLES — руководство: часть 1 — основы IPTABLES

Автор: | 10/18/2014
 

netfilter_logoВ цикле 4 статьи:

Часть 1 — основы IPTABLES: структура IPTABLES, таблицы, цепочки, кроткий обзор правил и действий;

Часть 2 — управление IPTABLES: основы управления — опции, команды для создания-удаления правил, цепочек, таблиц, сохранение и восстановление правил;

Часть 3 — параметры правил: — наиболее полезные параметры для создания правил, модули;

Часть 4 — цели для правил — описание целей (действий) для пакетов, попадающих под параметры правил;

IPTABLES является утилитой (!), а не непосредственно фаерволом. Роль фаервола в Linux играет пакет Netfilter (в Linux с версии 2.4).

IPTABLES представляет собой утилиту для конфигурирования Netfilter.

Структура IPTABLES

Структуру можно представить так:

iptables -> Tables -> Chains -> Rules

Пакет приходит на IPTABLES > далее на таблицы (Tables) > попадает в цепочки (Chains) > проходит по правилам (Rules).

Фактически, IPTABLES состоит из трёх основных частей:

таблицы: фактически, являют собой набор цепочек;

цепочки: набор правил;

правила;

Таблицы IPTABLES

У IPTABLES имеется 4 встроенных типа таблиц.

1. Filter Table

Является таблицей по-умолчанию. Если при создании/изменении правила не указана таблица — используется именно filter. Используется в основном для фильтрации пакетов. К примеру, тут можно выполнить DROP, LOG, ACCEPT или REJECT без каких либо сложностей, как в других таблицах.  Использует 3 встроенных цепочки:

  • INPUT chain – входящие пакеты, используется только для пакетов, цель которых — сам сервер, не используется для транзитного (роутинга) трафика
  • OUTPUT chain – исходящие пакеты, созданные локально и отправленные «за пределы» сервера;
  • FORWARD chain – пакеты, предназначенные другому сетевому интерфейсу (роут на другие машины сети, например).

2. NAT table

Таблица nat используется главным образом для преобразования сетевых адресов (Network Address Translation). Через эту таблицу проходит только первый пакет из потока. Преобразования адресов автоматически применяется ко всем последующим пакетам. Это один из факторов, исходя из которых мы не должны осуществлять какую-либо фильтрацию в этой таблице.

  • PREROUTING chain – преобразование адресов DNAT (Destination Network Address Translation), фильтрация пакетов здесь допускается только в исключительных случаях;
  • POSTROUTING chain – выполняется преобразование  адресов SNAT (Source Network Address Translation), фильтрация пакетов здесь крайне нежелательна;
  • OUTPUT chain – NAT для локально сгенерированных пакетов;

3. Mangle table

Таблица Mangle предназначена только для внесения изменения в некоторые заголовки пакетов — TOS (Type of Service),  TTL (Time to Live), MARK (особая метка для IPTABLES или других служб). Важно: в действительности поле MARK не изменяется, но в памяти ядра заводится структура, которая сопровождает данный пакет все время его прохождения через машину, так что другие правила и приложения на данной машине (и только на данной машине) могут использовать это поле в своих целях.

Включает в себя такие цепочки:

  • PREROUTING chain
  • OUTPUT chain
  • FORWARD chain
  • INPUT chain
  • POSTROUTING chain

4. Raw table

Применяется до передачи пакета механизму определения состояний (state machine, connection tracking — система трассировки соединений, при помощи которой реализуется межсетевой экран на сеансовом уровне (stateful firewall), позволяет определить, к какому соединению или сеансу принадлежит пакет, анализирует все пакеты кроме тех, которые были помечены NOTRACK в таблице raw).

  • PREROUTING chain
  • OUTPUT chain

Цепочки IPTABLES

Существует 5 типов стандартных цепочек, встроенных в систему:

  • PREROUTING — для изначальной обработки входящих пакетов;
  • INPUT — для входящих пакетов адресованных непосредственно локальному процессу (клиенту или серверу);
  • FORWARD — для входящих пакетов перенаправленных на выход (заметьте, что перенаправляемые пакеты проходят сначала цепь PREROUTING, затем FORWARD и POSTROUTING);
  • OUTPUT — для пакетов генерируемых локальными процессами;
  • POSTROUTING — для окончательной обработки исходящих пакетов.
Cписок цепочек в таблицах IPTABLES

Cписок цепочек в таблицах IPTABLES

Схематично путь пакетов через IPTABLES хорошо представлен на следующей схеме:

Прохождение пакетов через IPTABLES

Прохождение пакетов через IPTABLES

 

Правила IPTABLES

Правила имеют следующую структуру:

правило > цель > счётчик

Если пакет соответствует правилу, к нему применяется цель, и он учитывается счетчиком. Если правило (или критерий ) не задан — то цель применяется ко всем проходящим через цепочку пакетам. Если не указаны ни цель, ни правило — для правила будет срабатывать только счётчик пакетов. Если пакет не попадает под правило и цель — он передаётся следующему правилу в списке.

Параметры для формирования правил смотрите в посте Linux: IPTABLES — руководство: часть 3 — параметры правил.

Цели (targets) IPTABLES

Правило может содержать одно из следующих целей (или действий):

  • ACCEPT – принять пакет, и передать следующей цепочке  (или приложению, или передать для дальнейшего роутинга);
  • DNAT — (Destination Network Address Translation) используется для преобразования адреса места назначения в IP заголовке пакета; если пакет подпадает под критерий правила, выполняющего DNAT, то этот пакет, и все последующие пакеты из этого же потока, будут подвергнуты преобразованию адреса назначения и переданы на требуемое устройство, хост или сеть; действие DNAT может выполняться только в цепочках PREROUTING и OUTPUT таблицы nat, и во вложенных под-цепочках; важно запомнить, что вложенные подцепочки, реализующие DNAT не должны вызываться из других цепочек, кроме PREROUTING и OUTPUT;
  • DROP – просто «сбрасывает» пакет и IPTABLES «забывает» о его существовании; «сброшенные» пакеты прекращают свое движение полностью, т.е. они не передаются в другие таблицы, как это происходит в случае с действием ACCEPT; следует помнить, что данное действие может иметь негативные последствия, поскольку может оставлять незакрытые «мертвые» сокеты как на стороне сервера, так и на стороне клиента, наилучшим способом защиты будет использование действия REJECT, особенно при защите от сканирования портов;
  • LOG — действие, которое служит для журналирования отдельных пакетов и событий; в журнал могут заноситься заголовки IP пакетов и другая полезная информация; информация из журнала может быть затем прочитана с помощью dmesg или syslogd, либо с помощью других программ; обратите ваше внимание так же на цель ULOG, которое позволяет выполнять запись информации не в системный журнал, а в базу данных MySQL и т.п.;
  • MARK — используется для установки меток для определенных пакетов; это действие может выполняться только в пределах таблицы mangle; установка меток обычно используется для нужд маршрутизации пакетов по различным маршрутам, для ограничения трафика и т.п.; «метка» пакета существует только в период времени пока пакет не покинул брандмауэр, т.е. метка не передается по сети;
  • MASQUERADE — в основе своей представляет то же самое, что и SNAT только не имеет ключа --to-source; причиной тому то, что маскарадинг может работать, например, с dialup подключением или DHCP, т.е. в тех случаях, когда IP адрес присваивается устройству динамически; если у вас имеется динамическое подключение, то нужно использовать маскарадинг, если же у вас статическое IP подключение, то лучше будет использование SNAT;
  • MIRROR — может использоваться вами только для экспериментов и в демонстрационных целях, поскольку это действие может привести к «зацикливанию» пакета и в результате к «Отказу от обслуживания»; в результате действия MIRROR в пакете, поля source и destination меняются местами и пакет отправляется в сеть;  допускается использовать только в цепочках INPUT, FORWARD и PREROUTING, и в цепочках, вызываемых из этих трех;
  • QUEUE – ставит пакет в очередь на обработку пользовательскому процессу; оно может быть использовано для нужд учета, проксирования или дополнительной фильтрации пакетов;
  • REDIRECT — выполняет перенаправление пакетов и потоков на другой порт той же самой машины; можно пакеты, поступающие на HTTP порт перенаправить на порт HTTP-proxy; удобен для выполнения «прозрачного» проксирования (transparent proxy), когда машины в локальной сети даже не подозревают о существовании прокси; может использоваться только в цепочках PREROUTING и OUTPUT таблицы nat;
  • REJECT — используется, как правило, в тех же самых ситуациях, что и DROP, но в отличие от DROP, команда REJECT выдает сообщение об ошибке на хост, передавший пакет;
  • RETURN — прекращает движение пакета по текущей цепочке правил и производит возврат следующему правилу в вызывающей (предыдущей) цепочке, если текущая цепочка была вложенной, или, если текущая цепочка лежит на самом верхнем уровне (например INPUT), то к пакету будет применена политика по-умолчанию; обычно, в качестве политики по-умолчанию назначают действия ACCEPT или DROP;
  • SNAT — используется для преобразования сетевых адресов (Source Network Address Translation), т.е. изменение исходящего IP адреса в IP в заголовке пакета; SNAT допускается выполнять только в таблице nat, в цепочке POSTROUTING; если первый пакет в соединении подвергся преобразованию исходящего адреса, то все последующие пакеты, из этого же соединения, будут преобразованы автоматически и не пойдут через эту цепочку правил;
  • TOS — используется для установки битов в поле Type of Service IP заголовка; поле TOS содержит 8 бит, которые используются для маршрутизации пакетов;  важно помнить, что данное поле может обрабатываться различными маршрутизаторами с целью выбора маршрута движения пакета;  в отличие от MARK, сохраняет свое значение при движении по сети, а поэтому может использоваться для маршрутизации пакета; лучше всего использовать это поле для своих нужд только в пределах WAN или LAN;
  • TTL — используется для изменения содержимого поля Time To Live в IP заголовоке;
  • ULOG — система журналирования пакетов, которая заменяет традиционное действие LOG, базирующееся на системном журнале; при использовании этого действия, пакет, через сокеты netlink, передается специальному демону который может выполнять очень детальное журналирование в различных форматах (обычный текстовый файл, база данных MySQL и пр.), млжет формировать отчёты в CSV, XML, Netfilter’s LOG, Netfilter’s conntrack; подробнее смотрите на домашней странице проекта;

Параметры для формирования действий смотрите в посте Linux: IPTABLES — руководство: часть 4 — цели для правил.

Критерий так же может использовать состояние пакета для принятия решений:

  • NEW — пакет открывает новый сеанс, например — пакет TCP с флагом SYN;
  • ESTABLISHED — пакет является частью уже существующего сеанса;
  • RELATED — пакет открывает новый сеанс, связанный с уже открытым сеансом, например, во время сеанса пассивного FTP, клиент подсоединяется к порту 21 сервера, сервер сообщает клиенту номер второго, случайно выбранного порта, после чего клиент подсоединяется ко второму порту для передачи файлов; в этом случае второй сеанс (передача файлов по второму порту) связан с уже существующим сеансом (изначальное подсоединение к порту 21);
  • INVALID — все прочие пакеты.

Ссылки на материалы

https://www.frozentux.net — полный мануал по IPTABLES + много информации по структуре сети и пакетов; обновлялся в 2006 году; IPTABLES 1.2.2;

http://www.opennet.ru — то же, но на русском, обновлялся в 2003, IPTABLES 1.1.9;

http://www.netfor2.com — краткое описание протокола TCP и структуры пакетов;

http://ipset.netfilter.org

http://www.opennet.ru

http://help.ubuntu.ru

http://www.cinetel.ru

http://fideloper.com

https://www.digitalocean.com