如果你也遇到过这种场面:电脑一边插着校园网网线,一边又开着电信宽带的热点或Wi-Fi,结果教务系统页面一直转圈,图书馆数据库点了半点反应,可微信、普通网页却又都正常。那基本可以确定,你正被“默认路由被覆盖”这个经典问题折腾。当时我整理这份笔记的时间是2020年10月,目的非常单纯:让校园网内网资源走校园网出口,让其他流量走电信宽带出口,并且把Windows和Linux两条路上的命令都写清楚。这份方案我沿用很久,今天把完整的配置思路和命令一起放出来,遇到类似“多网卡、多出口”需求的人可以直接参考。
1. 为什么要手动添加路由:先理解校园网与电信宽带的“路由博弈”
1.1 多网卡环境下的路由决策机制
路由表本质上是一张“目的地该怎么走”的查询表。操作系统每发出一个IP包,都会拿着目的地址去路由表里做匹配:如果有到达目的网段的明确条目,就走这个条目;如果找不到更精确的条目,就交给默认路由兜底。默认路由在路由表里的写法通常是0.0.0.0/0,也就是“任何我没写明的目标,都从这儿出去”。
打个比方:快递分拣中心里,大部分包裹走A分拣线,少部分写着“校内四号楼”的包裹必须走B分拣线。分拣员(操作系统)不会凭感觉决定走哪条线,而是看包裹面单(目的IP)符合哪条规则。规则写得越具体,优先级越高。这就是最长前缀匹配。手动添加路由表命令,本质上是替分拣员补上一条它原本不认识的“校内四号楼走B线”规则。
1.2 校园网场景下的具体冲突是怎么发生的
正常接网后,校园网网卡会拿到一个校园网网关,电信宽带网卡也会拿到一个电信网关。问题在于,桌面操作系统通常只默认保留一条,也就是0.0.0.0/0这条缺省网关。谁后连接,谁就经常抢占这个默认出口。
多数人的习惯是:先插上校园网网线,之后又连了电信宽带的Wi-Fi。结果系统把电信宽带网关设成了默认出口。此时你访问的制度内网IP,例如10.10.x.x,操作系统查路由表时发现表里没有针对这个段的具体条目,就把包丢给了电信网关。电信骨干网不认识校园网专用的私有地址段,或者压根不允许路由,包就直接被丢弃。于是出现“外网能开,校内系统一堆连接超时”的怪象。
这里还要注意:校园网里的教务系统、图书馆数据库、校内FTP、实验平台等,很多都不走公网,而是走校园网内部路由。一旦默认出口被电信宽带抢占,这些系统的流量全都会被送到错误的方向,表现就是一个字:卡,或者干脆打不开。
1.3 加路由前需要搞清楚的三个问题
在动手敲命令之前,先给自己做一个简单的信息整理,不然很容易加错。三个问题:
- 问题一:两块网卡各自的IP、子网掩码、默认网关是什么?
- 问题二:你要访问的校内资源,具体落在哪几个网段?
- 问题三:你希望哪条线路兜底走默认,哪条线路只负责校内指定网段?
我的目标策略很清晰:校园网内网段单独指向校园网网关,剩余流量全部交给电信宽带网关。这样校内资源稳定访问,电信宽带的高带宽也不浪费。至于你的策略是不是这样,取决于你所在学校的网络结构,但路由命令的写法是通用的。
2. 准备工作:动手前先把网络参数摸清楚
2.1 Windows下收集网络信息
打开命令提示符,注意要用管理员身份运行,否则后续加路由会被权限拦住。先执行:
ipconfig /all找到“以太网适配器”和“WLAN”两块网卡的信息,重点记录IPv4地址、子网掩码和默认网关。然后再看当前路由状态:
route print -4只看IPv4部分,避免输出太长干扰判断。观察0.0.0.0那一行的“网关”列,基本就能确认现在默认出口被谁占用了。更直观的界面可以用route print配合滚动条慢慢翻,但命令行里复制出来对比更省眼睛。
我习惯把两块网卡的信息单独复制到一个文本里,例如:
校园网网卡 IP: 192.168.1.100/24 网关: 192.168.1.1 电信宽带网卡 IP: 192.168.2.100/24 网关: 192.168.2.1写清楚后再决定加哪条路由,不容易出错。
2.2 Linux下收集网络信息
Linux下思路一样,只是命令换成ip系列。先看网卡和IP:
ip addr再看当前路由:
ip route show重点看default那一行指向谁。常见的校园网网卡名可能是eth0、enpXs0、wlan0;电信宽带可能通过另一个无线网卡连接,也可能是通过USB共享网络。记下校园网网卡名和它的网关,后续加路由时dev参数就能写对。
如果你用的是普通用户,记得给命令加sudo,或者直接切到root,不然权限不足会提示“RTNETLINK answers: Operation not permitted”。
2.3 确认需要分流的内网地址范围
这一步最容易被跳过,但恰恰最重要。校园网内网段没有统一标准,不同学校差异很大。常见的是10.0.0.0/8、172.16.0.0/12、192.168.0.0/16,但不要看到10开头就一把梭全部加上,这样可能把原本不需要走校园网出口的流量也拽进来。
最稳妥的办法是:只连校园网,不连电信宽带,然后打开你要访问的系统,在命令行里看连接目标的IP。Windows下可以用netstat -ano看活动连接,Linux下用ss -tunp,找到目标地址后对照网段。另一个更快的方法:
tracert -d 10.10.0.1观察第一跳是不是校园网网关。如果第一跳就是你的物理网关,说明这个地址确实走校园网出口。
我当时实际用到的内网段配置大概是下面这样的,具体以你自己学校为准:
- 教务系统相关段:10.10.0.0/16,指向校园网网关
- 图书馆数据库相关段:172.16.0.0/12,指向校园网网关
- 默认流量:0.0.0.0/0,指向电信宽带网关
3. Windows平台:路由表的添加、删除与永久保存
3.1 临时添加一条路由并测试
Windows加路由表用的是route命令,基础语法:
route add 目标网段 mask 子网掩码 网关比如我想让10.10.0.0/16走校园网网关192.168.1.1,就执行:
route add 10.10.0.0 mask 255.255.0.0 192.168.1.1先别急着加-p持久化参数,临时加一条,测试通了再说。加完用ping看效果:
ping 10.10.0.1再配合tracert确认路径:
tracert -d 10.10.0.1如果第一跳显示的是192.168.1.1,说明流量确实进入了校园网网关,方向对了。如果不通,先检查网关本身能否ping通,再看网段掩码是否写错。
3.2 用 -p 参数让路由永久生效
测试通过后,才把-p参数加上,让系统持久保存这条路由:
route add 10.10.0.0 mask 255.255.0.0 192.168.1.1 -p-p是persistent的缩写,命令执行后Windows会把这条路由写入注册表并作为持久路由加载,重启后依然存在。再次查看时可以这样确认:
route print -4输出中会有“Persistent Routes”这一节,列出的就是这个命令添加的持久条目。
不过要提醒一点:在公共机房、实验室或者经常换网络的笔记本上,尽量少用-p把路由写死。因为到了宿舍、图书馆、家里,网关完全可能不一样,之前写死的校园网路由反而会把流量指到错误的网关,轻则无法上网,重则出现奇怪的路由冲突。对这种场景,我建议用临时路由,或者配合后面的脚本方案。
3.3 Windows下删除与修改路由的注意事项
访问出错需要调整时,删除路由很简单:
route delete 10.10.0.0只填目的网段就行,不用写掩码和网关。修改一条已有路由的网关,可以用change参数:
route change 10.10.0.0 mask 255.255.0.0 192.168.1.2注意一点:route命令里掩码必须显式写成255.255.0.0这样的格式,不支持直接写10.10.0.0/16这种CIDR写法,这也是新手最容易翻车的地方之一。
另外,Windows的route add还有个可选参数IF,可以指定从哪个接口索引走。多网卡环境下这招很有用:
route add 10.10.0.0 mask 255.255.0.0 192.168.1.1 IF 12 -p接口索引可以通过route print输出的第一列看到。当系统同时存在有线网卡、无线网卡、虚拟网卡时,指定IF能避免流量跑到错误的网卡上。
4. Linux平台:ip route命令详解与按发行版持久化
4.1 临时添加一条路由并测试
Linux下的命令更加直观,用ip route:
sudo ip route add 10.10.0.0/16 via 192.168.1.1 dev eth0参数拆开看:10.10.0.0/16是目标网段,via后面是网关,dev后面是出接口网卡名。如果你的校园网是通过无线网卡连接的,dev就写wlan0。
测试同样用ping和traceroute:
ping 10.10.0.1 traceroute -n 10.10.0.1如果traceroute显示第一跳是192.168.1.1,就说明配置正确。想确认某条流量最终实际走了哪条路由,还可以用:
ip route get 10.10.0.1这个命令会直接告诉你前往这个目标地址的具体路径,以及命中的路由条目,排查时特别省事。
旧式写法route命令也能用:
sudo route add -net 10.10.0.0/16 gw 192.168.1.1但我个人更推荐ip route,因为它是iproute2工具包里的标准命令,信息更完整,语法也更统一。
4.2 不同发行版的持久化配置
临时路由重启后自动消失,想开机自动生效就得按发行版配置。我在不同环境下用过三种方式,这里分别列一下。
Ubuntu从18.04开始默认使用netplan,配置文件在/etc/netplan/目录下。找到对应上网卡的yaml,在接口配置里加routes:
network: version: 2 ethernets: eth0: dhcp4: no addresses: - 192.168.1.100/24 routes: - to: 10.10.0.0/16 via: 192.168.1.1改完后执行:
sudo netplan apply如果是Debian或老派Ubuntu系统,使用/etc/network/interfaces管理,可以在对应网卡配置末尾追加:
auto eth0 iface eth0 inet dhcp up ip route add 10.10.0.0/16 via 192.168.1.1 dev eth0up关键字表示网卡启动后执行后面的命令,适合dhcp场景。
CentOS/RHEL系列则习惯在/etc/sysconfig/network-scripts/目录下新建route-eth0文件,文件名里的eth0要对应你的实际网卡名,文件内容直接写:
10.10.0.0/16 via 192.168.1.1 dev eth0保存后重启网络服务:
sudo systemctl restart network如果系统用的是NetworkManager,修改传统配置文件有时会被覆盖,优先使用nmcli或netplan这类官方支持的方式。这套配置的核心思路就是让静态路由在网卡启动时自动注入,理解这一点后,不同发行版只是写法差异,原理完全一样。
4.3 批量添加与脚本化思路
如果校内资源分布在多个网段,一条条敲命令效率太低,建议直接在终端跑一个循环:
for net in 10.10.0.0/16 172.16.0.0/12 192.168.20.0/24; do sudo ip route add $net via 192.168.1.1 dev eth0 done循环里每次执行都会打印一个错误提示,但只要你用的是没有明确命令提示符的交互式shell,基本不会影响后续执行。更保险的写法是把标准错误重定向掉,把提示丢给日志文件:
for net in 10.10.0.0/16 172.16.0.0/12 192.168.20.0/24; do sudo ip route add $net via 192.168.1.1 dev eth0 2>> /tmp/route.log done如果想做成一键脚本,可以在此基础上加一个判断,先检测校园网网关是否可达,再决定是否执行路由添加。这样从宿舍换到家里网络时,脚本不会误把路由加到错误的网关上。
5. 实测中踩过的坑:排查与避坑清单
5.1 路由添加成功但就是不生效,先查这三点
第一,网关本身是否可达。加路由前先ping一下校园网网关,例如:
ping 192.168.1.1ping不通就检查网线、无线是否断开、网卡是否被禁用。网关不可达时,路由表里的条目再好看,数据包也出不去。
第二,是否存在更精确的冲突路由。有些设备会自动生成169.254.0.0/16或172.16.0.0/12等链路段路由,与你要加的目标段重叠。用路由查找命令确认实际路径:
Windows下:
route print -4Linux下:
ip route get 10.10.0.1如果结果显示的数据包走向不是你期望的那条,多半是有更优先的条目,把冲突条目删掉或调整掩码即可。
第三,校园网是否强制Web认证或客户端认证。很多学校即使网线插上、IP正常,也必须先通过认证才能访问内网。路由表规则明确,但网关策略直接丢弃未认证流量时,表象就是“路由看着对,实际还是不通”。这种情况下先完成认证,再测路由。
5.2 重启丢路由、换网络环境后路由冲突怎么办
重启丢路由是最常见的现象。如果你用的是临时route add,重启后路由被清空太正常了,想保留就让Windows加-p,Linux按发行版做持久化。但如果一个环境里永远丢、重连就丢,那基本可以确定是网卡驱动或DHCP客户端在重连时刷新路由表,把静态路由一并清了。
另一种情况是换网络环境后旧路由作妖。比如你带着笔记本回到家,之前在校园网加的10.10.0.0/16还留在路由表里,而家里的网关是192.168.1.1,这个网关本身不可达,路由会一直挂着但不产生实际影响。可是如果恰好家的局域网也用了10.x网段,路由就会干扰本地设备访问。解决办法很简单:离开固定网络环境前做一次清理。
Windows:
route delete 10.10.0.0Linux:
sudo ip route del 10.10.0.0/16另外,把需要持久化的路由按段分开管理,不要使用超级粗的大段路由,能降低冲突概率。我见过有人图省事直接把10.0.0.0/8一条加进去,结果在酒店或校外网络访问类似内网段时,全被拽进错误网关,排查起来特别痛苦。
5.3 虚拟网卡与多网关干扰的排查经历
装了虚拟机软件后,路由表通常会出现不少虚拟网卡条目。Windows下最典型的是VMware的VMnet1、VMnet8,以及Hyper-V的Default Switch。这些虚拟网卡本身带有网关,有些会生成172.x路由,和校园网内网段冲突。
遇到这种情况,我的建议是先禁用不用的虚拟网卡,或者在做路由测试时临时禁用,确认问题是否跟虚拟网卡有关。如果确认就是这个原因,Windows下可以给route add命令指定明确的接口索引:
route add 10.10.0.0 mask 255.255.0.0 192.168.1.1 IF 12 -p实现类似效果,Linux下则用dev参数指定物理网卡:
sudo ip route add 10.10.0.0/16 via 192.168.1.1 dev eth0当年我在调试实测中就遇到过一次:路由表条目完全正确,可tracert就是不从校园网网关走,后来发现是虚拟机的虚拟网卡启动后自动把166.x网段路由加进去了,和校园网网段重叠了一部分。禁用虚拟网卡后,一切恢复正常。见惯了这种操作后,我现在排查网络问题时,第一步永远先看接口列表。
6. 写在最后:一点个人配置习惯
我最后想分享一个小的个人习惯:不要把所有内网路由都做成全局永久路由。Windows的-p参数和Linux的开机自启脚本虽然方便,但绑定的是特定网络位置。宿舍里的固定校园网环境,我会把核心内网路由用-p固定;到图书馆、实验室这种网络出口可能不同的地方,我更倾向于用一个批处理脚本一键添加临时路由,离开时一键删除。这样既省事,又不会因为环境变化积累一堆无效路由。
2020年10月那次折腾,让我养成了在任何网络问题前先看路由表的习惯。很多时候断网、卡顿、访问不了内网,根本不是带宽或防火墙问题,而是操作系统根本不知道该把包往哪儿发。理解路由表,再用命令去修正它,很多疑难杂症会在几分钟内搞清楚。
如果你刚好也在多网卡、多出口的环境里被“内网打不开、外网却正常”折磨,不妨按上面的步骤先收集IP和网关,再对照内网段加一条精确路由试试。原理通了,命令自然就不会背错。