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アドレスを取得できません。 MacBookではうまくいきます。なぜ出力が一貫性がないのかを知っている人はいますか?

答え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要求をしません。

関連情報