Linux内核TCP事件追踪:tcp_probe基于IP地址过滤方法求助
基于IP地址过滤tcp_probe事件的方法
问题原因
你之前的命令失败有两个核心原因:
- 引号语法错误:嵌套双引号导致shell解析异常,传递给内核的过滤规则格式无效。
- 字段类型不匹配:
tcp_probe的daddr/saddr字段是32位无符号整数(网络字节序),不能直接使用字符串格式的IP地址,必须转换为对应的数值形式。
解决步骤
1. 将字符串IP转换为网络字节序数值
你需要把目标IP(如172.18.9.46)转换成内核识别的整数格式,以下是两种快速转换方式:
方式一:手动计算十六进制/十进制值
对于IPv4地址a.b.c.d,网络字节序的十六进制格式为0x(a<<24 | b<<16 | c<<8 | d)的大端表示。
以172.18.9.46为例:
- 十六进制:
0xac12092e - 十进制:
2896698670
方式二:用命令自动转换
执行以下命令直接得到目标IP的十进制数值:
printf "%u\n" $(inet_pton -a 172.18.9.46 | od -An -tu4 -N4)
2. 设置正确的过滤规则
进入tcp_probe事件目录:
cd /sys/kernel/debug/tracing/events/tcp/tcp_probe
然后选择以下任意一种方式设置过滤:
用十进制数值过滤
echo "daddr == 2896698670" > filter
用十六进制数值过滤
echo "daddr == 0xac12092e" > filter
一键转换并设置过滤
无需手动计算,直接执行:
echo "daddr == $(printf "%u" $(inet_pton -a 172.18.9.46 | od -An -tu4 -N4))" > filter
3. 验证与启用
查看当前过滤规则是否生效:
cat filter
启用tcp_probe事件:
echo 1 > enable
扩展:使用trace-cmd简化操作
如果你安装了trace-cmd工具,可以直接用它来设置过滤并启动追踪,无需手动操作sysfs文件:
trace-cmd start -e tcp_probe --filter 'daddr == 0xac12092e'
内容的提问来源于stack exchange,提问作者Hemanth
相关产品推荐
相关产品推荐

