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