如何使用 lsof 识别传入的 TCP 连接?

如何使用 lsof 识别传入的 TCP 连接?

我想知道我的服务器是否与远程服务器建立了连接,或者远程服务器是否尝试访问我的服务器。我尝试读取输出lsof并获取以下信息:

lsof -i TCP:25 
 USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
master   2657    root   12u  IPv4     8086      0t0  TCP *:smtp (LISTEN)
smtpd   12950 postfix    6u  IPv4     8086      0t0  TCP *:smtp (LISTEN)
smtpd   12950 postfix    9u  IPv4 35762406      0t0  TCP hostname:smtp->spe.cif.ic.IP:55277 (ESTABLISHED)
smtp    13007 postfix   13u  IPv4 35762309      0t0  TCP hostname:34434->fake.VVVVV.fr:smtp (ESTABLISHED)
smtpd   14188 postfix    6u  IPv4     8086      0t0  TCP *:smtp (LISTEN)
smtpd   14188 postfix    9u  IPv4 35748921      0t0  TCP hostname:smtp->XX.XX.XX.XX:55912 (ESTABLISHED)
smtpd   14897 postfix    6u  IPv4     8086      0t0  TCP *:smtp (LISTEN)

我想知道此信息是否意味着我的服务器尝试连接,spe.cif.ic.IP或者是否相反。
该标志是否->相关,或者我应该使用不同的命令?

答案1

我认为线索就在端口号中,获取这两个条目

smtpd   12950 postfix    9u  IPv4 35762406      0t0  TCP hostname:smtp->spe.cif.ic.IP:55277 (ESTABLISHED)
smtp    13007 postfix   13u  IPv4 35762309      0t0  TCP hostname:34434->fake.VVVVV.fr:smtp (ESTABLISHED)

smtpd 在端口 smtp(25) 上收到来自高端口号的连接,而 smtp 连接到远程端口 smtp(25) 并具有本地高端口号。

所以->意味着连接到

答案2

至少在 Linux 上,无法告诉您哪一端发起了连接,因为它从无法获得该信息的位置lsof获取列表。/proc/net/tcp第一个地址总是指当地的端点。

该实用程序的最新版本ss(使用不同的内核 API 来检索连接信息)-e将为您提供指导,但不幸的是不适用于 TCP 连接。

作为@XTian 说,对于 TCP/SCTP/UDP,您通常可以猜测它是哪一个,因为连接发起方通常会使用高端口,而目标通常会是众所周知的低端口。但并不能保证。看机器还有或者没有倾听同一端口上的套接字也可以让您了解它的方向。例如,在您的情况下,您可能有一个进程在 port 上监听smtp/25,但没有监听 port unknown/34434。它不太可能fake.VVVVV.fr启动到您计算机上端口 34434 的连接,尤其是使用源端口 25/smtp(不太可能,但完全有可能)。

为了更可靠,您可以查询连接跟踪器。

系统的防火墙连接跟踪器将跟踪发起连接的一端(或为无连接传输协议(如 UDP)发送第一个数据包)。您可以使用conntrack命令行实用程序或类似 top 的命令来查询连接跟踪表iptstate

在那里,每行的第一个地址将是发起连接的地址。

请注意,它将包括所有跟踪的连接,因此也可能包括通过系统转发的连接,例如在路由器上。

相关内容