Por que lsof indica que meu soquete IPv4 é IPv6?

Por que lsof indica que meu soquete IPv4 é IPv6?

Estou olhando a saída de lsof -i e estou ficando confuso! Por exemplo, a seguinte conexão entre meu processo java e o banco de dados é mostrada 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)

Portanto, o tipo de saída é IPv6, mas mostra claramente um endereço IPv4 na coluna NOME. Além disso, a conexão foi configurada com um endereço IPv4! (Neste exemplo, 192.168.0.2)

Muito obrigado por qualquer insight!

Responder1

No Linux, os soquetes IPv6 podem ser IPv4 e IPv6 ao mesmo tempo. Um soquete IPv6 também pode aceitar pacotes de umEndereço IPv6 mapeado para IPv4.

Este recurso é controlado pela IPV6_V6ONLYopção socket, cujo padrão é controlado pelo net.ipv6.bindv6onlysysctl( /proc/sys/net/ipv6/bindv6only). Seu padrão é 0 (ou seja, está desativado) na maioria das distribuições Linux.

Isso pode ser facilmente reproduzido com:

[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

O soquete do cliente é IPv4 e o soquete do servidor é IPv6, e eles estão conectados.

informação relacionada