pka*_*mol 4 networking netcat port
\xce\x99 am nc 监听localhost:2500
\xe2\x96\xb6 nc -l 2500\n_\n
Run Code Online (Sandbox Code Playgroud)\n在另一个终端上,我尝试连接到这个监听端
\n\xe2\x96\xb6 nc -zv localhost 2500\nnc: connectx to localhost port 2500 (tcp) failed: Connection refused\nConnection to localhost port 2500 [tcp/rtsserv] succeeded!\n
Run Code Online (Sandbox Code Playgroud)\n为什么第一次尝试似乎失败了?
\n我还注意到,当连接尝试由于某种原因完成(显然成功)时,我的监听进程将退出。不知道为什么会发生这种情况。
\nnetcat 有许多不同的实现。
我假设您没有使用传统的实现,而是使用更现代的实现,它可以处理 IPv6,因为第一个问题看起来与 IPv6 相关。在这里,我使用的是 OpenBSD 变体nc
(版本 1.217,在 Debian 11 上为 1.217-3)。
第一期:双连接
nc -l 2500
监听 IPv4
nc -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!
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式避免这种情况:
在客户端命令上指定 127.0.0.1 而不是 localhost,或者使用-4
仅尝试 IPv4 的选项。
或者更改本地主机解析的双栈首选项以支持 IPv4 而不是 IPv6。在基于 glibc 的系统(例如大多数 Linux)上,可以通过添加以下内容来完成/etc/gai.conf
:
precedence ::1/128 5
Run Code Online (Sandbox Code Playgroud)
或者通过-6
在服务器命令上声明将使用 IPv6。实际上,根据RFC 3493 ,IPv6 套接字可能会默认为双模式 IPv4+IPv6 。
第二个问题:服务器命令结束
netcat使用 TCP的零模式扫描只是建立连接并结束它:传输零数据,但仍然建立并关闭连接。因此,完成其角色的服务器命令默认结束(这是 OpenBSD 变体的行为。例如,原始/传统变体没有这样做,但也没有使用 IPv6)。
将所需的选项添加到服务器命令中,以便它保留侦听套接字并且不会在收到第一个连接时停止。对于 OpenBSD 版本,这是选项-k
:“为多个连接保持入站套接字打开”:
nc -k -l 2500
Run Code Online (Sandbox Code Playgroud)
请注意,netcat还有其他实现,每个实现都有其细微的差别。我对使用哪个的建议是:不使用,而是使用具有更多功能的。socat