:::80
をリッスンしている場合、すべてのipv6またはすべてのipv6 + ipv4をリッスンしていますか?
これは私のnetstat -tln
です:
tcp 0 0 :::8080 :::*
::
にバインドされているリスニングソケット、つまり任意のアドレスIPv6アドレス(INADDR6_ANY
)は、IPv4を使用した接続をリッスンする場合としない場合があります。これはいくつかのことに依存します:
IPV6_V6ONLY
ソケットオプションが設定されているかどうかによって異なります。リスニングソケット(ソケットを作成したプログラムによる)。 LinuxベースのオペレーティングシステムとFreeBSDは、そのようなオペレーティングシステムの例です。オプションがプログラムによって明示的に設定されていない場合のデフォルトの動作は、OSに依存します。たとえば、Linuxベースのオペレーティングシステムでは、/proc/sys/net/ipv6/bindv6only
に0または1を書き込むことでこのデフォルトを変更できます。
一部のオペレーティングシステムでは、netstat
の出力により、ソケットがデュアルスタックであるかどうかがわかります。 FreeBSDのnetstat
は、たとえば、出力の最初の列でデュアルスタックソケットをtcp46
およびudp46
として報告します。
回答ありがとうございます@JohanMyreen例を挙げてこの回答を改善したいと思います。
両方の値を使用してipv6_onlyの動作をテストしています。
1。
cat /proc/sys/net/ipv6/bindv6only
0
nc -6 -l 80
#server started
# netstat
tcp6 0 0 :::80 :::* LISTEN
# nc client
nc localhost 80
test
# server response
nc -6 -l 80
test
# from ipv6 now
nc ::1 80
test ipv6
# server response
nc -6 -l 80
test ipv6
2。
cat /proc/sys/net/ipv6/bindv6only
1
# server started
nc -6 -l 80
# connect to ipv4
nc localhost 80
nc: connect to localhost port 80 (tcp) failed: Connection refused
# connect to ipv6
nc ::1 80
test ipv6
# server respose
nc -6 -l 80
test ipv6
上記の結果から、/ proc/sys/net/ipv6/bindv6onlyの値がipv6のみまたはipv6 + ipv4の動作を決定していることがわかります