![如何找到设备内 ping 请求的来源?](https://linux22.com/image/13404/%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E8%AE%BE%E5%A4%87%E5%86%85%20ping%20%E8%AF%B7%E6%B1%82%E7%9A%84%E6%9D%A5%E6%BA%90%EF%BC%9F.png)
我有一个基于 Linux 的蜂窝设备,每 4-6 周开始每分钟 10-12 次 ping Google IP 地址。这种增加的 ping 似乎是随机开始和结束的,持续几天后恢复正常(即没有 ping),并且 ping 请求似乎无一例外地收到成功的响应。尽管 ping 似乎始终使用 Google 地址,但每次 ping 活动开始新增加时,用于请求的 IP 地址都会发生变化。
有什么方法可以找到在我的设备上启动 ping 的应用程序/程序吗?我跑了
grep -r "Google"
希望找到设备用作不同 IP 地址来源的某种列表或数据库,但没有任何运气。任何建议/反馈/指导将不胜感激。
答案1
假设在内核中配置了 ftrace 并且您具有 root 访问权限,则可以使用内核跟踪功能。
有更新的工具可用,特别是 bpftrace,但嵌入式设备通常缺乏安装所需依赖项所需的空间。该解决方案使用了已经使用多年的 ftrace。这只是使用原始文件,有一些工具可以自动执行其中一些步骤。
如果 debugfs 尚未安装,则安装它
[ -e /sys/kernel/debug/tracing/README ] || mount -t debugfs debugfs /sys/kernel/debug
禁用跟踪,将报告设置为跟踪功能,设置要监视的功能
cd /sys/kernel/debug/tracing
echo 0 > tracing_on
echo function > current_tracer
echo ping_init_sock > set_ftrace_filter
echo sock_sendmsg >> set_ftrace_filter # Optional, omit if ping_init_sock gives results
启用跟踪
echo 1 > tracing_on
等待ping
事件发生,然后检查trace
文件中的内容。
cat trace
# tracer: function
#
# entries-in-buffer/entries-written: 56/56 #P:1
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
ping-3085 [000] .... 8035797.349326: ping_init_sock <-inet_create
ping-3085 [000] .... 8035797.349352: ping_init_sock <-inet6_create
ping-3085 [000] .... 8035797.349739: sock_sendmsg <-___sys_sendmsg
ping-3085 [000] .... 8035797.349764: sock_sendmsg <-___sys_sendmsg
ping-3085 [000] .... 8035797.365248: sock_sendmsg <-__sys_sendto
ping-3085 [000] .... 8035797.365486: sock_sendmsg <-__sys_sendto
ping-3085 [000] .... 8035797.379917: sock_sendmsg <-__sys_sendto
ping-3085 [000] .... 8035797.387487: sock_sendmsg <-__sys_sendto
这表明 PID 3085 正在执行 ping 操作。如果幸运的话,执行 ping 操作的进程仍将运行,以便您可以在输出中找到它ps
。如果没有,那么您可能希望它有一个可识别的名称。
如果这两个都失败,那么也许https://github.com/brendangregg/perf-tools/blob/master/deprecated/execsnoop-proc可以帮助。