Centos
如何在 CentOS 7 上使用 IPv4 連接連接到 IPv6 服務?
我正在嘗試研究如何將入站 IPv4 連接連接到在 CentOS 機器上偵聽 IPv6 埠的埠。
在 vanilla CentOS 7 伺服器上進行展示:
- 確認
bindV6only
已禁用$ cat /proc/sys/net/ipv6/bindv6only 0
- 在 IPv6 埠上執行 netcat 偵聽
nc -lvn6p 80
- 在另一個 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
如果省略
-6
and-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 的雙棧套接字特性的忠實擁護者 ;-)