← На главную

myNetwork чинит скачущий интерфейс на multi-homed хостах

08.08.2026 03:41 · hackernews

Проект myNetwork получил пул-реквест, который закрывает давний баг, проявляющийся на multi-homed хостах — машинах, где одновременно активны и проводная сеть, и Wi-Fi. Корень проблемы в том, что в такой конфигурации таблица маршрутизации содержит сразу несколько строк 'default via ...'. Старый regex, который использовался для парсинга, брал самую первую попавшуюся запись, игнорируя остальные. Поэтому выбор интерфейса мог меняться от одного слоя сканирования к другому: в одном случае трафик шёл через проводной интерфейс, в следующем — через Wi-Fi. Это вносило хаос в работу утилиты, а полные сканы иногда просто зависали на UDP-фазе. Проблема была зарегистрирована в issue ancaferro#2.

Исправление переписывает логику выбора маршрута. Вместо того чтобы хватать первую строку, код теперь разбирает все имеющиеся строки default и сортирует их по метрике — точно так же, как это делает ядро, когда решает, через какой интерфейс отправить пакет. Функция parseLinuxDefaultRoutes() вынесена в отдельный модуль, чтобы её можно было тестировать изолированно, и для неё добавлены unit-тесты. Благодаря этому выбор интерфейса становится предсказуемым и больше не зависит от того, в каком порядке записи выводят ip route или содержимое /proc/net/route.

В этом же PR есть временный костыль, связанный с регрессией, которую ещё предстоит расследовать. Один env report зеркалируется в collector репортера, чтобы данные не терялись, пока идёт отладка. Этот режим отключён в CI, а пользователь может выключить его через переменную окружения MYNETWORK_DIAG=0.

Кроме того, PR учитывает замечания из обсуждения о фоновых окнах. Раньше страница release-notes могла открываться в фоне, что раздражало. Теперь она появляется как небольшой видимый popup, показывается один раз на версию и сразу сворачивается обратно в нормальный поток работы. Остальное поведение не изменилось: popup по-прежнему один раз на версию, в CI не показывается, а отключить его можно через MYNETWORK_NOTES=0.

Читать оригинал →