web-dev-qa-db-ja.com

lsofがIPv4ソケットがIPv6であることを示すのはなぜですか?

Lsof -iの出力を見ていて、混乱しています。たとえば、次のmy 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)

洞察をありがとう!

2
Jamie

Linuxでは、IPv6ソケットが同時にIPv4とIPv6の両方になる場合があります。 IPv6ソケットは IPv4-mapped IPv6アドレス からのパケットも受け入れます。

この機能はIPV6_V6ONLYソケットオプション。デフォルトはnet.ipv6.bindv6only sysctl(/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で、接続されています。

3
pizdelect