什么是不对称路由
去程走 A 链路、回程走 B 链路,就是路由不对称。它本身在互联网上很常见且通常无害,但在两类环境里会直接制造故障:一是基于会话转发的防火墙与负载均衡,回程不在同一设备上时找不到会话,包被丢弃;二是 Linux 主机的反向路径过滤(rp_filter),严格模式下源地址不是从该接口该路回来的包会被静默丢弃。典型症状是「能 ping 通但 TCP 建连失败」或「时通时断、只有一个方向卡」。
基本信息
| 典型现象 | ping 通但 TCP 不通、单向通、时通时断、握手卡在一个方向 |
|---|---|
| 定位手段 | 在两端分别 traceroute 对方,比较路径与出口 |
| 常见元凶 | 多出口策略路由、会话型防火墙、rp_filter、源地址转换不一致 |
| 主机侧检查 | sysctl net.ipv4.conf.all.rp_filter 与具体接口的 rp_filter |
| 抓包要求 | 两端同时抓,单端抓包会得出片面结论 |
典型使用场景
- 多线出口(电信 + 联通 + 专线)环境下业务偶发连不上:核对回程出口是否一致
- 双机双网卡服务器新上线后 TCP 不通:检查 rp_filter 与策略路由优先级
- 云环境加了辅助网卡或弹性 IP 后流量异常:确认回程是否走另一张网卡
- 防火墙放行后仍不通:确认会话是否被回程路径上的另一台设备丢弃
- TCP 握手超时但 ICMP 正常:用两端 traceroute 与同时抓包把路径拼出来
双向路径对比
双向路径对比
# 在 A 端
traceroute -n <B 的地址>
# 在 B 端(对同一源地址)
traceroute -n <A 的地址>
# 结果路径若经过不同出口/防火墙,即存在不对称
# 带端口探测更接近业务路径(避免 ICMP 被策略区别对待):
traceroute -T -p 443 -n -m 20 <B 的地址>
# 主机侧查看策略路由与路由表选择:
ip rule show
ip route get <对端地址>
ip route show table all | head -20
# 检查 Linux 反向路径过滤是否在丢包:
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.eth0.rp_filter
# 统计被过滤丢弃的计数是否在增长:
nstat -az | grep -iE 'IPReversePathFilter|InAddrErrors'症状与指向
| 症状 | 指向 | 验证 |
|---|---|---|
| ping 通、TCP 不通 | 会话型防火墙或 rp_filter 丢回程 | 两端同时抓包看 SYN-ACK 是否被丢 |
| 单向能通 | 回程走了另一条出口 | 两端 traceroute 对比出口 |
| 同一目标有时通有时不通 | 按源地址或哈希分流,部分路径不对称 | 多次 ip route get 与抓包比对 |
| 内网正常、跨网段异常 | 多网卡主机的源地址与出接口不匹配 | 检查 ip rule 与源地址选择 |
不对称路由常伴随「单向通」:去程 SYN 到了、回程 SYN-ACK 被丢。抓包时务必两端同时抓,单端抓包只能看到一半事实,容易把责任判给错误的设备。
把 rp_filter 从严格(1)临时改成松散(2)可用于验证是否为内核丢包,但这是安全机制的放宽,验证完要评估影响并决定是否保留。