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

Kiw*_*iwy 5 lsof tcp netstat

我想知道我的服务器是否与远程服务器建立了连接,或者远程服务器是否尝试访问我的服务器。我试图阅读输出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)
Run Code Online (Sandbox Code Playgroud)

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

X T*_*ian 9

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

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)
Run Code Online (Sandbox Code Playgroud)

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

所以->意味着连接到


Sté*_*las 8

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

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

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

对于更可靠的东西,您可以查询连接跟踪器。

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

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

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