路由表是什么意思?VPN断了电脑上不了网,我route print一看,多出来的那行就是真凶

上周出差,连公司VPN改了四十来分钟材料。活干完退出VPN,想去查个资料,网页转圈,微信转圈,全都转圈。我心想酒店网络又抽风?ping了一下家里那台路由器的网关192.168.31.1,通的,一个包没丢。再ping 223.5.5.5,石沉大海。
网关都通,外网全断,这种一半正常一半瘫的毛病,答案是从一条命令里翻出来的:route print。打出来一看,我那张路由表里,0.0.0.0开头的那行有两条。
路由表不是路由器专属,你电脑里就有一张
很多人一听路由表,觉得那是路由器肚子里才有的东西。其实只要这台设备能上网,它就有一张——Windows、Mac、手机、我家那台NAS,全有。路由器之所以叫路由器,就是因为它查这张表查得最勤快,仅此而已。
这张表的任务一句话讲完:设备每发一个包,先看包要去哪,再查表决定交给谁转手。你去的所有地方,出发前都先在这张表里过了一遍堂,只是你不知道。
电脑里这张表哪来的?平时不用你管。DHCP把IP发给你的同时,顺手把网关也告诉你,系统就照着生成一条默认路由,指向那个网关(DHCP那套自动发门牌的流程我写过一篇)。路由器那张表则是WAN口拨号成功后自动生成的。两边都是自动的,所以平时感觉不到它的存在——直到哪天表里多了一条不该有的东西。
Windows下看自己这张表的命令就是route print。开始菜单搜cmd回车,敲进去,滚出来一大屏。别被吓着,真正有用的就中间那一段,标题叫「活动路由」。
表里就三列是骨架:去哪、范围多大、交给谁
route print的输出有五列,头三列是骨架,我先拿自己电脑上正常状态的表给你拆:
| 列名 | 白话 | 我机器上的例子 |
| Network Destination | 这批包要去哪 | 0.0.0.0表示所有地方 |
| Netmask | 上面那个目的地圈了多大范围 | 255.255.255.0表示圈一栋楼 |
| Gateway | 包交给谁转手 | 192.168.31.1是家里主路由 |
| Interface | 从哪块网卡出门 | 有线网卡或者无线网卡 |
| Metric | 这条路的路费,越小的越优先 | 有线一般比无线小 |
Destination和Netmask是搭档,一个报地名一个报范围(掩码圈网段的算法我在子网掩码那篇里掰过)。192.168.31.0配上255.255.255.0,意思是「31.x这栋楼里的所有门牌」;0.0.0.0配上0.0.0.0,意思是「所有地方都算」。
Gateway那一列有两种写法,区别很关键。写的是你自己网卡的IP,标注On-link,意思是「目的地跟我在同一网段,不用求人,我直接喊他名字」——喊名字这个动作就是ARP广播(ARP那篇里NAS时通时断的案子就是喊错了人)。写的是31.1这种别人的地址,意思是「这地方我够不着,交给网关替我转」(网关就是你出门要过的那道大门,概念不清的先补这篇)。
正常状态下,一张家用电脑的路由表精简到头就三行:127.0.0.1那条是本机自己跟自己说话用的;192.168.31.0那两条管楼内串门;0.0.0.0那条管出楼,指向网关。三行,撑起你全部的上网流量。
查表不是从上往下,是「最具体的赢」
这张表有个脾气:它不是按顺序从上往下找,而是所有能匹配上的条目里,谁的范围圈得越小、越具体,谁说了算。行话叫最长前缀匹配,你记「最具体的赢」就够了。
电脑发一个去192.168.31.5的包。31.0那栋楼的条目匹配,0.0.0.0那条兜底的也匹配。前者更具体,听前者的,On-link直接送,不惊动网关。
发一个去223.5.5.5的包。楼内条目都套不上,只剩0.0.0.0那条兜底筐能装,走它,包被交给31.1。这条兜底路由就是默认路由,名字里的「默认」俩字就是干这个的:实在没人认领的包,全塞给它。
所以手动填IP忘填网关会发生什么,现在你能推出去了:表里没有0.0.0.0那条了。同网段照常能ping——On-link送包不靠网关;一出网段就没人接,包烂在手里。这跟169.254那篇里手动配IP自救的处境是同一套逻辑,工具不同,原理一个源头。
我的翻车现场:VPN赖着不走的那一行
回到出差那晚。route print打出来,0.0.0.0那行果然有两条:
0.0.0.0 0.0.0.0 10.12.60.13 10.0.0.0 0.0.0.0 192.168.31.1 25
公司VPN连上的时候,它给自己造了块虚拟网卡,配了个10.x的网段,然后往路由表里塞了一条新的默认路由,路费metric标成1。同目的地多条路,谁小走谁,这是规矩。VPN在的时候这么干没毛病——全局VPN的设计就是让所有流量都钻隧道,它抢走本来也正常。
毛病出在断开。虚拟网卡都没了,它塞的那条默认路由还赖在表里。我所有出楼的包,还在往10.12.60.13这个已经不存在的地址送,出去就没了下文。而楼内串门走On-link,根本不查默认路由,所以ping网关31.1照样通——这就是这个故障最坑人的地方:症状是一半正常一半瘫,你光盯着网关看,永远想不明白。
修就一行命令:route delete 0.0.0.0 mask 0.0.0.0 10.12.60.13,回车,网页当场就刷出来了。打那以后我退完公司VPN有个习惯动作,route print扫一眼0.0.0.0还剩几条,多了就删,十秒钟的事。
顺带说一句,我家里那套VPN回家玩的路线(在外面连NAS的三条路我跑通过)特意配的是分流模式:表里只加一条31.x网段指向隧道,默认路由还是本地网关。就算哪天断开残留了,废掉的也就去家里那一段,全局不至于瘫痪。装VPN的时候多想一步,比坏了再修省心。
家里真能用上路由表的三件事
第一件,旁路由试水。想让一台电脑先尝尝旁路由的过滤效果,又不想全家跟着赌,不用动路由器,就在这台电脑上把它的默认路由下一跳从主路由改成旁路由——说白了就是手动改网关那一步。更稳的做法是只加一条更具体的路由,让某一段流量走旁路由,其余照旧,试错成本压到最低(旁路由的接法和坑我踩过一轮)。这跟我当年「先设备级试一周再全局」的主张是同一件事的两种说法。
第二件,插着网线又开WiFi。这时候表里有两个默认路由,各走各的网卡,metric谁小听谁的。有线的路费一般更低,所以优先有线;你把网线一拔,表自动重排,流量切到WiFi,中间不断档。你感受过的「无缝切换」,底下就是这张表在倒腾。
第三件,tracert第一跳。tracert baidu.com,第一跳永远是你的默认网关。哪天你发现第一跳不是自家路由器的IP,先别急着怪运营商,多半是中间还有一层设备在拨号(谁在拨号怎么判断我在拨号那篇里写过),或者就是VPN这类东西又偷偷改了你的表。
三条命令一个顺序,收个尾
日常会用这三条就够:
| 命令 | 干什么 | 要注意的 |
| route print | 看表 | 重点盯0.0.0.0那几行 |
| route add 目标 mask 掩码 网关 | 加一条 | 结尾加 -p 重启才不丢 |
| route delete 目标 mask 掩码 网关 | 删一条 | 删错就重启,表会重建 |
Mac和Linux的名字不一样,Mac看表是netstat -rn,Linux是ip route show,思路完全一致,就不占篇幅了。
网关在这张表里的地位,现在应该彻底立体了:它就是默认路由的下一跳。「网关填错上不了外网」这句话翻译成路由表语言,就是你的包被送去了错误的转手人。下次再碰上上不了网,按这个顺序走:先ping网关分诊,通的话route print看0.0.0.0有几条,多出来的删掉;还不行,再往DNS那个方向查。三层筛下来,九成的「上不了网」都能落到具体哪一环。

发表评论