Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
dpi:dpi_options:router:start [2021/07/22 10:00] – [Дополнительные параметры] 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 | ||
- | </ | ||
- | |||
- | < | ||
- | |||
- | Также не забывайте, |