はじめに

LPIC202 の主題 207「DNSサーバの基本的な設定」を演習していて、名前解決に関わる4つのファイル /etc/named.conf /etc/hosts /etc/nsswitch.conf /etc/resolv.conf が頭の中で混ざりやすいと感じた。特に 「DNSサーバを立てる設定」と「DNSサーバに問い合わせる設定」の取り違え でつまずく。

まず全体像 — 「立てる側」と「引く側」で分ける

4つのファイルは、役割で大きく2つに分かれる。

  • DNSサーバを立てる側(サーバ側)named.conf
  • 名前を引く側(クライアント側)nsswitch.conf + resolv.conf + hosts

覚え方

  • 立てる側(サーバ) = named.conf
  • 引く側(クライアント) = nsswitch.conf(DNSを使う・順序)+ resolv.conf(どのDNSへ)
  • DNSを使わない静的解決 = hosts

4ファイルの役割

ファイル守備範囲役割(ひとことで)主な設定・書式
/etc/named.confサーバ側DNSサーバ(BIND)本体の設定options { ... }; / zone "ex.com" { type master; file "..."; };。C言語ライク構文・key value;= は使わない・行末 ;
/etc/nsswitch.confクライアント側名前解決を 何で・どの順 で引くか(NSSの司令塔)hosts: files dns(DB名: ソースを優先順に列挙。files=hosts, dns=DNS)
/etc/resolv.confクライアント側問い合わせ先のDNSサーバを指定nameserver 8.8.8.8(最大3つ)/ search ex.com / domain
/etc/hostsクライアント側ホスト名とIPの 静的な対応表(手動)IPアドレス ホスト名 [別名...](例 127.0.0.1 localhost

言い換えのコツ(混同しないために)

最初、自分は nsswitch.conf を「DNSによる名前解決の手順」、resolv.conf を「DNSサーバの設定」と書いていた。どちらも “DNSっぽい説明” になってしまい区別が消えるので、次のように直した。

  • nsswitch.confDNS専用ではないfiles(hosts)と dnsどちらを・どの順で 使うかを決めるファイル(passwd/group など他の情報源も管轄)。
  • resolv.conf「立てる」ではなく「どこへ訊くか」の指定

DNSサーバの「設定」= named.conf / DNSサーバの「指定」= resolv.conf と、設定指定 を言い分けると安全。

実際の名前解決フロー(ping www.example.com の例)

1回の名前解決は「クライアント側3ファイル + 問い合わせ先サーバの1ファイル」がバトンリレーで働く。

ping www.example.com
  │ getaddrinfo() を呼ぶ

━━ クライアント側 ━━
1. /etc/nsswitch.conf
   └ "hosts: files dns" で引く順序を決定
2. /etc/hosts を検索 (files)
   └ 一致あり → IP即返却で終了(3・4へ進まない)
   └ 一致なし → 次へ
3. /etc/resolv.conf を読む (dns)
   └ nameserver 192.168.1.1 へ問い合わせ送信


━━ サーバ側 (問い合わせを受けたDNSサーバ) ━━
4. /etc/named.conf に従い named が応答生成
   └ 自分が権威  → zoneファイルで回答
   └ 権威でない → 上位(root→TLD→権威)へ

        ▼  回答(IP)
━━ クライアント側に戻る ━━
getaddrinfo が IP を返す → ping が通信開始
何が起きる働くファイル
1「何で・どの順で引くか」を決める(hosts: files dnsnsswitch.confクライアント
2まず静的表を検索。当たれば即終了hostsクライアント
3hostsで外れたら「どのDNSへ訊くか」を決め問い合わせ送信resolv.confクライアント
4問い合わせを 受けた側 で応答を組み立て返すnamed.confサーバ

つまずきポイント

  1. named.conf は自機のクライアント名前解決には登場しない。 働くのは 1〜3。4が動くのは 問い合わせを受けた向こうのサーバの中。自機がDNSサーバを兼ねない限り、自機の named.conf はこのフローに出てこない。=「設定する側(named.conf)」と「訊く側(resolv.conf)」はマシンからして別、というのが冒頭で触れた「立てる設定 ⇔ 問い合わせる設定」の取り違えの正体。
  2. hosts で当たると 3・4 を丸ごとスキップ。 resolv.conf もDNSも使われず終了する。「DNSが効かない/変な所に解決される」ときは、まず hosts に手書きの行が残っていないかを疑うとよい。
  3. 順序を握るのは nsswitch.conf hosts: dns files と逆順にすれば「先にDNS、無ければhosts」に変わる。1が2・3のどちらを先に呼ぶかの司令塔。
  4. resolv.conf は “宛先” だけで、応答の中身は作らない。 「192.168.1.1 に訊け」と言うだけ。実際にIPを答えるのはその先のサーバの named.conf(BIND)。指定(resolv.conf)と生成(named.conf)の分業。