我正在尝试弄清楚如何将入站 IPv4 连接连接到侦听 CentOS 机器上 IPv6 端口的端口。
在普通 CentOS 7 服务器上进行演示:
- 确认
bindV6only
已禁用
$ cat /proc/sys/net/ipv6/bindv6only
0
- 在 IPv6 端口上运行 netcat 侦听
nc -lvn6p 80
- 在另一个 shell 上,尝试通过 IPv4 telnet 到该端口
telnet 127.0.0.1 80
尝试 127.0.0.1... telnet:连接到地址 127.0.0.1:连接被拒绝
更多信息
- 尝试通过 IPv6 连接可以正常工作。例如远程登录::1 80
- 然而,我读到的所有内容都表明,如果在 sysctl 中禁用了 net.ipv6.bindv6only,基于 Linux 的 IPv6 套接字也应该接受 IPv4 连接。
- 我尝试过 Socket CAT,它可以工作,但不是一个优雅的解决方案,并且需要配置单独的服务。例如
socat TCP4-LISTEN:80,reuseaddr,fork TCP6:[::1]:80
参考:https://sysctl-explorer.net/net/ipv6/bindv6only/
参考:https://stackoverflow.com/questions/6343747/ipv6-socket-creation
答案1
我不知道这是否是你的问题,但yum install nc
在 centos 7 上运行将安装,它确实在 ipv6 套接字上nmap-ncat
设置套接字选项本身:SOL_IPV6/IPV6_V6ONLY
# strace -e trace=setsockopt nc -lvn6p 80
Ncat: Version 7.50 ( https://nmap.org/ncat )
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(3, SOL_IPV6, IPV6_V6ONLY, [1], 4) = 0
Ncat: Listening on :::80
如果省略-6
和-4
选项,它将绑定两个不同的ipv6
和ipv4
套接字:
# strace -e trace=bind,setsockopt nc -lvnp 80
Ncat: Version 7.50 ( https://nmap.org/ncat )
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(3, SOL_IPV6, IPV6_V6ONLY, [1], 4) = 0
bind(3, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
Ncat: Listening on :::80
setsockopt(4, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(4, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
Ncat: Listening on 0.0.0.0:80
显然,nmap
人们不太喜欢 Linux 的双栈套接字功能;-)