如何使用 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
或者是否相反。標誌是否
->
相關,或者我應該使用不同的命令?
我認為線索在埠號中,取這兩個條目
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,您通常可以猜到它是哪個,因為連接發起者通常會使用高埠,而目標通常是眾所周知的低埠。然而,不能保證。看到機器在同一個埠上也有或沒有監聽套接字,也可以讓您對它的方向有所了解。例如,在您的情況下,您可能有一個程序正在偵聽 port
smtp/25
但沒有偵聽 portunknown/34434
。fake.VVVVV.fr
在您的機器上啟動與埠 34434 的連接是非常不可能的,尤其是使用源埠 25/smtp(不太可能但完全可能)。對於更可靠的東西,您可以查詢連接跟踪器。
系統的防火牆連接跟踪器將跟踪發起連接的一端(或為 UDP 等無連接傳輸協議發送第一個數據包)。
conntrack
您可以使用命令行實用程序或iptstate
top-like 命令查詢連接跟踪表。在那裡,每行上的第一個地址將是啟動連接的那個地址。
請注意,它將包括所有跟踪的連接,因此可能還包括通過系統轉發的連接,例如路由器上的連接。