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_V6ONLY
opção socket, cujo padrão é controlado pelo net.ipv6.bindv6only
sysctl( /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.