Networking
連接嘗試後,netcat 在 localhost 監聽端關閉連接
Ι am nc-listening on
localhost:2500
▶ nc -l 2500 _
在另一個終端上,我試圖連接到這個監聽端
▶ nc -zv localhost 2500 nc: connectx to localhost port 2500 (tcp) failed: Connection refused Connection to localhost port 2500 [tcp/rtsserv] succeeded!
為什麼第一次嘗試似乎失敗了?
我還注意到,當連接嘗試由於某種原因完成(顯然成功)時,我的偵聽過程退出。不知道為什麼會這樣。
netcat 有許多不同的實現。
我假設您沒有使用傳統的實現,而是使用更現代的實現,它可以處理 IPv6,因為第一個問題看起來與 IPv6 有關。在這裡,我使用的是
nc
(版本 1.217,在 Debian 11 上為 1.217-3)的 OpenBSD 變體。
第一個問題:雙連接
nc -l 2500
偵聽 IPv4nc -zv localhost 2500
首先嘗試連接到 IPv6 localhost::1
,失敗並以 IPv4 localhost 透明重試127.0.0.1
:成功我的 netcat 提供了更多資訊:$ nc -zv localhost 2500 nc: connect to localhost (::1) port 2500 (tcp) failed: Connection refused Connection to localhost (127.0.0.1) 2500 port [tcp/*] succeeded!
您可以通過以下方式避免這種情況:
- 在客戶端命令上聲明 127.0.0.1 而不是 localhost 或使用
-4
僅嘗試 IPv4 的選項。- 或更改localhost解析的雙棧首選項以支持 IPv4 而不是 IPv6。在基於 glibc 的系統(例如大多數 Linux)上,可以通過將其添加到以下位置來完成
/etc/gai.conf
:precedence ::1/128 5
或通過說明`-6`將使用 IPv6 的伺服器命令。[實際上,根據RFC 3493](https://datatracker.ietf.org/doc/html/rfc3493#section-5.3 "5.3 AF_INET6 套接字的 IPV6_V6ONLY 選項"),IPv6 套接字很可能預設為雙模式 IPv4+IPv6 。 * 第二個問題:伺服器命令結束 *使用 TCP 的netcat*的零模式掃描只是建立一個連接並結束它:傳輸零數據,但仍然建立並關閉了一個連接。因此,完成其角色的伺服器命令預設結束(這是 OpenBSD 變體的行為。例如,原始/傳統變體沒有這樣做,但也沒有使用 IPv6)。 將所需的選項添加到伺服器命令,以便它保持偵聽套接字並且不會在收到第一個連接時停止。對於 OpenBSD 版本,這是選項`-k`:“保持入站套接字打開以進行多個連接”:
nc -k -l 2500
請注意,[還有其他](https://unix.stackexchange.com/questions/457670/netcat-how-to-listen-on-a-tcp-port-using-ipv6-address/457685#457685)*netcat*實現,每個都有自己的細微差別。我對使用哪個的建議是:無,使用[`socat`](http://www.dest-unreach.org/socat/doc/socat.html#EXAMPLES)具有更多功能的替代。