Linux. Полное руководство.

19.6. IPTables — пакетный фильтр для ядер 2.4.x. и 2.6.x.

Фильтр IPTables, очень похожий на IPChains, называется так потому, что хранит цепочки правил в таблицах. Главной таблицей, в которой хранятся правила обработки всех стандартных типов трафика, является таблица filter. Именно с ней мы и будем работать. К стандартным таблицам относятся также:

♦ таблица nat — используется для построения NAT-преобразователей;

♦ таблица mangle — задает типы преобразования некоторых пакетов.

Для просмотра содержимого таблицы служит следующая команда:

Iptables -L -t <имя_таблицы>

19.6.1. Что изменилось в IPTables по сравнению с IPChains.

♦ Имена стандартных цепочек INPUT, OUTPUT и FORWARD теперь пишутся в верхнем регистре. Имена пользовательских цепочек по соглашению пишутся строчными буквами и могут иметь длину до 31 символа.

♦ Действие «отклонить пакет» теперь называется не DENY, a DROP.

♦ Действие MASQ называется MASQUERADE.

♦ Для перенаправления пакетов на пользовательское устройство используется цель QUEUE (раньше для этого использовалась опция -о).

♦ Опция -i теперь означает входящий интерфейс и работает только в цепочках INPUT и FORWARD. Правила в цепочках FORWARD и OUTPUT, которые использовали опцию -i, следует переписать с использованием опции -о.

♦ Если обнулить встроенную (стандартную) цепочку, то очистятся также и счетчики политик.

♦ Правила для протоколов TCP и UDP должны использоваться вместе с флагами --source-port и --destination-port (--sport и --dport). Эти флаги должны использоваться только с указанием протокола, например, -p tcp.

♦ Опция -y теперь называется --syn и должна указываться после флага -p.

♦ Действия REJECT и LOG реализованы отдельными модулями ядра.

19.6.2. Настройка ядра Linux для поддержки IPTables.

Новые параметры конфигурации ядра, включающие поддержку IPTables, я представил в таблице 19.3. Возможно, в вашем дистрибутиве некоторые из них отключены, тогда вам придется пересобрать ядро. Следующая глава подробно рассказывает о том, как это сделать.

Параметры конфигурации ядра Таблица 19.3.

Параметр Назначение
CONFIG_IP_NF_IPTABLES Необходим для работы IPTables. Не включив этот параметр, вы вообще не сможете использовать IPTables
CONFIG_ PACKET Позволяет использовать программы, которые работают непосредственно с сетевым устройством. Примером такой программы может послужить tcpdump
CONFIG_NETFILTER Включите этот параметр, если вы собираетесь использовать ваш компьютер в качестве шлюза.
CONFIG_IP_NF_CONNTRACK Позволяет отслеживать соединений. Этот параметр необходим для работы функций NAT или IP-маскарадинга. На компьютере-шлюзе включите этот параметр
CONFIG_IP_NF_FTP Из-за большого количества FTP-запросов модуль IP_NF_CONNTRACK не в состоянии проследить все FTP-соединения, поэтому в помощь ему добавлен модуль CONFIG_IP_NF_FTP, отслеживающий только FTP-соединения. Включите этот параметр, если на вашем компьютере установлен FТР-сервер
CONFIG_IP_NF_MATCH_LIMIT Необязательный параметр. Позволяет ограничить количество пакетов, передаваемых/принимаемых за определенный промежуток времени
CONFIG_IP_NF_MATCH_MAC Позволяет блокировать пакеты, используя MAC-адрес (а не IP-адрес)

Все остальные опции, связанные с IPTables, содержат в своем названии слово MATCH, например, CONFIG_IP_NF_MATCH_MAC. Эти опции разрешают выполнять над пакетами определенные действия.

Фильтр IPTables может загружаться как модуль при первом запуске iptables, а может быть встроен в ядро постоянно (что рекомендуется). Модуль фильтра filter называется iptable_filter.o.

У вас может быть установлен модуль ipchains.o и соответствующий ему сервис — ipchains. Этот модуль несовместим с iptables, поэтому вы должны выбрать, какой из них вы будете использовать.

19.6.3. Первичная настройка IPTables. Задание политики по умолчанию.

Если к пакету не может быть применено ни одно правило из стандартной цепочки, то судьбу этого пакета определяет политика цепочки — действие по умолчанию. Значением политики может быть либо ACCEPT (принять), либо DROP (отклонить), либо REJECT (отклонить с уведомлением источника). Первоначально встроенные цепочки не содержат ни одного правила, а политикой имеют ACCEPT, поэтому первое, что нужно сделать, — это установить в целях безопасности действие DROP:

# iptables -P INPUT DROP.

# iptables -P OUTPUT DROP.

# iptables -P FORWARD DROP.

19.6.4. Действия над цепочками.

Рекомендуется создавать отдельные цепочки для различных объектов фильтрации. Это позволяет логически группировать правила. Для создания новой цепочки используется опция -N, за которой следует имя новой цепочки (напоминаю, что имена пользовательских цепочек пишутся строчными буквами):

Iptables -N имя_цепочки.

Ключи программы iptables, предназначенные для манипуляций с цепочками и правилами в них, точно такие же, как у программы ipchains (таблица 19.2).

19.6.5. Правила фильтрации.

Задание правил фильтрации IPTables похоже на задание правил в IPChains. Для создания правила используется опция --append (или -А). После этой опции указывается имя цепочки и критерий выбора пакетов в этой цепочке. Затем указывается опция --jump (или -j), значением которой служит действие (ACCEPT, DROP и т.п.):

Iptables -A INPUT критерий_выбора -j действие.

В качестве критерия выбора обычно указываются либо порты, либо IP-адреса, либо MAC-адрес. По этим параметрам и будет «вылавливаться» пакеты из цепочки. Можно задать сразу несколько критериев выбора, перечислив их друг за другом.

Фильтрация по портам, IP-адресу и MAC-адресу в IPTables задается с помощью следующих критериев выбора:

♦ -p протокол — задает протокол, по которому будет производиться отбор пакетов. Может принимать значение all, что означает «все протоколы»;

♦ -s адрес (или --source адрес) — задает исходный IP-адрес, по которому будет производиться отбор пакетов. В качестве значения может указываться сетевая маска или порт;

♦ -d адрес (или --destination адрес) — задает IP-адрес получателя, по которому будет производиться отбор пакетов. В качестве значения может указываться сетевая маска или порт;

♦ -i интерфейс — задает входной интерфейс (eth0, ppp0 и т.п.), с которого будет производиться отбор пакетов. Этот критерий работает только в цепочках INPUT и FORWARD. При задании интерфейса может использоваться знак «+», означающий «все интерфейсы заданного типа». Например, запись ppp+ означает все интерфейсы ppp (ppp0-pppN);

♦ -о интерфейс — задает выходной интерфейс (eth0, ppp0 и т.п.), с которого будет производиться отбор пакетов. Способ задания такой же, что и для предыдущего случая. Этот критерий работает только в выходных цепочках (OUTPUT);

♦ --sport порт[:порт] (или --source-port порт[:порт]) — задает исходный порт или диапазон исходных портов, по которому будет производиться отбор пакетов. Эта опция может использоваться только после опций -p tcp или -p udp. Диапазон портов задается номером первого и конечного портов, разделенных двоеточием;

♦ --dport порт [:порт] (или --destination-port порт[:порт]) — задает порт назначения или диапазон портов назначения, по которому будет производиться отбор пакетов. Эта опция может использоваться только после опций -p tcp или -p udp. Диапазон портов задается номером первого и конечного портов, разделенных двоеточием;

♦ --port порт [,порт] — позволяет задать порты, которые будут восприниматься и как порты источника, и как порты назначения. Использование этого критерия возможно только после использования -p tcp или -p udp и опции -m multiport;

♦ -m состояние — задает состояние соединения. В качестве состояния возможно указание большого количества вариантов. За подробной информацией обращайтесь к справочной системе. Некоторые варианты использования данного критерия приведены ниже, на практических примерах;

♦ --mac-source мак_адрес — задает MAC-адрес, по которому будет производиться отбор пакетов. Возможно только после использования критерия -m mac.

Рассмотрим теперь практические примеры. Выделить пакеты, приходящие от узла с MAC-адресом 11:12:13:14:15:16, можно с помощью правила:

Iptables -A INPUT --mac-source 11:12:13:14:15:16 -j ...

Потом вы уже сами определите действие после опции -j. Если же нам нужно выделить все пакеты, кроме тех, которые присылает узел с этим MAC-адресом, то нужно использовать символ инверсии «!».

IPTables позволяет указывать несколько портов (не больше 15) через запятую, например:

Iptables -A INPUT -p tcp -m multiport --sport 22,53,80,110 -j ...

Вместо портов источника вы можете указать порты назначения, используя опцию --dport.

Если вы хотите одновременно указать как порты источника, так и порты назначения, используйте опцию --port:

Iptables -A INPUT -p tcp -m multiport --port 22,53,80,110.

19.6.6. Фильтрация по отдельным пользователям.

Если IPChains умел отфильтровывать только пакеты, исходящие от определенного компьютера, то теперь мы можем выделять пакеты отдельных пользователей. Для этого предназначены следующие критерии, которые могут использоваться только для исходящих пакетов в цепочке OUTPUT:

♦ --uid-owner UID — отбор пакетов по UID пользователя;

♦ --gid-owner GID — отбор по группе (GID);

♦ --pid-owner PID — отбор по идентификатору процесса;

♦ --sid-owner SID — отбор по идентификатору сеанса.

Например, выделить все пакеты, исходящие от пользователя с UID 500, можно так:

Iptables -A OUTPUT -m owner --uid-owner 500.

Аналогично мы можем ограничивать исходящие пакеты группы или процесса:

Iptables -A OUTPUT -m owner --gid-owner 0.

Iptables -A OUTPUT -m owner --pid-owner 78.

Естественно, мы можем сделать это только для исходящих пакетов, поскольку мы не знаем, какой UID имеет пользователь другой системы: информация об этом не передается по протоколу TCP.