109.4 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
109 ネットワークの基礎 |
Objective: |
109.4 クライアント側DNSの構成 |
Lesson: |
1 of 1 |
はじめに
このレッスンでは、名前解決のクライアント側での構成と、CLI(コマンドラインインターフェイス)で名前解決を行うツールを取り上げます。
IPアドレス、UID、GIDなどの数値を覚えなければならないというのでは不便です。名前解決のサービスは、覚えやすい名前を数値に、あるいは逆に数値を名前に、変換します。このレッスンではホスト名に焦点を当てますが、ユーザー名、グループ名、ポート番号などでも似たような仕組みで名前解決を行います。
名前解決の仕組み
名前解決プログラムは、たいてい、標準Cライブラリ(LinuxシステムではGNUプロジェクトのglibc)に含まれている関数を利用しています。その関数は、まず、/etc/nsswitch.conf
ファイルを読み取り、名前解決をどのような方法で行うかを決めます。このレッスンではホストの名前解決に焦点を当てますが、ほかの名前解決でも同様で、/etc/nsswitch.conf
を読み取って、そこに指定されている方法で名前解決を行います。/etc/nsswitch.conf
はプラグインをサポートしていますから、次にどういう動作をするかはさまざまです。関数が名前解決を終えると、その結果(名前または数値)を返します。
DNSクラス
DNSクラスには、IN、HS、CHの3種類あります。このレッスンでは、INのDNSクエリだけを扱います。INはTCP/IPスタックを使うインターネットアドレスです。CHはChaosNetで、今はもう使われていないネットワークテクノロジーです。HSはHesiodで、/etc/passwdや/etc/groupの情報をDNSで提供します(訳注:IN以外は古く、見かけることもまずありません)。
/etc/nsswitch.conf
ファイル
このファイルについて理解するには、マニュアルページを読むのが早道です。たいていのシステムでは man nsswitch.conf
コマンドを実行すれば読めますし、そのコマンドで読めなければ https://man7.org/linux/man-pages/man5/nsswitch.conf.5.html でも読めます。
以下はマニュアルページから抜粋した、/etc/nsswitch.conf
の例です。
passwd: compat group: compat shadow: compat hosts: dns [!UNAVAIL=return] files networks: nis [NOTFOUND=return] files ethers: nis [NOTFOUND=return] files protocols: nis [NOTFOUND=return] files rpc: nis [NOTFOUND=return] files services: nis [NOTFOUND=return] files # This is a comment. It is ignored by the resolution functions.
このファイルは列形式になっています。左端の列は名前データベースの種類です。残りの列は名前解決の方法を示します。名前解決の方法は左から順番に読んでいきます。[]
内は、その直前の方法([]
の左隣に記載されている方法)に適用される条件ロジックです。
learning.lpi.org
というホストの名前解決を例に取って説明します。しかるべきCライブラリ(おそらくは gethostbyname
)を呼び出すと、まず /etc/nsswitch.conf
を読み取ります。ホストの名前解決ですから、hosts
で始まる行を探します。その行には dns
と書かれていますので、名前解決にDNSを使用します。次の列には [!UNAVAIL=return]
と書かれているため、DNSが利用不可(unavailable)でなければ、そこで終了し、次のソース(方法)を試みることはしません。言い換えると、DNSが利用可能であれば、名前解決ができなかったとしても、そこで打ち止めだということです。DNSが利用不可であれば、次のソース、上記の記載例では files
に移ります。
[result=action]
という形式の列は、その直前の方法([]
の左隣に記載されている方法)が result
であれば、action
を実行するという意味になります。result
の前に !
がついていると、result
でなければ action
を実行するという、反対の意味になります。result
と action
に何を記載できるかはマニュアルページに書かれています。
次はポート番号の名前解決を行う例を考えてみましょう。services
の行を読みます。最初のソースはNIS(Network Information Service)です。これはイエローページ(yellow pages)とも呼ばれる、ユーザーなどを中央コンピュータが一元管理する古いサービスです。セキュリティの脆弱性があるため現在では使われることがめったにありません。その次の列は [NOTFOUND=return]
ですから、名前解決に成功したけれどもそのポート番号に対応するサービス名が見つからなかった場合はそこで名前解決を終えることになります。[]
内の条件が満たされない場合(NISによる名前解決ができなかった場合など)は、ローカルファイル(files
)による名前解決に移ります。
#
の右側に書かれた部分はコメントで、名前解決には使用されません。
/etc/resolv.conf
ファイル
/etc/resolv.conf
ファイルでは、DNSによるホストの名前解決方法を構成します。ディストリビューションによっては、起動スクリプトやデーモン、その他のツールが、このファイルを自動的に生成することがあります。手動でこのファイルを編集する際には、そのことに注意して、必要に応じてお使いのディストリビューションとネットワーク構成ツールのドキュメントを確認してください。NetworkManagerなどのツールで自動的に生成された /etc/resolv.conf
ファイルには、手動による変更は上書きされる旨のコメントが記載されています。
/etc/nsswitch.conf
と同様に、/etc/resolv.conf
ファイルにもマニュアルページが存在します。man resolv.conf
を実行するか、 https://man7.org/linux/man-pages/man5/resolv.conf.5.html を参照してください。
このファイルも列形式になっていて、左端の列がオプション名、残りの列がそのオプションの値です。
最も重要なオプションは nameserver
です。DNSサーバーのIPアドレス(IPv4、IPv6)を指定します。現時点では、nameserver
を最大3つまで指定できます。/etc/resolv.conf
に nameserver
オプションが存在しなければ、デフォルトでローカルマシンのネームサーバーを使用します。
以下は一般的な構成例です。
search lpi.org nameserver 10.0.0.53 nameserver fd00:ffff::2:53
search
オプションを指定すると、デフォルトのドメイン名を省略して名前解決を行えます。上の例では、lpi.org
というドメインが指定されていますから、ドメイン部のないホスト名の名前解決を行う時に、.lpi.org
が付加されます。例えば、learning
というホスト名の名前解決を行うと、レゾルバが learning.lpi.org
を検索します。search
オプションでは、最大6つまでドメインを指定できます。
search
とほぼ同じ働きの domain
という古いオプションもあり、今でもたまに見かけることがあります。使用は推奨されていませんので、自分で設定する場合には search
を使用しましょう。
レゾルバ(クライアント側で名前解決を行うためのライブラリ)の動作を変更するオプションがいくつかあります。options
キーワードに続けて項目名を書き、項目によってはさらに :
に続けて値を書きます。以下の例では、タイムアウト(timeout)という、ネームサーバーの応答を待つ秒数を設定する項目に、3という値を設定しています。
options timeout:3
resolv.conf
にはまだほかにもオプションがありますが、ここで紹介したものを知っておけば足りるでしょう。
/etc/hosts
ファイル
/etc/hosts
ファイルは、ホスト名からIPアドレス、あるいは逆にIPアドレスからホスト名への対応を調べるために使います。IPv4とIPv6の両方を設定できます。左端の列がIPアドレスで、残りの列はそのIPアドレスに対応する名前(ホスト名)です。一般的には、localhost
とループバックアドレスなど、DNSによる名前解決ができない、あるいはふさわしくないホスト名とIPアドレスを対応づけるために /etc/hosts
を利用します。以下の実例では、そのようなIPアドレスから重要なものをいくつか定義しています。
127.0.0.1 localhost 127.0.1.1 proxy ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters 10.0.0.1 gateway.lpi.org gateway gw fd00:ffff::1 gateway.lpi.org gateway gw 10.0.1.53 dns1.lpi.org fd00:ffff::1:53 dns1.lpi.org 10.0.2.53 dns2.lpi.org fd00:ffff::2:53 dns2.lpi.org
systemd-resolved
systemdには systemd-resolved
というサービスがあります。通常のDNSクライアントの機能に加えて、mDNSやLLMNRなどの補助的なプロトコルもサポートしています。systemd-resolved
が起動すると、127.0.0.53
でDNSリクエストを待ち受けます。そこで完結するのではなく、/etc/systemd/resolv.conf
や /etc/resolv.conf
で構成されたサーバーに問い合わせます。/etc/nsswitch.conf
の hosts
行に resolve
と書けば、systemd-resolved
を使用できます。ディストリビューションによっては、デフォルトで systemd-resolved
パッケージが入っていないことがあります。
名前解決ツール
Linuxユーザーが利用できる名前解決ツールはたくさんあります。このレッスンでは、3つのツールを取り上げます。getent
では、実際のリクエストがどのように名前解決を行うかを確認できます。host
はシンプルなDNSクエリを実行するのに便利です。dig
を使えば複雑なDNSの操作を行えるので、DNSサーバーのトラブルシューティングに役立ちます。
getent
コマンド
getent
は、名前データベースから取得したエントリを表示するユーティリティです。/etc/nsswitch.conf
で構成できるすべての名前解決に対応しています。
getent
に続けて名前解決を行うデータベースの種類と、任意の個数の調べるエントリを指定して実行します。調べるエントリを指定せずに実行すると、その種類のエントリを表示できるだけすべて表示します。
$ getent hosts 127.0.0.1 localhost 127.0.1.1 proxy 10.0.1.53 dns1.lpi.org 10.0.2.53 dns2.lpi.org 127.0.0.1 localhost ip6-localhost ip6-loopback $ getent hosts dns1.lpi.org fd00:ffff::1:53 dns1.lpi.org
glibcのバージョン2.2.5(2006年リリース)から、-s
オプションでデータソースを指定できるようになりました。以下に例を示します。
$ getent -s files hosts learning.lpi.org ::1 learning.lpi.org $ getent -s dns hosts learning.lpi.org 208.94.166.198 learning.lpi.org
host
コマンド
host
はDNSエントリを調べるシンプルなプログラムです。オプションなしで実行すると、名前が与えられた場合はAレコードとAAAAレコードとMXレコードを、IPアドレス(IPv4、IPv6)が与えられた場合はPTRレコードを表示します。
$ host wikipedia.org wikipedia.org has address 208.80.154.224 wikipedia.org has IPv6 address 2620:0:861:ed1a::1 wikipedia.org mail is handled by 10 mx1001.wikimedia.org. wikipedia.org mail is handled by 50 mx2001.wikimedia.org. $ host 208.80.154.224 224.154.80.208.in-addr.arpa domain name pointer text-lb.eqiad.wikimedia.org.
-t
オプションに続けてDNSのリソースレコードの種類を指定できます。
$ host -t NS lpi.org lpi.org name server dns1.easydns.com. lpi.org name server dns3.easydns.ca. lpi.org name server dns2.easydns.net. $ host -t SOA lpi.org lpi.org has SOA record dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300
/etc/resolv.conf
に指定されていないネームサーバーに宛てて問い合わせることもできます。使用するネームサーバーのIPアドレスないし名前を、host
コマンドの最後の引数に指定します。
$ host -t MX lpi.org dns1.easydns.com Using domain server: Name: dns1.easydns.com Address: 64.68.192.10#53 Aliases: lpi.org mail is handled by 10 aspmx4.googlemail.com. lpi.org mail is handled by 10 aspmx2.googlemail.com. lpi.org mail is handled by 5 alt1.aspmx.l.google.com. lpi.org mail is handled by 0 aspmx.l.google.com. lpi.org mail is handled by 10 aspmx5.googlemail.com. lpi.org mail is handled by 10 aspmx3.googlemail.com. lpi.org mail is handled by 5 alt2.aspmx.l.google.com.
dig
コマンド
dig
もDNSサーバーに問い合わせるツールですが、host
よりもはるかに冗長な結果を出力します。dig
はデフォルトでAレコードを問い合わせます。IPアドレスないしホスト名を調べるだけでしたら、dig
の出力はあまりにも冗長でしょう。DNSサーバー構成のトラブルシューティングにより適しています。
$ dig learning.lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> learning.lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63004 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: ca7a415be1cec45592b082665ef87f3483b81ddd61063c30 (good) ;; QUESTION SECTION: ;learning.lpi.org. IN A ;; ANSWER SECTION: learning.lpi.org. 600 IN A 208.94.166.198 ;; AUTHORITY SECTION: lpi.org. 86400 IN NS dns2.easydns.net. lpi.org. 86400 IN NS dns1.easydns.com. lpi.org. 86400 IN NS dns3.easydns.ca. ;; ADDITIONAL SECTION: dns1.easydns.com. 172682 IN A 64.68.192.10 dns2.easydns.net. 170226 IN A 198.41.222.254 dns1.easydns.com. 172682 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 170226 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 135 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Sun Jun 28 07:29:56 EDT 2020 ;; MSG SIZE rcvd: 266
ご覧のとおり、dig
は大量の情報を表示します。出力はセクションに分かれています。最初のセクションでは、インストールされている dig
のバージョン、送信されたクエリ、コマンド実行時に使われたオプション、クエリと応答の情報が示されます。
次のセクションでは、用いられたDNS拡張メカニズム(EDNS)とクエリの情報が示されます。上の例では、DNSクッキーが用いられたこと、learning.lpi.org
のAレコードを問い合わせたことが示されています。
その次のセクションは問い合わせ結果です。2列目の数字は、そのリソースレコードのTTL(単位は秒)です。
出力の残りの部分は、そのドメインのネームサーバーについての情報です。NSレコードと、NSレコード内のサーバーのAレコードおよびAAAAレコードです。
host
と同様に、-t
オプションに続けてリソースレコードの種類を指定できます。
$ dig -t SOA lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> -t SOA lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16695 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: 185c67140a63baf46c4493215ef8906f7bfbe15bdca3b01a (good) ;; QUESTION SECTION: ;lpi.org. IN SOA ;; ANSWER SECTION: lpi.org. 600 IN SOA dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300 ;; AUTHORITY SECTION: lpi.org. 81989 IN NS dns1.easydns.com. lpi.org. 81989 IN NS dns2.easydns.net. lpi.org. 81989 IN NS dns3.easydns.ca. ;; ADDITIONAL SECTION: dns1.easydns.com. 168271 IN A 64.68.192.10 dns2.easydns.net. 165815 IN A 198.41.222.254 dns3.easydns.ca. 107 IN A 64.68.196.10 dns1.easydns.com. 168271 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 165815 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 94 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Sun Jun 28 08:43:27 EDT 2020 ;; MSG SIZE rcvd: 298
digには、サーバーへのクエリと応答の出力を調整するたくさんのオプションがあります。+
記号で始まるオプションです。short
オプションを指定すると、結果だけを出力します。
$ dig +short lpi.org 65.39.134.165 $ dig +short -t SOA lpi.org dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300
nocookie
オプションを指定すると、DNSクッキーを使いません。
$ dig +nocookie -t MX lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> +nocookie -t MX lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47774 ;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 3, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;lpi.org. IN MX ;; ANSWER SECTION: lpi.org. 468 IN MX 0 aspmx.l.google.com. lpi.org. 468 IN MX 10 aspmx4.googlemail.com. lpi.org. 468 IN MX 10 aspmx5.googlemail.com. lpi.org. 468 IN MX 10 aspmx2.googlemail.com. lpi.org. 468 IN MX 10 aspmx3.googlemail.com. lpi.org. 468 IN MX 5 alt2.aspmx.l.google.com. lpi.org. 468 IN MX 5 alt1.aspmx.l.google.com. ;; AUTHORITY SECTION: lpi.org. 77130 IN NS dns2.easydns.net. lpi.org. 77130 IN NS dns3.easydns.ca. lpi.org. 77130 IN NS dns1.easydns.com. ;; ADDITIONAL SECTION: dns1.easydns.com. 76140 IN A 64.68.192.10 dns2.easydns.net. 73684 IN A 198.41.222.254 dns1.easydns.com. 76140 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 73684 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 2 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Mon Jun 29 10:18:58 EDT 2020 ;; MSG SIZE rcvd: 389
演習
-
次のコマンドが何を行うかを説明してください。
$ getent group openldap
-
getent
、host
、dig
の間の、一番大きな違いは何ですか? -
dig
ないしhost
で、取得するリソースレコードの種類を指定するオプションは何ですか? -
/etc/hosts
の記載として正しいのは、次のうちどちらでしょう?::1 localhost
localhost 127.0.0.1
-
getent
で調べるデータソースを指定するオプションは何ですか?
発展演習
-
以下の
/etc/resolv.conf
ファイルを手動で編集したとしたら、どうなるでしょうか?# Generated by NetworkManager nameserver 192.168.1.20
手動で加えた変更がNetworkManagerによって上書きされます。
手動で加えた変更に応じてNetworkManagerが構成を更新します。
手動で変更を加えてもシステムの動作には影響しません。
NetworkManagerが無効になります。
-
/etc/nsswitch.conf
ファイル内の次の行はどういう意味ですか?hosts: files [SUCCESS=continue] dns
-
次の
/etc/resolv.conf
ファイルでは、DNSによる名前解決ができませんでした。なぜでしょうか?search lpi.org #nameserver fd00:ffff::1:53 #nameserver 10.0.1.53
-
dig +noall +answer +question lpi.org
コマンドを実行すると、どうなりますか? -
dig
のデフォルトの動作を変えて、実行時にコマンドラインでオプションを指定せずにすむようにするには、どうすればよいですか?
まとめ
getent
は、レゾルバの要求結果を確認するツールです。host
は、シンプルなDNSクエリを行い、使いやすく出力がわかりやすいです。dig
は、DNSクエリの詳細な情報や調整が必要な場合に最適です。
Linuxでは、共有ライブラリプラグインを追加してレゾルバの動作を構成できるので、さまざまな種類の名前解決を行えます。getent
はレゾルバライブラリを使用して名前解決を行うのに対し、host
と dig
はDNSサーバーに問い合わせます。
/etc/nsswitch.conf
ファイルでレゾルバの動作を構成します。データソースを変更でき、複数のソースについてちょっとした条件ロジックを記述できます。
/etc/resolv.conf
ファイルでDNSを構成します。何らかのツールがこのファイルを管理しているディストリビューションが多いですから、手動での変更が上書きされてしまう場合にはシステムのドキュメントを読んでください。
/etc/hosts
ファイルではホスト名とIPアドレスを対応づけます。localhost
など、DNSでは名前解決できないホスト名を定義するのが典型的な利用法です。
このレッスンで取り上げた構成ファイルでは、#
の右側に書かれた部分はコメントとして無視されます。
演習の解答
-
次のコマンドが何を行うかを説明してください。
$ getent group openldap
/etc/nsswitch.conf
ファイルを読み取り、group
で始まる行に記載されたソースからopenldap
グループを調べ、見つかればその結果を表示します。 -
getent
、host
、dig
の間の、一番大きな違いは何ですか?getent
はレゾルバライブラリを用いて名前解決を行うのに対し、host
とdig
はDNSクエリにより名前解決を行うという点が、一番大きな違いです。getent
を使うと、/etc/nsswitch.conf
ファイルに記載された名前解決ライブラリの構成をトラブルシューティングできます。host
とdig
は、DNSレコードを調べます(dig
のほうがhost
よりも冗長な結果を出力します)。 -
dig
ないしhost
で、取得するリソースレコードの種類を指定するオプションは何ですか?-t
オプションです。 -
/etc/hosts
の記載として正しいのは、次のうちどちらでしょう?::1 localhost
○
localhost 127.0.0.1
::1 localhost
が正しいです。左端の列は常にIPアドレス(IPv4、IPv6)です。 -
getent
で調べるデータソースを指定するオプションは何ですか?-s
オプションです。例えば次のように実行します。$ getent -s files hosts learning.lpi.org 192.168.10.25 learning.lpi.org $ getent -s dns hosts learning.lpi.org 208.94.166.198 learning.lpi.org
発展演習の解答
-
以下の
/etc/resolv.conf
ファイルを手動で編集したとしたら、どうなるでしょうか?# Generated by NetworkManager nameserver 192.168.1.20
手動で加えた変更がNetworkManagerによって上書きされます。
○
手動で加えた変更に応じてNetworkManagerが構成を更新します。
手動で変更を加えてもシステムの動作には影響しません。
NetworkManagerが無効になります。
-
/etc/nsswitch.conf
ファイル内の次の行はどういう意味ですか?hosts: files [SUCCESS=continue] dns
ホストの名前解決では
/etc/hosts
ファイルを最初に調べ、次にDNSを調べます。/etc/hosts
ファイルとDNSの両方で名前解決ができる場合には、DNSでの名前解決が採用されます。 -
次の
/etc/resolv.conf
ファイルでは、DNSによる名前解決ができませんでした。なぜでしょうか?search lpi.org #nameserver fd00:ffff::1:53 #nameserver 10.0.1.53
DNSサーバーを記述した行が2行ともコメントアウトされていて、ローカルホストでネームサーバーが起動していないからです。
-
dig +noall +answer +question lpi.org
コマンドを実行すると、どうなりますか?lpi.org
のAレコードを調べ、クエリと応答のみを表示します。 -
dig
のデフォルトの動作を変えて、実行時にコマンドラインでオプションを指定せずにすむようにするには、どうすればよいですか?ホームディレクトリに
.digrc
ファイルを作成します。