目录标题
结合抓包工具(如 tcpdump
, Wireshark
, bpftrace
, hubble
)来分析 MetalLB + Cilium + eBPF + VIP:Port 的访问流程,可以精准验证每一步数据包的变换过程与路径跳转,有助于排查问题和深入理解网络行为。
以下是一个详细的 抓包分析步骤指南,按流程阶段划分:
🧪 抓包分析总览表
流程阶段 | 抓包位置 | 目的 | 推荐工具 | 关键点 |
---|---|---|---|---|
1. ARP 宣告 | MetalLB Speaker 节点 | 验证 MetalLB 是否成功广播 VIP 所属权 | tcpdump | ARP who-has / is-at |
2. 客户端请求到达 | VIP 所在 Node | 查看外部请求是否正确到达 | tcpdump , Wireshark | VIP 为目标 IP |
3. eBPF 处理前 | eth0 接收包前 | 验证是否命中 Cilium eBPF hook | tcpdump -i eth0 , bpftrace | VIP+Port |
4. eBPF 执行 DNAT | eBPF Trace | 查看 VIP 是否被替换为 PodIP | bpftrace , hubble observe | 源/目标 IP 转换 |
5. 本地转发 | veth pair 处 | 确认数据包进入 Pod | tcpdump -i cilium_XXX | 目标为 Pod IP |
6. 跨节点转发 | Node A & C | 验证是否封装、隧道协议使用 | tcpdump udp port 8472 (VXLAN) | 源为 NodeA,目标为 NodeC |
7. Pod 响应处理 | Node C | 查看 Pod B 的响应包出发 | tcpdump -i cilium_XXX | 源 IP 为 PodIP |
8. 响应 SNAT | Node A or C | 验证响应包 SNAT 是否生效 | bpftrace , tcpdump | 源 IP 改为 VIP/Node IP |
9. 客户端收到包 | 客户端侧 | 查看是否成功收到并匹配预期 | tcpdump , Wireshark | VIP:Port 回复 Client |
🧭 分步骤详细操作
🧩 步骤 1:抓取 ARP 广播(VIP 宣告)
# 在 MetalLB Speaker 所在节点
tcpdump -i eth0 arp and host <VIP>
观察:
ARP, Reply <VIP> is-at <MAC>
表示 Speaker 已正确宣告 VIP。
🧩 步骤 2:客户端请求到达节点
# 在 Node A,VIP 所属节点
tcpdump -i eth0 'tcp and dst host <VIP> and dst port <Port>'
确认:
- 报文成功到达节点
- 未被中间网络丢弃
🧩 步骤 3:eBPF 捕获数据包入口
- 用
bpftrace
观察 eBPF 捕获行为:
bpftrace -e 'tracepoint:net:netif_receive_skb { printf("Packet received: %s\n", comm); }'
- 用 Hubble 观察:
hubble observe --from-ip <Client IP> --to-ip <VIP>
确认:
- eBPF 程序已生效
- 数据包已被重定向
🧩 步骤 4:验证 DNAT 后目的地址
- 抓 Node A 的
cilium_host
接口:
tcpdump -i cilium_host
确认 VIP ➜ PodIP_B 转换是否成功
🧩 步骤 5:本地 Pod 转发确认
# 抓 Pod 的 veth 设备(如 vethXXXX)
tcpdump -i vethXXXX
目标 IP 应为 PodIP_B
。
🧩 步骤 6:跨节点封装验证
- 若 Pod B 不在 Node A,则抓 VXLAN:
tcpdump -i eth0 udp port 8472
解包可见:
- 源 IP 为 Node A
- 目标 IP 为 Node C
- 内层 IP 为 PodIP_B
🧩 步骤 7:Pod B 响应包发送分析
# 在 Node C 的 cilium interface 或 veth 处
tcpdump -i cilium_XXX or vethYYY
确认源 IP 为 PodIP_B,目的 IP 为客户端
🧩 步骤 8:响应 SNAT 是否执行
- 对比不同 externalTrafficPolicy:
Cluster:
# 在 Node A 出口
tcpdump -i eth0 'tcp and src host <VIP>'
Local 且 Pod 本地:
tcpdump -i eth0 'tcp and src host <NodeIP>'
🧩 步骤 9:客户端抓包验证
tcpdump -i eth0 'tcp and port <Port>'
确认回复包:
- 源 IP 是 VIP/NodeIP
- 目标 IP 是客户端
🔍 进阶技巧
✅ 使用 Wireshark 分析 PCAP
tcpdump -i eth0 -w trace.pcap
导入 Wireshark,设置过滤条件:
ip.addr == <VIP> or ip.addr == <PodIP>
✅ 使用 Hubble CLI/UI(Cilium 可视化)
hubble observe
可查看:
- VIP ➜ Pod 的转发路径
- SNAT/DNAT 行为
- 各节点间跳转
🧷 补充工具推荐
工具 | 用途 |
---|---|
tcpdump | 抓原始数据包 |
bpftrace | 跟踪内核 hook 行为 |
hubble | 可视化流量路径 |
Wireshark | 分析协议与封装结构 |
cilium monitor | 跟踪 eBPF datapath 中的事件 |
是否需要我提供一套 抓包脚本模板 或 Wireshark 过滤表达式集合?可以进一步加速实战分析效率。