はじめに
ネットワークの仕組みを学んでいると、「ブラウザがドメイン名をIPアドレスに変換する過程で socket
ライブラリが使われる」と説明されることがあります。私はこの説明を読んで、「socket
ライブラリの関数を実行すると、OSのターミナルで nslookup
が動くの?」という疑問が浮かびました。
この記事では、この疑問を解決しながら、
-
socket
ライブラリがどのように名前解決を行うのか - OSの
/etc/hosts
、nsswitch.conf
、resolv.conf
の役割 -
nslookup
やdig
との違い
をまとめてみます。
socket
ライブラリによる名前解決の流れ
Python で socket.gethostbyname("www.example.com")
を実行すると、以下の手順で名前解決が行われます。
① /etc/hosts
を確認
まず、ローカルの /etc/hosts
に www.example.com
のエントリがあるかをチェックします。
/etc/hosts
の例
127.0.0.1 localhost
192.168.1.100 myserver
この場合、myserver
というホスト名を問い合わせると、DNS を使わずに 192.168.1.100
を返します。
② nsswitch.conf
を確認し、次の処理を決定
/etc/nsswitch.conf
には、名前解決を行う際の優先順位が設定されています。
/etc/nsswitch.conf
の例
hosts: files dns
この設定では、/etc/hosts
を見て、なければ DNS に問い合わせるという順番になっています。
③ /etc/resolv.conf
を参照してDNSサーバーに問い合わせ
/etc/hosts
にエントリがない場合、OS は /etc/resolv.conf
に設定されたDNSサーバーに問い合わせます。
/etc/resolv.conf
の例
nameserver 8.8.8.8
nameserver 1.1.1.1
この設定では、
- GoogleのDNSサーバー(
8.8.8.8
)に問い合わせる - 応答がなければ CloudflareのDNSサーバー(
1.1.1.1
)に問い合わせる
という順番になります。
socket
ライブラリと nslookup
の違い
ここで、「socket
ライブラリの関数を実行すると nslookup
が動くの?」という疑問に戻ります。
✅ socket
ライブラリの動作
-
/etc/hosts
→/etc/nsswitch.conf
→/etc/resolv.conf
の順に従う - DNS 以外の手段(ローカルファイル)も使う
❌ nslookup
や dig
の動作
- OSの名前解決システムを使わず、直接 DNS サーバーに問い合わせる
-
/etc/hosts
を無視する
つまり、socket
ライブラリは OSの名前解決ルールを守る のに対し、nslookup
は 常にDNSに問い合わせる という違いがあります。
【実験】OSの名前解決の動作を確認する
① /etc/hosts
を使った実験
-
/etc/hosts
を編集sudo nano /etc/hosts
-
次の行を追加
1.2.3.4 example.com
-
保存して
ping
で確認ping example.com
→
1.2.3.4
にアクセスする!(DNSを使わない) -
Python で確認
import socket print(socket.gethostbyname("example.com"))
→
1.2.3.4
になる! -
nslookup
で確認nslookup example.com
→ 本物のDNSサーバーのIPが返る(1.2.3.4 にはならない)
この結果から、socket
は /etc/hosts
を使うが、nslookup
は使わないことが確認できます。
まとめ
socket ライブラリ |
nslookup /dig
|
|
---|---|---|
/etc/hosts を使うか? |
✅ 使う | ❌ 使わない |
/etc/resolv.conf を使うか? |
✅ 使う | ✅ 使う |
/etc/nsswitch.conf の順番を守るか? |
✅ 守る | ❌ 守らない |
DNSに直接問い合わせるか? | ❌ まずローカルを確認 | ✅ 直接DNSへ |
socket
ライブラリは OSの名前解決のルールに従い、ローカルの /etc/hosts
も参照する のに対し、nslookup
は 常にDNSサーバーに直接問い合わせる という違いがあります。