Различия
Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
dpi:dpi_components:router [2022/03/29 12:24] – создано edrudichgmailcom | dpi:dpi_components:router [2024/11/28 13:11] (текущий) – elena.krasnobryzh | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Router ====== | + | {{tag> |
+ | ====== | ||
+ | {{indexmenu_n> | ||
+ | |||
+ | ===== Общее описание ===== | ||
+ | <note tip> | ||
+ | Сам СКАТ не занимается построением таблицы маршрутизации. Он делегирует эту работу проверенным специализированным инструментам, | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | В будущих версиях в целях экономии памяти возможно появление опциональных специализированных API для связи с тем или иным демоном, | ||
+ | |||
+ | Так как BIRD строит таблицу маршрутизации в ядре ОС, то, во избежание применения этих правил самим Linux-сервером, | ||
+ | |||
+ | Системные требования описаны в разделе [[dpi: | ||
+ | |||
+ | ==== Внутренняя архитектура роутера ==== | ||
+ | {{ : | ||
+ | |||
+ | Данные из kernel route table вычитываются (rtnetlink) в RIB роутера. RIB - это префиксное дерево, | ||
+ | |||
+ | Рабочие потоки используют FIB. Эта структура заточена на многопоточный поиск (LPM - longest prefix match), но не предназначена для модификаций (удаления/ | ||
+ | |||
+ | === Значения по умолчанию в роутере === | ||
+ | |||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | |||
+ | ==== Общее описание VRF ==== | ||
+ | < | ||
+ | <note tip>В СКАТ реализован VRF Lite — он разделяет таблицы маршрутизации, | ||
+ | |||
+ | VRF (Virtual Routing and Forwarding instance) — это механизм виртуализации маршрутизации. VRF позволяет создавать виртуальные маршрутизаторы на одном физическом устройстве с независимыми таблицами маршрутизации, | ||
+ | |||
+ | Каждый VRF представляет собой отдельный VPN и не пересекается с другими VRF. | ||
+ | |||
+ | Примером может служить выделение трафика от IPTV приставки, | ||
+ | |||
+ | VRF может называться Virtual Routing Instance в Juniper, VRF в Cisco и MikroTik, но всё это — механизм виртуализации маршрутизации с аналогичными функциями. | ||
+ | |||
+ | ==== Реализация VRF Lite в СКАТ | ||
+ | {{ : | ||
+ | |||
+ | Приставка Lite означает, | ||
+ | |||
+ | Реализация VRF Lite в СКАТ выполнена с помощью Soft-Router, | ||
+ | |||
+ | Демон маршрутизации работает в изолированном пространстве для того, чтобы операционная система не стала роутером. СКАТ направляет всю сигнализацию в роутер, | ||
+ | |||
+ | В текущей версии на данный момент нет поддержки L3VPN и MPLS, но при необходимости можно настроить особую контекстную маршрутизацию. | ||
+ | VRF Lite в СКАТ — это отдельная услуга 254, которая может быть как подключена абоненту, | ||
+ | |||
+ | === Логика работы === | ||
+ | Маршрутизация в СКАТ может происходить с помощью демонов маршрутизации FRR или BIRD — это отдельный процесс, | ||
+ | |||
+ | В этом разделе рассмотрены варианты с одним пространством имен и несколькими таблицами маршрутизации, | ||
+ | |||
+ | GRT (Global routing table) на данной схеме — условное название, | ||
+ | |||
+ | Все правила и фильтры настраиваются в роутере (в данном случае — в BIRD). При запуске BIRD, когда работает СКАТ и поднимается BGP-соседство, | ||
+ | |||
+ | В СКАТ описаны всё те же N VRF, направленные на определенные таблицы с правилами маршрутизации. Каждый инстанс читает из таблиц, | ||
+ | |||
+ | СКАТ имеет свой уникальный ARP-кеш, который он строит на основе ответов на ARP-запросы. В СКАТ может быть несколько ARP-таблиц, | ||
+ | |||
+ | Вследствие **изоляции** в рамках СКАТ одна и та же подсеть может быть доступна через разные hop и разные роутеры и маршрутизироваться по-разному. После того как построится FIB, когда пойдет трафик — сначала авторизуется абонент и помещается в нужный VRF. FIB может обновляться уже после того, как абонент авторизовался. Перемещать абонента между VRF можно динамически после авторизации абонента с помощью CoA. | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | Действия при исходящем от абонента трафике: | ||
+ | - Найти, к какому VRF принадлежит абонент. | ||
+ | - Найти, куда направлен пакет. | ||
+ | - Найти в FIB, на какой hop затерминировать пакет и терминировать. **Актуально только при создании flow, далее nexthop запоминается для flow.** | ||
+ | |||
+ | Действия при входящем трафике: | ||
+ | - Анализ dest. | ||
+ | - Проверка состояния абонента. | ||
+ | - Тест на оригинацию пакета. | ||
+ | |||
+ | Для других групп абонентов все происходит аналогично изолированно, | ||
+ | |||
+ | ===== Конфигурирование подсетей TAP ===== | ||
+ | Для каждого '' | ||
+ | |||
+ | Подсети задаются параметрами '' | ||
+ | Например, | ||
+ | <code bash> | ||
+ | router_device { | ||
+ | # Имя девайса из in_dev/ | ||
+ | device=41-00.1 | ||
+ | # Имя TAP-интерфейса для девайса (default=' | ||
+ | tap=dpi41 | ||
+ | # Имя парного TAP-интерфейса в netns для девайса (default=' | ||
+ | peer=rib41 | ||
+ | |||
+ | # Какие IPv4-подсети отводим на TAP | ||
+ | subnet=10.0.2.0/ | ||
+ | subnet=8.8.8.0/ | ||
+ | |||
+ | # Какие IPv6-подсети отводим на TAP | ||
+ | subnet6=2001:: | ||
+ | # link-local адрес интерфейса, | ||
+ | subnet6=fe80:: | ||
+ | } | ||
+ | </ | ||
+ | задает две IPv4-подсети для девайса '' | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | OSPF использует мультикастные адреса 224.0.0.5 и 224.0.0.6, поэтому если на '' | ||
+ | <code bash> | ||
+ | router_device { | ||
+ | device=41-00.1 | ||
+ | tap=dpi41 | ||
+ | peer=rib41 | ||
+ | |||
+ | # OSPF multicast | ||
+ | subnet=224.0.0.5/ | ||
+ | subnet=224.0.0.6/ | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | ===== Создание veth-интерфейсов ===== | ||
+ | <note important> | ||
+ | |||
+ | Пусть у нас в fastdpi.conf заданы следующие девайсы: | ||
+ | <code bash> | ||
+ | in_dev=41-00.0 | ||
+ | out_dev=41-00.1 | ||
+ | </ | ||
+ | Предположим, | ||
+ | <note tip> | ||
+ | Чтобы перенаправить BGP-трафик c '' | ||
+ | |||
+ | Создаем '' | ||
+ | <code bash> | ||
+ | ip netns add bird | ||
+ | </ | ||
+ | |||
+ | Создаем veth пару: | ||
+ | <code bash> | ||
+ | ip link add dpi41-00.1 type veth peer name rib41-00.1 netns bird | ||
+ | </ | ||
+ | |||
+ | rib-интерфейс должен иметь IP-адрес (и IPv6, если IPv6 поддерживается). Этот адрес будет адресом BGP-пира для BGP-соседа. | ||
+ | <code bash> | ||
+ | ip netns exec bird ip address add 10.0.0.4/24 broadcast 10.0.0.255 dev rib41-00.1 | ||
+ | ip netns exec bird ip address add 2098::4/124 dev rib41-00.1 | ||
+ | # включаем ARP на интерфейсе | ||
+ | ip netns exec bird ip link set dev rib41-00.1 arp on | ||
+ | |||
+ | # set tx checksum offload off - выключаем расчет контрольной суммы на интерфейсе | ||
+ | # замечено, | ||
+ | ip netns exec bird ethtool -K rib41-00.1 tx off | ||
+ | </ | ||
+ | <note warning> | ||
+ | |||
+ | dpi-интерфейс **не должен** иметь ни IPv4, ни IPv6 адреса, | ||
+ | <code bash> | ||
+ | ip link set dev dpi41-00.1 arp off | ||
+ | # Disable IPv6 on dpiXXX interfaces (чтобы не было даже link-local адреса) | ||
+ | echo 1>/ | ||
+ | </ | ||
+ | |||
+ | Наконец, | ||
+ | <code bash> | ||
+ | ip link set dpi41-00.1 up | ||
+ | ip netns exec bird ip link set lo up | ||
+ | ip netns exec bird ip link set rib41-00.1 up | ||
+ | </ | ||
+ | |||
+ | Не забываем про firewall: | ||
+ | <code bash> | ||
+ | firewall-cmd --zone=internal --add-source=10.0.0.1/ | ||
+ | </ | ||
+ | |||
+ | Не забывайте, | ||
+ | <code bash> | ||
+ | ip netns exec bird / | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | < | ||
+ | |||
+ | СКАТ пересылает пакеты в rib-интерфейсы " | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | СКАТ **не** выставляет MTU на veth-интерфейсах. При конфигурировании veth-интерфейсов следует задать MTU штатными средствами Linux. | ||
+ | </ | ||
+ | |||
+ | ===== Настройка СКАТ ===== | ||
+ | ==== Конфигурирование СКАТ ==== | ||
+ | === Обязательные параметры === | ||
+ | Чтобы включить функционал роутера, | ||
+ | <code bash> | ||
+ | # [cold] Включение функционала роутера | ||
+ | # Булевый параметр: | ||
+ | # 0, false, off - функционал роутера отключен (default) | ||
+ | # 1, true, on - функционал роутера включен | ||
+ | # Не допускает изменения "на лету" | ||
+ | router=1 | ||
+ | </ | ||
+ | |||
+ | Далее необходимо указать, | ||
+ | <code bash> | ||
+ | # [cold] Имя net namespace, в котором запущен BIRD | ||
+ | router_netns=bird | ||
+ | # [cold] Номер таблицы маршрутизации ядра, которую использует fastDPI | ||
+ | router_kernel_table=1 | ||
+ | </ | ||
+ | |||
+ | Также обязательно должны быть заданы следующие параметры BRAS, даже если никакой из режимов BRAS не включен: | ||
+ | <code bash> | ||
+ | # Виртуальный MAC-адрес СКАТ | ||
+ | bras_arp_mac=00: | ||
+ | |||
+ | # Виртуальный IP-адрес СКАТ | ||
+ | bras_arp_ip=188.227.73.40 | ||
+ | |||
+ | # Если используется IPv6, необходимо задать виртуальные IPv6-адреса: | ||
+ | |||
+ | # Задает глобальный IPv6 адрес СКАТа | ||
+ | bras_ipv6_address=2098:: | ||
+ | |||
+ | # Задает IPv6 link-local адрес СКАТа (префикс FE80::/ | ||
+ | # Если данный параметр не задан явно, он вычисляется по bras_arp_mac | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Прочие параметры, | ||
+ | |||
+ | === Дополнительные параметры === | ||
+ | Максимальное число маршрутов задается параметрами: | ||
+ | <code bash> | ||
+ | # [cold] Максимальное число маршрутов в IPv4 route table | ||
+ | # По умолчанию = 1000000 | ||
+ | # | ||
+ | |||
+ | # [cold] Максимальное число маршрутов в IPv6 route table | ||
+ | # По умолчанию = 200000 | ||
+ | # | ||
+ | </ | ||
+ | СКАТ при старте в режиме роутера преаллоцирует память для внутренних route table в соответствии с этими параметрами. Советуем устанавливать эти опции (если необходимо) с запасом в 20-30%, чтобы в процессе работы роутера гарантированно хватило преаллоцированной памяти. | ||
+ | |||
+ | Рабочая таблица маршрутизации (FIB) СКАТ обновляется раз в '' | ||
+ | <code bash> | ||
+ | # [hot] Период обновления FIB, секунд | ||
+ | # По умолчанию - раз в 15 секунд | ||
+ | # | ||
+ | </ | ||
+ | Устанавливать данный параметр слишком маленьким (меньше 5 секунд) особого смысла нет. | ||
+ | |||
+ | Максимальный размер neighbor cache (ARP cache) и тайм-аут обновления записей этого кеша задается параметрами: | ||
+ | <code bash> | ||
+ | # [cold] Max размер ARP cache (neighbor сache для IPv6) | ||
+ | # По умолчанию - 1024, max = 32K | ||
+ | # | ||
+ | </ | ||
+ | СКАТ содержит отдельные neighbor-кеши для IPv4 и IPv6, каждый размером '' | ||
+ | |||
+ | СКАТ сам не посылает ARP-запросы для устаревших записей кеша. Вместо этого он полагается на обновление кеша со стороны ядра Linux: СКАТ мониторит ARP-ответы, | ||
+ | |||
+ | Роутер работает в отдельном потоке на отдельном ядре CPU. При старте СКАТ задает параметры этого потока по умолчанию, | ||
+ | <code bash> | ||
+ | # [cold] Добавление к приоритету служебного потока роутера (повышение приоритета) | ||
+ | # | ||
+ | |||
+ | # [cold] Ядро привязки потока роутера, | ||
+ | # | ||
+ | </ | ||
+ | Изменять эти параметры надо только в крайнем случае, | ||
+ | <note warning> | ||
+ | |||
+ | === Конфигурирование VRF === | ||
+ | Настройки '' | ||
+ | |||
+ | При подготовке fastDPI к работе в режиме роутера администратору нужно создать необходимые netns и TAP-интерфейсы для отвода трафика на route-демоны. В конфигурации '' | ||
+ | |||
+ | Каждая VRF задается отдельной новой секцией в конфигурации роутера: | ||
+ | |||
+ | == Описание таблицы маршрутизации (VRF) == | ||
+ | <code bash> | ||
+ | router_vrf { | ||
+ | id= | ||
+ | netns= | ||
+ | kernel_table= | ||
+ | neighbor_cache= | ||
+ | } | ||
+ | </ | ||
+ | <code bash> | ||
+ | router_default_vrf= | ||
+ | </ | ||
+ | |||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | |||
+ | Параметры для данной VRF: | ||
+ | |||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | |||
+ | Эти параметры определяют требуемую память и частоту обновления для данного VRF. Здесь можно указать значения по умолчанию (берутся из глобальных опций) или переопределить их. | ||
+ | |||
+ | * Если в конфигурации **нет** секций '' | ||
+ | * Если в конфигурации **есть** секции '' | ||
+ | |||
+ | **'' | ||
+ | При включении этой опции: | ||
+ | - ARP абонента к шлюзу - обрабатывается fastDPI только если абонент и шлюз в одном VRF | ||
+ | - ICMP ping шлюза - обрабатывается fastDPI только если абонент и шлюз в одном VRF | ||
+ | - local interconnect - применяется только если оба абонента в одном VRF | ||
+ | |||
+ | **'' | ||
+ | При включении этой опции пакет будет дропнут при выполнении следующих условий: | ||
+ | - IP-адрес абонента (srcIP) неизвестный для L2 BRAS | ||
+ | - bras_term_by_as = 0 | ||
+ | - AS абонента не local | ||
+ | |||
+ | == Описание router_device == | ||
+ | |||
+ | В описание '' | ||
+ | Описание одного интерфейса роутера: | ||
+ | |||
+ | <code bash> | ||
+ | router_device { | ||
+ | device= | ||
+ | tap= | ||
+ | peer= | ||
+ | vrf= | ||
+ | subnet= | ||
+ | subnet= | ||
+ | subnet6= | ||
+ | subnet6= | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | **'' | ||
+ | |||
+ | **'' | ||
+ | |||
+ | **'' | ||
+ | **'' | ||
+ | |||
+ | Каждая IPv4 и IPv6 подсеть указывается отдельно в параметре '' | ||
+ | |||
+ | <note important> | ||
+ | Например, | ||
+ | Для каждого '' | ||
+ | |||
+ | == Управление VRF абонентами == | ||
+ | VRF ID поступает в fastDPI при авторизации, | ||
+ | |||
+ | '' | ||
+ | |||
+ | Здесь “VRF_ID” — идентификатор VRF. | ||
+ | |||
+ | === Пример настройки VRF в СКАТ === | ||
+ | <code bash> | ||
+ | in_dev=0b-00.0 | ||
+ | out_dev=13-00.0 | ||
+ | |||
+ | scale_factor=1 | ||
+ | |||
+ | ctrl_port=29000 | ||
+ | ctrl_dev=lo | ||
+ | |||
+ | federal_black_list=0 | ||
+ | black_list_sm=1 | ||
+ | black_list_redirect=http:// | ||
+ | |||
+ | num_threads=1 | ||
+ | |||
+ | router=1 | ||
+ | router_vrf { | ||
+ | id=ROUTER | ||
+ | netns=router | ||
+ | kernel_table=100 | ||
+ | neighbor_cache=shared | ||
+ | } | ||
+ | |||
+ | router_vrf { | ||
+ | id=ROUTER2 | ||
+ | netns=router | ||
+ | kernel_table=101 | ||
+ | neighbor_cache=shared | ||
+ | } | ||
+ | router_device { | ||
+ | device=13-00.0 | ||
+ | vrf=ROUTER | ||
+ | tap=dpi_ospf | ||
+ | peer=rib_ospf | ||
+ | subnet=224.0.0.5/ | ||
+ | subnet=192.168.123.69/ | ||
+ | } | ||
+ | router_device { | ||
+ | device=13-00.0 | ||
+ | vrf=ROUTER2 | ||
+ | tap=dpi_bgp | ||
+ | peer=rib_bgp | ||
+ | subnet=192.168.123.70/ | ||
+ | } | ||
+ | router_subs_announce=6 | ||
+ | |||
+ | enable_auth=1 | ||
+ | auth_servers=127.0.0.1%lo: | ||
+ | bras_enable=1 | ||
+ | bras_arp_ip=10.10.102.189 | ||
+ | bras_arp_mac=00: | ||
+ | bras_dhcp_mode=1 | ||
+ | bras_dhcp_server=10.10.99.3%ens256; | ||
+ | bras_pppoe_enable=1 | ||
+ | bras_pppoe_session=100 | ||
+ | bras_ppp_auth_list=2, | ||
+ | |||
+ | enable_acct=1 | ||
+ | netflow=4 | ||
+ | netflow_timeout=300 | ||
+ | bras_pppoe_service_name=demoDPI | ||
+ | </ | ||
+ | |||
+ | ==== Задание имен veth-интерфейсов ==== | ||
+ | В fastdpi.conf описываются все TAP-интерфейсы, | ||
+ | <code bash> | ||
+ | # Описание одного интерфейса роутера | ||
+ | # ВНИМАНИЕ! ' | ||
+ | router_device { | ||
+ | # Имя девайса из in_dev/ | ||
+ | device= | ||
+ | # Имя TAP-интерфейса для девайса (default=' | ||
+ | #tap= | ||
+ | # Имя парного TAP-интерфейса в netns для девайса (default=' | ||
+ | #peer= | ||
+ | # ВНИМАНИЕ! ' | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Например, | ||
+ | <code bash> | ||
+ | in_dev=41-00.0 | ||
+ | out_dev=41-00.1 | ||
+ | </ | ||
+ | где к роутеру подключен только '' | ||
+ | <code bash> | ||
+ | in_dev=41-00.0 | ||
+ | out_dev=41-00.1 | ||
+ | |||
+ | router_device { | ||
+ | # Имя девайса из in_dev/ | ||
+ | device=41-00.1 | ||
+ | # Имя TAP-интерфейса для девайса (default=' | ||
+ | tap=dpi41 | ||
+ | # Имя парного TAP-интерфейса в netns для девайса (default=' | ||
+ | peer=rib41 | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Можно не задавать имена '' | ||
+ | <code bash> | ||
+ | in_dev=41-00.0 | ||
+ | out_dev=41-00.1 | ||
+ | |||
+ | # TAP для out_dev: | ||
+ | router_device { | ||
+ | device=41-00.1 | ||
+ | } | ||
+ | |||
+ | # TAP для in_dev | ||
+ | router_device { | ||
+ | device=41-00.0 | ||
+ | } | ||
+ | </ | ||
+ | В этом случае предполагаются такие имена TAP-интерфейсов: | ||
+ | * для '' | ||
+ | * для '' | ||
+ | |||
+ | ==== Поддержка LAG ==== | ||
+ | В СКАТ 10.1 добавлена поддержка агрегации каналов в роутере. | ||
+ | |||
+ | Для агрегированных каналов пакеты, | ||
+ | |||
+ | Каждый LAG задается отдельной секцией в fastdpi.conf, | ||
+ | <code bash> | ||
+ | # Входные/ | ||
+ | in_dev=01-00.0: | ||
+ | out_dev=01-00.1: | ||
+ | |||
+ | # Описываем LAG в сторону inet | ||
+ | lag { | ||
+ | # Необязательное имя LAG, используется только для вывода в лог | ||
+ | name=inet | ||
+ | # Каждый девайс, | ||
+ | device=01-00.1 | ||
+ | device=02-00.1 | ||
+ | } | ||
+ | |||
+ | # Описание одного интерфейса роутера | ||
+ | router_device { | ||
+ | # Имя девайса из out_dev. Только для этого девайса делаем veth-пару TAP-интерфейсов | ||
+ | device=01-00.1 | ||
+ | # Имя TAP-интерфейса для девайса (default=' | ||
+ | tap=dpi0 | ||
+ | # Имя парного TAP-интерфейса в netns для девайса (default=' | ||
+ | peer=rib0 | ||
+ | # Подсети, | ||
+ | subnet=10.0.10.0/ | ||
+ | # | ||
+ | } | ||
+ | </ | ||
+ | При таком описании отвод трафика на TAP '' | ||
+ | |||
+ | В секции '' | ||
+ | Если роутер работает как в сторону inet, так и в сторону subs (например, | ||
+ | <code bash> | ||
+ | # LAG в сторону inet | ||
+ | lag { | ||
+ | name=inet | ||
+ | device=01-00.1 | ||
+ | device=02-00.1 | ||
+ | } | ||
+ | |||
+ | # LAG в сторону subs | ||
+ | lag { | ||
+ | name=subs | ||
+ | device=01-00.0 | ||
+ | device=02-00.0 | ||
+ | } | ||
+ | </ | ||
+ | и для каждой конфигурируется отдельная секция '' | ||
+ | |||
+ | Всего возможно задать не более 10 различных lag-секций. | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | ====ARP менеджмент==== | ||
+ | |||
+ | NeighborDB - это БД nexthop, которую обслуживает сам fastDPI: посылает ARP request для выяснения MAC-адреса nexthop, обновляет ARP кеш для этих nexthop. Для обновления используются следующие опции: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Запись nexthop состоит из: | ||
+ | * nexthop IP; | ||
+ | * // | ||
+ | * // | ||
+ | * // | ||
+ | |||
+ | Управление NeighborDB (добавление/ | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | **Приоритетность в ARP кеше**\\ | ||
+ | С появлением NeighborDB в fastDPI появлились два независимых источника записей в ARP кеше: | ||
+ | * [прежний] BIRD/FRR: fastDPI отлавливает взаимодействие BIRD/FRR с соседями и соотвественно заполняет свой ARP кеш для nexthop; fastDPI не обновляет статус таких записей отправкой ARP Request, а надеется на то, что это сделает BIRD/FRR | ||
+ | * [новый] NeighborDB: fastDPI сам следит за актуальностью записей, | ||
+ | ===== Поддержка Multi-path routing (ECMP) ===== | ||
+ | В СКАТ 10.2 добавлена поддержка multi-path routing ([[https:// | ||
+ | |||
+ | СКАТ делает балансировку трафика (round-robin) на уровне flow по всем маршрутам из multi-path. | ||
+ | Балансировка на уровне flow означает, | ||
+ | |||
+ | Для включения multi-path в СКАТ не требуется никакой настройки. Поддержка ECMP включается в конфигурационных параметрах демона маршрутизации. | ||
+ | Например, | ||
+ | |||
+ | ===== Особенности анонсирования адресов ===== | ||
+ | ==== Анонсы абонентов и NAT pool ==== | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | Включение анонсирования адресов абонентов производится параметром в fastdpi.conf: | ||
+ | <code bash> | ||
+ | # [cold] Флаги анонса адресов абонентов | ||
+ | # Битовая маска | ||
+ | # Значения: | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # Значение по умолчанию: | ||
+ | # | ||
+ | |||
+ | # [hot] Метрика для анонсов адресов абонентов | ||
+ | # Значение по умолчанию = 32 | ||
+ | # | ||
+ | </ | ||
+ | {{ : | ||
+ | Подсети белых адресов NAT анонсируются только в сторону inet при старте СКАТа и при добавлении/ | ||
+ | |||
+ | {{ : | ||
+ | Адреса абонентов могут анонсироваться как в сторону inet, так и в сторону subs. Но если IP адрес абонента [[dpi: | ||
+ | |||
+ | [СКАТ 10.2+] Если в fastdpi.conf задано '' | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Анонс адресов L3-абонентов ==== | ||
+ | |||
+ | В СКАТ 10.2 действует следующий алгоритм анонсов IP-адресов [[dpi: | ||
+ | * по умолчанию, | ||
+ | * fastdpi.conf-параметр '' | ||
+ | <code bash> | ||
+ | # [hot] Анонсировать (1) или нет (0) неавторизованных (Reject) абонентов | ||
+ | # Значение по умолчанию - 0 (не анонсировать) | ||
+ | # | ||
+ | </ | ||
+ | * добавлен новый Радиус-атрибут '' | ||
+ | |||
+ | Итого при решении вопроса, | ||
+ | * если в ответе Радиуса (Accept или Reject) явно задан атрибут '' | ||
+ | * если атрибута '' | ||
+ | * Для Access-Accept (успешная авторизация) IP-адрес абонента анонсируется | ||
+ | * Для Access-Reject (неуспешная авторизация) IP-адрес анонсируется только если fastdpi.conf-параметр '' | ||
+ | |||
+ | < | ||
+ | |||
+ | Данный алгоритм также применяется для ARP-авторизации и GTP-авторизации, | ||
+ | |||
+ | Для прочих видов L2-авторизации (DHCP, PPP, — всех, где явно **выдается** IP-адрес) атрибут '' | ||
+ | |||
+ | ===== Конфигурирование Роут-демона (BIRD, FRR, etc.) ===== | ||
+ | Настройки Роут-демона (BIRD, FRR, etc.) и СКАТ **должны быть согласованы**: | ||
+ | Поддерживаемые роут-демоны: | ||
+ | - [[https:// | ||
+ | - [[http:// | ||
+ | - [[https:// | ||
+ | - [[https:// | ||
+ | |||
+ | <note tip>В примере приведен частный случай, | ||
+ | |||
+ | ==== Пример настройки BIRD ==== | ||
+ | <code bash> | ||
+ | # Указать дополнительные функции для проверки: | ||
+ | |||
+ | # Любой публичный адрес | ||
+ | function is_public() { | ||
+ | if net !~ [ 10.0.0.0/ | ||
+ | return true; | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | # Любой приватный адрес | ||
+ | function is_private() { | ||
+ | if net ~ [ 10.0.0.0/ | ||
+ | return true; | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | # Шлюз по умолчанию | ||
+ | filter default_gw { | ||
+ | if net ~ [0.0.0.0/0] then | ||
+ | accept; | ||
+ | reject; | ||
+ | } | ||
+ | |||
+ | # Описать фильтры: | ||
+ | # Маршруты, | ||
+ | filter exclude_external_routes { | ||
+ | if (source = RTS_INHERIT) && (net.len != 32) then | ||
+ | accept; | ||
+ | reject; | ||
+ | } | ||
+ | |||
+ | # Исключить маршруты из других протоколов маршрутизации, | ||
+ | filter exclude_ext_1_ip { | ||
+ | if (source = RTS_INHERIT) && (is_public() || (is_private() && (net.len != 32))) then | ||
+ | accept; | ||
+ | reject; | ||
+ | } | ||
+ | |||
+ | |||
+ | log "/ | ||
+ | router id 192.168.123.65; | ||
+ | |||
+ | debug protocols all; | ||
+ | |||
+ | # Описать таблицы | ||
+ | ipv4 table grt; | ||
+ | ipv4 table bird00; | ||
+ | ipv4 table bird01; | ||
+ | |||
+ | protocol device { | ||
+ | } | ||
+ | |||
+ | |||
+ | protocol direct { | ||
+ | disabled; | ||
+ | ipv4; # Подключение к таблице IPv4 по умолчанию | ||
+ | ipv6; # ... и к таблице IPv6 по умолчанию | ||
+ | } | ||
+ | |||
+ | # Описать " | ||
+ | protocol kernel kernel_grt { | ||
+ | ipv4 { # Подключить протокол к таблице IPv4 по каналу | ||
+ | table grt; | ||
+ | import all; # Импорт в таблицу, | ||
+ | export all; # Экспорт в протокол. Значение по умолчанию - экспорт отсутствует | ||
+ | }; | ||
+ | scan time 5; | ||
+ | learn; # Изучить пришедшие маршруты из kernel-таблицы | ||
+ | kernel table 99; # Kernel-таблица для синхронизации с (по умолчанию: | ||
+ | } | ||
+ | protocol kernel kernel_bird00 { | ||
+ | ipv4 { # Подключить протокол к таблице IPv4 по каналу | ||
+ | table bird00; | ||
+ | import all; # Импорт в таблицу, | ||
+ | export all; # Экспорт в протокол. Значение по умолчанию - экспорт отсутствует | ||
+ | }; | ||
+ | scan time 5; | ||
+ | learn; # Изучить пришедшие маршруты из kernel-таблицы | ||
+ | kernel table 100; # Kernel-таблица для синхронизации с (по умолчанию: | ||
+ | } | ||
+ | |||
+ | protocol kernel kernel_bird01 { | ||
+ | ipv4 { # Подключить протокол к таблице IPv4 по каналу | ||
+ | table bird01; | ||
+ | import all; # Импорт в таблицу, | ||
+ | export all; # Экспорт в протокол. Значение по умолчанию - экспорт отсутствует | ||
+ | }; | ||
+ | scan time 20; | ||
+ | learn; # Изучить пришедшие маршруты из kernel-таблицы | ||
+ | kernel table 101; # Kernel-таблица для синхронизации с (по умолчанию: | ||
+ | } | ||
+ | |||
+ | # Другой экземпляр для IPv6, пропускающий параметры по умолчанию | ||
+ | protocol kernel { | ||
+ | ipv6 { export all; }; | ||
+ | } | ||
+ | |||
+ | protocol static { | ||
+ | ipv4; # Снова канал IPv4 с параметрами по умолчанию | ||
+ | |||
+ | } | ||
+ | |||
+ | # Протоколы OSPF (каждый инстанс со своей таблицей) | ||
+ | protocol ospf v2 ospf_grt { | ||
+ | tick 1; | ||
+ | rfc1583compat no; | ||
+ | stub router no; | ||
+ | ecmp yes limit 16; | ||
+ | ipv4 { | ||
+ | table grt; | ||
+ | import all; | ||
+ | export all; | ||
+ | }; | ||
+ | area 0.0.0.0 { | ||
+ | networks { | ||
+ | 192.168.123.64/ | ||
+ | }; | ||
+ | interface " | ||
+ | cost 1; | ||
+ | rx buffer large; | ||
+ | type broadcast; | ||
+ | authentication none; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | protocol ospf v2 ospf_bird01 { | ||
+ | tick 1; | ||
+ | rfc1583compat no; | ||
+ | ecmp yes limit 16; | ||
+ | ipv4 { | ||
+ | table bird01; | ||
+ | import all; | ||
+ | export all; | ||
+ | #export filter exclude_ext_1_ip; | ||
+ | }; | ||
+ | area 0.0.0.0 { | ||
+ | networks { | ||
+ | 192.168.123.68/ | ||
+ | }; | ||
+ | interface " | ||
+ | cost 1; | ||
+ | rx buffer large; | ||
+ | type broadcast; | ||
+ | authentication none; | ||
+ | }; | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | # Описать " | ||
+ | protocol pipe grt_bird00 { | ||
+ | table grt; | ||
+ | peer table bird00; | ||
+ | import all; | ||
+ | export filter default_gw; | ||
+ | } | ||
+ | protocol pipe grt_bird01 { | ||
+ | table grt; | ||
+ | peer table bird01; | ||
+ | import all; # filter exclude_ext_1_ip; | ||
+ | export all; #filter default_gw; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Отладка Роутера ===== | ||
+ | Роутер СКАТа в целях отладки может записывать в pcap трафик с BIRD: | ||
+ | <code bash> | ||
+ | # [hot] Запись pcap с TAP-интерфейсов роутера | ||
+ | # Note: записывать можно и утилитой tcpdump, указав имя TAP-интерфейса. | ||
+ | # Но проблема в том, что tcpdump не работает с интерфейсами в режиме DOWN, | ||
+ | # то есть tcpdump' | ||
+ | # из состояния DOWN в состояние UP. | ||
+ | # Имена TAP-интерфейсов через ';' | ||
+ | # Для каждого TAP-интерфейса создается отдельный pcap-файл с именем | ||
+ | # tap_< | ||
+ | # | ||
+ | |||
+ | # [hot] Направление пакетов для записи pcap с TAP-интерфейсов | ||
+ | # Значения: | ||
+ | # 1 - TAP -> вовне (пакеты от TAP-интерфейса) | ||
+ | # 2 - извне -> TAP (пакеты на TAP-интерфейс) | ||
+ | # 0 или 3 - все направления | ||
+ | # | ||
+ | |||
+ | # [hot] Интервал ротации TAP pcap, секунд | ||
+ | # 0 - берется из параметра ajb_udpi_ftimeout (ajb_udpi_ftimeout задается в минутах) | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | Также можно включить запись в pcap обмена данными с ядром (rtnetlink): | ||
+ | <code bash> | ||
+ | # [hot] Записывать или нет rtnetlink messages в pcap | ||
+ | # 0 - не записывать | ||
+ | # 1 - записывать | ||
+ | # Префикс pcap-файлов = " | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | Кроме того, если включена запись пакетов в pcap по маске адреса ('' | ||
+ | |||
+ | ====Трассировка==== | ||
+ | <code bash> | ||
+ | # [hot] Флаги трассировки различных частей роутера | ||
+ | # 0x0001 | ||
+ | # 0x0002 | ||
+ | # 0x0004 | ||
+ | # 0x0010 | ||
+ | # 0x0020 | ||
+ | # 0x0040 | ||
+ | # 0x0080 | ||
+ | # 0x0100 | ||
+ | # 0x0200 | ||
+ | # 0x0400 | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | ===== CLI-команды ===== | ||
+ | СКАТ имеет набор CLI-команд по просмотру текущего состояния роутера. Полный список команд см. | ||
+ | <code bash> | ||
+ | fdpi_cli help router | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | Также не забывайте, | ||
+ | |||
+ | Кроме того, стандартная утилита Linux '' |