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)
洞察をありがとう!
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で、接続されています。