43 KiB
10. Фильтр: принцип работы
← Оглавление · ← Раздел 9: Балансировщик: мониторинг и диагностика
Фильтр — основное устройство ТСПУ: он анализирует трафик и применяет к нему политики блокировки. Это сервер EcoFilter на платформе RDP.ru EcoSGE. Программный комплекс фильтра вырос из CGNAT-устройства, и трафик на нём обрабатывает процесс EcoNAT — на всех ядрах процессора, кроме одного сервисного (раздел 6.5.2). Из функций платформы (NAT, BRAS, управление качеством сервиса, URL-фильтрация, DPI) в ТСПУ задействованы две: EcoFilter — фильтрация по спискам (реестр Роскомнадзора и другие списки) и EcoDPI — распознавание протоколов и приложений вплоть до седьмого уровня модели OSI. Происхождением от CGNAT объясняются понятия, с которыми приходится работать на фильтре: пулы, трансляции и сессии, секция общих параметров nat_defaults (разделы 11.6, 12, 15.2 и 16).
10.1. Путь пакета через фильтр
Порты фильтра, через которые идёт трафик, объединены в пары: чётный порт пары — LAN (сторона абонентов), нечётный — WAN (сторона интернета) (раздел 11.5). По этой ориентации фильтр определяет, какой адрес сессии локальный (абонентский), а какой удалённый (раздел 12.5), поэтому перепутанные LAN и WAN нарушают обработку (раздел 23.6). Проходящий через фильтр кадр покидает его только через парный порт. Исключение — пакеты, которые фильтр сам формирует при блокировке: ответ абоненту (перенаправление или TCP Reset) уходит обратно в LAN-порт, через который пришёл запрос. За балансировщиком кадр приходит с 4-байтным служебным заголовком: по нему фильтр выбирает ядро для обработки и с тем же заголовком возвращает кадр на балансировщик (раздел 6.5.3).
Так фильтры подключаются в ТСПУ тип А. В эшелонированной системе (ТСПУ тип Б) фильтр подключён к балансировщику Eco Highway по схеме on-a-stick: порты равноправны, направление обозначает служебный VLAN-тег, который фильтр после обработки меняет на парный, а распознаванием протоколов фильтры там не занимаются (разделы 4.3.3 и 4.3.4).
Каждый пакет проходит цепочку проверок. Если на каком-то этапе пакет под обработку не подпадает, фильтр сразу передаёт его в парный порт без изменений, и пакет продолжает путь по сети оператора так, будто фильтра в тракте нет. До движка DPI доходит только трафик, прошедший все предварительные проверки:
Кадр от балансировщика (или от байпаса)
│
▼
┌──────────────────────────────────┐
│ 1. В кадре есть IP-пакет? ├─ нет ─► в парный порт без обработки
└─────────────────┬────────────────┘
│ да
▼
┌──────────────────────────────────┐
│ 2. Пакет попал в пул ├─ нет ─► в парный порт без обработки
│ (совпал с ACL пула)? │
└─────────────────┬────────────────┘
│ да: сессия найдена или заведена
▼
┌──────────────────────────────────┐
│ 3. Адреса пакета входят ├─ нет ─► в парный порт без обработки
│ в обработку DPI-листа? │
└─────────────────┬────────────────┘
│ да
▼
┌──────────────────────────────────┐
│ 4. Анализ движком DPI │
└─────────────────┬────────────────┘
┌────────┴────────┐
▼ ▼
Пропустить Заблокировать
(в парный порт) (drop, TCP Reset,
перенаправление)
Даже первую, самую простую проверку («IP-пакет или нет») выполняет программное ядро фильтра — процесс EcoNAT. Если процесс завис или фильтр перегружен настолько, что перестал обрабатывать трафик, не проходит и она: keep-alive-пакеты балансировщика перестают возвращаться, и балансировщик переводит эту пару портов в программный байпас, а при включённой перебалансировке перераспределяет её трафик по остальным парам портов (раздел 6.6). Поэтому keep-alive проверяют не только физический канал, но и то, что фильтр продолжает обрабатывать трафик. В схеме без балансировщика ту же роль играют heartbeat-пакеты байпаса (раздел 5.1).
10.1.1. Проверка: IP-пакет или нет
Сначала фильтр ищет в кадре IP-пакет. Инкапсуляция на стыке оператора зависит от его технологий и от места установки ТСПУ, и вариантов много:
- IP-пакет без дополнительных заголовков;
- пакет с одним или двумя VLAN-тегами (QinQ);
- пакет с MPLS-метками — с VLAN-тегами или без них;
- PPPoE-трафик, в том числе с двумя VLAN-тегами и внутри MPLS;
- и другие комбинации.
Фильтр не снимает эти заголовки, а разбирает стек, чтобы добраться до IP-пакета: MPLS-метки он просматривает до конца стека, а сколько VLAN-тегов разбирать, задаёт параметр vlan_mode (VLAN Mode) в секции nat_defaults (раздел 15.2.1):
Значение vlan_mode |
Где фильтр ищет IP-пакет |
|---|---|
untagged (по умолчанию) |
только в нетегированных кадрах; кадры с VLAN-тегами проходят без обработки |
vlan |
в нетегированных кадрах и кадрах с одним VLAN-тегом |
qinq |
в нетегированных кадрах и кадрах с одним или двумя VLAN-тегами |
В ТСПУ параметр всегда должен быть qinq. При другом значении часть тегированного трафика (при untagged — весь, при vlan — кадры с двумя тегами) проходит через фильтр прозрачно, без обработки, — и внешне это никак не проявляется: трафик идёт, просто не фильтруется.
По документации производителя в режимах vlan и qinq VLAN-тег не разделяет абонентов: одинаковые IP-адреса в разных VLAN фильтр считает одним и тем же абонентом, и передача трафика может нарушаться. Это стоит учитывать, если адресные пространства в разных VLAN оператора пересекаются.
В документации производителя описаны ещё две настройки этого этапа:
inner_vlanиouter_vlan— значения TPID внутреннего и внешнего VLAN-тегов (по умолчанию оба 0x8100). Они доступны на платформах с сетевыми контроллерами Intel серий 710/810 и нужны для правильной обработки QinQ: значение задаётся для всего устройства и должно совпадать с тем, как теги формирует оборудование оператора (например, TPID 0x88A8 у внешнего тега по IEEE 802.1ad или встречающийся на старом оборудовании 0x9100);pppoe_analyzer— обработка трафика PPPoE (по умолчанию выключена). При установке ТСПУ до BRAS, где идёт PPPoE-трафик (раздел 3.1.1), её стоит проверить.
У фильтра ограничений на типы инкапсуляции больше, чем у балансировщика (раздел 6.7): например, балансировщик разбирает до трёх VLAN-тегов, а фильтр — не больше двух. Кадр, в котором фильтр IP-пакет не нашёл, проходит через него прозрачно, без анализа.
Кадры без IP-пакета фильтр передаёт в парный порт на этой же проверке. За балансировщиком до фильтра доходят практически только keep-alive-пакеты балансировщика — прочие не-IP-кадры балансировщик пропускает сам, не отправляя на фильтры (раздел 6.7). Keep-alive возвращаются на балансировщик, который по времени их прохождения контролирует путь через фильтр (раздел 6.6.1). В схеме без балансировщика через фильтр прозрачно проходят и служебные кадры сети оператора — например, ARP или LACP, а heartbeat-кадры байпаса Silicom, подключённого к фильтру напрямую, тоже проходят в парный порт без обработки (раздел 5.4).
10.1.2. Проверка по ACL (привязка к пулу)
Найденный IP-пакет фильтр проверяет на принадлежность к пулу. Пул — понятие из CGNAT: там он задаёт тип трансляции и набор внешних адресов, а привязанный к пулу ACL (Access Control List) определяет, какой трафик этот пул обслуживает. DPI обрабатывает только трафик, попавший в какой-либо пул, поэтому пул нужен и там, где адреса не транслируются. В ТСПУ используются пулы типа fake: трансляции в них нет — что пришло, то и ушло.
Минимальная рабочая настройка — включённый (enable) пул типа fake с привязанным ACL. Новый пул создаётся с типом cgnat, поэтому тип fake задаётся явно (раздел 16).
Правило ACL состоит из:
- номера — правила проверяются в порядке возрастания номеров, и решает первое совпавшее; номера удобно задавать с шагом (10, 20, 30), чтобы потом вставлять правила между существующими;
- действия —
allowилиpermit(синонимы) либоdeny; - протокола —
ip(любой),tcp,udpилиicmp; - источника и назначения —
any, отдельный адрес, диапазон адресов или подсеть; для TCP и UDP — также порты; - VLAN — номер или диапазон; если VLAN не указан, правило действует во всех VLAN.
Пулы перебираются в порядке приоритета: чем меньше значение priority, тем раньше проверяется пул. Для каждого пула проверяется его ACL:
- совпало правило
allow/permit— пакет обслуживается этим пулом и идёт дальше по цепочке; - совпало правило
deny— этот пул для пакета больше не рассматривается, проверяются следующие; - не совпало ни одно правило — тоже переход к следующему пулу.
Если подходящего пула не нашлось, пакет прозрачно уходит в парный порт. Назначать нескольким пулам одинаковый приоритет не следует: по документации производителя тогда будет задействован только один из них. IPv6-трафик отбирается собственными настройками пула: обработку IPv6 нужно включить, иначе сессии по IPv6 не заводятся и этот трафик проходит через фильтр прозрачно (разделы 15.4 и 16.6).
Пул выбирается при создании сессии — по первому пакету потока; следующие пакеты фильтр находит в таблице сессий, и вся дальнейшая обработка ведётся в рамках сессий (раздел 12). Здесь фильтр может и отбросить пакет ещё до DPI: по умолчанию TCP-сессия заводится только по пакету с флагом SYN, а TCP-пакет без SYN, для которого сессии нет, отбрасывается. В ТСПУ такое поведение отключают параметром permit_invalid_flow (раздел 10.2).
Важно: в заводской конфигурации фильтра пулов и ACL нет. Пока они не созданы, фильтр пропускает весь трафик прозрачно, какие бы DPI-листы ни были настроены. Признак такой ситуации — нулевая скорость создания сессий в
show cpsпри идущем через фильтр трафике (раздел 18.9).
10.1.3. Проверка по DPI-листу (IP-подсети)
Следующий этап — DPI-листы. DPI-лист объединяет настройки одной политики фильтрации: на какой трафик она распространяется, что в нём ищется (загружаемый список IP-адресов, доменов и URL, распознаваемые протоколы) и что делать при совпадении (раздел 10.1.5). Подробно настройки DPI-листов описаны в разделе 17.4.
Набор листов задан прошивкой: это листы с номерами 0–16 — лист 0 и шестнадцать листов 1–16. Каждый лист включается и выключается независимо. В более поздних версиях ПО, по документации производителя, листы создаются по мере необходимости командой create dpilist N — в стандартной конфигурации с номерами 0–24, по запросу заказчика — до 1000.
Какие адреса обрабатывает лист, задают параметры:
| Параметр | Назначение |
|---|---|
ip |
адреса и подсети абонентов (с указанием VLAN), на трафик которых действует лист |
no_ip |
локальные адреса (абонентов), исключённые из обработки листом |
no_ip_remote |
удалённые адреса (серверов), исключённые из обработки листом |
ipv6 / no_ipv6 |
то же для IPv6 |
Исключения проверяются первыми: адрес из no_ip листом не обрабатывается, даже если входит в ip. Штатно в ip задаётся сеть 0.0.0.0/0 для всех VLAN — тогда лист действует на весь трафик, дошедший до DPI. Добавить адрес абонента в no_ip — удобный способ диагностики: если у абонента после этого что-то изменилось (например, заработало приложение), этот лист на его трафик действительно влиял (раздел 17.4.8).
В более поздних версиях ПО этих параметров в описании DPI-листа уже нет (в руководстве пользователя EcoSGE 3.1.8 они остались лишь в отдельных примерах конфигурации): вместо них к листу привязывается ACL (acl, aclv6). Трафик, совпавший с разрешающим правилом, обрабатывается листом, совпавший с запрещающим — передаётся следующему листу; значение по умолчанию none равносильно permit ip any any, то есть лист действует на весь трафик. Аналог диагностики через no_ip здесь — запрещающее правило для адреса абонента в ACL листа.
Пакет, адреса которого не подпадают ни под один включённый лист, DPI не анализирует — он прозрачно уходит в парный порт. Листы применяются в порядке возрастания номера; если сработали несколько листов, выполняется действие листа с наименьшим номером. Лист с behaviour ignore других листов при этом не перекрывает: по руководству EcoSGE 3.1.8 совпавший с ним трафик передаётся на проверку следующему листу.
В ТСПУ фильтрация по реестру Роскомнадзора выполняется в листе 0. В ранних версиях ПО настройки реестра находятся прямо в листе 0; в более поздних они вынесены в отдельный раздел, лист для реестра выбирается параметром list_number (по умолчанию 0; в руководстве EcoSGE 3.1.8 значение по умолчанию не задано, и лист указывают явно), а все листы устроены одинаково (раздел 17.2). Действие (behaviour) задаётся для листа целиком, а лист 0 блокирует по реестру, поэтому распознавание протоколов (ignore) и блокировку по очищенным спискам из ЦСУ (block, например в листе 5) настраивают в других листах (раздел 22).
10.1.4. Обработка движком DPI
Трафик, прошедший предварительные проверки, анализирует движок DPI. Он сверяет трафик со списками фильтрации — IP-адресами, доменами и URL (для HTTP — по запрошенному URL, для HTTPS — по имени сервера в SNI, раздел 17.5) — и распознаёт протоколы и приложения.
Распознавание — это многофакторный анализ сессии, а не отдельного пакета: движку нужно несколько пакетов сессии в обоих направлениях. Кроме очевидных полей — адресов и портов источника и назначения — учитывается не один десяток признаков, например:
- размеры пакетов и их вариации в рамках сессии;
- частота прохождения пакетов;
- частота появления тех или иных ключевых слов внутри пакетов.
У трафика, который шифруется и намеренно скрывает свою природу (протоколы мессенджеров, обфусцированные VPN), явных полей, указывающих на протокол, нет, поэтому он распознаётся по косвенным признакам. Такое распознавание не стопроцентно: другой шифрованный трафик может быть принят, например, за Telegram, и его блокировка задела бы полезные ресурсы. Поэтому для блокировки таких протоколов применяется двухстадийная схема: сначала фильтры только распознают трафик и отправляют логи, а блокируют уже по спискам, очищенным от ложных срабатываний в ЦСУ (раздел 22). Распознавание можно обойти — например, протоколом, который маскируется под другой. Если протокол в новой версии перестал распознаваться, нужна новая сигнатура (раздел 22.3).
Модуль DPI можно выключить целиком — тогда весь трафик проходит через фильтр прозрачно, без анализа. Так проверяют, связана ли проблема абонента с обработкой на фильтре вообще (раздел 17.1.1).
10.1.5. Решение: пропустить или заблокировать (drop)
По результату анализа фильтр решает судьбу пакета: в общем случае — пропустить его в парный порт или отбросить (drop), если трафик попадает под запрещающую политику. Что делать при срабатывании, задаёт параметр behaviour DPI-листа:
behaviour |
Действие | В ТСПУ |
|---|---|---|
block |
блокировка: HTTP — перенаправление на страницу-заглушку (если задан redirect_url), HTTPS — разрыв соединения |
основной режим |
ignore |
никаких действий: срабатывание только фиксируется | распознавание протоколов |
color |
маркировка: в байт ToS IP-заголовка записывается заданное значение | не используется |
redirect |
перенаправление HTTP, HTTPS пропускается | не используется |
В более поздних версиях ПО, по документации производителя, есть также значения drop (блокировка без TCP Reset и без перенаправления), pass (пропустить, не проверяя остальными листами) и ignore_ipv4 (для IPv4 — как ignore, IPv6 блокируется).
Блокировка (block) — основной режим для реестра Роскомнадзора и для очищенных протокольных списков:
- HTTP — запрос к заблокированному ресурсу не пропускается, а абоненту отправляется ответ с перенаправлением на страницу-заглушку оператора, сообщающую, что ресурс заблокирован. Адрес страницы задаёт параметр
redirect_url; по документации производителя это ответ «307 Temporary Redirect» с этим адресом в заголовкеLocation. URL передаётся открыто, поэтому блокировать можно конкретную страницу; - HTTPS — содержимое зашифровано, и подменить ответ нельзя: ресурс определяется по домену в SNI, а соединение разрывается пакетами TCP Reset. Блокируется домен целиком (раздел 17.5.3). По документации производителя проверяется и сертификат сервера, если он передаётся открыто (до TLS 1.3), а соединение без SNI пропускается;
- трафик с MPLS-метками — ответ абоненту фильтр сам сформировать не может: MPLS-путь однонаправлен, и стек меток обратного направления фильтру неизвестен. Поэтому запрос абонента пропускается к серверу, фильтр дожидается ответного пакета в той же сессии и подменяет его содержимое на перенаправление или TCP Reset, сохраняя метки (раздел 6.8);
- протоколы, блокировка которых включена в DPI-листе (указаны в
protocolsлиста сbehaviour block) — пакеты заблокированной сессии отбрасываются, TCP Reset при этом не отправляется (см. ниже про send RST). Вместо полной блокировки протокол можно «деградировать»: параметры деградации (protocols capacity) задают для протокола значение от 0 до 100 в условных единицах (это не проценты): 0 — полная блокировка, 100 — полный пропуск, промежуточные значения — сброс части пакетов сессии с вероятностью, зависящей от значения. Сама по себе настройка деградации — даже значение 0 — ничего не блокирует: она действует только на протоколы, блокировка которых включена в DPI-листе, и не затрагивает лист распознавания сignore(раздел 17.3).
Распознавание (ignore) — первая стадия двухстадийной блокировки: лист со списком распознаваемых протоколов срабатывает, но трафик не трогает, а логи о распознанных сессиях уходят на SPFS и далее в ЦСУ (разделы 22 и 14.10). ЦСУ отсеивает ложные срабатывания и загружает очищенные списки в другой DPI-лист — с behaviour block.
Белый список. Параметр whitelist_mode переключает лист из режима чёрного списка (по умолчанию: совпавшее блокируется, остальное пропускается) в режим белого: пропускается только совпавшее, всё остальное блокируется. В ТСПУ этот режим не используется — ошибка в таком листе может отрезать абонентам весь трафик; он нужен в других сценариях, например вместе с функциями BRAS.
TCP Reset при блокировке протоколов (send RST). Приложение (например, Telegram), получив TCP Reset в ответ на попытку соединения, тут же пытается соединиться снова — непрерывно и очень быстро, порождая огромное число сессий; наблюдались случаи, когда мобильные устройства абонентов из-за этого начинали тормозить. Поэтому отправку TCP Reset при блокировке протоколов можно отключить общим параметром модуля DPI send RST, и в ТСПУ он всегда off: попытка соединения просто отбрасывается, соединение висит и обрывается по тайм-ауту, и лавины новых сессий не возникает (раздел 17.1.2). В руководствах пользователя EcoSGE такого общего параметра нет; в более поздних версиях ПО блокировку без TCP Reset и без перенаправления задают для отдельного листа значением behaviour drop.
10.2. Работа на уровне L2: фильтр как «прозрачный провод»
Хотя фильтр анализирует трафик вплоть до седьмого уровня модели OSI, в топологии сети он работает на уровне L2. Для оператора и его оборудования фильтр — прозрачный провод: кадры входят в один порт пары и выходят из парного, а изменения вносятся только в пакеты блокируемых сессий. Это обеспечивают несколько свойств и настроек; описание относится к подключению парами портов в ТСПУ тип А (о схеме on-a-stick — в разделе 4.3.3).
Нет L3-интерфейсов в тракте. В ОС Linux, на которой построен фильтр, виден только management-интерфейс. Порты тракта, как и лог-интерфейсы, отданы под управление DPDK (Data Plane Development Kit) и процессу EcoNAT, который обрабатывает пакеты напрямую, минуя сетевой стек ОС. IP-адресов у портов тракта нет: ping и traceroute с фильтра выполняются только через management-интерфейс (раздел 18.14), а собственного трафика в тракт фильтр (при выключенном LLDP — см. ниже) не инициирует. Исключение — пакеты, которые он вставляет в блокируемые сессии: перенаправление и TCP Reset, адресованные участникам сессии.
Заголовки инкапсуляции сохраняются. VLAN-теги, MPLS-метки и другие заголовки фильтр не снимает и не меняет: он разбирает их только для того, чтобы найти IP-пакет, и все манипуляции выполняет с IP-пакетом. Кадр выходит из фильтра с тем же стеком заголовков, с каким вошёл, — включая 4-байтный заголовок балансировщика.
Пересылка включена. Параметр forward_traffic в nat_defaults (по умолчанию on) разрешает пересылку кадров через фильтр; значение off нужно, только когда фильтр анализирует зеркалированный трафик и обратно от него ничего не ждут. В ТСПУ фильтр стоит в разрыв, поэтому forward_traffic всегда on, а режим работы модуля DPI (functionality_mode) — обычный, для схемы «в разрыв», а не для зеркалированного трафика (разделы 15.2.3 и 17.1.3).
LLDP выключен. По документации производителя LLDP на платформе по умолчанию включён: устройство периодически (в разных редакциях документации — раз в 30 или 60 секунд) рассылает LLDP-сообщения через все задействованные интерфейсы, и соседнее оборудование видит его в своей топологии. В ТСПУ LLDP выключают (lldp off в nat_defaults) по просьбе операторов связи: оборудование должно оставаться невидимым и не появляться на схемах их сети (раздел 15.2.5).
L2 MTU — 9216 байт. Параметр l2mtu задаёт максимальный размер принимаемого Ethernet-кадра — с заголовками, но без контрольной суммы. Кадр длиннее этого значения фильтр не пропускает, а отбрасывает (такие потери видны в выводе show interface <имя> как «Packets droped because of L2MTU»). Значение по умолчанию — 1522 байта (в более поздних версиях ПО, по документации производителя, — 9216), максимум — 9692 байта. В ТСПУ ставят 9216 — распространённый предельный размер jumbo-кадра у сетевого оборудования; на портах балансировщиков MTU выставляют около 9000 байт. Для абонентского трафика этого хватает с большим запасом, тогда как при значении 1522 не прошёл бы уже 1500-байтный IP-пакет в QinQ-кадре с заголовком балансировщика (14 + 8 + 4 + 1500 = 1526 байт). Если же оператор передаёт jumbo-кадры, кадр вместе с 4-байтным заголовком должен укладываться и в L2 MTU фильтра, и в MTU портов балансировщика — это согласуют при проектировании (раздел 6.5.3).
permit_invalid_flow включён. По умолчанию параметр выключен: TCP-сессия заводится только по пакету с флагом SYN, а TCP-пакеты без SYN, для которых сессии нет, считаются ошибочными или вредоносными и отбрасываются. Для NAT-устройства это нормальное поведение, для фильтра — опасное: он часто видит TCP-сессии не с начала, а «с середины»:
- после возврата ТСПУ из байпаса в рабочий режим — из аппаратного байпаса в Inline или из программного байпаса балансировщика, в том числе отдельной пары портов (разделы 5.5 и 6.6.2), — а также при первом включении в тракт на фильтры сразу приходит трафик множества уже установленных сессий, SYN которых фильтр не видел. С выключенным параметром фильтр будет его дропать: все эти TCP-сессии абонентов оборвутся по тайм-ауту, и их придётся устанавливать заново;
- при перераспределении трафика — когда балансировщик перебалансирует нагрузку и сессии переезжают на другой фильтр (раздел 6.6.3), а также после перезапуска фильтра, когда таблица сессий пуста;
- при несимметричном трафике — когда исходящий трафик сессии прошёл через одну площадку или один фильтр, а ответный — через другой: второй фильтр не видел SYN, с которого абонент начал соединение, и сессия там не заведётся;
- для долго молчащих TCP-соединений (по документации производителя): когда сессия на фильтре удалена по тайм-ауту неактивности, следующий пакет соединения приходит уже без SYN.
Поэтому в ТСПУ параметр всегда включён: фильтр принимает пакеты «с середины» и заводит для них сессии. Параметр глобальный — действует на всё устройство и в пулах не переопределяется; изменение применяется командой apply (раздел 15.2.6).
← Оглавление · ← Раздел 9: Балансировщик: мониторинг и диагностика · Раздел 11: Фильтр: аппаратная платформа →