链路问题
tcpdump(链路抓包)
tcpdump -i eth0 tcp port 22 and host 192.168.12.22 -enn
系统内核问题
概念
eBPF:
( extended Berkeley Package Filter扩展柏克莱封包过滤器),是一种Linux内核技术,它允许开发者在不修改内核源码或加载内核模块的情况下,将自定义代码安全的运行在内核上下文中。最初用于网络数据包过滤,如今已经扩展到性能分析、安全监控、流量控制等多个领域。
hook:
狗子观测点
内核函数
kfree_skb
kfree_skb是linux内核中用于释放sk_buff结构体(网络数据包缓冲区)的函数,当数据包印错误或异常被丢弃是调用它。
典型调用场景:
1、接收路径错误:网卡驱动检查到校验和错误时,直接调用kfree_skb丢弃数据包;
2、协议栈处理失败:如TCP确认接收后释放skb, 或理由不可达时丢弃;
EulerOS : xd_ntrace2(内核协议栈抓包)
xd_ntrace2基于eBPF开发在内核网络协议栈经过关键节点函数中添加hook观测点,实时跟踪报文经过路径;
实现的功能包括:
1、网络报文跟踪:跟踪网络报文从进入到内核协议栈接收、发送过程中,以及被丢弃在内核中所走过的路径;对于有一定内核协议栈经验的人来说可以快速、有效的发现网络问题。
2、网络故障诊断:将以往的经验集成到工具的故障知识库,通过故障知识库匹配的方式来主动诊断当前网络故障,给出诊断结果已经修复建议;
常见问题场景:
iptables规则导致的丢包
./xd_ntrace2 -t tcp -S 源地址 -p 22 -c
在iptable的INPUT链上包被kfree
Diagnostic result: Check iptables Chain INPUT* or Firewall
********** [290718235_24616] skb:0xff9346873c4400 ************
IN \] \[_netif_receive_skb_core \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*L2 Layer Receive routine \[IN \] \[ip_rcv_core \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*L2 Layer Receive routine \[IN \] \[nf_hook_slow \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*Check iptables Chain PREROUTING\* \[IN \] \[ip_route_input_noref \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*(null) \[IN \] \[fib_validate_source \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*Check reverse path filter \[IN \] \[ip_local_deliver \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*Check Chain INPUT\* or package reassembly \[IN \] \[**nf_hook_slow** \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| **\*Check iptables Chain INPUT\* or Firewall** \[IN \] \[**kfree_skb** \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| **\*Drop the package**
rp_filter反向路径过滤导致的丢包
问题现象:
1、源上ping不通目的,但是能ping通目录的网关,目的tcpdump能抓到ICMP的request报文,但是没有发出reply报文。
2、源上traceroute/ip route get目的地址,路径走的是目的eth1网卡的网关,目的上traceroute/ip route get源地址,路径走的是目的的eth2的一条明细路由。
./xd_ntrace2 -t tcp -a 源地址 -c
Diagnostic result: Network unreachable
********** [290718235_24616] skb:0xff9346873c4400 ************
IN \] \[_netif_receive_skb_core \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*L2 Layer Receive routine \[IN \] \[ip_rcv_core \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*L2 Layer Receive routine \[IN \] \[nf_hook_slow \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*Check iptables Chain PREROUTING\* \[IN \] \[ip_route_input_noref \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*(null) \[IN \] \[**fib_validate_source** \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| **\*Check reverse path filter** \[IN \] \[**kfree_skb** \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| **\*Drop the package** \[IN \] \[ip_route_input_noref \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| \*(null) \[IN \] \[**fib_validate_source** \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| **\*Check reverse path filter** \[IN \] \[**kfree_skb** \] TCP: 8.82.242.75:44824 -\> 8.82.245.92:22 \[SYN \] seq:1781155 ack:0 dev:eth0 \| **\*Drop the package**