CentOSシステムのIPv6ポートでリッスンしているポートにインバウンドIPv4接続を接続する方法を見つけようとしています。
一般的なCentOS 7サーバーのデモ:
bindV6only
無効の確認
$ cat /proc/sys/net/ipv6/bindv6only
0
- IPv6ポートでnetcatリスニングを実行します。
nc -lvn6p 80
- 別のシェルで IPv4 経由でポートに Telnet を試みます。
telnet 127.0.0.1 80
127.0.0.1 試行中... Telnet: アドレス 127.0.0.1 に接続中: 接続が拒否されました。
追加情報
- IPv6経由で接続しようとすると正常に動作します。例: リモートログイン::1 80
- しかし、私が読んだことによれば、net.ipv6.bindv6onlyがsysctlで無効になっている場合、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では、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
とオプションを省略すると、2つの異なるソケットが-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のデュアルスタックソケット機能があまり好きではありません;-)