我有一项服务,保持某个端口打开。
我正在获取我既不期望也不想获取的数据,并且我正在尝试查明该数据的来源。那么我怎样才能找到哪个进程发送数据发送到特定端口,而不是正在侦听哪个进程。
答案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 域套接字)