如何找到设备内 ping 请求的来源?

如何找到设备内 ping 请求的来源?

我有一个基于 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可以帮助。

相关内容