lsof가 내 IPv4 소켓이 IPv6임을 나타내는 이유는 무엇입니까?

lsof가 내 IPv4 소켓이 IPv6임을 나타내는 이유는 무엇입니까?

lsof -i의 출력을 보고 있는데 혼란스럽습니다! 예를 들어, 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)

통찰력을 제공해 주셔서 정말 감사합니다!

답변1

Linux에서는 IPv6 소켓이 IPv4와 IPv6 둘 다일 수 있습니다. IPv6 소켓은 다음의 요청도 수락할 수 있습니다.IPv4 매핑된 IPv6 주소.

이 기능은 소켓 옵션에 의해 제어되며 IPV6_V6ONLY기본적으로 net.ipv6.bindv6onlysysctl( /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이며 연결되어 있습니다.

관련 정보