连接尝试后,netcat 关闭本地主机侦听端上的连接

连接尝试后,netcat 关闭本地主机侦听端上的连接

我正在 nc 收听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!

为什么第一次尝试似乎失败了?

我还注意到,当连接尝试由于某种原因完成(显然成功)时,我的监听进程将退出。不知道为什么会发生这种情况。

答案1

netcat 有许多不同的实现。

我假设您没有使用传统的实现,而是使用更现代的实现,它可以处理 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!
    

    您可以通过以下方式避免这种情况:

    • 在客户端命令上声明 127.0.0.1 而不是 localhost,或者使用-4仅尝试 IPv4 的选项。

    • 或更改双堆栈首选项的分辨率本地主机优先考虑 IPv4 而不是 IPv6。在基于 glibc 的系统(例如大多数 Linux)上,可以通过添加以下内容来完成/etc/gai.conf

      precedence  ::1/128       5 
      
    • 或通过说明-6在服务器命令上声明将使用 IPv6。实际上,IPv6 套接字很可能会默认为双模 IPv4+IPv6。RFC 3493

  • 第二个问题:服务器命令结束

    零模式扫描网猫TCP 只是建立一个连接并结束它:传输零数据,但仍然建立并关闭连接。因此,完成其角色的服务器命令默认结​​束(这是 OpenBSD 变体的行为。例如,原始/传统变体没有这样做,但也没有使用 IPv6)。

    将所需的选项添加到服务器命令中,以便它保留侦听套接字并且不会在收到第一个连接时停止。对于 OpenBSD 版本,这是选项-k:“为多个连接保持入站套接字打开”:

    nc -k -l 2500
    

注意还有其他实现网猫每个都有其自己的细微差别。我对使用哪个的建议是:无,使用socat相反,它具有更多功能。

相关内容