早在仅IPv4版本中,在netstat显示为监听0.0.0.0的LISTEN连接将响应系统中任何IPv4接口上的连接。
据我所知,新的IPv6 idiom ::监听所有可用的IPv6 和 IPv4接口。 对于所有操作系统(Unix,Windows,Mac),这是正确的吗? 有没有一个习惯于只听IPv6接口?
不幸的是,这取决于你使用的是什么操作系统。
在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时用于SMBstream量。 正如您所看到的,它分别绑定到0.0.0.0和::以使IPv4和IPv6客户端都能正常工作。
在Linux上, ::包含IPv4兼容的地址,正如您已经正确猜测的那样,所以绑定到0.0.0.0也是不必要的。 我写了一个简单的Python程序,只绑定到::上的AF_INET6套接字。 即使我没有绑定到AF_INET (IPv4)套接字,它仍然接受来自IPv4客户端的连接。 如果10.1.1.3连接到它,它将显示为::ffff:10.1.1.3连接。
除了它变得毛茸茸的。 如果将/proc/sys/net/ipv6/bindv6only设置为1 ,则以上不适用于Linux,在这种情况下,行为与Windows完全相同 – 绑定到::将仅侦听IPv6请求。 如果您也想监听IPv4请求,则需要创build一个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兼容绑定。 为了certificate这一点,如果你看看这个:
$ cat /proc/sys/net/ipv6/bindv6only 0
bindv6only被禁用(默认)。 如果设置为1 ,那么我将不得不鼓励SSH在0.0.0.0上进行收听(或者改为)。
对于在Mac OS X方面没有任何信息抱歉。 我过去曾经使用过它,但是我更喜欢GNOME的美学,所以我很久没有使用它了。 但是,我猜测这个行为和Linux是一样的。
希望这可以帮助。
这是不可能的,因为IPv6地址空间的一部分与IPv4空间相同,所以即使您可以以某种方式禁用IPv4套接字,仍然可以将IPv4数据包发送到IPv6套接字。 检出IPv4维基百科页面中的IPv4转换部分。
编辑:啊,进一步下来,它说:
一些常见的IPv6栈不支持IPv4映射地址function,或者是因为IPv6和IPv4栈是单独的实现(Vista / Longhorn之前的Microsoft Windows:例如XP / 2003),或者是出于安全考虑(OpenBSD)。 在这些操作系统上,需要为每个要支持的IP协议打开一个单独的套接字。 在一些系统上(例如Linux,NetBSD,FreeBSD),这个特性由RFC 3493中规定的套接字选项IPV6_V6ONLY来控制
你可以使用你的networkingID AAAA:BBBB:CCCC:DDDD ::或者其他任何东西。 这将保证只有IPv6接口才能接入。 我认为。 我不是IPv6的主人。