名前解決の設定
「hosts が先」は既定値がそうなっているだけで、順番を決めているのは別のファイルです。そこを押さえていないと、この範囲は勘で答えることになります。
/etc/hosts は アドレス、FQDN、別名 の順
プレーンテキスト
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
192.168.10.20 web01.example.internal web011行1エントリで、2列目に FQDN、3列目以降に短い別名を書くのが慣習です。同じ名前を複数行に書くと、最初に一致した行が使われます。DNS サーバーを立てずに済むので小規模な検証環境では手軽ですが、機械ごとに配るため台数が増えると破綻します。
/etc/resolv.conf の nameserver は3つまで
| 指定 | 意味 |
|---|---|
nameserver <IP> | 問い合わせ先の DNS サーバー。1行に1つ、最大3つまで有効 |
search <ドメイン> ... | 短い名前に補完するドメイン。空白区切りで複数書ける |
domain <ドメイン> | 自ホストのドメイン。search を1つ書いたのとほぼ同じ |
options timeout:n | 応答待ちの秒数。attempts:n は再試行の回数 |
options ndots:n | ドットがこの数未満の名前に search を適用する。rotate は順番に使い分ける |
nameserver は上から順に試され、応答が無いときに次へ移ります。負荷分散ではなく冗長化のための順番で、4つめ以降を書いても無視されます。search と domain は両方書くと後に書いたほうが勝つので、通常は search だけを使います。search example.internal があれば、web01 と打つだけで web01.example.internal として問い合わせてくれます。
優先順位を決めているのは nsswitch.conf
プレーンテキスト
hosts: files dns/etc/nsswitch.conf は、どのデータベースをどの順番で見るかを決めるファイルです。名前解決に関わるのは hosts の行で、左から順に試されます。files が /etc/hosts、dns が /etc/resolv.conf に書かれた DNS サーバーです。
この並びを入れ替えて dns files と書けば DNS が先になります。つまり hosts が優先というのは既定値がそうなっているだけで、規則を決めているのはこのファイルです。ここが試験の狙いどころです。
getent hosts <名前> はこの規則に実際に従って引くので、切り分けに使えます。getent が答えを返すのに dig が返さないなら、それは /etc/hosts で解決されている証拠です。
dig と host は /etc/hosts を見ない
DNS サーバーへ直接問い合わせるコマンドは host と dig と nslookup の3つです。host は出力が最も短く、dig は詳しくて実務と試験の標準、nslookup は古く対話モードを持ちます。この学習環境には入っていないので書式だけ押さえます。
ターミナル
host www.example.com 192.168.10.1 # サーバーは末尾に空白区切りで指定
dig @192.168.10.1 www.example.com # サーバーは @ で指定
dig www.example.com MX # レコード種別を指定
dig +short www.example.com # 答えだけを短く表示
dig -x 192.168.10.20 # 逆引きサーバーの指定が dig は @、host は空白区切りという違いが、入れ替えの誤答として出ます。またこれらは /etc/nsswitch.conf を参照しないので、/etc/hosts に書いた名前は dig では引けません。この違いも頻出です。
systemd-resolved 環境では resolv.conf を手書きしても消える
最近のディストリビューションでは systemd-resolved が名前解決を仲介することがあります。このとき /etc/resolv.conf は /run/systemd/resolve/stub-resolv.conf へのシンボリックリンクで、中身は nameserver 127.0.0.53 の1行だけです。127.0.0.53 は systemd-resolved 自身が待ち受けるアドレスで、上流サーバーは別に管理されています。手で書き換えても再起動やネットワーク再接続で上書きされます。状態は resolvectl status、上流の変更は /etc/systemd/resolved.conf の DNS= です。