web-dev-qa-db-ja.com

CentOS 7でIPv4接続を使用してIPv6サービスに接続するにはどうすればよいですか?

CentOSボックスのIPv6ポートをリッスンしているポートにインバウンドIPv4接続を接続する方法を見つけようとしています。

Vanilla CentOS 7サーバーでデモンストレーションするには:

  1. 確認 bindV6only 無効になっています
   $ cat /proc/sys/net/ipv6/bindv6only
   0
  1. IPv6ポートでnetcatリスニングを実行する
   nc -lvn6p 80
  1. 別のシェルで、IPv4経由でポートにtelnetで接続してみます
   telnet 127.0.0.1 80

127.0.0.1を試行しています... telnet:アドレス127.0.0.1に接続します:接続が拒否されました

さらに詳しい情報

  • IPv6経由で接続しようとすると、期待どおりに機能します。例えばtelnet :: 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

2
Nick Wilton

これがあなたの問題かどうかはわかりませんが、centos7でyum install ncを実行すると、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および-4オプションを省略すると、2つの異なる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のデュアルスタックソケット機能の大ファンではありません;-)

4
mosvy