簡単な設定があります。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/hosts
glib Cはそこで停止し、決してDNS要求をしません。