linux路由表无硬限制,所谓“满”实为fib缓存管理或gc机制触发保护;排查需先统计main表(ip route show table main | wc -l)和全表总量(ip route show table all 2>/dev/null | grep -v "empty" | wc -l),检查dmesg中fib6_gc_thresh或“no buffer space”提示;优化重点是调高ipv6 gc阈值、禁icmp重定向、清local残留路由、限bgp前缀、关ip转发及泛化策略规则。

Linux 系统中没有直接可调的“最大路由表项容量”硬限制参数,所谓“路由表满”,本质是内核在路由缓存(FIB)管理、内存分配或垃圾回收机制触发保护性行为所致。修改重点不在“扩容上限”,而在于调整回收策略、抑制无效路由注入、控制动态来源。
查清当前实际占用情况
先确认是否真受容量影响,而非误判:
- 统计主路由表条目数:
ip route show table main | wc -l - 统计所有策略表总条目(含 local/default):
ip route show table all 2>/dev/null | grep -v "empty" | wc -l - 检查内核日志是否有回收告警:
dmesg | grep -i "fib6_gc_thresh\|No buffer space"
若main表超 5 万、local表超 10 万,且伴随ip route add静默失败或报No buffer space available,需进入优化流程。
调整 IPv6 路由缓存 GC 阈值(最常见瓶颈)
IPv6 FIB 垃圾回收阈值默认极低(如 thresh3=1024),大量容器或 BGP 场景下极易触发强制清理并阻塞新增。修改 /etc/sysctl.conf:
net.ipv4.fib6_gc_thresh1 = 1024 net.ipv4.fib6_gc_thresh2 = 4096 net.ipv4.fib6_gc_thresh3 = 8192
执行 sysctl -p 生效。该调整不增加内存占用,仅放宽回收触发条件,避免高频抖动。
控制无效路由生成源头
多数“撑满”源于自动注入,非手动配置:
-
禁用 ICMP 重定向接收:
net.ipv4.conf.all.accept_redirects = 0(防止恶意/错误重定向注入unreachable路由) -
清理残留 local 路由:容器平台异常退出后常堆积
local xxx dev eth0 scope host,可用ip route flush table local清理(不影响活跃接口) -
限制 BGP/OSPF 接收前缀:若运行 FRR/BIRD,务必配置
max-prefix和前缀长度过滤(如只收/24及更粗),避免引入数十万公网路由
关闭非必要功能释放内核负担
-
关闭 IP 转发(如非路由器场景):
net.ipv4.conf.all.forwarding = 0,减少内核维护的转发相关状态 -
禁用策略路由泛化规则:检查
ip rule show,删除无from/to限定的宽泛规则(如lookup 200),避免每次查路由都遍历冗余表
不复杂但容易忽略











