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

use*_*849 29 networking process

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

我正在获取数据,我既不希望也不想得到,我正试图确定这些数据的来源。那么如何找到哪个进程数据发送到特定端口,而不是哪个进程正在侦听。

Sté*_*las 30

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

lsof -nPi tcp:the-port
Run Code Online (Sandbox Code Playgroud)

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

对于 UDP 或 RAW 套接字,虽然我认为 systemtap 或 dtrace 之类的东西可以派上用场,但它会更棘手。可能也被审计了。


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


小智 5

尝试以下操作:

$sudo ss -tp
Run Code Online (Sandbox Code Playgroud)

或者:

$sudo netstat -A inet -p
Run Code Online (Sandbox Code Playgroud)

为了避免本地主机结果:

$sudo netstat -A inet -p | grep -v localhost
Run Code Online (Sandbox Code Playgroud)

仅列出 ESTABLISHED 连接:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED
Run Code Online (Sandbox Code Playgroud)


ger*_*ijk 2

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

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

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

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