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. Он хорошо работает там, где топология меняется, но требует дисциплины на канальном уровне и защиты доверенного периметра. Начните с двух узлов в лаборатории, проверьте сходимость при отключении линка, и только потом масштабируйте площадку.