Загружаемые соответствия
Если для полных условий соответствия модули netfilter загружаются автоматически, то неполные соответствия можно использовать, лишь явно указав в спецификации правила опцию -m (--match) с именем модуля netfilter в качестве параметра. Например, для проверки состояния соединения в спецификации правила должна присутствовать опция -m state до указания проверяемых условий. Отметим также, что для использования таких проверок может потребоваться загрузка модулей ядра.
Соответствие MAC-адресов
Условие
--mac-source
позволяет проверять соответствие MAC-адресов отправителей в заголовках канального уровня пакетов IP. Не следует забывать, что для использования этого условия в строке спецификации правила должно присутствовать также опция загрузки модуля
-m mac
Пример проверки соответствия MAC-адреса показан ниже
iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 -j DROP
Условие можно также использовать со знаком инверсии (!). Например, правило
iptables -A INPUT -m mac ! --mac-source 00:00:00:00:00:ff -j DROP
будет отбрасывать все пакеты, кроме тех, которые получены от устройства с MAC-адресом 00:00:00:00:00:ff.
Отметим, что для использования проверки по MAC-адресам должна быть включена опция ядра MAC address match support. Если для опции было выбрано значение M, потребуется также загрузить модуль ipt_mac.
Пороговые значения частоты совпадений
Опция -m limit позволяет задать пороговое значение частоты выполнения условий, по достижении которого выполняется заданная правилом операция. Такая возможность весьма полезна для организации записи о событиях в системные журналы с помощью операций LOG и ULOG. Вы можете делать запись в журнал не для каждого случая совпадения с заданными условиями, а лишь ограничиваться заданной в правиле iptables частотой таких событий. Это позволяет снизить размер журнальных файлов и сделать их более читаемыми.
Опция -m limit
может использоваться с параметрами
--limit <средняя частота>
и
--limit-burst <пиковое значение>
Первый параметр задает среднюю частоту событий (число событий в единицу времени) и указывается в формате значение/суффикс. Значение определяет число событий, а суффикс – единицу времени (/s или /second – секунда, /m или /minute– минута, /h или /hour – час, /d или /day – сутки). По умолчанию используется пороговая частота 3 пакета в час. Второй параметр определяет пик “разовой” доставки пакетов. По умолчанию для пика используется значение 5. Модуль работает следующим образом:
-
условие считается выполненным, пока значение счетчика пакетов не превысит пика limit-burst;
-
каждый пакет, соответствующий правилу, увеличивает значение счетчика на 1;
-
по истечении каждого интервала 1/limit значение счетчика уменьшается на 1.
Проиллюстрировать работу этого условия проще всего на примере школьных задач о наполнении бассейна с двумя трубами (в бассейн заданного объема вода втекает через одну трубу с переменной скоростью и вытекает с постоянной скоростью через другую трубу). Параметр limit-burst задает объем бассейна (количество помещающихся в него пакетов), а параметр limit определяет скорость вытекания через выходную трубу. Пока в бассейне есть место, правило выполняется, а как только бассейн наполнится до краев, пакеты перестанут соответствовать правилу (польется через край). Очевидно, что в пустой бассейн может сразу поместиться limit-burst пакетов, а за счет вытекания через трубу число пакетов в бассейне уменьшается на limit в единицу времени. Следовательно за это время в бассейн можно поместить до limit новых пакетов. Если пакеты не приходят, бассейн постепенно опустошается и может принять в себя больший объем.
Очевидно, что срабатывание правил с этим условием имеет определенный гистерезис по частоте доставки пакетов, т. е. частота доставки, при которой условие “включается”, будет отличаться от частоты, при которой условие будет “выключено”. Рассмотрим работу модуля на примере правила
iptables -A FORWARD -m limit -j LOG
с принятыми по умолчанию значениями параметров. Информация о первых пяти пакетах, переданных правилу, будет записана в журнальный файл, поскольку значение счетчика не достигло пика. После этого, в течение 20 минут (1/3 часа) записи производиться не будут, независимо от частоты поступления пакетов. В конце этого интервала значение счетчика уменьшится на 1 и в течение следующего 20-минутного интервала в журнальный файл может быть записан еще один пакет (т. е., будет записываться в информация о первом пакете в течение каждой 20-минутки). Счетчик пикового значения уменьшается на 1 каждые 20 (60/30) минут при отсутствии пакетов, поэтому, если в течение 100 минут (60/3 * 5) не поступит ни одного пакета, счетчик пикового значения достигнет нуля и процесс начнется заново.
Отметим, что в текущей версии не могут обрабатываться интервалы времени более 119 часов, поэтому при выборе частоты 1 пакет в сутки, значение пика не может быть меньше 3.
Вы можете использовать этот модуль для защиты от атак на службы (DoS).
Защита от атак Syn-flood:
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
Защита от хитроумных сканеров портов:
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
Защита от Ping of death:
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
Для использования этого условия в ядре должна быть включена поддержка опции limit match support. Если для опции выбрано значение M, потребуется загрузка модуля ядра ipt_limit.
hashlimit
Этот модуль добавляет новое условие проверки hashlimit, позволяющее вводить ограничения, связанные с адресом или парой “адрес-порт” для получателей/отправителей пакетов. С помощью данного условия можно задавать ограничения типа
одной строкой iptables.
Основная идея заключается в создании хэш-таблицы для каждого адреса получателя и поддержка отдельных счетчиков пакетов и байтов для каждой записи. Таким способом можно, например, вводить ограничения на скорость и число попыток организации соединения с каждым адресом, как это делает limit для всех адресов сразу. Идеальным решением было бы создание общей хэш-таблицы, которая позволяла бы связывать любые операции iptables в хеш-записями. Однако архитектура iptables не позволяет этого и остается надеяться, что решение будет реализовано в pkttables для ядер версии 2.7.
Модуль поддерживает несколько параметров:
--hashlimit
задает среднее значение потока трафика. Параметр представляет собой целое число, определяющее максимальное количество пакетов, и суффикс, который определяет единицу времени. В качестве суффикса могут использоваться значения /second, /minute, /hour, /day. По умолчанию устанавливается число пакетов в секунду.
--hashlimit-burst
задает порог, идентичный параметру limit-burst для операции limit. По умолчанию значение параметра равно 5.
--hashlimit-mode <режим>
задает режим хеширования – по адресам, портам или их комбинациям. Параметр может содержать разделенный запятыми список значений dstip, dstport, srcip, srcport. Эта опция является обязательной в команде.
--hashlimit-name foo
задает имя для файла /proc/net/ipt_hashlimit/foo. Данная опция является обязательной. Имя файла может выбираться произвольно.
--hashlimit-htable-size
задает число число элементов (bucket) в хэш-таблице;
--hashlimit-htable-max
задает максимальное количество записей в хэше;
--hashlimit-htable-expire
задает время (в миллисекундах) жизни записи в хэш-таблице. По умолчанию время жизни составляет 10000 (10 секунд).
--hashlimit-htable-gcinterval
задает интервал “сборки мусора” в хэш-таблице. По умолчанию интервал сборки составляет 1000 мсек (1 секунда).
Формат хэш-таблицы для случая –hashlimit-mode srcip показан ниже
6 24.176.97.13:0->0.0.0.0:0 345709472 460800000 115200000
9 81.156.116.140:0->0.0.0.0:0 230626752 460800000 115200000
3 67.164.9.37:0->0.0.0.0:0 230784032 460800000 115200000
7 81.192.27.171:0->0.0.0.0:0 345679904 460800000 115200000
7 219.254.119.68:0->0.0.0.0:0 460800000 460800000 115200000
9 83.104.237.111:0->0.0.0.0:0 853952 460800000 115200000
Первое поле каждой записи указывает оставшееся для данной записи время жизни (в секундах), вторая – IP-адрес и номер порта отправителя, а также IP-адрес и номер порта получателя (поля структуры dsthash_dst, описанной в файле net/ipv4/netfilter/ipt_hashlimit.c). Остальные три элемента содержат поля структуры rateinfo (см. файл net/ipv4/netfilter/ipt_hashlimit.c) credit, credit_cap1, cost2, соответственно.
Правила, включающие такие проверки должны содержать явную команду загрузки модуля -m hashlimit. Для использования этого условия в ядре должна быть включена поддержка опции hashlimit match support. Если для опции выбрано значение M, потребуется загрузка модуля ядра ipt_hashlimit.
Соответствие маркеров
Модуль mark используется для проверки соответствия маркеров, установленных для пакета. Маркеры записываются функциями ядра Linux в специальное поле буферов skb и могут использоваться в течение всего времени существования этого буфера (пакета) на данном компьютере. В современных вариантах Linux поддерживается единственный способ установки маркеров – операция MARK в iptables. В более ранних версиях (ядра серии 2.2) для этих целей использовалась операция FWMARK в ipchains, поэтому в литературе можно встретить достаточно много упоминаний об этой операции. Маркер трактуется как беззнаковое целое число и в 32-битовых системах может принимать 4294967296 значений. Такая широта диапазона значений маркеров открывает широкий простор для их использования в целях фильтрации или управления потоками трафика.
Условие
--mark <маркер>
позволяет проверить соответствие маркера в данном пакете заданному значению и выполнить по результатам проверки ту или иную операцию. Для работы с условием --mark не забывайте указывать в спецификации правила опцию загрузки модуля -m mark. При указании значения маркера для проверки можно использовать маски, записывая параметр в формате
--mark <маркер>/<маска>
В этом случае для сравнения со значением маркера в пакете используется значение (<маркер> AND <маска>).
Для работы с этим условием в ядре должна быть включена опция netfilter MARK match support. Если для опции было выбрано значение M, потребуется загрузка модуля ipt_mark.
Проверка маркеров соединений
Модуль connmark позволяет использовать в правилах iptables проверку значений маркеров, установленных с помощью операции CONNMARK. Для использования модуля правило должно в явном виде включать команду загрузки этого модуля -m conmark. Модуль использует опцию
--mark маркер[/маска]
которая задает значение маркера соединений, при котором выполняется условие, а также может включать значение маски, которая накладывается (операция AND) на значение маркера соединения перед проверкой условия.
Для работы с этим условием в ядре должна быть включена опция Connection mark match support. Если для опции было выбрано значение M, потребуется загрузка модуля ipt_connmark.
Соответствие владельца пакета
Модуль owner позволяет проверять пакеты по идентификаторам их владельцев. Для указания владельца можно использовать идентификатор процесса, сессии, группы или отдельного пользователя. Поскольку данные о владельце являются локальными, этот модуль можно использовать только в цепочках таблицы OUTPUT. Отметим, что и для локально сгенерированных пакетов информация о владельце доступна не всегда. Многие пакеты, среди которых отклики ICMP, не содержат сведений о владельце - для таких пакетов заданное условие никогда не будет выполняться.
Работая с модулем owner, не забывайте указывать в спецификации правила опцию
-m owner
Для использования этого модуля в ядре должна быть включена опция Owner match support. Если при компиляции ядра для опции было выбрано значение M, потребуется также загрузка модуля ipt_owner.
Идентификатор пользователя
Условие --uid-owner позволяет отбирать пакеты по идентификатору пользователя (ГШВ), запустившего приложение, которое сгенерировало данный пакет. Например правило
iptables -A OUTPUT -m owner --uid-owner 500
будет отбирать все пакеты, сгенерированные приложениями, которые работают от имени пользователя с идентификатором 500. Таким образом вы сможете заблокировать организацию исходящих соединений с брандмауэра от того или иного пользователя (например, разрешить такие соединения только для пользователя root).
Идентификатор группы
Условие --gid-owner позволяет отбирать пакеты по идентификатору группы (GID), к которой относится запустивший приложение пользователь. Например, условию
iptables -A OUTPUT -m owner --gid-owner 0
будут соответствовать только пакеты, сгенерированные приложениями пользователей из группы 0 (root). Это позволяет разрешать или запрещать организацию исходящих соединений с брандмауэра для отдельных групп пользователей.
Идентификатор процесса
Условие --pid-owner позволяет проверить принадлежность пакета к указанному идентификатором (PID) процессу. Правилу
iptables -A OUTPUT -m owner --pid-owner 73
будут соответствовать только пакеты, сгенерированные процессом с PID=73. Идентификаторы процессов могут достаточно часто меняться, что усложняет использование этого условия. Однако ничто не мешает собирать сведения об идентификаторах процессов в системе с помощью команды ps. Приведенный ниже пример обеспечивает беспрепятственную передачу пакетов, сгенерированных процессом xinetd.
PID=`ps aux |grep xinetd |head -n 1 |cut -b 10-14`
/usr/local/sbin/iptables -A OUTPUT -p TCP -m owner --pid-owner $PID -j ACCEPT
Идентификатор сессии
Условие --sid-owner позволяет проверить принадлежность пакета к указанной идентификатором (SID) сессии. Идентификатор сессии относится к процессу и всем порожденным им процессам, Правилу
iptables -A OUTPUT -m owner --pid-owner 120
будут соответствовать все пакеты, сгенерированные процессами с идентификатором сессии SID=120. Идентификаторы сессий могут достаточно часто меняться, что усложняет использование этого условия. Однако ничто не мешает собирать сведения об идентификаторах процессов в системе с помощью команды ps. Приведенный ниже пример обеспечивает беспрепятственную передачу пакетов, сгенерированных web-сервером Apache и всеми порожденными им процессами
SID=`ps -eo sid,args |grep httpd |head -n 1 |cut -b 1-5`
/usr/local/sbin/iptables -A OUTPUT -p TCP -m owner --sid-owner $SID -j ACCEPT
Соответствие состояния соединения
Опция соответствия --state используется совместно с модулями контроля состояния соединений в ядре Linux. Проверка состояния соединения для пакетов осуществляется с использованием данных машины состояний ядра. Это позволяет связывать пакет с тем или иным потоком трафика практически для всех протоколов, включая те, которые не используют явных соединений (stateless protocol) – например, ICMP и UDP. Для всех соединений существует время бездействия (тайм-аут), по истечении которого сведения об это соединении удаляются из таблицы контроля соединений. Использование использования соответствия --state включается с помощью команды -m state в строке спецификации правила.
В настоящее время netfilter различает 4 состояния соединения - INVALID, ESTABLISHED, NEW и RELATED. Состояние INVALID означает, что пакет не связан ни с одним из известных потоков или соединений и не является попыткой организации нового соединения. Такой пакет может появиться в результате ошибки в данных или заголовке. Состояние ESTABLISHED означает, что пакет относится к известному соединению, в котором существует двухсторонний обмен данными. Состояние NEW констатирует попытку организации нового соединения или говорит о том, что пакет связан с соединением в котором пока не организован двухсторонний обмен данными. Состояние RELATED означает, что пакет инициирует новое соединение, связанное с одним из уже открытых соединений. Например, это может быть передача данных по протоколу FTP или сообщение ICMP об ошибке в одном из имеющихся соединений TCP или UDP. Пример использования условия показан ниже
iptables -A INPUT -m state --state RELATED,ESTABLISHED
Для работы с модулем state при компиляции ядра должна быть включена опция Connection state match support. Если для опции было выбрано значение M, потребуется также загрузить модуль ipt_state.
Дополнительные функции контроля состояния соединений обеспечиваются при использовании модуля conntrack.
Соответствия для множества портов
Кроме проверки соответствия для отдельных портов и диапазонов портов, существуют два модуля multiport и mport, обеспечивающие, соответственно, проверку соответствия группы отдельных портов и группе отдельных портов и диапазонов.
Соответствие для группы портов
При задании для протоколов TCP и UDP группы портов разделенных промежутками, используется модуль
-m multiport
позволяющий задать множество отдельных портов через запятую. Модуль -m multiport может использоваться с 3 опциями
-m multiport --source-port 22,53,80,110
-m multiport --destination-port 22,53,80,110
-m multiport --port 22,53,80,110
для задания группы номеров порта отправителя, получателя или отправителя и получателя, соответственно. В последнем случае, когда задаются номера портов для отправителя и получателя с помощью одного условия --port, для выполнения условия требуется дополнительно совпадение номеров портов для отправителя и получателя3.
В условиях для группы портов может использоваться до 15 значений, задающих номера портов.
Отметим, что для ядер до версии 2.6.11 использование в одной строке соответствия для порта (диапазона) и группы портов не допускается. Такие условия просто не будут работать. Ниже приведен пример некорректного использования условий
--sport 1024:63353 -m multiport --dport 21,23,80
Результат трактовки таких некорректно заданных условий зависит от конкретной формы спецификации условий, но в любом случае не следует ожидать от подобного правила корректной работы. Начиная с версии 2.6.11 поддерживается возможность указания в одной команде отдельных портов и диапазонов, что делает ненужные описанное в следующем параграфе соответствие mport.
Для использования этого условия требуется ядро с поддержкой опции Multiple port match support. Если для опции было выбрано значение M, потребуется также загрузка модуля ipt_multiport.
Соответствие mport
Модуль mport похож на описанный выше модуль multiport, но в отличие от того позволяет в одном параметре указывать отдельные порты и диапазоны портов. Например, правило
iptables -A INPUT -p tcp -m mport --ports 20:23,80 -j DROP
будет отбрасывать все пакеты, адресованные в порты с 20 по 23, включительно, и порт 80.
Отметим, что для работы с модулем mport потребуется включить поддержку этой функции при компиляции ядра и iptables4. Для решения этой задачи нужно установить модуль mport из Patch-O-Matic и после его установки заново собрать ядро и iptables.
Соответствие типа обслуживания (TOS)
Модуль tos служит для проверки соответствия битов поля типа обслуживания (Type Of Service) в заголовках IP. Для использования модуля в строке правила нужно явно указать -m tos.
Условие проверки битов TOS имеет вид
--tos <значение>
где параметр <значение> задает шестнадцатеричное (в формате 0xNN) или символьное представление проверяемых битов TOS. Для получения списка поддерживаемых символьных имен типов обслуживания можно воспользоваться командой
iptables -m tos -h
Поле TOS обычно используется для информирования промежуточных хостов об уровнях предпочтения для данного потока и его содержимого. Никто не обязан удовлетворять эти запросы, но они могут быть приняты во внимание промежуточными маршрутизаторами при обработке пакетов.
На основании проверки битов TOS можно устанавливать для пакетов маркеры (см. описание операции MARK), которые могут быть использоваться впоследствии при обработке пакетов на данном хосте.
Для использования модуля tos требуется ядро с поддержкой опции TOS match support. Если для опции было выбрано значение M, потребуется также загрузка модуля ipt_tos.
Соответствие времени жизни (TTL)
Модуль ttl позволяет отбирать пакеты по значению поля времени жизни (TTL) в заголовках IP. Для проверки значения времени жизни служит условие
--ttl
Значение TTL может лежать в интервале от 0 до 255 и каждый маршрутизатор на пути доставки пакета уменьшает значение этого поля на 1. При достижении нулевого значения пакет отбрасывается, а его отправителю передается сообщение ICMP типа 11 с кодом 0 (значение TTL достигло 0 в процессе доставки пакета) или 1 (значение TTL достигло 0 при сборке фрагментов).
Описываемое здесь условие может использоваться только для проверки значения TTL, а для его изменения служит специальная операция TTL. Для проверки TTL не забывайте указывать в строке правила команду загрузки модуля -m ttl.
Для использования проверки TTL в ядре должна быть включена поддержка опции TTL match support. Если для опции было выбрано значение M, потребуется также загрузить модуль ipt_ttl.
Соответствие ah
Модуль ah служит для проверки значений SPI5 в заголовках AH6 пакетов IPSec7. Для использования модуля в строке спецификации следует явно указывать команду его загрузки -m ah. Условие
-m ah [!] --ahspi spi1[:spi2]
позволяет проверить соответствие поля SPI в заголовке пакета значению spi1 или диапазону значений spi1 – spi2.
Для использования этого модуля в ядре должна быть включена опция AH/ESP match support. При выборе для опции значения M потребуется также загрузить модуль ipt_ah.
Соответствие esp
Модуль esp служит для проверки значений SPI в заголовках ESP8 пакетов IPSec9. Для использования модуля в строке спецификации следует явно указывать команду его загрузки -m esp. Условие
-m esp [!] --ahspi spi1[:spi2]
позволяет проверить соответствие поля SPI в заголовке пакета значению spi1 или диапазону значений spi1 – spi2.
Для использования этого модуля в ядре должна быть включена опция AH/ESP match support. При выборе для опции значения M потребуется также загрузить модуль ipt_esp.
Расширенное соответствие состояния соединений (conntrack)
Модуль conntrack обеспечивает поддержку расширенных функций контроля за состоянием соединений. По сути, этот модуль является дополнением к описанным выше соответствиям модуля state. Модуль поддерживает целый ряд условий:
--ctstate state
Проверяет соответствие пакета указанному состоянию или группе состояний. Параметр state представляет собой список разделенных запятыми состояний для которых проверяется соответствие. Состояние INVALID относится к пакетам, не связанным с известными соединениями и не являющихся попытками организации новых, ESTABLISHED указывает на состояние при котором соединение организовано и используется для двухстороннего обмена данными, NEW относится к пакетам, инициирующим новые соединения, а RELATED – к пакетам, инициирующим новые соединения, связанные с уже известными соединениями (например, передача данных по протоколу FTP или возврат сообщения ICMP об ошибке в соединении TCP или UDP)10. Виртуальному состоянию SNAT соответствуют пакеты, у которых исходный адрес отправителя отличается от адреса получателя в отклике, а виртуальному состоянию DNAT - пакеты, в которых исходный адрес получателя отличается от адреса отправителя в отклике.
--ctproto proto
Проверяет принадлежность пакета к указанному номером или символьным именем протоколу11.
--ctorigsrc [!] address[/mask]
Проверяет соответствие исходного (нетранслированного) адреса отправителя указанному адресу или диапазону адресов.
--ctorigdst [!] address[/mask]
Проверяет соответствие исходного (нетранслированного) адреса получателя указанному адресу или диапазону адресов.
--ctreplsrc [!] address[/mask]
Проверяет соответствие адреса отправителя отклика указанному адресу или диапазону адресов.
--ctrepldst [!] address[/mask]
Проверяет соответствие адреса получателя отклика указанному адресу или диапазону адресов.
--ctstatus [NONE|EXPECTED|SEEN_REPLY|ASSURED][,...]
Проверяет соответствие пакета одному или группе внутренних состояний conntrack.
--ctexpire time[:time]
Проверяет соответствие оставшегося для пакета времени жизни заданному значению или диапазону.
Для использования этого модуля в ядре должна быть включена опция Connection tracking match support. Если для этой опции было при компиляции выбрано значение M, потребуется также загрузить модуль ipt_conntrack. Программа iptables должна быть скомпилирована с использованием поддерживающего опцию ядра.
Соответствие DSCP
Этот модуль позволяет задать условия проверки 6-битового значения DSCP12 в поле TOS заголовка IP. В соответствии с RFC 247413 значение DSCP заменяет собой значение TOS. Для проверки значений DSCP в спецификации правила должна явно присутствовать команда загрузки модуля -m dscp. Условие
--dscp <значение>
позволяет проверить числовое значение поля DSCP. Параметр можно указывать в десятичном или шестнадцатеричном формате, а его значение должно лежать в диапазоне [0-32].
Условие
--dscp-class DiffServ
служит для проверки соответствия класса обслуживания DiffServ. Параметр может принимать значения классов BE, EF, AFxx или CSx.
Для использования модуля требуется ядро со включенной опцией DSCP match support. Если при компиляции ядра для опции было выбрано значение M, потребуется также загрузка модуля ipt_dscp.
Соответствие helper-модулей
Модуль helper служит для проверки соответствия указанному модулю conntrack-helper. Для работы с модулем в строке спецификации правила должна присутствовать команда -m helper. Условие
--helper <имя conntrack-helper>
проверяет соответствие связанного с пакетом модуля conntrack-helper указанному параметром значению. Параметр содержит имя helper-модуля, если проверка осуществляется для используемых по умолчанию портов. Если же вы хотите проверить соответствие для соединений с другими портами, укажите номер порта вслед за именем модуля через дефис. Например, для пакетов связанных с FTP-сессиями можно записать параметр в форме ftp-2121.
Для ядра версии 2.6.10 поддерживаются helper-модули для протоколов TCP, UDP и ICMP, встраиваемые непосредственно в систему контроля соединений, а также SCTP (модуль ip_conntrack_proto_sctp), Amanda (модуль ip_conntrack_amanda), FTP (модуль ip_conntrack_ftp), IRC (модуль ip_conntrack_irc), TFTP (модуль ip_conntrack_tftp), а также базовый модуль контроля соединений (ip_conntrack).
Для использования этого модуля требуется ядро со включенными опциями Connection tracking, Helper match support и опциями поддержки используемых helper-модулей. При выборе для той или иной из этих опций значения M потребуется также загрузка соответствующего модуля.
Соответствие размера пакетов (length)
Модуль length позволяет проверять размеры пакетов. При использовании модуля в спецификации правила должна быть указана команда загрузки этого модуля -m length. Условие
--length length[:length]
позволяет проверить соответствие размера пакета заданному значению или диапазону значений.
Для работы с этим модулем требуется ядро со включенной опцией LENGTH match support. Если при компиляции ядра для опции было выбрано значение M, потребуется также загрузка модуля ipt_length.
Соответствие физического устройства (physdev)
Этот модуль позволяет проверять для пакетов соответствие входных и выходных портов моста. Модуль является частью инфраструктуры, обеспечивающих возможность организации прозрачных мостов с поддержкой функций брандмауэра IP и может использоваться с ядрами, начиная с версии 2.5.44. Для использования модуля в строке спецификации правила должна присутствовать команда -m physdev. Условие
--physdev-in <имя устройства>
позволяет проверить для пакета имя принявшего его интерфейса (только для цепочек INPUT, FORWARD и PREROUTING). Знак + в конце имени устройства обозначает шаблон имен, которому соответствуют все устройства, начала имени которых (все, что слева от знака +) совпадает со значением параметра. Условие можно использовать со знаком инверсии !.
Другое условие
--physdev-out <имя устройства>
позволяет проверить для пакета соответствие выходного интерфейса (только для цепочек FORWARD, OUTPUT и POSTROUTING). Отметим, что для цепочек OUTPUT в таблицах nat и mangle проверка выходного интерфейса возможна не всегда, однако такая проверка работает для цепочек OUTPUT таблицы filter. Если пакет не будет уходить с моста или на момент проверки непонятно, через какой интерфейс уйдет пакет, условие не выполняется, если в правиле не задан один из дополнительных параметров, обеспечивающих выполнение условия
--physdev-is-in
если пакет получен через интерфейс моста;
--physdev-is-out
если пакет будут передан через интерфейс моста;
--physdev-is-bridged
если для пакета используются функции моста, а не маршрутизатора (этот параметр может быть полезен только в цепочках FORWARD и POSTROUTING).
Для работы с этим модулем требуется ядро, поддерживающее опцию Physdev match support. Если при компиляции ядра для опции было выбрано значение M, потребуется также загрузка модуля ipt_physdev.
Соответствие типа пакетов (pkttype)
Этот модуль позволяет проверять соответствие типа пакетов на канальном уровне. Для работы с модулем в строке спецификации правила не забывайте указывать команду -m pkt-type. Условие
--pkt-type [unicast|broadcast|multicast]
позволяет различать пакеты с индивидуальной и групповой адресацией, а также широковещательные пакеты.
Для использования этого условия в модуле должна быть включена опция Packet type match support. Если для опции было выбрано значение M, потребуется также загрузить модуль ipt_pkttype.
Соответствие типа адреса (addrtype)
Этот модуль позволяет проверять соответствие типа адреса получателя и отправителя. Типы адресов используются стеком протоколов ядра и набор возможных типов зависит от используемого протокола сетевого уровня. Для сокета netlink в идентификаторы типа адресов определены в файле .
Таблица 1: Типы адресов сетевого уровня
Тип
|
Описание
|
UNSPEC
|
Адрес не указан (0.0.0.0).
|
UNICAST
|
Индивидуальный адрес IP (адрес шлюза или прямой маршрут в получателю)
|
LOCAL
|
Локальный адрес, принадлежащий одному из хостов, подключенных к маршрутизатору сетей.
|
BROADCAST
|
Адрес, который воспринимается и пересылается как широковещательный.
|
ANYCAST
|
Пакет, адресованный всем – воспринимается как широковещательный, но пересылается как UNICAST.
|
MULTICAST
|
Групповой адрес
|
BLACKHOLE
|
Пакет, адресованный в “черную дыру” (DROP).
|
UNREACHABLE
|
Недоступный адрес.
|
PROHIBIT
|
Запрещенный адрес.
|
THROW
|
Адрес отсутствует в таблице.
|
NAT
|
Адрес должен транслироваться (NAT).
|
XRESOLVE
|
Нужно использовать внешние средства определения типа (external resolver).
|
Опция
--src-type <тип>
используется для проверки типа адреса отправителя
--dst-type <тип>
служит для проверки типа адреса получателя.
При использовании этого модуля не забывайте включать в спецификацию правила команду загрузки модуля -m addrtype. Для использования модуля при компиляции ядра должна быть включена опция address type match support. Если при компиляции ядра для опции было выбрано значение M, потребуется также загрузить модуль ядра ipt_addrtype.
Соответствие recent
Модуль recent позволяет создавать динамические списки адресов IP для недавних пакетов и проверять соответствие адресов в полученных пакетах этим спискам. Не забывайте указывать в спецификации правила команду -m recent для работы с этим модулем. Модуль поддерживает ряд опций.
--name name
указывает имя списка, с которым работает команда. По умолчанию для списка используется имя DEFAULT.
[!] --set
эта команда служит для добавления адреса отправителя пакета в список. Если такой адрес уже есть в списке, запись будет обновлена. Команда возвращает позитивный результат (success), а в случае использования инверсии (!) - негативный (failure).
[!] --rcheck
эта опция будет проверять наличие адреса отправителя пакета в списке и возвращать true при его наличии. Знак инверсии (!) меняет возвращаемый результат на обратный.
[!] --update
эта опция будет проверять наличие адреса отправителя пакета в списке. Если адрес присутствует, соответствующая запись обновляется и возвращается значение true. При отсутствии адреса в списке возвращается значение false. Знак инверсии (!) меняет возвращаемый результат на обратный.
[!] --remove
эта опция будет проверять наличие адреса отправителя в списке и, при обнаружении, удалять удалять соответствующую запись, возвращая значение true. При отсутствии адреса в списке возвращается значение false. Знак инверсии (!) меняет возвращаемый результат на обратный.
[!] --seconds seconds
эта опция может использоваться вместе с опцией rcheck или update, задавая период (отсчет от текущего момента), в течение которого искомый адрес может находиться в списке (возраст записи). Знак инверсии (!) меняет значение опции на обратное (поиск записей, находящихся в списке более указанного параметром времени).
[!] --hitcount hits

Рисунок 1 Соответствие recent эта опция может использоваться вместе с опцией rcheck или update – при наличии этого счетчика указанные команды возвращают позитивный результат при наличии адреса в списке только в том случае, когда число принятых пакетов не меньше заданного значения. Опцию можно использовать совместно с seconds для дополнительного ужесточения условий соответствия (не менее заданного числа пакетов в заданный интервал времени. Знак инверсии (!) меняет значение опции на обратное.
--rttl
при использовании этой опции условие выполняется, если адрес присутствует в списке и значение поля TTL в текущем пакет совпадает со значением этого поля в пакете, для которого была использована опция --set. Это может быть полезно для предотвращения организации DoS-атак с использованием функций данного модуля14 и подставных адресов.
В качестве примера использования модуля рассмотрим блокировку попыток доступа к вашему брандмауэру через порт 139. Создание списка badguy позволяет в дальнейшем отбрасывать пакеты с этих адресов без дополнительных проверок.
iptables -A FORWARD -m recent --name badguy --rcheck --seconds 60 -j DROP
iptables -A FORWARD -p tcp -i eth0 --dport 139 -m recent --name badguy --set -j DROP
Если после этого вы введете команду iptables -L, то увидите (Рисунок 1), что пакеты с адресов, откуда были запросы к порту netbios-ssn в течение последней минуты будут блокироваться первым правилом без дополнительной проверки.
Для использования этого модуля требуется ядро со включенной опцией recent match support. Если для опции было выбрано значение M, потребуется также загрузка модуля ipt_recent.
Соответствие ECN
Модуль ecn используется для проверки соответствия значения поля ECN15 в заголовках TCP. Для использования модуля в строке спецификации правила должна присутствовать команда -m ecn. Модуль поддерживает проверку нескольких условий
[!] --ecn-tcp-cwr
проверяет бит CWR16 в заголовках пакетов TCP;
[!] --ecn-tcp-ece
проверяет бит ECE17 в заголовках пакетов TCP;
[!] --ecn-ip-ect [0..3]
проверяет код ECN в заголовке IPv4.
Для использования этого модуля в ядре должна быть включена опция ECN match support. Если для опции было выбрано значение M, потребуется также загрузить модуль ipt_ecn.
Условие comment
Модуль comment может использоваться для добавления комментариев в правила iptables. При использовании этого модуля строка спецификации правила должна явно включать команду загрузки модуля -m comment. Модуль использует единственный параметр
--comment <Текст комментария>
Например, для добавления комментария “Приватный блок адресов” для всех пакетов, принятых из сети 192.168.0.0/24 можно использовать правило
-A INPUT -s 192.168.0.0/16 -m comment --comment "Приватный блок адресов"
Для использования этого модуля в ядре должна быть включена опция comment match support. Если для опции было выбрано значение M, потребуется также загрузить модуль ipt_comment.
Соответствие unclean
Условие unclean не имеет никаких параметров и служит лишь для попытки удаления некорректно форматированных и необычных пакетов. Пакеты, обнаруженные с помощью проверки этого условия можно отбрасывать или записывать в системные журналы.
Это условие является пока экспериментальным и его не следует использовать в реальных межсетевых экранах.
|