如果我正在侦听:::80
,它是侦听所有 ipv6 还是所有 ipv6+ipv4?
这是我的netstat -tln
:
tcp 0 0 :::8080 :::*
答案1
绑定到 的侦听套接字::
(即任何地址 IPv6 地址 ( INADDR6_ANY
))可能也可能不侦听使用 IPv4 的连接。这取决于几件事:
- 有些操作系统被称为双栈,并且在这些操作系统上,这取决于是否
IPV6_V6ONLY
在侦听套接字上设置了套接字选项(由创建套接字的程序)。基于 Linux 的操作系统和 FreeBSD 是此类操作系统的示例。如果程序未显式设置该选项,则默认行为取决于操作系统。例如,在基于 Linux 的操作系统上,您可以通过将 0 或 1 写入 来更改此默认值
/proc/sys/net/ipv6/bindv6only
。 - 其他一些操作系统则没有双栈,并且在这些操作系统上,人们无法使用单个套接字同时侦听 IPv6 和 IPv4。 OpenBSD 就是这样一种操作系统。
在某些操作系统上, 的输出netstat
将告诉您套接字是否是双堆栈的。例如, FreeBSD在输出的第一列中报告netstat
双栈套接字。tcp46
udp46
感谢您的回答@Johan Myreen,我想通过示例改进这个答案。
我正在使用这两个值测试 ipv6_only 行为。
1.
cat /proc/sys/net/ipv6/bindv6only
0
nc -6 -l 80
#server started
# netstat
tcp6 0 0 :::80 :::* LISTEN
# nc client
nc localhost 80
test
# server response
nc -6 -l 80
test
# from ipv6 now
nc ::1 80
test ipv6
# server response
nc -6 -l 80
test ipv6
2.
cat /proc/sys/net/ipv6/bindv6only
1
# server started
nc -6 -l 80
# connect to ipv4
nc localhost 80
nc: connect to localhost port 80 (tcp) failed: Connection refused
# connect to ipv6
nc ::1 80
test ipv6
# server respose
nc -6 -l 80
test ipv6
从上面的结果我们可以看到 /proc/sys/net/ipv6/bindv6only 的值决定了仅 ipv6 或 ipv6+ipv4 的行为