You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS 6.10与Miracle Linux 8.7多网卡(LAN+PPPOE)路由异常及ip route顺序影响咨询

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的输出顺序不是直接原因,更可能是以下几个点出了问题:

  1. 路由规则优先级问题
    CentOS 6.10的路由规则优先级是27373,而Miracle Linux 8.7是32615。优先级数值越小,规则越先匹配。你可以用ip rule list查看完整规则列表,看看是否有其他更高优先级的规则(数值小于32615)抢先匹配了源IP为B.B.B.B的数据包,导致没有触发自定义路由表。

  2. 反向路径过滤(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/目录下的配置文件永久生效。

  3. 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规则覆盖当前配置。

  4. 路由表匹配验证
    直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 07:43:07