Files
DanielLavrushin_tspu-docs/docs/filter.md
T

43 KiB
Raw Blame History

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: Фильтр: аппаратная платформа →