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이며 연결되어 있습니다.

관련 정보