路由转发丢包率高通常不是路由本身丢包,而是IP层或后续环节异常丢弃;需排查IP转发是否开启、rp_filter是否误触发、iptables/nftables FORWARD链规则是否静默DROP,以及ip route get验证实际转发路径是否一致。

路由转发丢包率高,通常不是“路由本身丢包”,而是数据包在经过Linux内核协议栈的IP层或后续环节时被异常丢弃。Linux不主动丢弃合法转发的数据包,但当配置错误、资源不足或策略干预时,就会在路由决策后或转发过程中触发丢包。排查需聚焦在是否真正执行了转发、转发路径上哪些环节拦下了包、有没有被静默丢弃而无日志这三个核心问题。
确认系统已启用IP转发
若未开启,所有非本机目的IP的数据包都会被直接丢弃,且通常不报错。
- 检查:运行
sysctl net.ipv4.ip_forward,返回net.ipv4.ip_forward = 0表示关闭 - 临时开启:
sudo sysctl -w net.ipv4.ip_forward=1 - 永久生效:在
/etc/sysctl.conf中添加net.ipv4.ip_forward = 1并执行sysctl -p
检查反向路径过滤(rp_filter)是否误丢包
rp_filter 启用严格模式(值为1或2)时,会校验入向包的源IP是否能通过当前入口网卡路由回程。若拓扑非对称(如多出口、策略路由),极易触发丢包,且默认不记录日志。
- 查看各接口设置:
sysctl net.ipv4.conf.all.rp_filter和sysctl net.ipv4.conf.eth0.rp_filter - 常见修复:设为宽松模式
sudo sysctl -w net.ipv4.conf.all.rp_filter=2(推荐)或彻底关闭=0 - 注意:修改后需重新触发流量测试,该丢包不会出现在
/proc/net/dev或ethtool -S统计中
定位iptables/nftables规则导致的静默丢包
FORWARD链中的 DROP 或 REJECT 规则,尤其是带条件匹配(如状态、端口、速率)的规则,是转发丢包最常见原因。这类丢包不会增加网卡统计,但可通过计数器确认。
- 查看 FORWARD 链规则及命中数:
sudo iptables -L FORWARD -nv或sudo nft list chain ip filter forward - 重点关注
pkts列有增长但无对应 ACCEPT 的 DROP/REJECT 规则 - 临时清空测试:
sudo iptables -P FORWARD ACCEPT && sudo iptables -F FORWARD(操作后务必验证业务)
检查路由表与实际转发路径是否一致
看似有路由,但因策略路由、路由缓存(已废弃)、fib_lookup失败等原因,仍可能无法正确转发。
- 用
ip route get from iif模拟真实转发路径,确认输出接口和下一跳 - 对比
ip rule show是否存在冲突的策略规则(如基于源地址选路) - 若使用 VRF 或 network namespace,确保路由查询在对应上下文中执行











