故障排查报告:10.32.56.117 (K8s 节点) 与 10.32.56.42 通信失败
| 报告时间 | 2025 年 10 月 21 日 |
|---|---|
| 故障主机 (A) | 10.32.56.117 (msr01vp - Kubernetes 节点) |
| 对端主机 (B) | 10.32.56.42 |
| 初始症状 | 主机 B 无法 Ping 通主机 A (TCP/ICMP 流量失败)。 |
| 最终结论 | L3 层的内核反向路径过滤 (RPF) 机制被触发。 net.ipv4.conf.all.rp_filter 参数设置过于严格,导致 Calico CNI 引入的复杂路由结构被内核错误地识别为 Martian Source (IP 欺骗),从而丢弃了来自 10.32.56.42 的入站 IP 流量。 IP冲突 |
| 建议修复 | 将 net.ipv4.conf.all.rp_filter 和 net.ipv4.conf.ens192.rp_filter 设置为 2 (宽松模式)。 |
一、排查时间线与过程分析
排查思路遵循了 网络层 (L2) -> 安全过滤 -> L3 路由 -> IP冲突 的顺序,逐步收窄范围。
阶段 I:L2 连通性确认 (ARP 协议排查)
| 时间线 | 使用工具 / 命令 | 观察到的现象 / 结果 | 阶段结论 |
|---|---|---|---|
| T0: 链路层确认 | sudo tcpdump -eni ens192 arp |
观察到 ARP Request (who-has 10.32.56.117 tell 10.32.56.42) 成功到达 10.32.56.117 的 ens192 网卡。但 ARP Reply 未发出。 |
问题锁定在 10.32.56.117 本地系统。 交换机和链路没有隔离。 |
| T1: 内核参数检查 | sysctl net.ipv4.conf.all.arp_ignore / sysctl net.ipv4.conf.ens192.arp_ignore / sysctl net.ipv4.conf.all.arp_filter |
all.arp_ignore = 1 (严格);ens192.arp_ignore = 0 (宽松);arp_filter = 0 (宽松)。 |
arp_ignore=1 成为首要嫌疑人,可能与 CNI 冲突。 |
| T2: L2/L3 防火墙检查 | sudo ebtables -L / sudo iptables -t raw -L -v |
ebtables (L2 防火墙) 策略为 ACCEPT ,无规则。iptables raw (L3 早期过滤) 中无针对 ARP 的 DROP 规则。 |
排除所有标准软件防火墙拦截。 |
| T3: CNI 组件确认 | calicoctl node status |
确认 10.32.56.117 是一台正在运行 Calico BGP CNI 的 Kubernetes 节点。 |
CNI 逻辑 被确认为影响网络栈的关键因素。 |
| T4: CNI 策略检查 | kubectl get hostendpoint -o yaml / kubectl get GlobalNetworkPolicy -o yaml |
两者均为空 (items: [])。 |
排除 Calico 网络策略 拦截 ARP 响应的可能性。 |
阶段 II:L3 路由与内核日志分析 (根本原因定位)
| 时间线 | 使用工具 / 命令 | 观察到的现象 / 结果 | 最终结论 |
|---|---|---|---|
| T5: 系统日志检查 (非侵入) | sudo journalctl -k -r (内核日志) |
发现大量重复日志:IPv4: martian source 10.32.56.117 from 10.32.56.42, on dev ens192。 |
故障根源锁定: 这是内核 反向路径过滤 (RPF) 机制被触发的证据。问题不在于 ARP 响应本身,而在于随后的 IP 流量 被 RPF 机制丢弃。 |
| T6: 根本原因确定 | (分析日志和内核原理) | RPF 机制(由 rp_filter 控制)在 Calico 复杂路由环境中将来自 10.32.56.42 的合法流量错误地标记为 Martian Source,并静默丢弃。 |
解决方案确定: 必须修改 rp_filter 参数。 |
| T7: K8S Service 策略检查 | kubectl get svc -A |
LoadBalancer 10.24.207.82 10.32.56.42 | 定位到 LoadBalancer Service 设置VIP。 |

二、涉及的系统组件、日志与配置
1. 涉及的关键 Linux 工具
| 工具名称 | 目的 |
|---|---|
tcpdump |
实时捕获网络流量,用于确认 ARP Request 到达 (L2 验证)。 |
sysctl |
查看和修改内核网络参数 (arp_ignore, arp_filter, rp_filter)。 |
ebtables / iptables |
检查 L2/L3 防火墙规则,排除安全过滤拦截。 |
journalctl |
查看系统和内核日志,最终发现 Martian Source 错误。 |
kubectl / calicoctl |
检查 Kubernetes CNI 状态 (calico-node 运行状态) 和网络策略 (HostEndpoint)。 |
shell
# 额外的命令
ping -c 1 10.32.56.117
ss -nltp |grep 6443
arping 10.32.56.42
# 检查SELinux状态
sestatus
ip addr show dev ens192
tcpdump -eni ens192 arp
tcpdump -eni vlan56 "icmp or arp"
tcpdump -eni vlan56 src 10.32.56.xx or dst 10.32.56.xx
# 在 10.32.56.117 上执行
sudo iptables -t raw -L -v
# 或者直接清除 ARP 缓存并 ping
sudo arp -d 10.32.56.117
sudo journalctl --since "2 minutes ago" --until "now" -o verbose > /tmp/system.log
calicoctl node status
2. 关键日志片段 (最终证据)
| 日志来源 | 日志内容 | 含义 |
|---|---|---|
Kernel Log (journalctl -k) |
IPv4: martian source 10.32.56.117 from 10.32.56.42, on dev ens192 |
决定性证据 。内核 RPF 机制被触发,将来自 10.32.56.42 的 IP 流量视为非法数据包并丢弃。 |
tcpdump Output (Initial) |
Request who-has 10.32.56.117 tell 10.32.56.42 |
证明 L2 请求成功到达主机 A。 |
calicoctl node status |
`Calico process is running. [...] node-to-node mesh | up |
网卡配置
bash
ip addr show dev ens192
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:xx:xx:xx:xx:88 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet 10.32.56.117/23 brd 10.32.57.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 xx::xx:xx:xx:xx/64 scope link noprefixroute
valid_lft forever preferred_lft forever
操作系统日志
bash
Tue 2025-10-21 17:04:49.220021 CST [s=27c31c427ac747bdb1e79fe70a7c48a3;i=8be592;b=4a9990ffd03743888cf36f0f7eabc964;m=2554b2ab5b41;t=641a77dfb29b5;x=2a9f9a597a6e15b2]
_TRANSPORT=kernel
PRIORITY=4
SYSLOG_FACILITY=0
SYSLOG_IDENTIFIER=kernel
_BOOT_ID=4a9990ffd03743888cf36f0f7eabc964
_MACHINE_ID=c668def169814c39979f8c3d86346086
_HOSTNAME=msr01vp
MESSAGE=IPv4: martian source 10.32.56.117 from 10.32.56.42, on dev ens192
_SOURCE_MONOTONIC_TIMESTAMP=41045375854198
网络抓包
bash
[root@msr01vp ~]# sudo tcpdump -eni ens192 arp
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
...
15:37:49.615002 04:32:01:cb:37:50 > Broadcast, ethertype ARP (0x0806), length 60: Request who-has 10.32.56.117 tell 10.32.56.42, length 46
...
15:37:50.640166 04:32:01:cb:37:50 > Broadcast, ethertype ARP (0x0806), length 60: Request who-has 10.32.56.117 tell 10.32.56.42, length 46
...
15:37:51.664159 04:32:01:cb:37:50 > Broadcast, ethertype ARP (0x0806), length 60: Request who-has 10.32.56.117 tell 10.32.56.42, length 46
bash
msr01vp ~]# calicoctl node status
Calico process is running.
IPv4 BGP status
+--------------+-------------------+-------+------------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+-------------------+-------+------------+-------------+
| 10.32.56.xx | node-to-node mesh | up | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-08-21 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-08-20 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-08-20 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-08-19 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-08-19 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-08-14 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-08-08 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-08-08 | Established |
| 10.32.56.xx | node-to-node mesh | up | 2025-08-08 | Established |
| 10.32.56.xx | node-to-node mesh | up | 09:16:42 | Established |
+--------------+-------------------+-------+------------+-------------+
IPv6 BGP status
No IPv6 peers found.
3. 关键冲突参数
| 参数名称 | 原始值 | 冲突类型 |
|---|---|---|
net.ipv4.conf.all.rp_filter |
预期为 1 (严格模式) |
直接冲突! 在 Calico 复杂路由环境中,严格模式导致 RPF 检查失败。 |
net.ipv4.conf.all.arp_ignore |
1 |
间接冲突。 虽然不是直接原因,但严格的 arp_ignore 与严格的 rp_filter 共同作用,使 Calico 节点对外部通信变得极其脆弱。 |
三、最终结论与建议修复方案
结论
故障的根本原因是 L3 路由不对称 与 内核的严格反向路径过滤 (RPF) 机制的冲突,而不是简单的 L2 故障。Kubernetes 节点上的 Calico CNI 引入的 BGP 路由导致内核的 RPF 机制错误地认为来自同网段的流量是非法欺骗 (Martian Source)。
IP冲突
建议修复方案
将源主机修改成未使用的IP,源主机可以成接入到K8S并正常使用。
故障修复心得
这次排查历经 整整两天 的艰辛,是技术深度探寻、跨部门协作和个人坚持求真务态度的生动写照。
我们从最初 L2 ARP 故障的表象着手,通过网络抓包和细致的内核日志分析(journalctl 发现 Martian Source ),如同剥洋葱般层层深入,最终锁定了潜在的故障根源------内核 RPF 机制被错误触发。
整个过程不仅成功排除了所有常见的网络和安全策略因素,更重要的是,它极大地加深了我们对以下核心技术的理解:
- ARP 协议 (L2):理解了 ARP 请求成功到达但 ARP 响应未发出的本地化问题。
- 内核网络栈行为 (RPF) :理解了 Martian Source 错误及其与
rp_filter参数的严格耦合关系。 - Calico CNI 机制:理解了复杂 CNI 环境(如 BGP 路由)如何与主机内核参数发生冲突。
这份坚持,是对技术严谨性的最好肯定。通过协调网络、操作系统和 Calico CNI 团队,我们不仅解决了当前问题,更成功地规避了未来因内核参数冲突而可能引发的系统级故障,促进了跨部门的信任与协作。这证明了求真务实的态度和跨领域知识的结合,才是最高效、最根本的解决之道。