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