Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| dpi:dpi_options:router:start [2021/07/22 10:04] – [CLI-команды] mkhizhinsky | dpi:dpi_options:router:start [2022/03/29 12:25] (текущий) – удалено edrudichgmailcom | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== 20 Роутер ====== | ||
| - | {{indexmenu_n> | ||
| - | <note warning> | ||
| - | <note important> | ||
| - | |||
| - | < | ||
| - | | ||
| - | ===== Общее описание ===== | ||
| - | <note tip> | ||
| - | </ | ||
| - | Сам СКАТ не занимаетсмя построением таблицы маршрутизации. Он делегирует эту работу проверенным специализированным инструментам, | ||
| - | {{ : | ||
| - | <note tip> | ||
| - | |||
| - | В будущих версиях в целях экономии памяти возможно появление опциональных специализированных API для связи с тем или иным демоном, | ||
| - | |||
| - | Так как BIRD строит таблицу маршрутизации в ядре ОС, то, во избежание применения этих правил самим Линукс-сервером, | ||
| - | ==== Внутренняя архитектура роутера ==== | ||
| - | Данные из kernel route table вычитываются (rtnetlink) в RIB роутера. RIB - это префиксное дерево, | ||
| - | |||
| - | Рабочие потоки используют FIB. Эта структура заточена на многопоточный поиск (LPM - longest prefix match), но не предназначена для модификаций (удаления/ | ||
| - | ===== Системные требования ===== | ||
| - | Режим роутера в СКАТ требует довольно много памяти, | ||
| - | |||
| - | ===== Задание имен veth-интерфейсов ===== | ||
| - | В fastdpi.conf описываются все TAP-интерфейсы, | ||
| - | < | ||
| - | # Описание одного интерфейса роутера | ||
| - | # ВНИМАНИЕ! ' | ||
| - | router_device { | ||
| - | # Имя девайса из in_dev/ | ||
| - | device= | ||
| - | # Имя TAP-интерфейса для девайса (default=' | ||
| - | #tap= | ||
| - | # Имя парного TAP-интерфейса в netns для девайса (default=' | ||
| - | #peer= | ||
| - | # ВНИМАНИЕ! ' | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Например, | ||
| - | < | ||
| - | in_dev=41-00.0 | ||
| - | out_dev=41-00.1 | ||
| - | </ | ||
| - | где к роутеру подключен только '' | ||
| - | < | ||
| - | in_dev=41-00.0 | ||
| - | out_dev=41-00.1 | ||
| - | |||
| - | router_device { | ||
| - | # Имя девайса из in_dev/ | ||
| - | device=41-00.1 | ||
| - | # Имя TAP-интерфейса для девайса (default=' | ||
| - | tap=tap41 | ||
| - | # Имя парного TAP-интерфейса в netns для девайса (default=' | ||
| - | peer=bgp41 | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Можно не задавать имена '' | ||
| - | < | ||
| - | 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-интерфейсов: | ||
| - | * для '' | ||
| - | * для '' | ||
| - | |||
| - | ===== Конфигурирование подсетей TAP ===== | ||
| - | Для каждого '' | ||
| - | |||
| - | Подсети задаются параметрами '' | ||
| - | Например, | ||
| - | < | ||
| - | router_device { | ||
| - | # Имя девайса из in_dev/ | ||
| - | device=41-00.1 | ||
| - | # Имя TAP-интерфейса для девайса (default=' | ||
| - | tap=tap41 | ||
| - | # Имя парного TAP-интерфейса в netns для девайса (default=' | ||
| - | peer=bgp41 | ||
| - | |||
| - | # Какие 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, поэтому если на '' | ||
| - | < | ||
| - | router_device { | ||
| - | device=41-00.1 | ||
| - | tap=tap41 | ||
| - | peer=bgp41 | ||
| - | |||
| - | # OSPF multicast | ||
| - | subnet=224.0.0.5/ | ||
| - | subnet=224.0.0.6/ | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <note warning> | ||
| - | |||
| - | ===== Создание veth-интерфейсов ===== | ||
| - | <note important> | ||
| - | |||
| - | Пусть у нас в fastdpi.conf заданы следующие девайсы: | ||
| - | < | ||
| - | in_dev=41-00.0 | ||
| - | out_dev=41-00.1 | ||
| - | </ | ||
| - | Предположим, | ||
| - | <note tip> | ||
| - | Чтобы перенаправить BGP-трафик c '' | ||
| - | |||
| - | Создаем '' | ||
| - | < | ||
| - | ip netns add bird | ||
| - | </ | ||
| - | |||
| - | Создаем veth пару: | ||
| - | < | ||
| - | ip link add dpi41-00.1 type veth peer name rib41-00.1 netns bird | ||
| - | </ | ||
| - | |||
| - | rib-интерфейс должен иметь IP-адрес (и IPv6, если IPv6 поддерживается). Этот адрес будет адресом BGP-пира для BGP-соседа. | ||
| - | < | ||
| - | 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 адреса, | ||
| - | < | ||
| - | ip link set dev dpi41-00.1 arp off | ||
| - | # Disable IPv6 on dpiXXX interfaces (чтобы не было даже link-local адреса) | ||
| - | echo 1>/ | ||
| - | </ | ||
| - | |||
| - | Наконец, | ||
| - | < | ||
| - | 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: | ||
| - | < | ||
| - | firewall-cmd --zone=internal --add-source=10.0.0.1/ | ||
| - | firewall-cmd --zone=internal --add-rich-rule=' | ||
| - | </ | ||
| - | |||
| - | Не забывайте, | ||
| - | < | ||
| - | ip netns exec bird / | ||
| - | </ | ||
| - | |||
| - | <note important> | ||
| - | |||
| - | < | ||
| - | |||
| - | СКАТ пересылает пакеты в rib-интерфейсы " | ||
| - | |||
| - | В fastdpi.conf vlan-интерфейсы, | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | |||
| - | СКАТ **не** выставляет MTU на veth-интерфейсах. При конфигурировании veth-интерфейсов следует задать MTU штатными средствами Линукса. | ||
| - | </ | ||
| - | |||
| - | ===== Поддержка LAG ===== | ||
| - | В СКАТ 10.1 добавлена поддержка агрегации каналов в роутере. | ||
| - | |||
| - | Для агрегированных каналов пакеты, | ||
| - | |||
| - | Каждый LAG задается отдельной секцией в fastdpi.conf, | ||
| - | < | ||
| - | # Входные/ | ||
| - | 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=tap0 | ||
| - | # Имя парного TAP-интерфейса в netns для девайса (default=' | ||
| - | peer=peer0 | ||
| - | # Подсети, | ||
| - | subnet=10.0.10.0/ | ||
| - | # | ||
| - | } | ||
| - | </ | ||
| - | При таком описании отвод трафика на TAP '' | ||
| - | |||
| - | В секции '' | ||
| - | Если роутер работает как в сторону inet, так и в сторону subs (например, | ||
| - | < | ||
| - | # 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> | ||
| - | |||
| - | ===== Multi-path routing (ECMP) ===== | ||
| - | В СКАТ 10.2 добавлена поддержка multi-path routing (ECMP). | ||
| - | TODO | ||
| - | |||
| - | ===== Конфигурирование Роут-демона (BIRD, FRR, etc.) ===== | ||
| - | Настройки Роут-демона (BIRD, FRR, etc.) и СКАТ **должны быть согласованы**: | ||
| - | Поддерживаемые роут-демоны: | ||
| - | - [[https:// | ||
| - | - [[http:// | ||
| - | - [[https:// | ||
| - | - [[https:// | ||
| - | |||
| - | |||
| - | |||
| - | ===== Конфигурирование fastDPI ===== | ||
| - | ==== Обязательные параметры ==== | ||
| - | Чтобы включить функционал роутера, | ||
| - | < | ||
| - | # [cold] Включение функционала роутера | ||
| - | # Булевый параметр: | ||
| - | # 0, false, off - функционал роутера отключен (default) | ||
| - | # 1, true, on - функционал роутера включен | ||
| - | # Не допускает изменения "на лету" | ||
| - | router=1 | ||
| - | </ | ||
| - | |||
| - | Далее необходимо указать, | ||
| - | < | ||
| - | # [cold] Имя net namespace, в котором запущен BIRD | ||
| - | router_netns=bird | ||
| - | # [cold] Номер таблицы маршрутизации ядра, которую использует fastDPI | ||
| - | router_kernel_table=1 | ||
| - | </ | ||
| - | |||
| - | Также обязательно должны быть заданы следующие параметры BRAS, даже если никакой из режимов BRAS не включен: | ||
| - | < | ||
| - | # Виртуальный MAC-адрес СКАТ | ||
| - | bras_arp_mac=00: | ||
| - | |||
| - | # Виртуальный IP-адрес СКАТ | ||
| - | bras_arp_ip=188.227.73.40 | ||
| - | |||
| - | # Если используется IPv6, необходимо задать виртуальные IPv6-адреса: | ||
| - | |||
| - | # Задает глобальный IPv6 адрес СКАТа | ||
| - | bras_ipv6_address=2098:: | ||
| - | |||
| - | # Задает IPv6 link-local адрес СКАТа (префикс FE80::/10) | ||
| - | # Если данный параметр не задан явно, он вычисляется по bras_arp_mac | ||
| - | # | ||
| - | </ | ||
| - | |||
| - | <note tip> | ||
| - | Прочие параметры, | ||
| - | |||
| - | === Анонсы абонентов и NAT pool=== | ||
| - | Включение анонсирования адресов абонентов производится параметром в fastdpi.conf: | ||
| - | < | ||
| - | # [cold] Флаги анонса адресов абонентов | ||
| - | # Битовая маска | ||
| - | # Значения: | ||
| - | # 1 - анонсировать адрес абонента в сторону subs | ||
| - | # 2 - анонсировать адрес абонента в сторону inet (если у абонента не подключен NAT) | ||
| - | # 4 - анонсировать NAT-подсети в сторону inet | ||
| - | # 8 - анонсировать абонентские шлюзы (направление задается флагами 1 и 2) | ||
| - | # Значение по умолчанию: | ||
| - | # | ||
| - | |||
| - | # [hot] Метрика для анонсов адресов абонентов | ||
| - | # Значение по умолчанию = 32 | ||
| - | # | ||
| - | </ | ||
| - | {{ : | ||
| - | Подсети белых адресов NAT анонсируются только в сторону inet при старте СКАТа и при добавлении/ | ||
| - | |||
| - | {{ : | ||
| - | Адреса абонентов могут анонсироваться как в сторону inet, так и в сторону subs. Но если IP адрес абонента | ||
| - | |||
| - | ==== Дополнительные параметры ==== | ||
| - | Максимальное число маршрутов задается параметрами: | ||
| - | < | ||
| - | # [cold] Максимальное число маршрутов в IPv4 route table | ||
| - | # По умолчанию = 1000000 | ||
| - | # | ||
| - | |||
| - | # [cold] Максимальное число маршрутов в IPv6 route table | ||
| - | # По умолчанию = 200000 | ||
| - | # | ||
| - | </ | ||
| - | СКАТ при старте в режиме роутера преаллоцирует память для внутренних route table в соотвествии с этими параметрами. Советуем устанавливать эти опции (если необходимо) с запасом в 20-30%, чтобы в процессе работы роутера гарантированно хватило преаллоцированной памяти. | ||
| - | |||
| - | Рабочая таблица маршрутизации (FIB) СКАТ обновляется раз в '' | ||
| - | < | ||
| - | # [hot] Период обновления FIB, секунд | ||
| - | # По умолчанию - раз в 15 секунд | ||
| - | # | ||
| - | </ | ||
| - | Устанавливать данный параметр слишком маленьким (меньше 5 секунд) особого смысла нет. | ||
| - | |||
| - | Максимальный размер neighbor cache (ARP cache) и тайм-аут обновления записей этого кеша задается параметрами: | ||
| - | < | ||
| - | # [cold] Max размер ARP cache (neighbor сache для IPv6) | ||
| - | # По умолчанию - 1024, max = 32K | ||
| - | # | ||
| - | </ | ||
| - | СКАТ содержит отдельные neighbor-кеши для IPv4 и IPv6, каждый размером '' | ||
| - | |||
| - | СКАТ сам не посылает ARP-запросы для устаревших записей кеша. Вместо этого он полагается на обновление кеша со стороны ядра Линукса: | ||
| - | |||
| - | Роутер работает в отдельном потоке на отдельном ядре CPU. При старте СКАТ задает параметры этого потока по умолчанию, | ||
| - | < | ||
| - | # [cold] Добавление к приоритету служебного потока роутера (повышение приоритета) | ||
| - | # | ||
| - | |||
| - | # [cold] Ядро привязки потока роутера, | ||
| - | # | ||
| - | </ | ||
| - | Изменять эти параметры надо только в крайнем случае, | ||
| - | <note warning> | ||
| - | ===== Отладка Роутера ===== | ||
| - | Роутер СКАТа в целях отладки может записывать в pcap трафик с BIRD: | ||
| - | < | ||
| - | # [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): | ||
| - | < | ||
| - | # [hot] Записывать или нет rtnetlink messages в pcap | ||
| - | # 0 - не записывать | ||
| - | # 1 - записывать | ||
| - | # Префикс pcap-файлов = " | ||
| - | # | ||
| - | </ | ||
| - | |||
| - | Кроме того, если включена запись пакетов в pcap по маске адреса ('' | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | ===== CLI-команды ===== | ||
| - | СКАТ имеет набор CLI-команд по просмотру текущего состояния роутера. Полный список команд см. | ||
| - | < | ||
| - | fdpi_cli help router | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | |||
| - | Также не забывайте, | ||
| - | |||
| - | Кроме того, стандартная утилита Линукса '' | ||