问题现象
在多网卡或复杂的网络路由环境(如使用 LVS 负载均衡、Overlay 网络、非对称路由场景)中,系统出现以下异常:
服务访问异常:通过负载均衡(SLB)访问后端服务器时,出现健康检查失败或业务访问不通的情况,但直接登录并访问后端服务器的服务端口却是正常的。
网络连接超时:在多网卡或配置了策略路由的ECS实例上,部分方向的网络连接出现偶发性超时或完全不通。
系统存在丢包:通过
tcpdump等工具抓包,可以观察到数据报文已进入网卡,但上层应用程序无法接收到数据。
问题原因
该问题通常由rp_filter内核参数的严格模式(值为1)与非对称路由(Asymmetric Routing)网络环境并存导致。非对称路由指数据报文的往返路径不一致。当系统开启rp_filter严格模式时,内核会对接收到的每个数据包进行反向路由验证,如果数据包的入口网卡不是系统路由表中的最优出口,该数据包将被丢弃。
原因一:多网卡或策略路由导致的非对称路由:在拥有多个网卡的ECS实例中,如果配置了策略路由,可能导致一个数据包从
eth0网卡进入,但其响应包根据路由策略需要从eth1网卡发出。此时,严格模式的rp_filter会认为该数据包路径非法而将其丢弃。原因二:负载均衡(LVS-DR模式)导致的非对称路由:使用阿里云负载均衡(如CLB)的四层监听(TCP/UDP协议)时,其后端服务器默认采用DR(Direct Routing)模式。在该模式下,客户端请求报文经由LVS到达后端ECS,但ECS的响应报文会绕过LVS直接返回给客户端。这对ECS来说是典型的非对称路由,如果ECS开启了
rp_filter严格模式,就会丢弃来自LVS的请求报文。
解决方案
方式一:设置为宽松模式(推荐)
将rp_filter设置为宽松模式(值为2)。内核仅检查源IP地址是否存在于路由表中并且可达,而不强制要求入口网卡为最佳出口,适用于所有非对称路由场景。
临时修改内核参数以立即生效。
# 将所有网卡的rp_filter模式设置为宽松模式 echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter echo 2 > /proc/sys/net/ipv4/conf/default/rp_filter测试业务是否恢复正常。如果问题解决,请继续下一步将其永久化。
编辑
/etc/sysctl.conf文件,添加或修改以下配置,使其在系统重启后依然生效。# 编辑配置文件 vi /etc/sysctl.conf # 添加或修改以下两行 net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2执行
sysctl -p命令使永久配置生效。sudo sysctl -p
方式二:关闭指定网卡的验证
如果只有特定的网卡(例如eth0)接收来自LVS的流量,可以选择仅关闭该网卡的反向路由验证。
临时关闭
eth0网卡的rp_filter。echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter测试业务是否恢复正常。如果问题解决,请继续下一步将其永久化。
编辑
/etc/sysctl.conf文件,添加或修改以下配置。# 编辑配置文件 vi /etc/sysctl.conf # 添加或修改以下行 net.ipv4.conf.eth0.rp_filter = 0执行
sysctl -p命令使永久配置生效。sudo sysctl -p
方式三:全局关闭验证
此方式将完全禁用反向路由验证,会使系统面临IP欺骗攻击的风险。
临时修改内核参数。
# 警告:此操作会降低系统安全性,请谨慎使用 echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter测试业务是否恢复正常。如果问题解决,请继续下一步将其永久化。
编辑
/etc/sysctl.conf文件,添加或修改以下配置。# 编辑配置文件 vi /etc/sysctl.conf # 警告:以下配置会使服务器面临IP欺骗攻击的风险 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0执行
sysctl -p命令使永久配置生效。sudo sysctl -p
后续建议
遵循最小权限原则:在调整rp_filter参数时,优先选择影响范围最小的方案。例如,使用宽松模式(rp_filter=2)优于完全关闭(rp_filter=0),修改单个网卡配置优于修改全局配置。