¿Por qué lsof indica que mi socket IPv4 es IPv6?

¿Por qué lsof indica que mi socket IPv4 es IPv6?

¡Estoy mirando el resultado de lsof -i y me estoy confundiendo! Por ejemplo, la siguiente conexión entre mi proceso Java y la base de datos se muestra como 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)

Entonces, el tipo de salida es IPv6 pero muestra claramente una dirección IPv4 en la columna NOMBRE. Además, ¡la conexión se configuró con una dirección IPv4! (En este ejemplo, 192.168.0.2)

¡Muchas gracias por cualquier idea!

Respuesta1

En Linux, los sockets IPv6 pueden ser IPv4 e IPv6 al mismo tiempo. Un socket IPv6 también puede aceptar paquetes de unDirección IPv6 asignada a IPv4.

Esta característica está controlada por la IPV6_V6ONLYopción socket, cuyo valor predeterminado está controlado por net.ipv6.bindv6onlysysctl ( /proc/sys/net/ipv6/bindv6only). Su valor predeterminado es 0 (es decir, está desactivado) en la mayoría de las distribuciones de Linux.

Esto podría reproducirse fácilmente con:

[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

El socket del cliente es IPv4 y el socket del servidor es IPv6 y están conectados.

información relacionada