Перенаправить запрос mDNS из подсети WSL в подсеть хоста Windows

Привет, товарищи программисты / разработчики / сетевики / Девопс / ...

У меня проблема с настройкой _1 _ / _ 2_ в контексте WSL2 (версия Windows 10 2004)

У меня дома довольно простая установка с главным сервером и Raspberry Pi, и я хотел бы активировать обнаружение службы DNS, что позволяет мне иметь простой способ автоматического обнаружения моего сервера на моем Raspberry PI.

Используя простую библиотеку, такую ​​как dnssd, или даже самостоятельно передавая нужные данные, мне удается заставить ее работать легко, когда не используется WSL2. Однако у меня есть требование, чтобы он работал на WSL2, и здесь все усложняется.

Поскольку WSL2 работает в своей собственной подсети, широковещательная передача больше не работает. Использование mDNS в подсети работает только в этой подсети. Однако Windows уже перенаправляет часть широковещательного трафика между хостом и WSL.

Это легко проверить: выполнение простого Ping с моего сервера на адрес Avahi Pi, который полагается на mDNS, работает.

введите описание изображения здесь

В левой части экрана вы можете увидеть трафик, захваченный Wireshark на сетевом интерфейсе хоста, а в правой части вы можете увидеть трафик, захваченный Wireshark на сетевом интерфейсе WSL. Первые 3 строки представляют собой простой пинг: он выполняется в контексте WSL, но отображаемый здесь IP-адрес - 172.28.192.1- не является IP-адресом клиента WSL, это IP-адрес внутреннего DNS-сервера WSL. . Он идеально перенаправлен на хост, как вы можете видеть справа, с IP-адресом хоста Windows: 192.168.0.39

Однако второй запрос, который выполняется сценарием, имеет исходный IP-адрес WSL (172.28.204.42), и этот запрос не перенаправляется на хост.

Мои знания о сети очень ограничены, и я не понимаю, как это работает, и как я могу заставить WSL маршрутизировать мои собственные запросы mDNS на хосте. Было бы безумно предположить, что это как-то связано с iptables, но это все, что мне нужно.

Если кто-то знает, почему он работает на исходном адресе DNS-сервера, а не на том, когда я это выполняю сам, это мне очень поможет!

Изменить 1: Таблица маршрутов WSL  введите описание изображения здесь


person Sisyphe    schedule 30.05.2020    source источник
comment
находится ли сервер wsl mdns в той же подсети, что и хост wsl? если он другой, id хотел бы увидеть таблицу маршрутов wsl   -  person Rafael    schedule 06.06.2020
comment
Сервер mDNS находится в той же подсети, что и WSL (172.x.x.x), но не в той же подсети, что и Windows (192.168.x.x).   -  person Sisyphe    schedule 06.06.2020
comment
вы уже предоставили эту информацию; пожалуйста, перечитайте мой вопрос   -  person Rafael    schedule 07.06.2020
comment
Кажется, я только что ответил на этот вопрос :) Что вы называете хостом WSL? Если под WSL Host вы имеете в виду окна, подсеть будет другой. Если под хостом WSL вы имеете в виду экземпляр WSL, это то же самое, что и тот, в котором запущен WSL. Сервер mDNS - это мой собственный код, работающий непосредственно в дистрибутиве Ubuntu, работающем в WSL.   -  person Sisyphe    schedule 07.06.2020
comment
Я добавил таблицу маршрутов WSL, если это поможет.   -  person Sisyphe    schedule 07.06.2020


Ответы (1)


Сетевой коммутатор WSL2 Hyper-V не действует как мост многоадресной рассылки. По умолчанию коммутатор создает внутреннюю сеть. Многоадресные пакеты доставляются только в системы, подключенные к внутренней сети, а не во что-либо за ее пределами. Дополнительную информацию о типах сетей Hyper-V можно найти в это сообщение в блоге Nakivo.

В вашем первом случае ping запускает регулярный поиск DNS, который переходит к преобразователю - хосту Windows. Затем хост Windows выполняет поиск mDNS как во внешней, так и во внутренней сети. Ваш дамп пакета показывает внутренний поиск, но обратите внимание, что на него ничего не отвечает. Ответ приходит через внешнюю сеть, а пинг получает свой ответ через обычный DNS. Во втором случае вы выполняете только поиск mDNS. Этот поиск не получает ответа, потому что он идет только во внутреннюю сеть. Чтобы убедиться, что поиск mDNS работает во внутренней сети, выполните поиск локального адреса хоста Windows (MACHINE.local). Это будет работать, потому что хост Windows находится во внутренней сети и может отвечать.

Хорошая новость в том, что вы можете изменить тип сети WSL.

  1. Нажмите клавишу Windows и введите «Диспетчер Hyper-V».
  2. Щелкните приложение правой кнопкой мыши и выберите «Запуск от имени администратора».
  3. В диспетчере найдите свою машину в разделе «Диспетчер Hyper-V» и нажмите на нее.
  4. В области «Действия» щелкните «Диспетчер виртуальных коммутаторов ...»
  5. Найдите переключатель WSL и нажмите на него
  6. Измените тип подключения на «Внешняя сеть»
  7. Нажмите ОК.

Снимок экрана диспетчера Hyper-V

После этого перезапустите WSL:

> wsl --shutdown
> wsl -t <distribution-name>
> wsl --distribution <distribution-name>

После перезапуска сеть вашего гостя будет нарушена. Вам нужно будет добавить IP-адрес и маршрут из вашей внешней сети, используя ip addr add и ip route или что-то подобное. Ваш дистрибутив почти наверняка будет пытаться настроить свою сеть для WSL-коммутатора по умолчанию при каждом запуске, поэтому вам может потребоваться настроить конфигурации для добавления этого внешнего сетевого адреса в будущем. Например, Ubuntu 20.04 всегда добавляет динамический адрес во внутреннюю сеть, независимо от конфигурации коммутатора.

Внесение изменения в тип сетевого коммутатора, вероятно, нарушит другие способы использования WSL2 (например, Docker Desktop) по той же причине. Windows воссоздает сетевой коммутатор Hyper-V при каждой перезагрузке, поэтому ваши изменения будут действовать только до тех пор, пока ваша система будет работать.

person hrunting    schedule 07.06.2020