Вышел релиз iptables 1.4.8 — интерфейса к Linux-фаерволу netfilter.
Наиболее интересным новшеством данного релиза является поддержка
conntrack zones — механизма,
позволяющего корректно отслеживать соединения в случае подключения хоста к двум
или более сетям с одинаковыми адресными пространствами через разные сетевые
интерфейсы. Такая ситуация является достаточно редкой, но тем не менее довольно
неприятной, особенно в том случае, если вы не можете ничего изменить.
Стандартный Linux-фаервол netfilter использует для отслеживания соединений
интегрированную в ядро подсистему conntrack. Полученная информация затем может
использоваться при фильтрации и преобразовании пакетов. Например, именно на базе
этой информации работают критерии conntrack (проверка состояния соединения, его
устаревшая версия известна как state), connlimit (ограничение количества
одновременных соединений с одного адреса или подсети), connbytes (ограничение
соединений по количеству пакетов или байт, переданных в одном или в обоих
направлениях), connmark (работает с маркировкой ctmark, общей для всех пакетов в
соединении). Также информация conntrack автоматически используется всеми
операциями преобразования адресов и портов (SNAT, MASQUERADE, DNAT, REDIRECT,
SAME, NETMAP).
Эта информация хранится в специальной таблице (просмотреть ее можно,
например, выполнив cat /proc/net/nf_conntrack). Каждое соединение описывается
так называемым кортежем (tuple) — набором значений, в который входят адреса и
порты (в случае ICMP — типы и коды ICMP) источника и назначения при передаче
данных в прямом и обратном направлении. Очевидно, что при наличии нескольких
подсетей с одинаковыми адресными пространствами, возможно возникновение
путаницы, когда сразу нескольким соединениям ставится в соответствие одна и та
же запись в таблице соединений. Чтобы избежать такой ситуации, в кортеж был
добавлен идентификатор зоны conntrack — целое число, которое можно устанавливать
через специальное правило в таблице raw в зависимости от входящего интерфейса
(цепочку PREROUTING таблицы raw пакеты проходят еще до обработки их conntrack'ом).
Кроме того, это значение можно задать для каждого интерфейса через sysfs, минуя
iptables (псевдофайл /sys/class/net/имя_интерфейса/nf_ct_zone). Таким образом,
сетевые администраторы получили эффективный инструмент, позволяющей изящно
решить даже такую сложную задачу.
Стоит отметить, что большинство вопросов маршрутизации в описанных условиях
уже давно решено средствами iproute2 (используя ip rule, можно направить пакеты
с определенного интерфейса в соответствующую таблицу маршрутизации).
Операция установки значения conntrack zone реализуется в netfilter/iptables
новым действием CT. Это действие используется в таблице raw и позволяет задать
настройки conntrack для новых соединений. В частности, с его помощью можно:
- Отключить отслеживание соединений для данного класса пакетов (опция --notrack).
Ранее это выполнялось отдельным действием NOTRACK, которое теперь, видимо,
будет объявлено устаревшим. Отслеживание отдельных соединений имеет смысл
отключать, например, в том случае, если ты находишься под DDoS-атакой,
локализовал ее источники и используешь средства активного противодействия,
такие, как TARPIT. Если ты не отключишь трекинг для таких соединений, это
оружие может больно ударить и тебя самого. - Установить для конкретного соединения нужный вспомогательный модуль (conntrack
helper). Вспомогательные модули используются системой conntrack для
отслеживания сложных протоколов, использующих несколько соединений в рамках
одного сеанса (например, FTP, SIP, IRC, H.323 и т.п.). Теперь, если ты
используешь нестандартный порт для FTP, совсем не обязательно править
конфигурацию modprobe.conf, чтобы прописать нужный параметр для
соответствующего модуля ядра — достаточно выполнить привязку хелпера к порту
через правило netfilter'а. - Ограничить список событий conntrack, генерируемых для данного соединения
(например, реагировать только на открытие и закрытие соединения, игнорируя
изменения его состояния).
Надо заметить, что поддержка действия CT и conntrack zones была добавлена в
netfilter (т.е. в ядро) еще в начале февраля, поэтому присутствовала уже в
релизе 2.6.33. Однако модули netfilter сами по себе не могут быть использованы
без соответствующих управляющих команд из userspace, которые обычно отдаются
через утилиту iptables.
Помимо добавления поддержки действия CT, в код iptables также было внесено
несколько менее значительных изменений:
- Полная поддержка ядра 2.6.34.
- Исправлена ошибка парсинга диапазона адресов в критерии iprange.
- Улучшен парсинг номеров портов для действий MASQUERADE и REDIRECT.
- В проект импортирована утилита nfnl_osf, обеспечивающая подгрузку базы
сигнатур для критерия
osf. - Улучшена документация.