
我在 Ubuntu 18.04.3 LTS 伺服器上執行 Netcat,以偵聽連接埠 469。我用以下命令啟動 Netcat:
nc -kl 469
我可以看到該過程正在運行:
$ ps -aux | grep 469
產生以下輸出:
根 11041 0.0 0.1 13596 1060 ?八月 31 日 0:21 nc -kl 469`
該系統在大約 24 - 28 小時內運作良好,但隨後 Netcat 停止回應。經過調查,我認為問題是 Recv-Q 緩衝區「填滿」。通常,Recv-Q 緩衝區為零,直到 Netcat 停止回應。停止回應後,Recv-Q 緩衝區為常數 2(而非正常的 0)。我可以用“ss”檢查這一點,如下所示。
$ ss -tnl
然後我看到了這個,可以看到異常的 Recv-Q 為 2。
$ ss -tnl
狀態 Recv-Q Send-Q 本機位址:連接埠 對等位址:連接埠
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 64 0.0.0.0:42587 0.0.0.0:128
LISTEN 0. 。
聽 2 1 0.0.0.0:469 0.0.0.0:*
聽 0 128 127.0.0.53%lo:53 0.0.0.0:*
聽 0 128 [::]:22 [::]:*
聽 0 64 [::]:44057 [::]:*
聽 0 128 [ ::]:55085 [::]:*
聽 0 128 [::]:111 [::]:*
我們還有其他幾台 Ubuntu 伺服器,它們也以完全相同的方式運行 Netcat,偵聽連接埠 469。他們沒有失敗——他們已經堅持了好幾個星期了。但該伺服器一次又一次地失敗,即使在重新啟動後也是如此,而且總是在大約 24 小時以上之後。這台伺服器和其他伺服器(我能想到的)唯一的區別是,這台伺服器還安裝了一個 nfs 磁碟區(從上面監聽 111 連接埠可以看出)。
這可能是什麼原因造成的?我可以以某種方式清除Recv-Q(從bash),以便我可以定期清除它(作為臨時修復)嗎?任何幫助深表感謝。
答案1
我現在已經找到了這個問題的答案,我想將其發佈在這裡,以防萬一它可以幫助其他人。
問題在於該伺服器還安裝了 Strongswan,並且對連接埠 469 的傳入 TCP 請求來自另一台伺服器的 IPSec 連線。所發生的情況是,當 IPSec 連線重新加密時(大約每 24 小時一次),IPSEC 連線有時會中斷很短的時間。如果這種情況發生在對連接埠 469 進行 TCP Syn/Ack 的過程中,則會使其陷入困境。因此「nc -kl」會被卡住,封包位於 Recv-Q 緩衝區中。
解決方案是配置 Strongswan,以便重新產生金鑰不會中斷。我們學到的不是尋找 Recv-Q 緩衝區或 Netcat 的問題,而是有必要了解根本原因 - 在本例中是了解 TCP Syn/Ack 無法完成的原因。