CentOS 6.10与Miracle Linux 8.7多网卡(LAN+PPPOE)路由异常及ip route顺序影响咨询
首先,我完全理解你的困扰:给服务器配置了多网卡,一块用于LAN,其余绑定PPPOE连接,CentOS 6.10下每个PPPOE的数据包都能正确走对应的链路,但在Miracle Linux 8.7(RHEL兼容发行版)中,PPPOE的数据包却被错误路由到了默认LAN接口,你怀疑这和ip route的输出顺序有关,想搞清楚问题所在。
我们先对比两个系统的配置差异,再一步步分析可能的原因:
一、CentOS 6.10 正常配置及测试结果
系统版本
# cat /etc/redhat-release CentOS release 6.10 (Final)
路由表配置
# cat /etc/iproute2/rt_tables | grep -v "^#\|^$" 255 local 254 main 253 default 0 unspec 100 tbl_ppp0
主路由表
# ip route C.C.C.C dev ppp0 proto kernel scope link src A.A.A.A 169.254.0.0/16 dev eth0 scope link metric 1002 default via 192.168.1.1 dev eth0
自定义PPPOE路由表
# ip route show table tbl_ppp0 default via A.A.A.A dev ppp0
路由规则
# ip rule | grep tbl_ppp0 27373: from A.A.A.A lookup tbl_ppp0
Squid配置(绑定PPPOE IP)
# cat /etc/squid/acl.conf | grep ppp0 http_port A.A.A.A:3128 name=ppp0_IP acl ppp0_acl myportname ppp0_IP tcp_outgoing_address A.A.A.A ppp0_acl
测试结果(正常)
# curl -s -m 2 http://ifconfig.co/ip -x A.A.A.A:3128 A.A.A.A
日志显示数据包正确走PPPOE链路:
# tail /var/log/squid/access.log | grep A.A.A.A 1688498713.497 260 A.A.A.A TCP_MISS/200 683 GET http://ifconfig.co/ip - DIRECT/172.64.163.15 text/plain
二、Miracle Linux 8.7 异常配置及测试结果
系统版本
# cat /etc/redhat-release MIRACLE LINUX release 8.7 (Peony)
路由表配置
# cat /etc/iproute2/rt_tables | grep -v "^#\|^$" 255 local 254 main 253 default 0 unspec 100 tbl_ppp0
主路由表
# ip route default via 172.20.0.1 dev enp1s0 169.254.0.0/16 dev enp1s0 scope link metric 1002 172.20.0.0/24 dev enp1s0 proto kernel scope link src 172.20.0.104 C.C.C.C dev ppp0 proto kernel scope link src B.B.B.B
自定义PPPOE路由表
# ip route show table tbl_ppp0 default via B.B.B.B dev ppp0
路由规则
# ip rule | grep tbl_ppp0 32615: from B.B.B.B lookup tbl_ppp0
Squid配置(绑定PPPOE IP)
# cat /etc/squid/acl.conf | grep ppp0 http_port B.B.B.B:3128 name=ppp0_IP acl ppp0_acl myportname ppp0_IP tcp_outgoing_address B.B.B.B ppp0_acl
测试结果(异常)
# curl -s -m 2 http://ifconfig.co/ip -x B.B.B.B:3128 X.X.X.X ← this ip is enp1s0
日志显示数据包错误走LAN链路:
# tail /var/log/squid/access.log | grep B.B.B.B 1688498755.023 282 B.B.B.B TCP_MISS/200 681 GET http://ifconfig.co/ip - HIER_DIRECT/172.64.163.15 text/plain
三、问题分析与排查建议
从配置来看,两个系统的核心路由策略完全一致:基于源IP(PPPOE的本地IP)匹配自定义路由表,强制走PPPOE链路,但Miracle Linux 8.7下未生效。我认为ip route的输出顺序不是直接原因,更可能是以下几个点出了问题:
路由规则优先级问题
CentOS 6.10的路由规则优先级是27373,而Miracle Linux 8.7是32615。优先级数值越小,规则越先匹配。你可以用ip rule list查看完整规则列表,看看是否有其他更高优先级的规则(数值小于32615)抢先匹配了源IP为B.B.B.B的数据包,导致没有触发自定义路由表。反向路径过滤(rp_filter)的干扰
RHEL 8系列默认可能开启了严格的反向路径过滤,这会让系统检查数据包的源IP是否与入站接口匹配,可能干扰你的源路由策略。你可以先检查当前设置:sysctl net.ipv4.conf.all.rp_filter如果值为
1(严格模式),可以临时改为2(宽松模式)测试:sysctl -w net.ipv4.conf.all.rp_filter=2测试生效后再写入
/etc/sysctl.d/目录下的配置文件永久生效。Squid的
tcp_outgoing_address是否真正生效
虽然你配置了绑定规则,但可能Squid没有正确绑定源IP。你可以用tcpdump在ppp0和enp1s0接口抓包,确认请求是否真的从ppp0发出:tcpdump -i ppp0 host ifconfig.co tcpdump -i enp1s0 host ifconfig.co另外要确保Squid服务已经重启,且没有其他更高优先级的
tcp_outgoing_address规则覆盖当前配置。路由表匹配验证
直接用ip route get命令模拟源IP为B.B.B.B的数据包路由,看系统是否正确选择自定义路由表:ip route get 172.64.163.15 from B.B.B.B如果输出显示走
enp1s0,说明路由规则没有生效,需要检查规则是否正确添加;如果显示走ppp0,那问题大概率出在Squid的配置上。
四、关于ip route顺序的说明
ip route的输出顺序是按路由前缀长度(最长匹配优先)和metric值排序的,主路由表中默认路由的位置不会影响基于源IP的路由规则——因为路由规则的匹配逻辑会先于主路由表生效。所以你怀疑的ip route顺序问题大概率不是根源,但如果主路由表中存在更具体的路由覆盖了自定义表的规则,才可能有影响,而你的配置里不存在这种情况。
备注:内容来源于stack exchange,提问作者Cholho Lee

