CentOS 7でIPv4接続を使用してIPv6サービスに接続する方法は?

CentOS 7でIPv4接続を使用してIPv6サービスに接続する方法は?

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

一般的な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経由で接続しようとすると正常に動作します。例: リモートログイン::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-ncatipv6ソケットにソケットオプション自体を設定します。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バインドされます。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のデュアルスタックソケット機能があまり好きではありません;-)

おすすめ記事