Пример: iptables -A INPUT -p udp –sport 53
Описание: Исходный порт, с которого был отправлен пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов вы сможете найти в файле other/services.txt. При указании номеров портов правила отрабатывают несколько быстрее. однако это менее удобно при разборе листингов скриптов. Если же вы собираетесь создавать значительные по объему наборы правил, скажем порядка нескольких сотен и более, то тут предпочтительнее использовать номера портов. Номера портов могут задаваться в виде интервала из минимального и максимального номеров, например -source-port 22:80. Если опускается минимальный порт, т.е. когда критерий записывается как –source-port :80, то в качестве начала диапазона принимается число 0. Если опускается максимальный порт, т.е. когда критерий записывается как –source-port 22: , то в качестве конца диапазона принимается число 65535. Допускается такая запись –source-port 80:22 , в этом случае iptables поменяет числа 22 и 80 местами, т.е. подобного рода запись будет преобразована в –source-port 22:80 . Как и раньше, символ ! используется для инверсии. Так критерий –source-port ! 22 подразумевает любой порт, кроме 22. Инверсия может применяться и к диапазону портов, например –source-port ! 22:80.
Критерий: –dport, –destination-port
Пример: iptables -A INPUT -p udp –dport 53
Описание: Порт, на который адресован пакет. Формат аргументов полностью аналогичен принятому в критерии –source-port.
6.4.2.3. ICMP критерии
Этот протокол используется, как правило, для передачи сообщений об ошибках и для управления соединением. Он не является подчиненным
Таблица 6-7. ICMP критерии
(Критерий – Пример – Описание)
Критерий: –icmp-type
Пример: iptables -A INPUT -p icmp –icmp-type 8
Описание: Тип сообщения
6.4.3. Явные критерии
Перед использованием этих расширений, они должны быть загружены явно, с помощью ключа -m или –match. Так, например, если мы собираемся использовать критерии state, то мы должны явно указать это в строке правила: -m state левее используемого критерия. Некоторые из этих критериев пока еще находятся в стадии разработки, а посему могут работать не всегда, однако, в большинстве случаев, они работают вполне устойчиво. Все отличие между явными и неявными критериями заключается только в том, что первые нужно подгружать явно, а вторые подгружаются автоматически.
6.4.3.1. Критерий Limit
Должен подгружаться явно ключом -m limit. Прекрасно подходит для правил, производящих запись в системный журнал (logging) и т.п. Добавляя этот критерий, мы тем самым устанавливаем предельное число пакетов в единицу времени, которое способно пропустить правило. Можно использовать символ ! для инверсии, например -m limit ! –limit 5/s. В этом случае подразумевается, что пакеты будут проходить правило только после превышения ограничения.
Более наглядно этот критерий можно представить себе как некоторую емкость с выпускным отверстием, через которое проходит определенное число пакетов за единицу времени (т.е. скорость «вытекания»). Скорость «вытекания» как раз и определяет величина –limit. Величина –limit-burst задает общий «объем емкости». А теперь представим себе правило –limit 3/minute –limit-burst 5, тогда после поступления 5 пакетов (за очень короткий промежуток времени), емкость «наполнится» и каждый последующий пакет будет вызывать «переполнение» емкости, т.е. «срабатывание» критерия. Через 20 секунд «уровень» в емкости будет понижен (в соответствии с величиной –limit), таким образом она готова будет принять еще один пакет, не вызывая «переполнения» емкости, т.е. срабатывания критерия.
Рассмотрим еще подробнее.
1. Предположим наличие правила, содержащего критерий -m limit –limit 5/second –limit-burst 10. Ключ limit-burst установил объем «емкости» равный 10-ти. Каждый пакет, который подпадает под указанное правило, направляется в эту емкость.
2. Допустим, в течение 1/1000 секунды, мы получили 10 пакетов, тогда с получением каждого пакета «уровень» в «емкости» будет возрастать: 1-2-3-4-5-6-7-8-9-10.
3. Емкость наполнилась. Теперь пакеты, подпадающие под наше ограничительное правило, больше не смогут попасть в эту «емкость» (там просто нет места), поэтому они (пакеты) пойдут дальше по набору правил, пока не будут явно восприняты одним из них, либо подвергнутся политике по-умолчанию.
4. Каждые 1/5 секунды «уровень» в воображаемой емкости снижается на 1, и так до тех пор, пока «емкость» не будет опустошена. Через секунду, после приема 10-ти пакетов «емкость» готова будет принять еще 5 пакетов.
5. Само собой разумеется, что «уровень» в «емкости» возрастает на 1 с каждым вновь пришедшим пакетом.
Таблица 6-8. Ключи критерия limit
(Ключ – Пример – Описание)
Ключ: –limit
Пример: iptables -A INPUT -m limit –limit 3/hour
Описание: Устанавливается средняя скорость «освобождения емкости» за единицу времени. В качестве аргумента указывается число пакетов и время. Допустимыми считаются следующие единицы измерения времени: /second/minute/hour/day. По умолчанию принято значение 3 пакета в час, или 3/hour. Использование флага инверсии условия ! в данном критерии недопустим.
Ключ: –limit-burst
Пример: iptables -A INPUT -m limit –limit-burst 5
Описание: Устанавливает максимальное значение числа
6.4.3.2. Критерий MAC
ПРИМЕЧАНИЕ: Модуль расширения должен подгружаться явно ключом -m mac. Упоминаю я об этом потому, что многие, забыв указать этот ключ, удивляются, почему не работает этот критерий.
Таблица 6-9. Ключи критерия MAC
(Ключ – Пример – Описание)
Ключ: –mac-source
Пример: iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01
Описание:
6.4.3.3. Критерий Mark
Критерий mark предоставляет возможность «пометить» пакеты специальным образом. Mark – специальное поле, которое существует только в области памяти ядра и связано с конкретным пакетом. Может использоваться в самых разнообразных целях, например, ограничение трафика и фильтрация. На сегодняшний день существует единственная возможность установки метки на пакет в Linux – это использование действия MARK. Поле mark представляет собой беззнаковое целое число в диапазоне от 0 до 4294967296 для 32-битных систем.
Таблица 6-10. Ключи критерия Mark
(Ключ – Пример – Описание)
Ключ: –mark
Пример: iptables -t mangle -A INPUT -m mark –mark 1
Описание: Критерий производит проверку пакетов, которые были предварительно «помечены». Метки устанавливаются действием MARK, которое мы будем рассматривать ниже. Все пакеты, проходящие через netfilter имеют специальное поле mark. Запомните, что нет никакой возможности передать состояние этого поля вместе с пакетом в сеть. Поле mark является целым беззнаковым, таким образом можно создать не более 4294967296 различных меток. Допускается использовать маску с меткам. В данном случае критерий будет выглядеть подобным образом: –mark 1/1. Если указывается маска, то выполняется логическое AND метки и маски.
6.4.3.4. Критерий Multiport
Расширение multiport позволяет указывать в тексте правила несколько портов и диапазонов портов.
ПРИМЕЧАНИЕ: Вы не сможете использовать стандартную проверку портов и расширение -m multiport (например –sport 1024:63353 -m multiport –dport 21,23,80) одновременно. Подобные правила будут просто отвергаться iptables.
Таблица 6-11. Ключи критерия Multiport
(Ключ – Пример – Описание)
Ключ: –source-port
Пример: iptables -A INPUT -p tcp -m multiport –source-port 22,53,80,110
Описание: Служит для указания списка исходящих портов. С помощью данного критерия можно указать до 15 различных портов. Названия портов в списке должны отделяться друг от друга запятыми, пробелы в списке не допустимы. Данное расширение может использоваться только совместно с критериями -p tcp или -p udp. Главным образом используется как расширенная версия обычного критерия –source-port.
Ключ: –destination-port
Пример: iptables -A INPUT -p tcp -m multiport –destination-port 22,53,80,110
Описание: Служит для указания списка входных портов. Формат задания аргументов полностью аналогичен -m multiport –source-port.
Ключ: –port
Пример: iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
Описание: Данный критерий проверяет как исходящий так и входящий порт пакета. Формат аргументов аналогичен критерию –source-port и –destination-port. Обратите внимание на то что данный критерий проверяет порты обеих направлений, т.е. если вы пишете -m multiport –port 80, то под данный критерий подпадают пакеты, идущие с порта 80 на порт 80.
6.4.3.5. Критерий Owner
Расширение owner предназначено для проверки «владельца» пакета. Изначально данное расширение было написано как пример демонстрации возможностей iptables. Допускается использовать этот критерий только в цепочке
Таблица 6-12. Ключи критерия Owner
(Ключ – Пример – Описание)
Ключ: -uid-owner
Пример: iptables -A OUTPUT -m owner –uid-owner 500
Описание: Производится проверка «владельца» по User ID (UID). Подобного рода проверка может использоваться, к примеру, для блокировки выхода в Интернет отдельных пользователей.
Ключ: –gid-owner
Пример: iptables -A OUTPUT -m owner –gid-owner 0
Описание: Производится проверка «владельца» пакета по Group ID (GID).
Ключ: –pid-owner
Пример: iptables -A OUTPUT -m owner –pid-owner 78
Описание: Производится проверка «владельца» пакета по
Ключ: –sid-owner
Пример: iptables -A OUTPUT -m owner –sid-owner 100
Описание: Производится проверка
6.4.3.6. Критерий State
Критерий state используется совместно с кодом трассировки соединений и позволяет нам получать информацию о признаке состояния соединения, что позволяет судить о состоянии соединения, причем даже для таких протоколов как