场景
电脑有两张无线网卡,同时连接两个不同的 WiFi 网络:
| 网卡 | 连接的WiFi | 用途 |
|---|---|---|
| 网卡A(内置) | WiFi_A | 默认上网,走默认网关 |
| 网卡B(USB) | WiFi_B | 专门访问某个内网/特定服务器 |
需求:默认上网走 WiFi_A,访问特定 IP 时走 WiFi_B。
做了哪些改动
1. 导入 WiFi 配置文件到第二张网卡
将已保存的 WiFi 配置从网卡A复制到网卡B,这样两张网卡都能连接各自的网络。
# 导出配置(从网卡A导出 WiFi_B 的配置文件,包含密码)
netsh wlan export profile name="WiFi_B" interface="网卡A的名称" folder="C:\temp" key=clear
# 导入到网卡B
netsh wlan add profile filename="C:\temp\网卡A的名称-WiFi_B.xml" interface="网卡B的名称"
2. 用网卡B连接目标WiFi
netsh wlan connect name="WiFi_B" interface="网卡B的名称"
3. 添加静态路由(核心改动)
让访问目标IP的流量走网卡B的网关,而不是默认的网卡A。
# 临时路由(重启后失效,用于测试)
route add 目标IP mask 255.255.255.255 网卡B的网关 if 网卡B的接口编号 metric 1
# 永久路由(-p 参数,重启后仍然生效)
route -p add 目标IP mask 255.255.255.255 网卡B的网关 if 网卡B的接口编号 metric 1
if 接口编号是网卡B的接口编号(ifIndex),每台电脑不一样,需要自己查。
原理说明
路由表是怎么工作的
Windows 有一张"路由表",决定每个数据包走哪条路(哪个网卡、哪个网关)。
当你要访问一个 IP 时,Windows 会按以下规则匹配路由表:
- 最精确匹配优先:子网掩码越长(越精确)的路由,优先级越高。
- 跃点数越低越优先:同样精确的路由,metric(跃点数)小的先走。
默认路由 vs 静态路由
| 路由类型 | 目标 | 说明 |
|---|---|---|
| 默认路由 | 0.0.0.0/0 | 所有没匹配到更具体路由的流量都走这里 |
| 静态路由 | x.x.x.x/32 | 只针对这一个 IP,走指定的网卡和网关 |
因为单个 IP 的路由(32位掩码,精确到单个IP)比默认路由(0位掩码,所有地址)更精确,所以访问那个 IP 时会优先走静态路由那条路。
为什么不能直接靠默认网关
如果两张网卡都有默认网关,Windows 会选跃点数低的那个作为主网关,另一个的默认网关基本不会被用到。所以普通情况下虽然连了两个 WiFi,但实际流量只走其中一个。
要让特定地址走另一个网卡,就必须加静态路由明确告诉系统:“这个IP走那条路”。
操作步骤(完整流程)
第一步:确认网卡名称和接口编号
# 查看所有网卡及其接口编号(ifIndex)
Get-NetAdapter | Select-Object Name, ifIndex, Status
# 查看当前连接的 WiFi
netsh wlan show interfaces
记下两张网卡的名称和接口编号。
第二步:查看两张网卡的IP和网关
Get-NetIPConfiguration | Where-Object { $_.InterfaceAlias -match "WLAN" } | Select-Object InterfaceAlias, IPv4Address, IPv4DefaultGateway
记下:
- 网卡B的网关地址(用来做静态路由的下一跳)
第三步:导出/导入 WiFi 配置(如果网卡B没连过目标WiFi)
# 从已连接过的网卡导出配置
netsh wlan export profile name="目标WiFi名称" interface="网卡A名称" folder="C:\temp" key=clear
# 导入到网卡B
netsh wlan add profile filename="C:\temp\导出的文件名.xml" interface="网卡B名称"
第四步:连接 WiFi
netsh wlan connect name="目标WiFi名称" interface="网卡B名称"
第五步:添加静态路由
先测试临时路由:
route add 目标IP mask 255.255.255.255 网卡B的网关 if 网卡B接口编号 metric 1
测试访问是否成功,成功后再加永久路由:
route -p add 目标IP mask 255.255.255.255 网卡B的网关 if 网卡B接口编号 metric 1
常用操作
查看当前路由表
# 查看所有路由
route print
# 只看永久路由
route print -p
# 查看某个特定IP的路由
route print 目标IP
删除路由
# 删除临时路由
route delete 目标IP
# 删除永久路由(同样的命令,永久路由也会一起删掉)
route delete 目标IP
测试连通性
# 测试端口是否通
Test-NetConnection -ComputerName 目标IP -Port 端口号
# 测试HTTP访问
Invoke-WebRequest -Uri "http://目标IP:端口号/" -UseBasicParsing
注意事项
- 网关 IP 可能变化:如果目标网络的路由器重启或 DHCP 重新分配,网关可能变。如果访问不了,先检查网关是否还是原来的地址。
- 接口编号可能变化:插拔 USB 网卡或重启电脑后,接口编号(ifIndex)可能变,路由就失效了,需要重新添加。
- metric(跃点数):数字越小优先级越高。静态路由 metric 设为 1 是为了确保它比默认路由优先。
- 永久路由保存在注册表:
route -p添加的路由存在HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes。 - 需要管理员权限:添加/删除路由需要以管理员身份运行 PowerShell。
- 网段路由:如果需要访问整个网段而不是单个 IP,把掩码改成对应的网段掩码即可(例如
mask 255.255.255.0表示整个C段)。