
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 设为校内 DNSLinux 下则编辑对应网卡的 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 21 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] DescriptionAdd campus network static routes Afternetwork-online.target Wantsnetwork-online.target [Service] Typeoneshot ExecStart/usr/local/bin/campus-route.sh RemainAfterExityes [Install] WantedBymulti-user.target然后执行sudo systemctl enable campus-route.service sudo systemctl start campus-route.service这样配置一次后续再也不用管无论是重启还是休眠唤醒路由都会自动加回来。5.3 路由验证工具的日常使用习惯配置完路由之后建议养成一个习惯在浏览器访问校园网资源前先花三秒钟在终端里确认路由状态。Windows 下敲route print -4Linux 下敲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 或者休眠的坑。