Alex J Asked: 2009-06-08 17:48:44 +0800 CST2009-06-08 17:48:44 +0800 CST 2009-06-08 17:48:44 +0800 CST 双栈操作系统中 :: 和 0.0.0.0 的语义 772 netstat回到纯 IPv4 时代,显示为正在侦听的 LISTEN 连接0.0.0.0将响应系统中任何 IPv4 接口上的连接。 据我了解,新的 IPv6 惯用语::侦听所有可用的 IPv6和IPv4 接口。对于所有操作系统(Unix、Windows、Mac),这是否正确?是否有只听 IPv6 接口的习惯用法? windows linux ip ipv6 netstat 3 个回答 Voted Best Answer Jeremy Visser 2009-07-13T04:37:48+08:002009-07-13T04:37:48+08:00 不幸的是,这取决于您使用的操作系统。 在 Microsoft Windows 上,将套接字绑定到::仅绑定到 IPv6 端口。因此,要监听 IPv4 和 IPv6 上的所有地址,您需要绑定0.0.0.0到::. 以下摘录来自 Vista 框: C:\>netstat -an | find "445" TCP 0.0.0.0:445 0.0.0.0:0 LISTENING TCP [::]:445 [::]:0 LISTENING 我给出的示例是端口 445,在不使用 NetBIOS 时用于 SMB 流量。如您所见,它绑定到两者0.0.0.0,并::分别使 IPv4 和 IPv6 客户端都工作。 在 Linux 上,::它包括与 IPv4 兼容的地址,正如您猜对的0.0.0.0那样,因此也不需要绑定。我写了一个简单的 Python 程序,它只绑定AF_INET6到::. 即使我也没有绑定到AF_INET(IPv4) 套接字,它仍然接受来自 IPv4 客户端的连接。例如,如果10.1.1.3连接到它,它将显示为正在连接 from ::ffff:10.1.1.3。 除了它会长毛。/proc/sys/net/ipv6/bindv6only如果设置为,则上述内容不适用于 Linux 1,在这种情况下,行为与 Windows 完全相同——绑定到::只会侦听 IPv6 请求。如果您还想监听 IPv4 请求,您还需要创建一个AF_INET套接字并监听0.0.0.0。幸运的是,默认值bindv6only是0,因此您必须处理这个问题的可能性很小(除非您使用 Debian,它实际上默认为bindv6only = 1)。 在检查服务是否支持 IPv6 以及是否也支持 IPv4 时,所有这些都很方便。这是我的 SSH 服务器: $ netstat -64ln | grep 22 tcp6 0 0 :::22 :::* LISTEN 如您所见,SSH 仅在::端口 22 上侦听。但是,它不仅在侦听 IPv6 客户端——它在 IPv4 客户端上工作正常,因为 IPv4 兼容绑定。为了证明这一点,如果你看这个: $ cat /proc/sys/net/ipv6/bindv6only 0 bindv6only被禁用(默认)。如果将其设置为1,那么我将不得不鼓励 SSH0.0.0.0也(或相反)收听。 抱歉没有关于 Mac OS X 方面的信息。以前用过,不过我更喜欢GNOME的美学,所以很久没用了。但是,我猜想这种行为与 Linux 的行为相同。 希望这可以帮助。 David Pashley 2009-06-08T18:09:55+08:002009-06-08T18:09:55+08:00 这是不可能的,因为 IPv6 地址空间的一部分与 IPv4 空间相同,因此即使您可以以某种方式禁用 IPv4 套接字,您仍然可以将 IPv4 数据包发送到 IPv6 套接字。查看IPv4 维基百科页面中的 IPv4 转换部分。 编辑:啊,再往下一点,它确实说: 一些常见的 IPv6 堆栈不支持 IPv4 映射地址功能,因为 IPv6 和 IPv4 堆栈是单独的实现(Vista/Longhorn 之前的 Microsoft Windows:例如 XP/2003),或者因为安全问题(OpenBSD)。在这些操作系统上,必须为要支持的每个 IP 协议打开一个单独的套接字。在某些系统(例如,Linux、NetBSD、FreeBSD)上,此功能由RFC 3493中指定的套接字选项 IPV6_V6ONLY 控制 Matt Simmons 2009-06-08T18:01:12+08:002009-06-08T18:01:12+08:00 您可以使用您的网络 ID、AAAA:BBBB:CCCC:DDDD:: 或任何适合您的方式来完成此操作。这将保证只有 IPv6 接口可以接收它。我认为。我不是 IPv6 大师。
不幸的是,这取决于您使用的操作系统。
在 Microsoft Windows 上,将套接字绑定到
::
仅绑定到 IPv6 端口。因此,要监听 IPv4 和 IPv6 上的所有地址,您需要绑定0.0.0.0
到::
. 以下摘录来自 Vista 框:我给出的示例是端口 445,在不使用 NetBIOS 时用于 SMB 流量。如您所见,它绑定到两者
0.0.0.0
,并::
分别使 IPv4 和 IPv6 客户端都工作。在 Linux 上,
::
它包括与 IPv4 兼容的地址,正如您猜对的0.0.0.0
那样,因此也不需要绑定。我写了一个简单的 Python 程序,它只绑定AF_INET6
到::
. 即使我也没有绑定到AF_INET
(IPv4) 套接字,它仍然接受来自 IPv4 客户端的连接。例如,如果10.1.1.3
连接到它,它将显示为正在连接 from::ffff:10.1.1.3
。除了它会长毛。
/proc/sys/net/ipv6/bindv6only
如果设置为,则上述内容不适用于 Linux1
,在这种情况下,行为与 Windows 完全相同——绑定到::
只会侦听 IPv6 请求。如果您还想监听 IPv4 请求,您还需要创建一个AF_INET
套接字并监听0.0.0.0
。幸运的是,默认值bindv6only
是0
,因此您必须处理这个问题的可能性很小(除非您使用 Debian,它实际上默认为bindv6only = 1
)。在检查服务是否支持 IPv6 以及是否也支持 IPv4 时,所有这些都很方便。这是我的 SSH 服务器:
如您所见,SSH 仅在
::
端口 22 上侦听。但是,它不仅在侦听 IPv6 客户端——它在 IPv4 客户端上工作正常,因为 IPv4 兼容绑定。为了证明这一点,如果你看这个:bindv6only
被禁用(默认)。如果将其设置为1
,那么我将不得不鼓励 SSH0.0.0.0
也(或相反)收听。抱歉没有关于 Mac OS X 方面的信息。以前用过,不过我更喜欢GNOME的美学,所以很久没用了。但是,我猜想这种行为与 Linux 的行为相同。
希望这可以帮助。
这是不可能的,因为 IPv6 地址空间的一部分与 IPv4 空间相同,因此即使您可以以某种方式禁用 IPv4 套接字,您仍然可以将 IPv4 数据包发送到 IPv6 套接字。查看IPv4 维基百科页面中的 IPv4 转换部分。
编辑:啊,再往下一点,它确实说:
您可以使用您的网络 ID、AAAA:BBBB:CCCC:DDDD:: 或任何适合您的方式来完成此操作。这将保证只有 IPv6 接口可以接收它。我认为。我不是 IPv6 大师。