← Заметки

Домашняя mesh-сеть на AmneziaWG

· openwrt, amneziawg, bird, routing

Мои роутеры стоят в разных местах: несколько хабов на арендованных серверах в разных странах и несколько площадок — дом, стойка хоумлаба и ещё пара мест. Все на OpenWrt, а связаны между собой AmneziaWG — форком WireGuard, пакеты которого не похожи на WireGuard. Эта заметка — про маршрутизацию поверх, а не про сами туннели.

Устройство

Маршрутизация

На каждом роутере один демон BIRD:

Две детали делают всё это удобным:

Особенность netifd

Протоколу маршрутизации на link-local адресах нужен маршрут fe80::/64 на каждом туннеле. netifd в OpenWrt добавляет его, только если у интерфейса ненулевая метрика, а Linux держит один fe80::/64 на одно значение метрики — поэтому туннели с одинаковой метрикой молча теряют link-local маршруты, кроме последнего поднятого. Лекарство скучное: каждому туннелю своя метрика.

Что не взлетело

Отчасти хотелось автоматически замечать задушенные трансграничные линки и обходить их. Я попробовал два протокола, учитывающих качество каналов:

И у обоих есть проблема глубже: качество линка они считают по маленьким hello-пакетам. Задушенный линк часто идеально пропускает ping и hello, пока объёмный TCP еле ползёт, и метрика на hello считает его здоровым.

Все три пакета лежат в моём фиде для OpenWrt, my-openwrt-feed, вместе с остальным, что крутится на этих роутерах.

Дальше

Внешний контроллер, который по-настоящему измеряет каждый линк — пропускную способность, а не только доступность, — и передаёт результат в стоимости OSPF, с гистерезисом, чтобы маршруты не прыгали.