Iptables в Linux

Опубликовано: 16 Декабрь, 2016 в разделе: Обучение

netfilter — стандартный файрволл операционной системы на ядре Linux. Конфигурацией netfilter можно управлять при помощи команды iptables.

Правила файрволла по умолчанию находятся в файле /etc/sysconfig/iptables

В одной из предыдущих статей писал про файловую систему /proc, так вот, там, в этой ФС, имеются файлы, отражающие информацию о работе netfilter:

  • /proc/net/ip_tables_names — используемые таблицы;
  • /proc/net/ip_tables_targets — используемые действия;
  • /proc/net/ip_tables_matches — используемые протоколы, и некоторые другие файлы в зависимости от версии ОС;

Я выделил несколько примечательных зон в конфиге, чтобы можно было понять как строятся правила в netfilter:

Под цифрой 1 я указал метку таблицы, по умолчанию это filter. Существуют и другие таблицы — nat, mangle и raw, значение которых я расскажу ниже.

  1. Таблица filter используется по умолчанию для фильтрации пакетов, цепочки INPUT, FORWARD, OUTPUT;
  2. Таблица nat используется для подмены адресов источника или назначения. В таблице проходит только первый пакет из потока (состояние new), для последующих пакетов этого потока правила применяются автоматически. Цепочки PREROUTING, POSTROUTING, OUTPUT;
  3. Таблица mangle используется для модификации пакета (полей заголовка). Цепочки — все (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING);
  4. Таблица raw используется очень редко, для работы с пакетами до того, как они попадут в систему определения состояний, как правило для маркировки с целью не пускать их в эту систему. Цепочки PREROUTING, OUTPUT.

Под цифрой 2 я пометил три цепочки — INPUT, FORWARD, OUTPUT, которые содержатся в нашей таблице (filter).

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

Цепочки могут быть произвольными, эти же заданы по умолчанию. Так же после имени цепочки пишется правило по умолчанию (в нашем случае ACCEPT), что определяет действие над пакетом после прохождения цепочки, если ни одно из правил этой цепочки не сработало. В нашем случае пакет пропускается. В квадратных скобках задаётся счётчик пакетов/байт прошедших через конкретное правило.

Под цифрой 3 идут непосредственно правила. Как видите, синтаксис весьма несложен, стоит только запомнить некоторые опорные элементы:

-A означает append — добавить правило. За ним следует имя цепочки, куда данное правило будет относиться. Далее следуют параметры (например -i — интерфейс, -p — протокол, -s — адрес источника, -j — действие, -m — использование дополнительных модулей). В конце правил указывается слово COMMIT для применения состояния.

Опорные элементы:

Ключ Действие Пример
-A (—append) Добавляет указанное правило в конец указанной цепочки -A INPUT -i lo -j ACCEPT
-D (—delete) Удаляет правило(-а) из указанной цепочки указанное(-ые) по номерам или описанию -D INPUT 2,3


-D INPUT -p tcp -d 192.168.1.102 -j DROP

-E (—rename-chain) Переименовывает пользовательскую цепочку -E firstchain secondchain
-F (—flush) Очистка всех правил в текущей таблице -t filter -F
-L (—list) Отображение правил указанной таблицы (по умолчанию — filter), в сочетании с —line-numbers нумерует правила (для последующего удаления, например) -L --line-numbers
-I (—insert) Вставляет правило в цепочку под заданным номером (если модифицируем уже существующую цепочку) -I FORWARD 3 -i eth0 -p icmp -j DROP
-P (—policy) Устанавливает политику для конкретной цепочки (действие по умолчанию) -P INPUT DROP
-R (—replace) Заменяет правило под указанным номером другим правилом, указанным в параметрах -R INPUT 3 -i eth0 -s 192.168.1.102 -j ACCEPT
-X (—delete-chain) Удаляет все пользовательские цепочки, оставляя только стандартные -t mangle -X
-Z (—zero) Обнуляет все счётчики текущей (или указанной) цепочки -Z
—line-numbers Отображает номера правил (пример выше с -L)
-n (—numeric) Не резолвит адреса, номера портов -L -n
-t Указывает таблицу, с которой проводится действие -t nat -L --line-numbers --numeric
-v (—verbose) Детальный вывод -t nat -L -v

Важная тема — порядок прохождения цепочек в netfilter

Это нужно тщательно запомнить (или понять, кому что проще), потому что на этой теме часто спотыкаются новички, не в силах правильно диагностировать проблему. По какому пути проходит сетевой пакет с момента обработки его сетевым адаптером?

Сетевые пакеты приходят на сетевой интерфейс и после базовых проверок контрольных сумм (FCS) попадают на последовательность цепочек. Первая цепочка PREROUTING (предмаршрутизация). После прохождения таблиц в PREROUTING принимается решение либо передать пакет дальше (FORWARD (перенаправление)), либо доставить его локальной системе — если адрес назначения равен адресу сетевого интерфейса.

Итак, если назначение пакета — текущая машина, то пакет уходит в цепочку INPUT (входящий), после которой достигает, наконец, локального процесса.

От локального процесса, исходящие данные уходят в цепочку OUTPUT (исходящий), после чего снова принимается решение о маршрутизации, после чего (а также после прохождения цепочки FORWARD) направляется в цепочку POSTROUTING (постмаршрутизация), а затем и на выход с сетевого адаптера.

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

При этом, проходя цепочки, пакет последовательно проходит все таблицы, указанные на блок-схеме выше, а в каждой таблице сравнивается с каждым критерием. В случае соответствия критерию правила, над пакетом выполняются определённые действия.

Кроме того, в каждой встроенной таблице существует политика по умолчанию для принятия решения о действии над пакетом в случае, если данные пакета не соответствуют ни одному критерию правил.

Так же несколько раз встречается определение состояний conntrack (connection tracking). Это очень крутая штука, позволяющая анализировать состояние каждого пакета (кроме помеченных NOTRACK в таблице raw) и определить первый пакет (NEW) в сеансе или это часть уже установившегося обмена данными (ESTABLISHED). Существует также соединение, открытое дополнительно (инициированное другим соединением) — RELATED, например ftp. Или другое неопределённое состояние (INVALID). Модуль conntrack анализирует заголовки tcp-пакета (я описывал эти поля в статье об установке tcp-соединения).

Теперь перейдём к описанию критериев пакетных правил

Ключ Действие Пример
-p (—protocol) Определяет протокол пакета (перечислены в /etc/protocols) -A INPUT -p icmp
-s (—source) Определяет адрес источника пакета, указывается либо отдельным адресом, либо с указанием маски различным способом, как через префикс (192.168.1.22/27), так и длинной нотацией (192.168.0.0/255.255.255.0) -A INPUT -s 10.0.127.0/24 -j DROP
-o (—out-interface), -i (—in-interface) Определяет интерфейс, с которого пакет уйдёт (придёт). Используется как правило в случаях NAT и для машин с несколькими сетевыми интерфейсами. Используется подстановочный символ +. -t nat -A POSTROUTING -o eth1
—sport (—source-port) Определяет порт источника (для протоколов tcp, udp) -A OUTPUT -p tcp --source-port 25 -j DROP
—dport (—destination-port) Определяет порт назначения (для протоколов tcp, udp) -A INPUT -p tcp —dport 22 -j ACCEPT
-m conntrack —cstate Определяет состояние потока пакетов, может быть NEW, ESTABLISHED, RELATED, INVALID -A INPUT -m conntrack --cstate ESTABLISHED -j ACCEPT
—tcp-flags Определяет маску и флаги tcp-пакета -A INPUT -p tcp --tcp-flags SYN, ACK SYN

Критерии можно дополнять префиксом !, который инвертирует значение.

это далеко не полный перечень критериев, по которым можно отбирать тот или иной пакет. Как правило, функциональность расширяется за счёт применения дополнительных модулей, в частности можно фильтровать определённые коды сообщений icmp, фильтровать трафик по меткам QoS а так же использовать модуль limit, hashlimit, позволяющие ограничить скорость прохождения пакетов и отбрасывать при превышении числа пакетов за интервал времени (писал об этом тут).

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

  • DROP — отбросить пакет без отправки уведомления;
  • REJECT — отбросить пакет с отправкой icmp-уведомления;
  • ACCEPT — пакет принимается (покидает текущую цепочку и идёт дальше);
  • RETURN — возвратить пакет в предыдущую цепочку и продолжить её проход со следующего правила;
  • SNAT — модификация адреса источника в пакете (таблицы nat);
  • DNAT — модификация адреса назначения в пакете (nat), используется параметр —to-destionation в качестве указания адреса, на который заменяется адрес назначения;
  • LOG — запротоколировать прохождение этого пакета и продолжить его обработку, может использоваться параметр —log-level для указания уровня журналирования, —log-prefix для указания текстовой метки для пакета при отправке его в систему журналирования (можно указать до 29 символов);
  • MARK — пометить пакет (QoS);
  • MASQUERADE — так называемый PAT или маскарадинг;
  • QUEUE — передать пакет внешней программе;

На этом обзорную статью закончим, будем думать над лабораторной работой для закрепления знаний! Всем счастливо!

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.