クライアント DNS 設定 - resolv.conf/hosts/getent【LPIC-1 109.4】
この記事で達成できること
/etc/resolv.confのnameserver/search/optionsを読み書きできる/etc/hostsによる静的名前解決と DNS の優先順位を説明できる/etc/nsswitch.confのhosts:行で解決順(files dns)を制御できるgetentで NSS データベースを横断的に照会できるsystemd-resolved(resolvectl・stub resolver127.0.0.53)の挙動を把握できるhost/digで名前解決の問題を切り分けられる
LPIC-1 主題 109.4「クライアント側の DNS を設定する」の中核。名前解決がどのファイルとどの順序で行われるかを理解すれば、接続トラブルの大半は切り分けられる。
クライアント名前解決はどの順で起きるのか
名前解決はアプリが GNU C ライブラリ(glibc)の getaddrinfo() を呼ぶことで始まり、/etc/nsswitch.conf の hosts: 行が参照ソースと順序を決める。files(= /etc/hosts)が dns より前にあれば、hosts ファイルが DNS より優先される。
| 段階 | 参照先 | 役割 |
|---|---|---|
| 1. 順序 | /etc/nsswitch.conf |
hosts: 行で files / dns の順を決定 |
| 2. 静的 | /etc/hosts |
手書きの IP↔ホスト名対応(DNS より先に一致すれば即決定) |
| 3. DNS | /etc/resolv.conf |
問い合わせ先 nameserver と search ドメイン |
つまり「getent hosts の結果が DNS と違う」場合、まず疑うのは nsswitch.conf の順序と /etc/hosts の記述。試験でも実務でもこの 3 ファイルの関係が最重要。
getent hosts は nsswitch.conf 経由(hosts と DNS 両方)の結果を返すが、host / dig は DNS サーバーに直接問い合わせる。両者の結果が食い違うときは /etc/hosts の関与を疑う。
/etc/resolv.conf の設定
/etc/resolv.conf は DNS リゾルバの設定ファイル。nameserver(問い合わせ先 IP)、search(補完ドメイン)、options が主要ディレクティブ。
nameserver / search / domain / options
cat /etc/resolv.conf
nameserver 192.168.1.1 nameserver 8.8.8.8 search example.com lan options timeout:2 attempts:3
man resolv.conf(5) に基づく主要ディレクティブは次のとおり。
| ディレクティブ | 意味 |
|---|---|
nameserver IP |
問い合わせる DNS サーバー。最大 3 件(MAXNS)まで。上から順に試行 |
search dom1 dom2 |
短い名前に補完するドメインのリスト(例 web → web.example.com) |
domain name |
ローカルドメイン名。search と相互排他で、後に書いた方が有効 |
options name |
リゾルバ動作の調整(timeout:n / attempts:n / rotate / ndots:n) |
search と domain は両方あると最後に出現したものが採用される(man resolv.conf(5))。ndots:n はドット数が n 未満の名前を絶対名でなく相対名として扱い search を適用する閾値。
多くのディストリビューションで /etc/resolv.conf は NetworkManager や systemd-resolved が自動生成・上書きする。手編集しても再起動や接続変更で消えることがある。恒久設定は生成元(後述)で行う。
/etc/hosts と /etc/nsswitch.conf
/etc/hosts は IP とホスト名を静的に対応づけるファイル。/etc/nsswitch.conf の hosts: 行で、この静的定義と DNS のどちらを先に引くかが決まる。
/etc/hosts の書式
cat /etc/hosts
127.0.0.1 localhost ::1 localhost ip6-localhost 192.168.1.50 web.example.com web
man hosts(5) によると書式は「IPアドレス 正規ホスト名 別名...」。1 行に IP とそのホスト名・エイリアスを空白区切りで並べる。DNS を介さず即座に解決されるため、テスト用の名前固定やローカル開発で多用する。
nsswitch.conf の hosts: 行
grep hosts /etc/nsswitch.conf
hosts: files dns
hosts: の値が解決の参照順。files(/etc/hosts)→ dns(/etc/resolv.conf のサーバー)の順に試す設定。files が先なので /etc/hosts に一致があれば DNS は引かれない。systemd 環境では files resolve [!UNAVAIL=return] dns のように resolve(systemd-resolved の NSS モジュール nss-resolve)が入る場合がある。
hosts: を dns files の順に書くと DNS が優先され、/etc/hosts の固定が効かなくなる。順序が想定外の挙動を生む典型例なので、トラブル時は必ずこの行を確認する。
getent / host / dig での確認
getent は NSS データベース(hosts / passwd / group 等)を nsswitch.conf 経由で照会するコマンド。host / dig は DNS サーバーへ直接問い合わせる。両者を使い分けると、名前解決の問題が hosts 側か DNS 側かを切り分けられる。
getent で NSS を引く
getent hosts web.example.com getent hosts 8.8.8.8
192.168.1.50 web.example.com web 8.8.8.8 dns.google
getent hosts NAME は nsswitch.conf の hosts: 行に従い、/etc/hosts と DNS を合わせた最終結果を返す。getent は passwd / group / services 等のデータベースも引ける(例 getent passwd root)。アプリが実際に得る解決結果に最も近いのがこの出力。
host / dig で DNS に直接問い合わせる
host example.com dig example.com A +short
example.com has address 93.184.216.34 93.184.216.34
host NAME は DNS の正引き、host IP は逆引きを行う。dig NAME A は A レコードを問い合わせ、+short で応答のみを抽出する。dig @8.8.8.8 example.com のように @サーバー で問い合わせ先を明示でき、/etc/resolv.conf を介さずに特定サーバーへ直接照会できる。
切り分けの定石は次の対比。getent hosts X は成功するが dig X が失敗 → /etc/hosts で解決されている。dig X は成功するが getent hosts X が失敗 → nsswitch.conf の順序か NSS モジュールの問題。
systemd-resolved の設定
systemd-resolved はネットワークネームレゾリューションを提供するシステムサービス。stub resolver として 127.0.0.53 を listen し、/etc/resolv.conf はこのアドレスを指すよう生成されることが多い。状態確認と設定は resolvectl で行う。
resolvectl で状態と解決を確認する
resolvectl status resolvectl query example.com
Global
Protocols: -LLMNR +mDNS ...
Link 2 (eth0)
DNS Servers: 192.168.1.1
DNS Domain: example.com
example.com: 93.184.216.34
resolvectl status は現在の DNS サーバー・検索ドメインをリンクごとに表示する。resolvectl query NAME は resolved 経由で名前解決する。systemd-resolved 環境では /etc/resolv.conf の nameserver が 127.0.0.53(stub resolver)になり、実際の上流サーバーは resolvectl status で確認する点に注意。
resolved.conf と resolv.conf の関係
cat /etc/resolv.conf grep -v '^#' /etc/systemd/resolved.conf
nameserver 127.0.0.53 options edns0 trust-ad search example.com [Resolve] DNS=192.168.1.1 FallbackDNS=8.8.8.8
恒久的な上流 DNS は /etc/systemd/resolved.conf の [Resolve] セクション(DNS= / FallbackDNS=)で指定し、systemctl restart systemd-resolved で反映する。/etc/resolv.conf 直接編集ではなく、生成元のこのファイルを編集するのが正しい運用。
systemd-resolved 環境で /etc/resolv.conf の 127.0.0.53 を実 IP に書き換えても、サービスやネットワーク再起動で元に戻る。上流変更は resolved.conf で行う。/etc/resolv.conf が /run/systemd/resolve/stub-resolv.conf へのシンボリックリンクになっている構成もある。
/etc/host.conf の役割
/etc/host.conf は古くからあるリゾルバ設定ファイルで、現在の glibc では限定的な項目(主に multi)のみが意味を持つ。解決順の中心は nsswitch.conf に移っている。
cat /etc/host.conf
multi on
man host.conf(5) によると、glibc では order 行は無視され、解決順は /etc/nsswitch.conf が決める。multi on は /etc/hosts 内で同一ホストに複数 IP がある場合にすべて返す指定。歴史的経緯で残るファイルであり、現在の解決順制御は nsswitch.conf 側で行う点を押さえておけばよい。
よくあるミス
名前解決トラブルの多くは設定ファイルの誤解に起因する。試験でも実務でも頻出する 5 つを挙げる。
- resolv.conf を手編集して消える: NetworkManager / systemd-resolved が再生成するため手編集は揮発する。生成元(
resolved.confや NetworkManager 接続設定)で変更する。 - nsswitch.conf の順序を誤解:
hosts: dns filesにすると DNS が優先され、/etc/hostsの固定が無視される。/etc/hostsを効かせたいならfilesを先に置く。 - hosts と DNS の優先順位を取り違える:
/etc/hostsに一致があれば(filesが先なら)DNS は引かれない。DNS を引いていないつもりが hosts に古い行が残っているケース。 - systemd-resolved の stub を上流と混同:
/etc/resolv.confの127.0.0.53は stub であり実際の上流ではない。上流はresolvectl statusで確認する。 - getent と dig の差を理解していない:
getent hostsは/etc/hostsを含むがdigは DNS のみ。結果が食い違うのは正常で、切り分けに使える。
トラブルシューティング
症状: 編集した resolv.conf がすぐ元に戻る
原因: NetworkManager または systemd-resolved が /etc/resolv.conf を自動生成・上書きしている
確認:
ls -l /etc/resolv.conf resolvectl status
対処: systemd-resolved 環境なら /etc/systemd/resolved.conf の DNS= を編集し systemctl restart systemd-resolved。NetworkManager 環境なら接続プロファイルで DNS を設定する。
症状: 特定ホストだけ古い IP に解決される
原因: /etc/hosts に古いエントリが残り、files 優先で DNS より先に一致している
確認:
getent hosts target.example.com grep target.example.com /etc/hosts dig target.example.com +short
対処: /etc/hosts の該当行を修正または削除する。getent と dig の結果差が hosts 関与の証拠。
症状: getent hosts は引けるが dig が失敗する
原因: 名前が /etc/hosts で解決されており DNS には登録がない
確認:
grep name /etc/hosts grep hosts /etc/nsswitch.conf
対処: 設計どおりなら問題なし。DNS で解決させたい場合は /etc/hosts の行を削除し、DNS にレコードを登録する。
作業完了チェックリスト
- [ ]
cat /etc/resolv.confで nameserver / search を確認した - [ ]
grep hosts /etc/nsswitch.confで解決順を確認した - [ ]
getent hosts NAMEで実際の解決結果を確認した - [ ]
host/digで DNS に直接問い合わせて切り分けた - [ ] systemd-resolved 環境では
resolvectl statusで上流を確認した
まとめ
| 場面 | コマンド / ファイル | 目的 |
|---|---|---|
| DNS サーバー確認 | /etc/resolv.conf |
nameserver / search の確認 |
| 静的名前解決 | /etc/hosts |
IP↔ホスト名の固定 |
| 解決順の制御 | /etc/nsswitch.conf |
hosts: files dns の順序 |
| 実解決の確認 | getent hosts NAME |
NSS 経由の最終結果 |
| DNS 直接問い合わせ | host / dig |
DNS サーバーへ直接照会 |
| resolved 管理 | resolvectl / resolved.conf |
systemd-resolved の状態と設定 |
クライアント DNS はネットワーク運用の基礎。3 ファイル(resolv.conf / hosts / nsswitch.conf)の関係と getent / host / dig の使い分けを押さえれば、名前解決の切り分けは確実に行える。