在 windows 操作系统中,同时启动有线和无线网卡后,有线网卡所连内网的跨网段站点无法正常访问的原因和解决方案
同时启用有线网卡和无线网卡时,有线网卡所练级内网环境无法正常访问:
Windows 主机同时启用有线网卡和无线网卡:
- 有线网卡:接入内网环境,确保能访问内网环境
- 无线网卡:连接手机热点,确保能连接到互联网
使用这种方案,经常会出现这样的问题:
- 访问同网段内网设备:正常
- 访问跨网段内网设备:失败
这是因为虽然有线网卡配置了网关,但系统并未把跨网段流量从有线网卡发出。根本原因在于 Windows 多网卡环境下的默认路由竞争机制。
Windows 上的路由信息
在 Windows 上可以通过 route print -4 可以查看本地的路由信息:

这里显示的路由条目中,网关就是下一跳的地址,根据路由的"网关",可以将路由分为两类:
on-link:直连路由,网关为 on-link 表示目标就在链路上,可以直接到达。gateway:网关路由,不能直接到达目标网络,需要经过下一跳,所以网关为一个具体 IP地址。
Windows 上的直连和默认路由是这样生成的:
- 直连路由:给网卡配置 IP 地址和子网掩码后,会自动在本地路由表中生成一条到达该该网卡所在网段的直连路由。
- 默认路由:给网卡配置网关地址后,会自动再本地生成一条出接口是该网卡的默认路由:
0.0.0.0/0
Windows 查找路由的规则
本地主机 和 目标主机 在同一网段时:直接使用该网卡生成的直连路由(on-link)发送数据包。
将 目标 IP 与网卡配置的IP地址的 子网掩码 进行 AND操作后得到网络号,若两者前缀一致就说明是位于同一网络。
本地主机 和 目标主机 在不同网段时:Windows 会按照以下流程找到最终的路由:
找出所有目的网络能覆盖目标 IP 的路由,然后从中筛选出 掩码最长 的那一批(这就是最长掩码匹配原则)
- 网络前缀最长的路由唯一:若能找到一条网络前缀最长的路由,那么就使用这条路由来转发IP分组。
- 网络前缀最长的路由有多条:存在多条网络前缀一样长的路由,就会选择
路由的 metric(跃点数)+ 网卡的 metric(网卡优先级)值最小的路由。
这也就解释了为什么内网站点有时同网段能访问,跨网段不行:
- 同网段:直接通过直连路由(on-link )发送数据包,肯定能成功;
- 跨网段:跨网段访问内网站点时,数据包流量从无线网卡发送出去了。
在内网网卡 和 外网网卡 都配置网关的情况下,会生成两条默认路由,在进行路由匹配时,因网络前缀长度一致,所以会比较 (route metric + interface metric)的值,Windows 默认无线网卡的metric更低,所以流量从无线网卡发出,自然无法访问内网另一网段。
Windows 多网卡配置的解决方案
方法一:内网不配置网关地址,确保不生成两条默认路由(0.0.0.0/0),配置静态路由,强制让去往目标网络的流量通过该网卡所在网络的网关地址,保证流量能正常从内网的有线网卡出去。
方法二:正常配置双网关,使有线网卡的 interface metric 更小,但是这种方式存在访问外网的流量从内网网卡出去,如内网是没有配置NAT地址转换,和互联网完全隔绝的,是不能访问到互联网的。
为什么配置静态路由就行了?因为在跨网段访问进行最长掩码匹配选路由时,静态路由的网络前缀就是最长的,自然也就能选择到它。
Windows 中管理路由的相关命令:
添加静态路由
route add <目标网络> mask <子网掩码> <网关地址> [metric <跃点数>] [if <接口编号>]
# 这条路由临时生效,重启后就失效了,通过 -p 选项可以持久生效
# 指定了网关地址,就不用指定出接口了,Windows 会根据“网关 IP 地址属于哪个网卡的网段”来自动推导出接口
删除静态路由
route delete 目标网络 目标网络的子网掩码
查看静态路由
route print -4
例如:添加一条到主机90.46.137.33 的路由,因为这个主机和我本地不在同一网段,所以要指定下一跳为本电脑所在网段的网关地址。
route add 90.46.137.33 mask 255.255.255.255 90.46.4.94
浙公网安备 33010602011771号