我有兴趣学习正确的过程来确定哪个 Linux 程序/进程负责定期重复的给定短期网络连接。
不做任何假设,比如“流量在这个端口上,因此必须与 X 程序相关”。
我还希望有一些可验证、可演示的方法来确定此流量与已识别的程序或进程相关。
例如,假设我tcpdump
正在 Ubuntu 发行版上观看,我看到:
07:28:59.935102 IP 10.8.8.5.57667 > time-a-b.nist.gov.ntp: NTPv4, Client, length 48
07:29:00.048145 IP time-a-b.nist.gov.ntp > 10.8.8.5.57667: NTPv3, Server, length 48
08:03:08.184704 IP 10.8.8.5.59451 > time-a-b.nist.gov.ntp: NTPv4, Client, length 48
08:03:08.297119 IP time-a-b.nist.gov.ntp > 10.8.8.5.59451: NTPv3, Server, length 48
我如何收集信息并确定哪个程序实际上在创建它?
对时间服务器的 NTP 调用只是一个工作示例。我希望有一个解决方案也适用于其他网络调用。似乎越来越多的应用程序可以随意发送出站信息,我想知道它是哪个进程,以便我可以确定其合法性。
答案1
一种可能的选择是使用开源工具sysdig
,这将允许您在每个进程的基础上跟踪系统调用。使用sysdig
,您可以监视传出连接。
根据您的示例,如果您想知道哪个进程正在连接到远程 NTP 服务器,您可以使用:
$ sudo sysdig evt.type=connect and fd.sport=ntp
这将过滤掉connect()
已指定标准 NTP 端口作为服务器端端口的系统调用。
为了进行演示,我将触发 NTP 更新:
$ sudo ntpdate pool.ntp.org
这样,sysdig
产生以下输出:
50365 18:54:32.790143415 7 ntpdate (4089388) < connect res=0 tuple=192.168.1.135:33982->173.72.22.244:123
50368 18:54:32.790144930 7 ntpdate (4089388) > connect fd=3(<4u>192.168.1.135:33982->173.72.22.244:123)
50371 18:54:32.790147190 7 ntpdate (4089388) < connect res=0 tuple=192.168.1.135:46730->204.11.201.12:123
50374 18:54:32.790148380 7 ntpdate (4089388) > connect fd=3(<4u>192.168.1.135:46730->204.11.201.12:123)
50377 18:54:32.790150548 7 ntpdate (4089388) < connect res=0 tuple=192.168.1.135:40705->129.250.35.251:123
50380 18:54:32.790151746 7 ntpdate (4089388) > connect fd=3(<4u>192.168.1.135:40705->129.250.35.251:123)
50383 18:54:32.790153641 7 ntpdate (4089388) < connect res=0 tuple=192.168.1.135:42732->104.236.116.147:123
50392 18:54:32.790161130 7 ntpdate (4089388) < connect res=0 tuple=192.168.1.135:36404->173.72.22.244:123
50398 18:54:32.790165853 7 ntpdate (4089388) < connect res=0 tuple=192.168.1.135:50312->204.11.201.12:123
50404 18:54:32.790170315 7 ntpdate (4089388) < connect res=0 tuple=192.168.1.135:37229->129.250.35.251:123
50410 18:54:32.790174565 7 ntpdate (4089388) < connect res=0 tuple=192.168.1.135:59468->104.236.116.147:123
50450 18:54:32.790255847 7 ntpdate (4089388) < connect res=0 tuple=::1:44859->:::123
50453 18:54:32.790257385 7 ntpdate (4089388) > connect fd=3(<6u>::1:44859->:::123)
50456 18:54:32.790260502 7 ntpdate (4089388) < connect res=0 tuple=127.0.0.1:41670->0.0.0.0:123
从该输出中,我知道这是ntpdate
连接到 NTP 服务器的程序,并且该进程的 ID 是 4089388。
虽然上面的示例是特定于 NTP 的,但sysdig
它将使您能够针对各种用例执行类似的操作。您可以看到系统挖掘用户指南有关各种过滤器选项和输出格式的更多信息。