linux内核路由表不记录历史变更,仅保存当前生效条目;ip route等命令只读取fib快照,无时间戳或操作溯源能力;需依赖systemd-networkd、networkmanager等上层服务日志或shell历史追溯变更原因。

Linux 内核路由表本身不记录动态更新历史——它只保存当前生效的路由条目,没有内置日志或时间戳功能。
为什么 ip route 不显示历史记录
路由表是内核网络栈的运行时状态快照,不是数据库。每次添加/删除/修改路由(如 DHCP 获取、NetworkManager 重配置、ip route add 执行),旧条目被直接覆盖或替换,无回溯机制。
-
ip route、route -n、netstat -rn都只读取当前 FIB(Forwarding Information Base)内容,不包含“何时”“谁触发”的元信息 - 内核未提供
/proc/net/route的历史版本,该文件仅反映此刻状态 - 策略路由、多表路由(如
table local)同样无变更日志,ip route show table X只输出当前快照
哪些组件可能留下间接线索
真正能帮你还原“路由何时变、怎么变”的,是管理路由的上层服务,而非路由子系统本身:
-
systemd-networkd:启用LogLevel=debug后,其 journal 日志会记录路由增删,例如:Jul 09 14:22:18 host systemd-networkd[1234]: ens33: Adding route: dst: 0.0.0.0/0, gw: 192.168.1.1
-
NetworkManager:运行journalctl -u NetworkManager --since "1 hour ago" | grep -i route,可看到类似dhcp4 (ens33): set default route via 10.0.0.1的事件 - DHCP 客户端(如
dhclient或dhcpcd):其日志(通常在/var/log/syslog或 journal)会明确写出获取到的网关和路由选项 - 手动操作痕迹:检查 shell 历史(
history | grep -E "(ip route|route add|nmcli)"),但仅限当前用户且未清除 history 的情况
如何主动开启路由变更监控
若需长期追踪,必须外部介入,不能依赖内核原生能力:
- 用
inotifywait监控/etc/network/interfaces或/etc/NetworkManager/system-connections/(配置变更 ≠ 路由即时生效,但可作为起点) - 写一个轮询脚本,每秒执行
ip route show > /tmp/route-$(date +%s)并用diff比对前后差异——开销低但只能捕获“变化后”,无法定位触发源 - 启用 netlink socket 监听(C/Python 使用
libnl或pyroute2):可实时收到RTM_NEWROUTE/RTM_DELROUTE事件,含协议、表号、源(如proto kernel表示内核自动生成,proto static表示手动添加)
真要查某次路由突变的原因,别翻路由表本身——直接看 journalctl -b 里 network 服务的日志,或者确认最近是否执行过 nmcli、dhclient -r、ip link down 这类操作。内核路由表干净得只剩结果,过程全在别处。











