如果你也遇到过这种场面电脑一边插着校园网网线一边又开着电信宽带的热点或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系列。先看网卡和IPip 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 routesudo 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和tracerouteping 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在接口配置里加routesnetwork: 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加-pLinux按发行版做持久化。但如果一个环境里永远丢、重连就丢那基本可以确定是网卡驱动或DHCP客户端在重连时刷新路由表把静态路由一并清了。另一种情况是换网络环境后旧路由作妖。比如你带着笔记本回到家之前在校园网加的10.10.0.0/16还留在路由表里而家里的网关是192.168.1.1这个网关本身不可达路由会一直挂着但不产生实际影响。可是如果恰好家的局域网也用了10.x网段路由就会干扰本地设备访问。解决办法很简单离开固定网络环境前做一次清理。Windowsroute delete 10.10.0.0Linuxsudo 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和网关再对照内网段加一条精确路由试试。原理通了命令自然就不会背错。