
- •Iptables
- •История
- •Архитектура
- •Основные понятия
- •Принцип работы
- •Основные компоненты
- •netfilter
- •iptables
- •conntrack
- •nfnetlink
- •ipset
- •ipvs
- •Механизм определения состояний
- •Критерий состояния соединения
- •Маркировка соединений
- •Использование статистики по соединениям
- •Ограничение количества соединений
- •Отслеживание информации о соединениях
- •Действия
- •Переходы
- •Встроенные действия
- •Терминальные и нетерминальные действия
- •Таблицы
- •Таблица mangle
- •Цепочки
- •Действия
- •Таблица nat
- •Цепочки
- •Действия
- •Таблица filter
- •Цепочки
- •Действия
- •Таблица security
- •Цепочки
- •Действия
- •Таблица raw
- •Цепочки
- •Действия
- •Таблица rawpost
- •Цепочки
- •Действия
- •Критерии
- •Универсальные критерии
- •Критерии, специфичные для протоколов
- •IPsec
- •Критерии состояния соединения
- •conntrack
- •state
- •Дополнительные критерии
- •Вспомогательные критерии
- •Критерии маркировки
- •Лимитирующие критерии
- •Критерий recent
- •Критерий u32
- •Прочие критерии
- •Критерии из набора xtables-addons
- •Программы
- •Основные
- •iptables
- •ipset
- •Вспомогательные
- •Фронтенды
- •С веб-интерфейсом
- •Модули ядра
- •Параметры sysctl/procfs
- •Псевдофайлы procfs
- •Параметры, относящиеся к протоколам
- •Расширения
- •Userspace-компоненты
- •Наборы дополнительных критериев и действий
- •Patch-o-Matic
- •Команды
- •Команды модификации правил
- •Параметры определения правил
- •Модули
- •Некоторые из встроенных (входящие в стандартный пакет)
- •state
- •connlimit
- •iprange
- •multiport
- •Примечания
- •Литература
- •Ссылки
- •Лицензия

Iptables |
35 |
Критерии
Напоминаем, критерий — это логическое выражение, определяющее, соответствует ли пакет или соединение данному конкретному правилу.
В одном правиле можно указать несколько критериев. Для того, чтобы пакет был обработан правилом, должны выполняться все критерии, то есть критерии неявно объединяются логическим AND.
Также многие критерии и параметры критериев можно инвертировать, поставив перед ними восклицательный знак. В описании синтаксиса таких критериев присутствует пометка «[!]». Инверсия меняет смысл критерия или его параметра на ровно противоположный. Например, критерию -s 127.0.0.1 соответствуют все пакеты, имеющие обратный адрес 127.0.0.1, а критерию ! -s 127.0.0.1 — все пакеты, кроме имеющих обратный адрес 127.0.0.1. В ранних версиях iptables восклицательный знак можно было ставить между названием критерия и значением, например, -s ! 127.0.0.1, однако последние версии iptables (в частности, 1.4.3.2 и выше), уже не поддерживают этот синтаксис, выдавая следующую ошибку:
Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`).
Далее мы кратко рассмотрим наиболее важные и интересные критерии.
Универсальные критерии
Под этим термином понимаются критерии, применимые ко все пакетам и соединениям, независимо от протокола транспортного уровня, и не требующие подключения внешних модулей (-m).
• [!] -p, --protocol протокол
Позволяет указать протокол транспортного уровня. Наиболее часто употребляются tcp, udp, icmp и all. Протокол также можно указать с помощью номера или названия согласно перечню, приведенному в /etc/protocols. Значение «любой протокол» можно указать с помощью слова all или числа 0. Если протокол не указан, подразумевается «любой протокол».
При указании протокола становится возможным использовать специфичные для него критерии. Например, для TCP и UDP доступны критерии --sport и --dport, для ICMP — --icmp-type. Подробнее эти критерии будут рассмотрены ниже.
• [!] -s, --src, --source адрес[/маска][,адрес[/маска]...]
Определяет адрес отправителя. В качестве адреса может выступать IP-адрес (возможно с маской), имя хоста из /etc/hosts, или доменное имя (в последних двух случаях перед добавлением правила в цепочку имя резольвится в IP-адрес). Маска подсети может быть указана в классическом формате (например, 255.255.0.0) либо в формате CIDR (например, 16)[22]. Например,
iptables -I INPUT -i eth0 -s 192.168.0.0/16 -j DROP
(где eth0 — интерфейс, подключенный к интернету), позволяет заблокировать простейший вид спуфинга — из интернета не могут приходить пакеты с обратным адресом, принадлежащим к диапазону, зарезервированному для локальных сетей.
Начиная с версии iptables 1.4.6, в одном параметре -s можно указывать более одного адреса, разделяя адреса запятой. При этом для каждого адреса будет добавлено отдельное правило. Например, запись
iptables -A INPUT -i eth0 -s 192.168.0.0/16,172.16.0.0/12,10.0.0.0/8 -j DROP
эквивалентна записи

Iptables |
36 |
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
При добавлении через команду -A (вставка в конец цепочки) порядок добавляемых правил будет соответствовать порядку перечисления адресов в исходной команде, при использовании команды -I (вставка в начало цепочки либо после заданного правила) порядок будет обратным исходному.
Настойчиво не рекомендуется использовать доменные имена, для разрешения (резольва) которых требуются DNS-запросы, так как на этапе конфигурирования фаервола DNS может работать некорректно. Также, заметим, имена резольвятся всего один раз — при добавлении правила в цепочку. Впоследствии соответствующий этому имени IP-адрес может измениться, но на уже записанные правила это никак не повлияет (в них останется старый адрес). Если указать доменное имя, которое резольвится в несколько IP-адресов, то для каждого адреса будет добавлено отдельное правило (как и в случае перечисления нескольких адресов, см. выше).
• [!] -d, --dst, --destination адрес[/маска][,адрес[/маска]...]
Определяет адрес получателя. Синтаксис аналогичен -s.
Заметим, что, если использовать возможность указания нескольких адресов (перечислив их явно или указав доменное имя, резольвящееся на несколько адресов) одновременно в параметрах -s и -d, то на каждое возможное сочетание адресов будет добавлено свое правило. Например, запись
iptables -A FORWARD -s 192.168.1.1,192.168.1.2 -d 192.168.1.3,192.168.1.4 -j REJECT
эквивалентна
iptables -A FORWARD -s 192.168.1.1 -d 192.168.1.3 -j REJECT iptables -A FORWARD -s 192.168.1.1 -d 192.168.1.4 -j REJECT iptables -A FORWARD -s 192.168.1.2 -d 192.168.1.3 -j REJECT iptables -A FORWARD -s 192.168.1.2 -d 192.168.1.4 -j REJECT
• [!] -i, --in-interface имя_интерфейса
Определяет входящий сетевой интерфейс. Если указанное имя интерфейса заканчивается знаком «+» (например, tun+), то критерию соответствуют все интерфейсы, чьи названия начинаются на указанное имя (для нашего примера tun0, tun1, …). Данный критерий можно использовать в цепочках PREROUTING, INPUT и FORWARD. Например,
iptables -I INPUT -i lo -j ACCEPT
позволит принимать весь трафик, входящий через интерфейс обратной петли.
• [!] -o, --out-interface имя_интерфейса
Определяет исходящий сетевой интерфейс. Синтаксис аналогичен -i. Критерий можно использовать в цепочках FORWARD, OUTPUT и POSTROUTING. Вспоминая один из наших примеров,
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE