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


21

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

我正在获取它既不期望也不希望得到的数据,并且我正在尝试查明此数据的来源。因此,我该如何查找哪个进程数据发送到特定端口,而不是哪个进程正在侦听。

Answers:


23

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

lsof -nPi tcp:the-port

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

对于UDP或RAW套接字,这会比较棘手,尽管我认为它是systemtap或dtrace之类的东西可以派上用场。可能还会进行审核。


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


这对我来说不适用于SCTP。
sudo

1
@sudo,看到编辑
斯特凡Chazelas

3

请尝试以下操作:

$sudo ss -tp

要么:

$sudo netstat -A inet -p

为了避免本地主机结果:

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

要仅列出已建立的连接:

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

2

根据它建立的发送数据的连接类型,这些方法中的一种会带您到某个地方。

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

  • 万一它建立并保持打开状态的tcp / udp连接,您可以netstat用来查找该连接的远程IP。

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


1

您可以使用sockstat命令在本地主机上查找已启动到服务连接的进程。

DESCRIPTION
     The sockstat command lists open Internet or UNIX domain sockets.

只需将所有源连接匹配到目标即可。这对于TCP / UDP / UNIXsockets正常工作。


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.