我有以下场景:两个站点,每个站点都有自己的网络(不重叠的私有子网),通过站点到站点 VPN(第 3 层,Wireguard)连接。到其他站点的路由在默认网关中配置,并通过 DHCP 分发给客户端。IP 流量(v4 和 v6)在网络之间传输良好。
在两个 VPN 网关上,avahi 守护进程enable-reflector=yes
在本地网络和 wireguard 隧道之间充当 mDNS 中继器 ( ),并且短信设置为转发可路由的 SSDP 多播数据包(发送到239.255.255.250
、ff05::c
、ff08::c
)从本地网络到 wireguard 隧道,反之亦然。这很有效,MDNS 和 SSDP 数据包都从一个网络传输到另一个网络,我用 Wireshark 检查了这一点。
在 Windows 10 (21H2) 上,得益于 avahi-daemon 反射,.local 域的 mDNS 名称解析在两个网络上都能很好地运行。在 Windows 上的 VLC 中,可以使用 mDNS 和 UPnP (SSDP) 找到来自两个网络的多媒体设备,并且可以访问它们。但是,Windows 资源管理器在其网络视图中仅显示来自本地网络的设备。
我已经检查并尝试了以下操作:
- 功能发现资源发布服务 (FDResPub) 已启用并正在运行。
- 功能发现提供程序主机服务 (fdPHost) 已启用并正在运行(尽管据我所知,这对于服务发现来说不是必需的)。
- 在高级共享设置中,针对活动网络配置文件(私人)打开了网络发现以及文件和打印机共享。
- 我完全禁用了 Windows Firefall 以进行测试(没有安装其他防火墙产品)。
在 Windows 资源管理器中的网络视图中按 Ctrl+F5 时,我可以看到 SSDP M-SEARCH 请求被发送到多播地址239.255.255.250
和ff02::c
。IPv6 地址ff02::c
是链路本地多播地址,不会路由到其他网络,但发送到的请求239.255.255.250
确实到达了其他网络,并且来自那里的设备的答案到达了本地网络。但这些设备不会显示在 Windows 资源管理器中。
我发现Windows UPnP API 文档。有一节关于配置设置可以使用注册表项进行更改。大多数提到的注册表路径都存在,但没有设置任何提到的键。键DownloadScope
和ReceiveScope
都默认为1
,这允许发现私有子网中的主机。我还将这两个键添加到注册表中(作为 DWORD 32 位),明确将它们设置为 1 并重新启动 Windows 计算机,但 Windows 资源管理器仍然只显示来自同一子网的其他计算机。
这UPnP设备查找器可以在 PowerShell 中使用来列出 UPnP 设备(学分):
$ssdpFinder = New-Object -ComObject 'UPnP.UPnPDeviceFinder'
$ssdpFinder.FindByType('ssdp:all', 0)
这做查找本地和远程网络中的 UPnP 设备,注册表中也有DownloadScope
和未指定的设备。但是,即使和都明确设置为, IPv6 SSDP M-SEARCH 请求也会发送到,因此ReceiveScope
ff02::c
DownloadScope
ReceiveScope
1
不得路由到其他网络。
因此还剩下两个问题:
- 如何配置 Windows 10,以便 Windows 资源管理器在网络视图中显示通过 WS-Discovery/UPnP/SSDP 发现的其他网络的设备?
- 如何配置 Windows 10(UPnPDeviceFinder、Windows Explorer)以向
ff05::c
或ff08::c
代替广播 IPv6 SSDP M-SEARCH 请求ff02::c
,以便将多播消息路由到其他网络?