为什么 SSH 在 netstat 中将协议显示为 tcp6 *和* tcp?

为什么 SSH 在 netstat 中将协议显示为 tcp6 *和* tcp?
$ netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN  

为什么22端口有两条记录(:::220.0.0.0:22),为什么一条使用protocol as tcp,一条使用astcp6

这是在 Ubuntu 12.04.4 上

答案1

默认情况下sshd使用 ipv4 和 ipv6。您可以通过AddressFamily以下指令配置 sshd 使用的协议/etc/ssh/sshd_config

对于 ipv4 和 ipv6(默认)

AddressFamily any

仅适用于 IPv4

AddressFamily inet

仅适用于 IPv6

AddressFamily inet6

进行任何更改后sshd_config重新启动sshd以使更改生效。

答案2

事实上,它更有趣一些

基本上,即使您完全禁用 IPv6,由于奇怪的内核原因,某些套接字也会被识别为“TCP6/UDP6”。

我在连接到 3G 网络且没有 IPv6 支持的 Android 手机上运行 netstat 后注意到了这一点(在 APN 设置中禁用并且运营商明确不支持)

当我看到 WhatsApp 的 TCP6 连接以某种方式持续存在后,我开始研究并找到了这个链接: https://blog.codecentric.de/en/2014/04/note-netstat/

答案3

可以仅绑定::IPv4 和 IPv6 并进行对话。我想知道为什么某些应用程序(包括 openssh)不利用这一点。

FreeBSD 开发者手册中有关 IPv6 的部分有一些可能相关的有趣评论:

看来RFC2553对通配符绑定问题谈得太少了,特别是在端口空间问题、故障模式以及AF_INET/INET6通配符绑定之间的关系方面。此 RFC 可以有多种与其一致但行为不同的单独解释。因此,要实现可移植应用程序,您不应假设内核中的行为。使用 getaddrinfo(3) 是最安全的方法。 1999 年 3 月中旬,端口号空间和通配符绑定问题在 ipv6imp 邮件列表上进行了详细讨论,看起来没有具体的共识(意味着,取决于实现者)。您可能需要检查邮件列表档案。

我们还可以推测,这种默认行为是在大量系统不支持 IPv6 时定义的。

相关内容