2020年10月,宿舍里拉好了电信宽带,网速确实比校园网爽不少,结果第二天同学就来找我,说教务系统、图书馆电子资源、校内OA全打不开了,连学校主页都时通时断。我过去一看,网卡同时接了校园网和电信宽带,Windows 系统自动给了两条默认路由,数据包全跑去电信网关,校园网内网段自然就“失联”了。这个问题不复杂,本质就是路由表方向不对,用几条 route 命令就能掰回来。这篇就把当时排查和配置的过程完整写出来,同时覆盖 Windows 和 Linux 两种系统,给遇到同类双网接入问题的朋友一个能直接抄的作业。
1. 双网并存的矛盾根源:两条默认路由在打架
1.1 宿舍网络环境的典型拓扑
先交代一下场景。学校宿舍楼里一般有两种网络接入方式:一种是校园网有线口,插上去认证后就能访问校内资源和部分外网;另一种是自己拉电信宽带,光猫加无线路由器,PPPoE拨号上网,速度快、高峰期稳。
很多同学的操作是:电脑有线口插着校园网,无线网卡连着电信路由器,想的是“两边同时用,哪个好用走哪个”。Windows 也确实会同时给两个网卡配默认网关,看着好像挺智能,实际上是把路由表搞乱了。
这时候的网络拓扑大致是:
- 校园网有线网卡:自动获取 IP,假设网关是 192.168.50.1;
- 电信宽带无线网卡:自动获取 IP,网关是 192.168.1.1;
- 校园网内网资源:统一规划在 10.0.0.0/8 这个大网段里面,比如教务系统 10.1.2.3、图书馆 10.2.0.5、校内应用平台 10.3.1.8。
数字不重要,关键是网段差异。校园网出口在内网段,电信出口在互联网,两个出口互不相通。
1.2 “能上外网、进不了内网”的完整判断链路
同学描述的现象是“外网能上,B站抖音都正常,但学校网站全部打不开”。这里要注意,学校网站分两种:一种做了公网映射,外网也能访问;另一种只对校内开放,必须走校园网。
只要目标地址落在 10.0.0.0/8 内网段,数据包就需要交给校园网网关 192.168.50.1。但 Windows 的默认路由表里,同时存在两条:
0.0.0.0/0 → 192.168.1.1(电信) 0.0.0.0/0 → 192.168.50.1(校园网)系统选择默认路由时,会根据网卡的接口跃点(Interface Metric)来决定优先级。两个网卡的跃点如果差不多,系统就随机选,于是就会出现同一台电脑,一会儿走电信网关,一会儿走校园网网关。访问校内 IP 时,数据包被扔给了电信网关,电信那边没有回程路由,丢包超时,页面自然打不开。
验证方法很简单,打开命令行执行:
ping 10.1.2.3如果通,说明校园网链路正常;如果超时,再看下一跳:
tracert -d 10.1.2.3第一跳如果是 192.168.1.1,那就确认了——数据包走了电信。再敲一下route print -4,你会看到两条 0.0.0.0/0 的默认路由并列在那里,这就是问题根因。
所以核心不是加一条路由的事,而是要让“去内网的流量走校园网,去外网的流量走电信”,两者互不干扰。理解了这一点,后面所有命令就都是顺理成章的操作。
2. Windows 下的核心操作:静态路由绑定与默认跃点调整
2.1 第一步:清理默认路由,只留电信一条出口
Windows 网络适配器默认开启了“自动跃点”,这功能在双网卡场景下就是灾难。我们需要手动干预,把默认流量固定到电信宽带。
打开“网络连接”→ 找到电信宽带对应的无线网卡 → 右键属性 → 选中“Internet 协议版本 4 (TCP/IPv4)”→ 高级 → 取消“自动跃点”,在“接口跃点数”里填1。再把校园网有线网卡同样设置,接口跃点数填10。
这样设置之后,默认路由的优先级就固定了:所有未匹配到明细路由的流量,优先走电信网关。你可以再执行route print -4确认,0.0.0.0/0 的路由只保留电信网关,校园网那条默认路由会自动消失,因为系统发现校园网接口跃点更高,不再把它当作默认出口。
提示:这一步很多人忽略,直接跳到加路由,结果加完静态路由依然不稳定,就是因为默认路由没有被正确收敛。先调跃点,再处理明细路由,顺序不能反。
2.2 第二步:查看接口索引,避免路由绑定到错误网卡
执行:
route print -4输出里会列出所有网卡的接口列表,类似:
接口列表 4...00 1a 2b 3c 4d 5e ...... Intel(R) Ethernet Connection 7...00 1c 2d 3e 4f 5a ...... Intel(R) Wireless-AC 8265这里的4是校园网有线网卡的接口索引,7是电信无线网卡的接口索引。记住校园网那张卡的索引,下一步添加静态路由时要指定它。
为什么要指定接口索引?因为route add命令如果不写IF参数,Windows 会根据下一跳 IP 地址自动匹配接口。如果两个网卡恰好有网段重叠,或者路由表里存在相同网段的多条记录,系统就可能选错接口,路由加成功了却完全不起作用。
2.3 第三步:添加校园网内网段的静态路由
现在把校园网的所有内网段指向校园网网关。以网段 10.0.0.0/8 为例,在管理员命令行执行:
route add 10.0.0.0 mask 255.0.0.0 192.168.50.1 IF 4 -p解释一下各参数:
10.0.0.0目标网段;mask 255.0.0.0子网掩码,代表 10.x.x.x 整个大段都走这条路由;192.168.50.1校园网网关;IF 4强制绑定校园网有线网卡;-p持久化路由,重启后依然生效。
如果你的校园网内网资源不止一个网段,可以多写几条。例如还有 172.16.0.0/12 段的资源,就再加一条:
route add 172.16.0.0 mask 255.240.0.0 192.168.50.1 IF 4 -p注意子网掩码别写错。255.240.0.0 对应的 CIDR 是 /12,代表 172.16.0.0 – 172.31.255.255 范围。写错掩码会导致路由覆盖范围过大或过小,范围过大会把电信宽带的正常流量也带偏,范围过小则漏掉部分内网地址。
2.4 第四步:验证是否真正生效
添加完成后,执行:
route print -4在“IPv4 路由表”区域,你应该能看到类似这样的记录:
10.0.0.0 255.0.0.0 192.168.50.1 10 10 4然后分别验证两条链路:
ping 10.1.2.3此时应该能通,且tracert -d 10.1.2.3的第一跳是 192.168.50.1。再验证电信链路:
ping 223.5.5.5第一跳应该是 192.168.1.1。两个方向都对了,就说明路由配置正确。
注意:如果你发现
ping 10.1.2.3依然走到电信网关,先检查静态路由里的网关 IP 是否可达。执行route print -4确认路由状态是否为“永久”,如果不是永久路由,说明上一步忘加了-p参数。
3. Linux 系统的路由配置:命令更短,但细节更较真
3.1 基础命令与网卡信息获取
Linux 下做同样的事情,绕不开ip命令。先查看当前网络接口和路由状态:
ip addr ip route show假设识别出校园网有线网卡叫 eth0,电信宽带无线网卡叫 wlan0,两者连接正常。查看路由表,你会看到类似:
default via 192.168.1.1 dev wlan0 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.100 192.168.50.0/24 dev eth0 proto kernel scope link src 192.168.50.100这里有一个小细节:校园网接口上可能带有自己的直连路由,但直连路由只覆盖本地子网,并不会自动添加内网段路由。访问 10.0.0.0/8 时,内核找不到匹配路由,就丢给默认路由 wlan0 走电信。
3.2 临时路由命令,即刻生效
添加一条指向校园网网关的静态路由:
sudo ip route add 10.0.0.0/8 via 192.168.50.1 dev eth0解释一下语义:到 10.0.0.0/8 的数据包,下一跳交给 192.168.50.1,从 eth0 接口发出。加上dev eth0是保险操作,避免系统多网卡时选错出口。
如果你要添加多个网段,可以逐条添加:
sudo ip route add 172.16.0.0/12 via 192.168.50.1 dev eth0添加完成后,执行ip route show确认:
default via 192.168.1.1 dev wlan0 10.0.0.0/8 via 192.168.50.1 dev eth0 172.16.0.0/12 via 192.168.50.1 dev eth0删除路由同样简单:
sudo ip route del 10.0.0.0/8 via 192.168.50.1 dev eth03.3 永久生效的三种配置方案
临时路由重启后会消失,所以还要看你怎么让它永久生效。根据系统网络管理方式的不同,有三种常见做法。
第一种,基于apt系系统自带的netplan。以 Ubuntu 为例,修改/etc/netplan/01-netcfg.yaml,在校园网有线网卡 eth0 下增加路由段:
network: version: 2 ethernets: eth0: dhcp4: true routes: - to: 10.0.0.0/8 via: 192.168.50.1执行sudo netplan apply生效。
第二种,在/etc/rc.local或/etc/rc.d/rc.local里追加命令。这是最通用也最容易理解的方案,适合没有 netplan 的发行版:
#!/bin/bash ip route add 10.0.0.0/8 via 192.168.50.1 dev eth0 ip route add 172.16.0.0/12 via 192.168.50.1 dev eth0 exit 0记得给文件加执行权限,并且在 systemd 环境下确保 rc-local 服务正常启动。
第三种,用 NetworkManager 自带的 dispatcher 脚本。如果你用的是桌面发行版,网络归 NetworkManager 管,那最佳实践是新建/etc/NetworkManager/dispatcher.d/99-campus-routes,属性设置为 root 用户可执行:
#!/bin/bash if [ "$2" = "up" ]; then ip route add 10.0.0.0/8 via 192.168.50.1 dev eth0 2>/dev/null ip route add 172.16.0.0/12 via 192.168.50.1 dev eth0 2>/dev/null fi这个脚本只要网卡接口 up,就会自动执行,比硬塞到 rc.local 里更适配图形化环境,也是我更推荐的方式。
3.4 路由优先级与 Metric 调整
Linux 下同样存在默认路由优先级问题。如果电信宽带和校园网两条链路同时有默认路由,可以用ip route add default后面的metric参数来指定优先级:
sudo ip route add default via 192.168.1.1 dev wlan0 metric 10 sudo ip route add default via 192.168.50.1 dev eth0 metric 20数字越小优先级越高。这样在正常情况下,默认流量走电信,只有匹配到明细路由的校内网段才走校园网。不过多数情况下,我们添加了明细路由之后就不需要动默认路由了,保持系统已有的默认路由即可。
4. 那些年一起踩过的坑:DNS、跃点、休眠、掩码
4.1 坑一:内网资源还是打不开,但 IP 能 ping 通
这是最让人抓狂的情况。路由表看着完全正常,ping内网 IP 也通,但浏览器打开学校网站就是报错。
问题大概率出在 DNS 上。校园网很多内网域名只有校内 DNS 服务器能解析,电信 DNS 不知道这些记录。比如学校图书馆的电子资源系统,域名看似正常,但只在校园网 DNS 里有 A 记录。
排查方法:用nslookup对比域名解析结果。如果发现解析出来的 IP 不对,或者根本解析不了,就把校园网 DNS 地址加到网卡的备用 DNS 里。Windows 下打开 IPv4 属性,把默认 DNS 设为电信公共 DNS,备用 DNS 设为校内 DNS;Linux 下则编辑对应网卡的 nameserver。
还有一种情况是域名本身能解析,但功能页面用到多个内部子域名,需要你确认这些子域名都解析到了内网 IP。如果只有部分走了校园网路由,页面上的某些接口还是会失败。
4.2 坑二:默认路由没有收敛,网络时断时续
我在 2.1 节里专门强调先调跃点,就是因为很多同学跳过了这一步,直接加静态路由,结果上网体验更差了——一会儿正常,一会儿所有网页都打不开。
原因很简单:两条默认路由并存且优先级相近时,系统会随机选择出口。HTTP 连接突然中断,然后刷新又好了,就是典型的默认路由漂移。
解决办法除了手动设置接口跃点数之外,还可以考虑写一条默认路由的 QoS 策略,但那是企业级网络设备才需要做的事,个人电脑上手动调跃点数就够了。
4.3 坑三:笔记本休眠之后再开机,路由“神秘消失”
Windows 下,非持久化的路由在网卡重启后会消失。休眠模式下,系统可能会为了节能断开网卡连接,唤醒后网卡重新获取 IP,之前的内存路由就被清掉了。
处理方式有两种。一种是在添加路由时直接带-p参数,让 Windows 把路由写入注册表,持久生效。另一种是写一个批处理脚本,放在启动目录下,开机自动执行:
@echo off route add 10.0.0.0 mask 255.0.0.0 192.168.50.1 IF 4 -p route add 172.16.0.0 mask 255.240.0.0 192.168.50.1 IF 4 -pLinux 下休眠后路由丢失同样常见,所以我在上一节才给出了永久配置方案,而不是让大家每次开机手动敲命令。
4.4 坑四:掩码写错,小问题引发大范围网络异常
有一次帮同学配置,他按网上的教程写的是route add 10.1.2.3 mask 255.255.255.255 ...,直接把单个 IP 加进去了。结果教务系统能访问,但图书馆的资源还是打不开。
问题就出在掩码太窄。10.0.0.0/8 是整个内网的大范围,10.1.2.3/32 只是一个具体地址。如果你不确定内网总共有多少个网段,最稳妥的办法是先查学校网络中心公布的地址规划,或者直接用10.0.0.0 mask 255.0.0.0覆盖所有以 10 开头的地址。
但这里也有个反面案例:有人直接把0.0.0.0 mask 0.0.0.0改成了校园网网关,等于把默认路由换掉了,所有流量都走校园网,结果外网访问慢得离谱。所以掩码范围宁缺毋滥,能覆盖内网就行,千万不要动默认路由。
5. 脚本化一劳永逸:把路由命令变成开机自动执行
5.1 Windows 批处理脚本:管理员权限与开机启动
Windows 下建议把路由命令写进批处理脚本,放到“启动”文件夹。脚本里第一行加上管理员权限检查,因为route命令必须管理员运行:
@echo off net session >nul 2>&1 if %errorlevel% neq 0 ( echo 请右键选择以管理员身份运行此脚本 pause exit /b ) route add 10.0.0.0 mask 255.0.0.0 192.168.50.1 IF 4 -p route add 172.16.0.0 mask 255.240.0.0 192.168.50.1 IF 4 -p echo 校园网路由配置完成 pause如果你已经用了-p持久路由参数,其实不需要开机重复执行,这个脚本主要是为了在网卡索引变化时重新配置。有些笔记本 BIOS 更新后,网卡顺序会变,IF参数对应的索引号可能会变化,这时就需要重新运行脚本调整。
5.2 Linux 脚本:三行命令解决核心问题
如果你更喜欢纯粹的脚本控制,把下面这段放到/usr/local/bin/campus-route.sh,赋可执行权限:
#!/bin/bash ip route add 10.0.0.0/8 via 192.168.50.1 dev eth0 2>/dev/null ip route add 172.16.0.0/12 via 192.168.50.1 dev eth0 2>/dev/null然后配合 systemd 服务或者 NetworkManager dispatcher 一起用。用 systemd 的话,写一个 service 文件:
[Unit] Description=Add campus network static routes After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/usr/local/bin/campus-route.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target然后执行:
sudo systemctl enable campus-route.service sudo systemctl start campus-route.service这样配置一次,后续再也不用管,无论是重启还是休眠唤醒,路由都会自动加回来。
5.3 路由验证工具的日常使用习惯
配置完路由之后,建议养成一个习惯:在浏览器访问校园网资源前,先花三秒钟在终端里确认路由状态。Windows 下敲route print -4,Linux 下敲ip route show,看看 10.0.0.0/8 那一条是不是还在。万一哪天打不开内网了,这个检查能帮你快速从 DNS、防火墙、路由三层里定位问题。
排查顺序我总结为一条链路:先ping内网 IP,能通则查 DNS;不能通则看tracert或ip route get,确认下一跳是不是校园网网关;如果下一跳不对,就看路由表;如果路由表正常但下一跳不通,再查网卡物理连接。这个顺序能帮你节省大量踩坑时间。
说到最后,我自己的经验是:每次帮人配这种双网环境,最花时间的都不是命令本身,而是要先搞清楚用户学校的内网规划到底落在哪些网段。有的学校把内网做在 172.16.0.0/12,有的学校用 10.0.0.0/8,还有的学校同时用多个段,比如 OA 在 10.x、教务在 172.x。摸清楚网段,再加一条静态路由,整个网络马上恢复正常。所以如果你现在正被校园网加电信宽带的路由问题折磨,按我上面给的脉络走一遍:先看路由表,确认默认路由走向,再确认内网网段,然后针对性加路由,十分钟内就能解决。万一你折腾完还是有问题,也别急着重装系统,先看看是不是踩了我上面写的 DNS 或者休眠的坑。