getaddrinfo는 Linux에서는 IPv6를 반환하지 않지만 Macbook에서는 반환합니다.

getaddrinfo는 Linux에서는 IPv6를 반환하지 않지만 Macbook에서는 반환합니다.

간단한 설정이 있습니다. 1.2.3.4 yahoo.com/etc/hosts 파일에 추가했습니다 .

/etc/hosts 파일에 google.com에 대한 항목을 추가하지 않았습니다.

Macbook에서는 1.2.3.4와 yahoo.com의 원래 IPv6 주소가 응답으로 표시됩니다.

데모는 다음과 같습니다.

x@macbook:~ $ getent hosts yahoo.com
1.2.3.4 yahoo.com
x@macbook:~ $ cat /etc/hosts | grep yahoo.com
1.2.3.4 yahoo.com
x@macbook:~ $ python test.py
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('142.251.36.14', 443)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2a00:1450:400e:801::200e', 443, 0, 0))]
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('1.2.3.4', 443)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2001:4998:24:120d::1:0', 443, 0, 0)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2001:4998:124:1507::f000', 443, 0, 0)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2001:4998:24:120d::1:1', 443, 0, 0)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2001:4998:44:3507::8001', 443, 0, 0)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2001:4998:44:3507::8000', 443, 0, 0)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2001:4998:124:1507::f001', 443, 0, 0))]
x@macbook:~ $ cat test.py
import socket
print(socket.getaddrinfo("google.com", 443, 0, socket.SOCK_STREAM))
print(socket.getaddrinfo("yahoo.com", 443, 0, socket.SOCK_STREAM))

Linux에서도 비슷한 설정:

root@linux:~# getent hosts yahoo.com
1.2.3.4         yahoo.com
root@linux:~# getent ahosts yahoo.com
1.2.3.4         STREAM yahoo.com
1.2.3.4         DGRAM
1.2.3.4         RAW
root@linux:~# cat /etc/hosts |grep yahoo.com
1.2.3.4 yahoo.com
root@linux:~# python test.py
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('142.251.39.110', 443)), (<AddressFamily.AF_INET6: 10>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2a00:1450:400e:810::200e', 443, 0, 0))]
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('1.2.3.4', 443))]
root@linux:~# cat test.py
import socket
print(socket.getaddrinfo("google.com", 443, 0, socket.SOCK_STREAM))
print(socket.getaddrinfo("yahoo.com", 443, 0, socket.SOCK_STREAM))

Linux에서는 DNS에서 google.com의 IPv4 및 IPv6를 얻을 수 있습니다. 하지만 DNS에서 yahoo.com의 IPv6 주소를 가져올 수 없습니다. 맥북에서는 잘 작동합니다. 출력이 왜 일관성이 없는지 아는 사람이 있습니까?

답변1

Linux의 동작이 좀 더 직관적인 것 같아서 MacOS의 동작에 조금 놀랐습니다.

Linux는 기본적으로 DNS를 처리하지 않습니다. 이는 실제로 glibc와 같은 사용자 공간 라이브러리입니다(귀하의 질문에 이 항목을 태그한 것으로 나타났습니다). Linux의 glibc에서 DNS 확인은 다음 명령으로 제어됩니다.NS 스위치 (Alpine Linux 및 유사한 musl C는 nsswitch를 사용하지 않으므로 다른 결과를 얻을 수 있습니다)

MacOS는 nsswitch를 사용하지 않습니다. 적어도 /etc/nsswitch.conf는 없습니다. 있는 것 같다자체 시스템.

Linux에서 glibc에서 일어나는 일은 /etc/nsswitch.conf호스트를 찾는 방법을 결정하기 위해 참조된다는 것입니다 yahoo.com.


대부분의 경우 기본값은 다음 nsswitch.conf과 유사합니다.

hosts:          files mdns_minimal [NOTFOUND=return] dns

이는 이름 확인이 다음 순서로 시도됨을 의미합니다.

  • /etc/호스트
  • MDNS(로컬 네트워크의 멀티캐스트 DNS)
  • 도메인 명 시스템

결과가 발견되면 중지됩니다. 따라서 yahoo.com에 IPv4 주소를 추가 하면 /etc/hostsglib C는 거기서 멈추고 결코 DNS 요청을 하지 않을 것입니다.

관련 정보