クライアント DNS 設定 - resolv.conf/hosts/getent【LPIC-1 109.4】

クライアント DNS 設定 - resolv.conf/hosts/getent【LPIC-1 109.4】

この記事で達成できること

  • /etc/resolv.confnameserver / search / options を読み書きできる
  • /etc/hosts による静的名前解決と DNS の優先順位を説明できる
  • /etc/nsswitch.confhosts: 行で解決順(files dns)を制御できる
  • getent で NSS データベースを横断的に照会できる
  • systemd-resolvedresolvectl・stub resolver 127.0.0.53)の挙動を把握できる
  • host / dig で名前解決の問題を切り分けられる

LPIC-1 主題 109.4「クライアント側の DNS を設定する」の中核。名前解決がどのファイルとどの順序で行われるかを理解すれば、接続トラブルの大半は切り分けられる。

クライアント名前解決はどの順で起きるのか

名前解決はアプリが GNU C ライブラリ(glibc)の getaddrinfo() を呼ぶことで始まり、/etc/nsswitch.confhosts: 行が参照ソースと順序を決める。files(= /etc/hosts)が dns より前にあれば、hosts ファイルが DNS より優先される。

段階 参照先 役割
1. 順序 /etc/nsswitch.conf hosts: 行で files / dns の順を決定
2. 静的 /etc/hosts 手書きの IP↔ホスト名対応(DNS より先に一致すれば即決定)
3. DNS /etc/resolv.conf 問い合わせ先 nameserversearch ドメイン

つまり「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 短い名前に補完するドメインのリスト(例 webweb.example.com
domain name ローカルドメイン名。search と相互排他で、後に書いた方が有効
options name リゾルバ動作の調整(timeout:n / attempts:n / rotate / ndots:n

searchdomain は両方あると最後に出現したものが採用される(man resolv.conf(5))。ndots:n はドット数が n 未満の名前を絶対名でなく相対名として扱い search を適用する閾値。

多くのディストリビューションで /etc/resolv.conf は NetworkManager や systemd-resolved が自動生成・上書きする。手編集しても再起動や接続変更で消えることがある。恒久設定は生成元(後述)で行う。

/etc/hosts と /etc/nsswitch.conf

/etc/hosts は IP とホスト名を静的に対応づけるファイル。/etc/nsswitch.confhosts: 行で、この静的定義と 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 を合わせた最終結果を返す。getentpasswd / 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.confnameserver127.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.conf127.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 つを挙げる。

  1. resolv.conf を手編集して消える: NetworkManager / systemd-resolved が再生成するため手編集は揮発する。生成元(resolved.conf や NetworkManager 接続設定)で変更する。
  2. nsswitch.conf の順序を誤解: hosts: dns files にすると DNS が優先され、/etc/hosts の固定が無視される。/etc/hosts を効かせたいなら files を先に置く。
  3. hosts と DNS の優先順位を取り違える: /etc/hosts に一致があれば(files が先なら)DNS は引かれない。DNS を引いていないつもりが hosts に古い行が残っているケース。
  4. systemd-resolved の stub を上流と混同: /etc/resolv.conf127.0.0.53 は stub であり実際の上流ではない。上流は resolvectl status で確認する。
  5. 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.confDNS= を編集し 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 の該当行を修正または削除する。getentdig の結果差が 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 の使い分けを押さえれば、名前解決の切り分けは確実に行える。

次に読む