Windows双网卡路由配置:从原理到实操解决内外网冲突
电脑上插了两块网卡,一根网线接办公内网,一根网线接宽带外网,结果要么外网上不去,要么内网系统打不开,这个场景估计不少人都撞上过。问题不在网卡本身,而在 Windows 的路由表——两块网卡各自带着默认网关,系统不知道该把数据往哪儿送,于是“打架”。这篇文章就把双网卡配置这件事彻底讲清楚,从原理到实操再到排障,照着做就能让外网和内网各走各的路,互不干扰。
1. 双网卡配置到底在解决什么问题
1.1 为什么两块网卡会“打架”
很多人以为网卡插上就能用,两块网卡自然就是两个网络都能上。实际上 Windows 在同一时间只会选择一个默认网关,也就是“所有数据包的默认出口”。当内网网卡和外网网卡都配置了网关时,系统会按自动跃点数(Metric)选一个作为默认网关,另一个被晾在一边。于是你看到的典型症状就是:外网偶尔能上,但慢得离谱;或者内网系统彻底打不开;又或者重启一次网络就换了一种“抽风”方式。
这个问题的本质是路由决策。Windows 每发一个数据包,都会拿目标 IP 和路由表逐条比对,先匹配掩码范围,再比较跃点数,最后决定从哪个网卡出去。内网地址段如果没被路由表精确命中,数据包就会跑到默认网关去,而默认网关是外网的,内网包自然就丢了。反过来,外网数据包如果被内网网卡抢了默认路由,就会发到内网网关,网关一看目标不是内网地址,直接丢弃,外网就断。
1.2 路由表的基本概念
配置双网卡前,先理解路由表的四个核心字段:
| 字段 | 含义 | 举例 |
|---|---|---|
| 网络目标 | 数据包要去的地址段 | 10.10.0.0 |
| 网络掩码 | 地址段的范围大小 | 255.255.0.0 |
| 网关 | 下一跳设备的 IP | 10.10.0.1 |
| 接口 | 从哪块网卡发出 | 10.10.5.100 |
Windows 判断一个数据包走哪条路由,关键是“最长匹配”原则:掩码越长、范围越精确的路由优先级越高。比如目标 10.10.1.50 同时命中 0.0.0.0/0 和 10.10.0.0/16 两条路由时,系统一定走后者,因为它的掩码更长、更精确。这就是双网卡配置的理论基础——你不需要删除默认路由,只需要给内网地址段添加一条更精确的静态路由,内网流量就会自动走内网网卡,其余流量继续走外网默认路由。
提示:双网卡配置的核心思想不是“让两块网卡同时上网”,而是“让不同的流量走不同的网卡”。默认路由只能有一条,剩下的靠精确路由来分流。
2. 动手之前先理清网络拓扑
2.1 采集网络信息,别上来就敲命令
双网卡配置翻车,十有八九是没搞清楚网络地址段就开始操作。我的建议是先花五分钟把信息摸清楚,再决定怎么配。
按 Win + R 输入cmd打开命令行,执行:
ipconfig /all重点看两块网卡各自的信息:IPv4 地址、子网掩码、默认网关、DNS。把结果抄下来,确认哪个网卡对应外网,哪个对应内网。一般办公环境里,外网网卡可能是 DHCP 自动获取,地址段常见是 192.168.x.x 或 172.16.x.x;内网网卡通常是固定 IP,地址段多为 10.x.x.x 或 172.16.x.x。
接下来再看当前路由表:
route print -4这里会列出所有 IPv4 路由。你大概率会看到两条 0.0.0.0/0 默认路由,分别指向两个网关,其中一条的跃点数更小,系统就选了它。这就是问题的根源。
2.2 确定配置策略的几个关键问题
在动手前,先回答下面几个问题:
- 哪个网卡有访问互联网的能力?只有这个网卡的默认网关需要保留。
- 内网有哪些地址段?是单个网段,还是多个网段(比如 10.10.0.0/16 和 172.16.3.0/24)?有几个内网段就要加几条路由。
- 内网网关是多少?内网网卡的网关要作为静态路由的下一跳地址。
- 内网网卡用 DHCP 还是静态 IP?如果内网网卡走 DHCP,IP 变化会导致路由失效,强烈建议内网网卡改成静态 IP。
这些信息决定了下文的配置方案。如果内网只有一个网段,静态路由方案最省事;如果内网网段很多,或者你不想维护一堆路由规则,可以试试调整接口跃点数的方式,后面会讲到。
2.3 事先确认连通性
配置之前,先用 ping 测试一下当前状态,作为基线:
ping 外网网关IP ping 内网网关IP如果内网网关都 ping 不通,说明网线、IP、防火墙这些基础问题还没解决,这时候配置路由没有意义。顺便说一句,有些内网设备会禁 ICMP,ping 不通不代表网络不通,可以再试试访问内网的具体服务端口,比如:
telnet 10.10.1.50 8080能通就说明链路是好的,只是不响应 ping 而已。
3. 两种主流配置方案
3.1 方案一:静态路由,最精准也最常用
这是我最推荐的方式,思路很简单:内网网卡只负责内网网段,外网网卡负责其余所有流量。实现方式就是添加一条或多条指向内网网段的静态路由。
具体步骤分为三步:
第一步,给内网网卡配置固定 IP。打开“网络和 Internet 设置” -> “更改适配器选项”,找到内网网卡,右键属性,双击“Internet 协议版本 4 (TCP/IPv4)”,填入内网 IP、子网掩码。关于网关这一栏,我的建议是先留空,网关只作为后面静态路由的下一跳参数使用,不需要填在这里。如果某些内网环境必须填网关才能通,那就填上,但后续要在“高级”设置里把自动跃点数调大,或者干脆用下方命令行的方式处理。
第二步,添加静态路由。回到管理员命令行,执行:
route add 10.0.0.0 mask 255.0.0.0 10.10.0.1 -p这条命令的含义是:凡是目标地址在 10.0.0.0/8 范围内的数据包,下一跳交给 10.10.0.1(内网网关)。-p参数表示持久化路由,重启后仍然有效。这里有几个参数要解释清楚:
10.0.0.0是内网地址段的起始地址。255.0.0.0是子网掩码,两者配合决定了路由覆盖的范围。10.10.0.1是内网网卡的网关,数据包会从内网网卡发到这个地址,再由它转发。-p对应 persistent,不写的话重启就丢。
第三步,验证。执行route print -4确认路由已经写入,然后分别 ping 内网和外网的地址测试。
注意:
route add命令需要管理员权限。普通权限的命令行执行会报“需要提升权限”的错误。
3.2 方案二:调整接口跃点数,适合内网网段多的情况
如果你所在的内网有十几个网段,一条条加路由太痛苦,这时可以用另一种思路:让内网网卡接管所有“非外网”流量。做法是把内网网卡的接口跃点数调低,外网网卡的跃点数调高,这样当两条路由的匹配精度相同时,系统会优先走跃点数小的网卡。
操作路径:网卡属性 -> IPv4 -> 高级 -> 取消“自动跃点”,手动填入一个数值。内网网卡填 10,外网网卡填 20。原理是 Windows 给每条路由计算一个综合跃点数,数值越小优先级越高。所有需要走默认路由的流量,会优先从跃点数小的网卡出去。
这个方案的好处是配置简单,内网网段再多也不用管;坏处是它的分流粒度比较粗,如果内网和外网存在重叠地址段,或者某些流量必须走特定网卡,它就搞不定了。另外,如果你的外网网卡同时承担着其他网段的转发,跃点数法也可能误伤。
3.3 方案三:命令行一步到位
对喜欢脚本化的朋友,可以直接在管理员命令行里完成全部配置。修改网卡静态 IP 可以用 PowerShell:
New-NetIPAddress -InterfaceAlias "以太网 2" -IPAddress 10.10.5.100 -PrefixLength 16添加静态路由也可以用 PowerShell 的等价命令:
New-NetRoute -DestinationPrefix "10.0.0.0/8" -NextHop "10.10.0.1" -InterfaceAlias "以太网 2" -PersistentNew-NetRoute的-Persistent参数相当于命令行的-p。这种方式的好处是可以在一个脚本里完成 IP、网关、路由、DNS 的全部设置,适合多台电脑批量部署。内网 DNS 的配置可以用:
Set-DnsClientServerAddress -InterfaceAlias "以太网 2" -ServerAddresses 10.10.0.24. 实操演示:一次典型的办公场景配置
4.1 场景说明与参数规划
假设一个典型的办公环境:外网网卡通过 DHCP 自动获取,当前 IP 为 192.168.1.100,子网掩码 255.255.255.0,网关 192.168.1.1;内网网卡需要配置静态 IP 10.10.5.100,子网掩码 255.255.0.0,内网网关 10.10.0.1,内网里有一台 ERP 服务器地址是 10.10.1.50,还有一条独立的财务网段 172.16.3.0/24。
配置目标:访问 10.10.0.0/16 和 172.16.3.0/24 走内网网卡,其余流量全部走外网网卡。
4.2 完整配置步骤
第一步,设置内网网卡静态 IP。在内网网卡的 IPv4 属性里填入:
- IP 地址:10.10.5.100
- 子网掩码:255.255.0.0
- 默认网关:留空
DNS 可以填内网 DNS 服务器,比如 10.10.0.2,也可以暂时不填,后面按需补。
第二步,添加两条静态路由。管理员命令行执行:
route add 10.0.0.0 mask 255.0.0.0 10.10.0.1 -p route add 172.16.3.0 mask 255.255.255.0 10.10.0.1 -p这里第二条第掩码是 255.255.255.0,只覆盖 172.16.3.0/24 这一个网段。如果你想偷懒,也可以只加一条 172.16.0.0 mask 255.255.0.0 的路由,把整个 172.16 段都交给内网网关,但这样如果外网也有 172.16 段的资源,就会被错误地拐到内网去。我的原则是:路由覆盖范围宁小勿大,只写确实需要走内网的地址段。
第三步,验证。先看路由表:
route print -4确认存在这样几条路由:
| 网络目标 | 掩码 | 网关 | 接口 | 跃点数 |
|---|---|---|---|---|
| 0.0.0.0 | 0.0.0.0 | 192.168.1.1 | 192.168.1.100 | 20 |
| 10.0.0.0 | 255.0.0.0 | 10.10.0.1 | 10.10.5.100 | 1 |
| 172.16.3.0 | 255.255.255.0 | 10.10.0.1 | 10.10.5.100 | 1 |
然后测试连通性:
ping 10.10.1.50 ping www.baidu.com两个都能通,说明配置成功。
4.3 用 tracert 验证流量走向
ping 通只是第一步,你还需要确认流量确实走了正确的路径。用 tracert 可以直观看到数据包的下一跳:
tracert -d 10.10.1.50 tracert -d 8.8.8.8第一个命令的第一个跳点应该是 10.10.0.1,第二个命令的第一个跳点应该是 192.168.1.1。如果第一个命令的跳点里出现了外网网关,说明路由没生效,回去检查路由表的接口和网关是不是填错了。
提示:
tracert -d里的-d参数表示不对 IP 反向解析域名,输出更快,也更容易读。
5. 翻车现场与排查技巧实录
5.1 常见问题速查表
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 配置完成后重启,路由丢失 | 没加-p参数 | 重新用route add … -p添加 |
| 内网能通,外网时断时续 | 内网网卡也配置了默认网关,系统选了内网作为默认出口 | 把内网网卡的默认网关清空 |
| 外网能通,内网某台机器不通 | 静态路由的掩码覆盖范围不够 | 确认内网地址段,补充路由规则 |
| 路由表里添加了规则,但流量不走 | 接口 IP 变化,旧路由失效 | 删除旧路由,用新接口重新添加 |
| 内网网卡是 DHCP,IP 变了路由失效 | DHCP 动态分配导致 IP 漂移 | 内网网卡改成静态 IP |
| 加了路由之后,某个网站打不开 | 网站的地址段恰好被静态路由覆盖,流量被拐进内网 | 检查路由覆盖范围,拆分成更精确的网段 |
5.2 路由不生效的经典排查思路
先说一个我踩过的坑:用route add添加了静态路由,route print也能看到,但流量就是不走这条路。后来发现是因为添加路由时没指定接口,Windows 自动选了跃点数最小的网卡作为接口,而这个网卡恰好是外网网卡。数据包被发到外网网卡后,虽然下一跳是内网网关,但外网网卡和内网网关不在同一二层网络,包根本发不出去。
解决办法是添加路由时用if参数显式指定接口编号。先查接口编号:
route print -4输出第一列 Interface List 里有每个网卡的编号,比如内网网卡的编号是 15。然后添加路由时带上 if 参数:
route add 10.0.0.0 mask 255.0.0.0 10.10.0.1 if 15 -p这样可以强制让路由走内网网卡,彻底避免选错接口的问题。
5.3 DHCP 和系统更新导致的坑
公司网络如果统一走 DHCP,你内网网卡的 IP 每次开机都可能变,静态路由里的接口 IP 对应的路由就废了。这种情况下有两个选择:一是找网管把内网网卡的 MAC 地址绑定到固定 IP;二是坚持使用静态 IP,对内网网卡手动配置。我个人强烈推荐后者,因为办公电脑的内网 IP 通常需要稳定,手动配置反而省心。
另外,Windows 大版本更新后有可能会重置网络配置,包括清空静态路由和网卡的高级设置。我遇到过几次,某次系统更新后内网突然不通,一看路由表空了一条,只能重新执行一遍 route add。建议把配置命令存成脚本,出了问题时一键恢复,下一节会给出脚本。
5.4 防火墙和 DNS 的连带问题
双网卡配置完成后,内网和外网都能通了,但有时还是会出现“能 ping 通但打不开网页”的情况,这时候多半是 DNS 的问题。外网 DNS 用 114.114.114.114 或者运营商的 DNS 没问题,但内网资源如果用域名访问,那必须同时配置内网 DNS。我的做法是:外网网卡只填外网 DNS,内网网卡只填内网 DNS,别混着填。因为 Windows 查询 DNS 时会按网卡顺序尝试,混填可能导致内网域名被外网 DNS 拒答。
注意:Windows 防火墙有时会拦截跨网卡的访问,尤其是从外网网卡去访问内网共享资源时。如果排除了路由问题还是不通用,临时关闭防火墙测试一下,能通就把对应的入站规则加白名单,不要因噎废食长期关防火墙。
6. 配置脚本与长期维护
6.1 一键配置脚本
把常用的配置命令写成一个批处理脚本,省去每次手敲的麻烦。以下脚本以第 4 节的场景为例:
@echo off rem 内网网卡配置静态 IP netsh interface ip set address name="以太网 2" static 10.10.5.100 255.255.0.0 netsh interface ip set dns name="以太网 2" static 10.10.0.2 rem 添加静态路由 route delete 10.0.0.0 mask 255.0.0.0 route delete 172.16.3.0 mask 255.255.255.0 route add 10.0.0.0 mask 255.0.0.0 10.10.0.1 if 15 -p route add 172.16.3.0 mask 255.255.255.0 10.10.0.1 if 15 -p rem 验证 route print -4 pause脚本开头先执行route delete是为了保证脚本可重复运行。很多人写脚本时忘了删除旧路由,第二次执行会报“路由已存在”的错,或者残留多条相同的路由导致系统选路混乱。
6.2 路由表备份与恢复
配置完成后最好把整个 IPv4 配置备份一份。用 netsh 可以在命令行里导出网卡配置:
netsh interface ipv4 show config > 网卡配置备份.txt netsh interface ipv4 show route > 路由表备份.txt系统更新或误操作后,对照备份文件恢复即可。如果只是路由表乱了,可以直接重置所有静态路由,恢复到纯 DHCP 状态:
route -f这个命令会清除所有非默认路由,谨慎使用。执行后需要重新添加你的静态路由。
6.3 把配置做成开机自启
有些环境里同事的电脑也需要同样的双网卡配置,与其一台台手动配,我建议做一个更省事的版本:把脚本放到“启动”文件夹,或者用任务计划程序设置开机运行一次。批处理文件在开机时自动执行,管理员权限可以通过任务计划程序设置为“使用最高权限运行”来解决。
这样即使 DHCP 或系统更新把路由搞乱了,重启一次电脑也能自动恢复。实测这个方案在公司几十台办公电脑上运行稳定,省了不少运维时间。
6.4 多网段内网环境的扩展思路
如果你的内网不是单网段,而是多个业务系统分布在几个不同的地址段,只要重复添加静态路由就行了。比如公司还有一套 OA 系统在 172.16.8.0/24,只需要再加一条:
route add 172.16.8.0 mask 255.255.255.0 10.10.0.1 if 15 -p这时候“路由覆盖范围宁小勿大”的原则就很重要了。我习惯把每个独立业务系统的网段拆开写,而不是图省事写个大范围的掩码。少写一条路由的代价是某天某个业务突然不通,多写一条路由的代价是有可能把外网流量错误地拐进内网,权衡下来还是细粒度更安全。
我个人在实际操作中还有一个习惯:每次配置完成后,把命令、IP 规划、验证结果都记在文档里,标注清楚每块网卡的用途和路由规则。别小看这一步,几个月后网卡驱动更新或者换新电脑需要重新配置时,这份记录比任何记忆都可靠。双网卡配置本身不算复杂,真正让人翻车的永远是细节——接口选错、掩码写宽、DHCP 漂移、忘了加持久化参数,这些坑踩过一次就记住了。