如何在 CentOS 7 上使用 IPv4 连接连接到 IPv6 服务?

如何在 CentOS 7 上使用 IPv4 连接连接到 IPv6 服务?

我正在尝试弄清楚如何将入站 IPv4 连接连接到侦听 CentOS 机器上 IPv6 端口的端口。

在普通 CentOS 7 服务器上进行演示:

  1. 确认bindV6only已禁用
   $ cat /proc/sys/net/ipv6/bindv6only
   0
  1. 在 IPv6 端口上运行 netcat 侦听
   nc -lvn6p 80
  1. 在另一个 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选项,它将绑定两个不同的ipv6ipv4套接字:

# 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 的双栈套接字功能;-)

相关内容