Tcp

如何使用 lsof 辨識傳入的 TCP 連接?

  • October 25, 2015

我想知道我的伺服器是否與遠端伺服器建立連接,或者遠端伺服器是否嘗試訪問我的伺服器。我試圖閱讀輸出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或者是否相反。

標誌是否->相關,或者我應該使用不同的命令?

我認為線索在埠號中,取這兩個條目

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) 並具有本地高埠號。

所以->意味著連接到

至少在 Linux 上,lsof無法告訴您是哪一端發起了連接,因為它從/proc/net/tcp該資訊不可用的位置獲取列表。第一個地址總是指本地端點。

該實用程序的最新版本ss(使用不同的核心 API 來檢索連接資訊)帶有-e,將為您提供指導,但不幸的是,它不適用於 TCP 連接。

正如@XTian 所說,對於 TCP/SCTP/UDP,您通常可以猜到它是哪個,因為連接發起者通常會使用高埠,而目標通常是眾所周知的低埠。然而,不能保證。看到機器在同一個埠上也有或沒有監聽套接字,也可以讓您對它的方向有所了解。例如,在您的情況下,您可能有一個程序正在偵聽 portsmtp/25但沒有偵聽 port unknown/34434fake.VVVVV.fr在您的機器上啟動與埠 34434 的連接是非常不可能的,尤其是使用源埠 25/smtp(不太可能但完全可能)。

對於更可靠的東西,您可以查詢連接跟踪器。

系統的防火牆連接跟踪器將跟踪發起連接的一端(或為 UDP 等無連接傳輸協議發送第一個數據包)。conntrack您可以使用命令行實用程序或iptstatetop-like 命令查詢連接跟踪表。

在那裡,每行上的第一個地址將是啟動連接的那個地址。

請注意,它將包括所有跟踪的連接,因此可能還包括通過系統轉發的連接,例如路由器上的連接。

引用自:https://unix.stackexchange.com/questions/211804