如何找到哪个进程向特定端口发送数据?

如何找到哪个进程向特定端口发送数据?

我有一项服务,保持某个端口打开。

我正在获取我既不期望也不想获取的数据,并且我正在尝试查明该数据的来源。那么我怎样才能找到哪个进程发送数据发送到特定端口,而不是正在侦听哪个进程。

答案1

对于 TCP(尽管相同的方法适用于 SCTP 1或任何面向连接的传输协议),与查找侦听协议相同:

lsof -nPi tcp:the-port

将报告在该端口上打开 TCP 套接字的进程。如果您知道源端口(您的服务器应用程序可以知道它并记录它),您可以使用它来查明恶意客户端。

对于 UDP 或 RAW 套接字,这会更棘手,尽管我认为 systemtap 或 dtrace 之类的东西可以派上用场。也有可能经过审核。


1lsof尽管在版本 4.86 中添加了 SCTP 支持(仅在 Linux 上) ,但您不能用于-i显式请求 SCTP 套接字。这里可以用作lsof -nP | grep -w 'SCTP.*:the-port'启发式代替。

答案2

尝试以下操作:

$sudo ss -tp

或者:

$sudo netstat -A inet -p

为了避免本地主机结果:

$sudo netstat -A inet -p | grep -v localhost

仅列出 ESTABLISHED 连接:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED

答案3

根据它为发送数据而建立的连接类型,其中一种方法将帮助您达到目标。

  • 用于tcpdump port 1234获取发送到该端口的数据。您可以使用 Wireshark 之类的程序在另一台计算机上对其进行分析(使用该-w选项捕获到文件)。或者,直接使用 Wireshark。

  • 如果它建立并保持打开的 tcp/udp 连接,您可以使用它netstat来查找连接的远程 IP。

  • 列出进程的打开套接字,如 @StephaneChazelas 提供的答案所示。

答案4

在 Solaris 上,在所有进程上运行 pfile 应该显示哪些进程打开了哪些连接。它将需要一些仔细的文件管理,可能使用 ggrep 的 -A、-B 选项......

在 Linux 上,netstat -anp --inet即使没有安装 lsof,也可以工作。 (--inet也可以删除以获取 Unix 域套接字)

相关内容