汇知百科
白蓝主题五 · 清爽阅读
首页  > 故障排查

网络协议栈路由表查询:排查网络不通的实用方法

路由表在哪儿,数据包就往哪儿走

你有没有遇到过这种情况:电脑连着网,浏览器却打不开网页,ping 外部地址也超时。重启路由器没用,杀毒软件也没报问题,最后发现是系统不知道该把数据包发给谁。这时候就得查网络协议里的路由表。

路由表就像快递系统的分拣规则,告诉操作系统“去 192.168.1.0 的包走内网,去 8.8.8.8 的包走默认网关”。一旦这条路由出错或缺失,再快的网速也白搭。

查看路由表的基本命令

在 Windows 上打开命令提示符,输入:

route print

你会看到一堆表格,重点看“网络目标”和“网关”这两列。比如,默认路由通常长这样:

网络目标        网关           接口          跃点数
0.0.0.0         192.168.1.1    192.168.1.100   30

这表示所有未知目的地的流量都会被送往 192.168.1.1。如果这一条没了,外网自然访问不了。

在 Linux 或 macOS 上,使用:

ip route show

或者老一点的系统:

route -n

输出类似:

default via 192.168.1.1 dev wlan0
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.100

这里的 default 就是默认路由,相当于 Windows 的 0.0.0.0 那条。

常见问题和处理方式

有时候你会发现路由表里有两条默认路由。比如插了 USB 网卡又连着 Wi-Fi,两个网络都设置了默认网关。这时候系统可能选错出口,导致明明连着网却上不了线。

可以手动删掉多余的:

route delete 0.0.0.0 mask 0.0.0.0 192.168.2.1

Linux 下用:

ip route del default via 192.168.2.1

还有一种情况是静态路由配置错误。公司内网常会加特定路由,比如把 10.10.0.0/16 的流量指向某个专用接口。如果手误写成 10.10.0.0/8,可能把不该走内网的请求也拦下来了。

查这类问题,可以用 traceroute(Windows 是 tracert)看看数据包到底走到哪一步断了:

tracert 8.8.8.8

如果第一跳就失败,很可能是本地路由表没配好。

别忘了检查策略路由

高级场景下,系统可能用了策略路由(Policy Routing),也就是根据源地址、端口等条件选择不同路由表。Linux 上可以用:

ip rule show

看看有没有按源 IP 分流的规则。如果某张自定义路由表里缺了默认路由,走那条路径的流量就会丢包。

开发人员调试多网卡应用时,容易忽略这一点。比如 Docker 启动容器后会新建虚拟网桥并添加独立路由规则,若主机网络切换频繁,这些规则可能失效。

自动化脚本辅助排查

如果你经常处理这类问题,可以写个简单脚本定期记录路由状态。Windows 批处理示例:

@echo off
route print > C:\routes\route_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.txt

Linux 可以用 shell 加入 cron:

*/10 * * * * ip route show > /var/log/route.log.$(date \+\%Y\%m\%d)

当网络出问题时,对比正常和异常时刻的路由快照,往往能一眼看出差异。