¡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_V6ONLY
opción socket, cuyo valor predeterminado está controlado por net.ipv6.bindv6only
sysctl ( /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.