我有一台运行 Windows Server 2019 的虚拟机,它是一台具有许多网络接口的终端服务器。它实际上是一个中继,正在为许多 vlan 接口配置,从而导致这么多接口 - 但这对我的问题来说并不重要。现在,来到奇怪的部分:
PS C:\Users\XXXX> netstat -n | findstr "192.168.4.80:445"
TCP 10.0.200.90:49531 192.168.4.80:445 ESTABLISHED
TCP 10.0.200.90:49532 192.168.4.80:445 ESTABLISHED
TCP 10.0.200.90:49533 192.168.4.80:445 ESTABLISHED
TCP 10.0.200.90:49534 192.168.4.80:445 ESTABLISHED
TCP 192.168.4.90:49528 192.168.4.80:445 ESTABLISHED
TCP 192.168.4.90:49529 192.168.4.80:445 ESTABLISHED
TCP 192.168.4.90:49530 192.168.4.80:445 ESTABLISHED
TCP 192.168.4.90:55959 192.168.4.80:445 ESTABLISHED
这里讨论的两个接口都配置了/24
网络掩码 - 并且10.0.200.90/24
接口保存默认网关。路由表非常大,因为有很多接口,但是 192.168.4.0/24 子网没有冲突的路由。以下是相关部分:
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 10.0.200.250 10.0.200.90 271
10.0.200.0 255.255.255.0 On-link 10.0.200.90 271
10.0.200.90 255.255.255.255 On-link 10.0.200.90 271
10.0.200.255 255.255.255.255 On-link 10.0.200.90 271
192.168.4.0 255.255.255.0 On-link 192.168.4.90 271
192.168.4.90 255.255.255.255 On-link 192.168.4.90 271
192.168.4.255 255.255.255.255 On-link 192.168.4.90 271
===========================================================================
某些连接是如何通过默认网关发送的,而某些连接又采用正确的接口路由的?我在防火墙(默认网关)的数据包过滤器日志中注意到了这一点,因此这不仅仅是显示问题,某些数据包确实是通过默认网关发送的 - 我通过资源监视器检查,这些连接属于 PID 4(系统),很可能是映射的网络驱动器。
就我所知,只有当两条路由具有相同的子网时,才会考虑度量 - 在这种情况下,度量较低的路由将获胜。但无论配置了什么度量,默认网关路由都不应该胜过接口路由 - 对吗?
我的第一个想法是,这一定是 Windows 内部的一个错误 - 可能是启动界面的进程和映射网络驱动器的进程之间存在竞争条件。但这纯粹是猜测,我希望有人能给我更深入的见解...
这完全取决于连接。连接的价值可以用链接速度、跳数或时间延迟来衡量。“自动度量”是 Windows 中的一项新功能,它会自动配置基于链接速度的本地路由度量。
自动度量功能默认启用,也可以手动配置以分配特定度量。
在 Windows Server 2016 和 Windows 10 中,您可以使用接口度量来配置网络接口的顺序。
INetCfgComponentBindings::MoveBefore
这与以前的 Windows Server 不同,以前的 Windows Server 允许您使用用户界面或命令(和)配置网络适配器的绑定顺序[...]::MoveAfter
。现在不再是这样了(从 Server 2016 开始)。相反,您可以(读作“必须”)使用 来配置接口度量
Set-NetIPInterface
。选择网络流量路由时,会使用总体度量来确定接口优先级 - 即路由度量和接口度量的总和。通常,接口度量会优先考虑特定接口,例如如果有线和无线都可用,则使用有线接口。
虽然这完全有可能,但如今微软 IP 堆栈中的错误极为罕见。想想看:在一个必须在所有情况下都具有确定性的系统中(想想 Hyper-V),这种情况从第一天起就是灾难性的。