Babel — протокол маршрутизации для сетей с быстро меняющейся топологией. Он описан в RFC 8966, работает с IPv4 и IPv6 и хорошо подходит для mesh-сетей, где радиоканалы то появляются, то пропадают. Babel не заменяет канальный уровень: это демон babeld, который договаривается с соседями и устанавливает маршруты в ядре Linux. Разберём настройку на своей инфраструктуре и способы понять, почему маршрут не появился.

Как Babel выбирает маршрут

Babel — дистанционно-векторный протокол с условием допустимости. Каждый узел рассылает анонсы префиксов с метрикой, а сосед принимает маршрут только если тот не создаёт петлю. Для беспроводных линков используется метрика ETX: она оценивает долю успешных передач и штрафует нестабильные каналы. Для проводных сегментов метрику можно свести к числу хопов.

Метрика обновляется по мере поступления данных, поэтому путь может измениться даже без полного разрыва линка. Для радиосети это нормально, но приложение должно переживать смену маршрута: короткие таймауты и повторные попытки здесь важнее, чем попытка удержать соединение любой ценой.

Служебный трафик идёт по UDP на порт 6696, приветствия рассылаются в multicast. В IPv4 это группа 224.0.0.111, в IPv6 — ff02::1:6. Такой дизайн означает, что Babel не требует центрального контроллера и одинаково работает на коммутируемых и радиосегментах, если multicast не заблокирован.

Когда Babel уместен

  • Сеть из нескольких собственных узлов, соединённых Wi-Fi, Ethernet и резервными каналами.
  • Несколько равнозначных путей и необходимость автоматически переключаться при деградации.
  • Сегменты с IPv6, где нужен простой протокол без сложной политики.
  • Лаборатория или площадка, где важна быстрая сходимость и минимум настройки.

Для стыка с провайдером и полноценной BGP-политики Babel не предназначен: там нужны BGP и явное управление анонсами. Также не стоит запускать его на интерфейсах, которые смотрят в недоверенную сеть: встроенной криптографической аутентификации в протоколе нет.

Адресация и планирование

До запуска демона договоритесь о схеме адресов: каждому узлу — стабильный loopback-адрес и уникальный префикс /64 для IPv6. Babel умеет объявлять подключённые сети, но лучше явно перечислить доверенные префиксы, чтобы случайный интерфейс не попал в анонсы. Для IPv4 выбирайте диапазон, который не пересекается с домашними и офисными сетями.

Loopback важен как идентификатор: маршруты к нему не зависят от того, какой линк сейчас активен. Если у узла несколько адресов, анонсируйте только служебный, а остальные оставьте локальными. Запишите план в таблицу и храните её рядом с конфигурацией — при добавлении площадки это экономит часы разбора.

Установка и конфигурация

В Debian и Ubuntu демон есть в основном репозитории. После установки отредактируйте /etc/babeld.conf: перечислите интерфейсы и префиксы, которые нужно анонсировать.

sudo apt install -y babeld
sudoedit /etc/babeld.conf
sudo systemctl enable --now babeld
sudo systemctl status babeld

Минимальный конфиг для двух интерфейсов и локальной подсети выглядит так:

interface lo
interface enp1s0
interface wlan0
  hello-interval 4
  update-interval 16
redistribute local ip 10.20.0.0/16
redistribute ip 10.20.0.0/16

Строка redistribute local ip объявляет подключённую сеть, а redistribute ip задаёт явный префикс. Параметр wired на проводном интерфейсе отключает расчёт ETX и переводит линк на метрику по хопам; для Wi-Fi его использовать не нужно. Если линк нестабилен, увеличение hello-interval снижает служебный трафик, но замедляет обнаружение обрыва.

Babel поверх Wi-Fi и batman-adv

В инфраструктурном Wi-Fi multicast передаётся на минимальной скорости и часто теряется. Для площадки лучше собрать ad-hoc сеть или использовать batman-adv на канальном уровне, а Babel запустить поверх bat0. Пример перевода интерфейса в IBSS:

sudo ip link set wlan0 down
sudo iw dev wlan0 set type ibss
sudo ip link set wlan0 up
sudo iw dev wlan0 ibss join mesh0 2412 HT20

Канал и ширину полосы указывайте одинаковые на всех узлах и проверяйте региональные ограничения. Если используется batman-adv, Babel видит bat0 как обычный Ethernet-интерфейс, а логика выбора пути ложится на два уровня сразу — такое сочетание требует аккуратной настройки метрик, чтобы уровни не спорили друг с другом.

Проверка маршрутов

Ядро помечает маршруты, установленные Babel, номером протокола 42. Смотрим таблицы IPv4 и IPv6 и слушаем служебный трафик.

ip route show proto 42
ip -6 route show proto 42
sudo journalctl -u babeld -n 50 --no-pager
sudo tcpdump -ni wlan0 udp port 6696

Если таблица пуста, а tcpdump молчит, проверьте, что интерфейс поднят, multicast не отключён и соседи в одном канале. Если пакеты видны, но маршрута нет, смотрите журнал: babeld может отбрасывать анонс из-за условия допустимости или фильтра redistribute. Команда ip neigh помогает исключить проблемы канального уровня, а ping6 по link-local адресу соседа — проверить связность до запуска демона.

Для точечной отладки остановите службу и запустите демон в foreground с уровнем журнала 2: sudo systemctl stop babeld, затем sudo babeld -d 2 -c /etc/babeld.conf. Так видно, какие hello приходят и почему маршрут отклонён. Не оставляйте такой режим на продакшене: подробный лог быстро растёт и сам создаёт нагрузку.

Правила файрвола и безопасность

На каждом узле разрешите UDP 6696 только на доверенных интерфейсах. В nftables это делается отдельным правилом, а не открытием порта наружу.

sudo nft add rule inet filter input iifname { "enp1s0", "wlan0" } udp dport 6696 accept
sudo nft add rule inet filter output oifname { "enp1s0", "wlan0" } udp dport 6696 accept
sudo nft list ruleset

Помните: Babel не шифрует и не аутентифицирует анонсы. В сети, куда может подключиться посторонний, маршрутизацию стоит поднимать поверх доверенного канала или сегментировать площадку так, чтобы служебный трафик не выходил за её пределы. Для собственной инфраструктуры этого достаточно, если доступ к интерфейсам контролируется.

Чек-лист диагностики

  • Сосед не виден: разные каналы, выключен multicast, интерфейс в другом режиме.
  • Маршрут мигает: нестабильный ETX, слишком агрессивные таймеры, перегрузка канала.
  • Нет анонса: префикс не попал в redistribute или отфильтрован политикой.
  • Трафик идёт не туда: проверьте несколько путей и метрики, а не только таблицу маршрутов.

Итог

Babel — компактный инструмент для mesh-сетей: несколько строк конфигурации, понятные метрики и прозрачная диагностика через ip route и tcpdump. Он хорошо работает там, где топология меняется, но требует дисциплины на канальном уровне и защиты доверенного периметра. Начните с двух узлов в лаборатории, проверьте сходимость при отключении линка, и только потом масштабируйте площадку.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте