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