NPF IN BSD Докладчик: Анастасия Антонова. ► NPF – новый пакетный фильтр в NetBSD Разработан в рамках проекта NetBSD Миндаугасом Расюкевичиусом. В репозиторий NetBSD код NPF вошел 22 августа 2010 года. Первым релизом NetBSD со входящим в поставку NPF является версия 6.0 Основные функции Сетевого фильтра: ► ► ► ► ► Отслеживать состояния активных соединений Не пропускать (фильтровать) пакеты, не подходящие под критерии, определённые в конфигурации. Не пропускать пакеты, не удовлетворяющие логике и алгоритмам работы соответствующих протоколов и приложений Бороться с различными видами DOS-атак NAT(Network Address Translation) – динамическая замена серых адресов или портов на внешние. В рамках проекта NetBSD существуют следующие пакетные фильтры: Firewall Версии NetBSD Разработчик Лицензия IPF (IP Filter) NetBSD v 1.0-v2.1 Darren Reed Ipfilter License PF (Packet Filter) NetBSD v 3.0-v5.1 OpenBSD BSD License NetBSD BSD License NPF(New NetBSD Packet Filter) v 6.0 Этапы разработки: (netbsd.org) Revision 1.1 Mon Aug 22 20:56:23 2010 (6 months, 1 week ago) by rmind (Mindaugas Rasiukevicius) Написан NPF – новый пакетный фильтр. Некоторые особенности: поддержка обработки пакетов в многопоточном режиме и минимизация блокировок в коде(MP-safe). NPF отлично масштабируется на многопроцессорных системах, в отличие от PF, в котором используется однопоточный режим работы. (new!) Revision 1.1 Mon Aug 22 20:56:23 2010 (6 months, 1 week ago) by rmind (Mindaugas Rasiukevicius) Написан NPF – новый пакетный фильтр. Некоторые особенности: Использование эффективных хэш-таблиц и красно-черных деревьев для ускорения выборки элементов. (new!) Revision 1.1 Mon Aug 22 20:56:23 2010 (6 months, 1 week ago) by rmind (Mindaugas Rasiukevicius) Написан NPF – новый пакетный фильтр. Некоторые особенности: Поддержка нескольких режимов трансляции адресов, включая NAPT (Network Address Port Translation, несколько внутренних адресов могут быть привязаны к одному реальному IP с разделением по номеру порта) и ALG (Application-Level Gateway, учет особенностей прикладных протоколов при организации трансляции адресов, например, позволяет работать через NAT ftp, p2p, h.323, sip и т.п.) Revision 1.1 Mon Aug 22 20:56:23 2010 (6 months, 1 week ago) by rmind (Mindaugas Rasiukevicius) Написан NPF – новый пакетный фильтр. Некоторые особенности: Поддержка фильтрации с учетом состояния TCP-соединений; Revision 1.1 Mon Aug 22 20:56:23 2010 (6 months, 1 week ago) by rmind (Mindaugas Rasiukevicius) Написан NPF – новый пакетный фильтр. Некоторые особенности: Модульность и расширяемость: функции NPF могут расширяться через загрузку дополнительных модулей. Для создания модулей и расширений подготовлен специальный API. В заданных пользователем правилах фильтрации могут быть встроены обращения к внешним модулям (new!) Revision 1.1 Mon Aug 22 20:56:23 2010 (6 months, 1 week ago) by rmind (Mindaugas Rasiukevicius) Написан NPF – новый пакетный фильтр. Некоторые особенности: Механизм контроля пакетов "N-Code processor" основан на идеях, реализованных в интерфейсе BPF : попадание пакетов под правила обеспечивается через формирование набора RISC-подобных инструкций и CISC-подобных команд для выполнения типовых операций (например, проверка IPv4-адреса). (new!) Revision 1.1 Mon Aug 22 20:56:23 2010 (6 months, 1 week ago) by rmind (Mindaugas Rasiukevicius) Написан NPF – новый пакетный фильтр. Некоторые особенности: Привычный, для пользователей PF и IP Filter, синтаксис файла конфигурации и типовой набор утилит; Revision 1.3 Thu Sep 16 06:53:27 2010 (5 months ago 1 week ago) by rmind Добавлена поддержка двунаправленного NAT и форвардинг портов. Фильтрация по ICMP type/code и фильтрация по флагам TCP Выборочное блокирования ICMP и TCP RST пакетов; Исправлена куча ошибок, код приведен в красивый вид Revision 1.4 Thu Nov 11 07:30:29 2010 (3 months, 2 week ago) by rmind (Mindaugas Rasiukevicius) Добавлен правильный механизм TCP-отслеживания, описанный в статье Guido van Rooij, плюс handle TCP Window Scaling option. Полностью исправлен npf_cache_t, уменьшена зернистость, упрощен код Добавлена абстракция npf_addr_t as, изменен код обработки сессий, так же как код NAT. Теперь все готово для поддержки IPv6!!!! :) Revision 1.4 Thu Nov 11 07:30:29 2010 (3 months, 2 week ago) by rmind (Mindaugas Rasiukevicius) Поддержка пересборки IPv4 пакетов. Поддержка IPv4 ID randomization and minimum TTL enforcement. Поддержка TCP MSS(Maximal Segment Size) "clamping". Random bits for IPv6. Различные изправления и приведение в порядок кода. Revision 1.5 Sat Dec 18 02:07:26 2010 (2 months, 1 week ago) by rmind (Mindaugas Rasiukevicius) Добавлено сохранение/восстановление сессий Ведение лога пакетов, настраиваемого через систему фильтров. (tcpdump и pseudo-interface) Перезагрузка без потери сессий; Пересмотрен механизм контроля сессий Добавлены некоторые счетчики для статистики, использующие percpu(9) Добавлена возможность очистки флаговых полей в заголовках IPпакетов Пофиксены различные баги Revision 1.6 Tue Jan 18 21:33:45 2010 (5 weeks, 5 days ago) by rmind (Mindaugas Rasiukevicius) Добавлена концепция концепция процедуры правил: отдельная нормализация, логирование и возможность использования других функций из rule structure. Процедура правил может быть распространена среди всех правил. Разделение происходит как на уровне ядра(npf_rproc_t), так и на уровне конфигураций ("procedure" + "apply"). Revision 1.6 Tue Jan 18 21:33:45 2010 (5 weeks, 5 days ago) by rmind (Mindaugas Rasiukevicius) Fix portmap sharing for NAT policy. Обновлена логика отслеживания(tracking) состояния TCP Добавлено if_byindex(). Используется в логировании для поиска. Исправлено traceroute ALG, и многие другие ошибки Revision 1.7 Wed Feb 2 03:20:25 2010 (3 weeks, 5 days ago) by rmind (Mindaugas Rasiukevicius) Добавлена libnpf(3) - библиотека для контроля NPF(Конфигурация, набор правил и др.) Добавлена поддержка NPF для ftp-proxy Добавлен скрипт rc.d для NPF Конвертирована npfctl(8) для использования libnpf(3), и это сделало ее менее гнетущей. Добавлено больше документаций Различные исправления Главные отличия от предыдущих NetBSDфайрволов: Умеет использовать все доступные ядра/процессоры Не просто проходит по наборам правил, но компилирует их в специальный псевдокод Расширяем и масштабируем на мультироцессорных системах Основные черты NPF: • • • • • • • Поддержка FTP proxy Механизм блокировки пакетов ICMP и TCP RST Сохранение/восстановление текущего соединения Логирование пакетов, конфигурируемые правила фильтрации пакетов. высокая производительность на многопроцессорных системах; быстрый поиск по хэш-таблице и красно-черному дереву; поддержка NAPT (Network Address Port Translation) и ALG (Application-Level Gateways), например, для traceroute; • обработчик N-Code • привычный синтаксис конфигурации и инструментов; модульность и расширяемость IP header flags cleansing • • Обработчик N-Code Движок обработки пакетов, созданный под вдохновением от BPF (Berkeley Packet Filter): Его можно программировать на отбор пакетов с использованием общих инструкций в стиле RISC и некоторых инструкций, подобных CISC, для таких распространенных шаблонов, как IP-адрес; Модульность и расширяемость • расширять NPF можно путем загрузки модуля к ядру, разработчикам предоставлен специальный API для расширений, в правилах NPF предусмотрены хуки для вызова расширений. NPF Пакетный фильтр Конфигурационная утилита npfctl Пакетный фильтр ► ► Располагается в ядре ОС и осуществляет обработку пакетов. Фильтр полностью работает в контексте ядра ОС, взаимодействие с ним осуществляется через системный ioctl. Поэтому pfctl, строго говоря, не является необходимой частью PF. Возможности фильтрации ► ► ► ► ► ► ► ► ► ► Сетевой адрес(для TCP и UDP также и порт) источника и получателя пакета Сетевой интерфейс(или их группа), на котором обрабатывается пакет, а так же на котором он появился в системе Корректность маршрута, с которого пришел пакет(Да или Нет) Флаги(для TCP) Биты типа обслуживания(ToS) Тип и код ICMP Теги пакетов Локальный пользователь(владелец сокета) Различные счетчики соединений Вероятность Правила обработки пакетов бывают: 1. match Если пакет удовлетворяет условиям правила, то указания из данного правила выполняются моментально. match-правила обычно используются для NAT, журналирования трафика, QoS и так далее. 2. block Если пакет удовлетворяет условиям правила, то он помечается как подлежащий блокировке. 3. pass Если пакет удовлетворяет условиям правила, то он помечается как подлежащий пропуску далее. Утилита pfctl • • • Предоставляет интерфейс для управления межсетевым экраном Имеет привычный синтаксис конфигурации, схожий с PF. Использует файлы по умолчанию: /dev/npf - устройство управления /etc/npf.conf - конфигурационный файл по умолчанию Команды утилиты npfctl: start Включает обработку пакетов, используя текущую загруженную конфигурацию, или другую. stop Отключает обработку пакетов. Эта команда не изменяет текущую конфигурацию утилиты и существующие сессии. reload [path] Загружает или обновляет конфигурацию из файла. В случае, если конфигурационный файл не определен в path , будет использоваться по умолчанию файл /etc/npf.conf. Все текущие сессии будут сохранены во время загрузки, за исключением тех, которые могут потерять NAT во время обновления. Политика NAT определяется типом трансляции и адресом. Следует обратить внимание, что изменение критерия фильтрации не влияет на соответствующие подключения. Операция reload (т.е. изменение набора правил, политики NAT и таблиц) является атомарной. flush Очистить конфигурацию. Удаляет все правила, таблицы, и завершает все сессии. Эта команда не отключает обработку пакетов. table tid Выводит все записи в текущей загруженной таблице, определенной tid. Выводит ошибку, если tid не существует. table tid <addr/mask> Запрашивает таблицу tid для конкретного IPv4 CIDR, определенного в addr/mask table tid [add | rem] <addr/mask> Добавляет или удаляет IPv4 CIDR, определенный в<addr/mask> sess-save Сохраняет все активные сессии. Информация будет записана в файл /var/db/npf_sessions.db. Администратор может захотеть остановить обработку пакетов до закрытия сессии. sess-load Загружает из файла сохраненные сессии. Стоит отметить, что конфигурация по умолчанию должна быть загружена до того как новая сессия. В случае изменения политики NAT, сессия, потерявшая соответствующую политику, загружена не будет. Любые существующие сессии будут закрыты в результате денной команды. Администратор может возобновить обработку пакетов после Пример конфигурационного файла: Недостатки NPF: ► В NPF еще не реализована поддержка IPv6. Разработчик ищет помощников и готов предоставить им техническую поддержку по реализации IPv6 в NPF. Спасибо за внимание!