lsofが私のIPv4ソケットがIPv6であることを示す理由は何ですか?

lsofが私のIPv4ソケットがIPv6であることを示す理由は何ですか?

lsof -iの出力を見ているのが混乱しています!たとえば、Java プロセスとデータベース間の次の接続は IPv6 として表示されます。

[me ~] % lsof  -P -n -i :2315 -a -p xxxx
COMMAND  PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
java    xxxx   me   93u  IPv6 2499087197      0t0  TCP 192.168.0.1:16712->192.168.0.2:2315 (ESTABLISHED)

したがって、出力タイプはIPv6ですが、NAME列にIPv4アドレスが明確に表示されます。また、接続はIPv4アドレスで構成されています! (この例では192.168.0.2)

洞察力を提供していただきありがとうございます!

ベストアンサー1

Linux では、IPv6 ソケットは IPv4 と IPv6 の両方である可能性があります。 IPv6ソケットは次の要求も受け入れることができます。IPv4 マップされた IPv6 アドレス

この機能はソケットオプションによって制御され、IPV6_V6ONLYデフォルトではnet.ipv6.bindv6onlysysctl(/proc/sys/net/ipv6/bindv6only)によって制御されます。ほとんどのLinuxディストリビューションでは、デフォルトは0(オフ)です。

これは簡単に再現できます。

[prompt] nc -6 -l 9999 & nc -4 localhost 9999 &
[4] 10892
[5] 10893
[prompt] lsof -P -n -i :9999
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      10892    x    3u  IPv6 297229      0t0  TCP *:9999 (LISTEN)
nc      10892    x    4u  IPv6 297230      0t0  TCP 127.0.0.1:9999->127.0.0.1:41472 (ESTABLISHED)
nc      10893    x    3u  IPv4 296209      0t0  TCP 127.0.0.1:41472->127.0.0.1:9999 (ESTABLISHED)
[prompt] kill %4 %5

クライアントソケットはIPv4、サーバーソケットはIPv6、接続されています。

おすすめ記事