Centos

如何在 CentOS 7 上使用 IPv4 連接連接到 IPv6 服務?

  • April 2, 2019

我正在嘗試研究如何將入站 IPv4 連接連接到在 CentOS 機器上偵聽 IPv6 埠的埠。

在 vanilla CentOS 7 伺服器上進行展示:

  1. 確認bindV6only已禁用
  $ cat /proc/sys/net/ipv6/bindv6only
  0
  1. 在 IPv6 埠上執行 netcat 偵聽
  nc -lvn6p 80
  1. 在另一個 shell 上,嘗試通過 IPv4 遠端登錄到埠
  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

我不知道這是否是你的問題,但yum install nc在 centos 7 上執行會安裝nmap-ncat,它確實在 ipv6 套接字上設置了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

如果省略-6and-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 的雙棧套接字特性的忠實擁護者 ;-)

引用自:https://unix.stackexchange.com/questions/509999