13.7 Linuxシステムにおける名前解決
Linux Essentials Online Text | 2021/08/03

ここまで学習してきた内容でもわかるように、ネットワークはIPアドレスを用いて通信しています。ネットワークに接続されているすべてのコンピュータは固有のIPアドレスを持ち、TCP/IPの通信を実現している、ということです。そしてこれは、インターネット上における通信でも同様です。

インターネットをするときに、IPアドレスをあまり意識したことはないかもしれません。しかし、インターネットの世界でも、ちゃんとIPアドレスを使って通信を行っているのです。

例えば、ウェブブラウザを使ってLPIのホームページを表示させるには、https://www.lpi.org/という文字列をアドレス欄に入力することになります。この場合、「www.lpi.org」が「LPIのホームページ」を示すユニークな文字列となるわけですが、それぞれ「www」はWebサービスを表し、「org」は「非営利団体」を示す文字列です。つまり、「非営利団体LPIのWebサービス」を「www.lpi.org」に置き換えて表しています。

しかし、コンピュータはこのアルファベットの文字列の意味を理解する事ができません。コンピュータが他のネットワーク機器と通信を行うにはIPアドレスが必要なのです。そこで、コンピュータはこの文字列(URL/URI)をIPアドレスに変換してくれるサーバに問い合わせを行います。問い合わせを受けたサーバは「www.lpi.org」に設定されているIPアドレス “65.39.134.165” を検索し、問い合わせてきたコンピュータにIPアドレスを渡します。
これにより、コンピュータは「https://www.lpi.org/(65.39.134.165)」にアクセスができるようになる、ということです。

このように、コンピュータは人間が入力したURLやURI、コンピュータ名をIPアドレスに変換してアクセスを行います。この時、 URLやURI、コンピュータ名から、IPアドレスを調べる機能のことをDNS(Domain Name System:ドメイン・ネーム・システム)と言います。そして、この仕組みを提供するサーバをDNSサーバと言います。

例えるなら、DNSサーバは氏名(URLやURI)から電話番号(IPアドレス)を自動で調べる電話帳のようなものです。

ホスト名(URLやURI、コンピュータ名等)から、そのホストにアクセスするためのIPアドレスを得ることを、「名前(ホスト名の)解決(resolve)する」と言い、これを行うためのクライアント側のしくみを「リゾルバ」と言います。

FQDN

FQDNとは、いわゆるサイトアドレスとか、URLと呼ばれるものです。
「ホスト名」と「ドメイン名」を組み合わせたもののことを指します。

yahoo.co.jpや、google.co.jpのように、サイトや企業、組織の名前が入る部分と、coのような、組織の種別を表すセカンドレベルドメイン、jpのような国を表すトップレベルドメインの部分を合わせた部分をドメイン、またはドメイン名といいます。

これに、wwwのようなホスト名を付けたものを完全装飾ドメイン、FQDNと言います。
一般的な企業のドメインの使い方としては、wwwというホスト名を付けてWebサーバを公開し、mailというホスト名を付けてメールサーバを、ドメインを管理するなら、nsというホスト名を付けてDNSサーバを構築します。
ホスト名の部分は自由に設定することができますが、ホスト名から提供しているサービスを想像できる状態にするのが一般的です。

hostsとresolve

コンピュータ上で名前の機能を使うには2つの方法があります。1つは前述したとおりDNSサーバで名前を解決する方法、もう1つはコンピュータ自身に名前とIPアドレスを結びつけるリストを保管する方法です。

どちらも、名前とIPアドレスを結びつけるためのリストを参照する、という形に変わりはありません。

/etc/resolv.confファイル

DNSサーバを利用したい場合は、/etc/resolv.confファイルにDNSサーバのIPアドレスを記載します。

DNSは、主にインターネット上のFQDNを名前解決するために使用しますが、企業などのネットワークでは、企業内で専用のドメインを設定してネットワークリソースを共有していることが多くあり、内部的な名前解決も社内DNSサーバで兼ねている場合があります。

/etc/resolv.confの書式は以下のとおりです。

書式:

nameserver   ネームサーバのIPアドレス
domain         ドメイン名
search           検索リスト  

実際に、設定されている内容を見てみましょう。

# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.0.1

/etc/resolv.conf には、 「nameserver」 「domain」「search」の3つのパラメータが使用できます。 「nameserver」は必須ですが、 「domain」「search」 は設定しなくても名前解決はできます。

「nameserver」はIPアドレスと共に記載しますが、これがこのコンピュータが参照するDNSサーバのIPアドレスです。DNSサーバは3つまで指定でき、コンピュータは上から順番に問い合わせを行い、未返答な場合は順番に次のサーバへ問い合わせをします。

「domain」は、ドメイン名と共に記載します。このパラメータが指定されている場合は、ホスト名のみを指定して通信しようとしたとき、設定したドメイン名を補完してFQDNに直して通信します。
つまり、「hogehoge」にアクセスしようとすると、lpi.orgを自動的に補完して「hogehoge.lpi.org」へアクセスします。見つからなければ「hogehoge」のみで名前解決します。

「search」は、「domain」の複数指定版です。指定した順番にドメインを補完してアクセスします。「domain」と「search」 どちらも設定されている場合は、先に「domain」で指定されているもので確認し、その後「search」に記載されている順番に補完して確認します。

domainやsearchは、設定が原因で名前解決が遅れて通信が遅延する場合があるので注意が必要です。また、必ずしも設定する必要はありません。

/etc/hostsファイル

/etc/hostsファイルは、コンピュータの中に格納されている名前とIPアドレスを結びつけるリストです。なお、このファイルはWindowsにも存在します。

試しに中身を確認してみましょう。

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

まずIPアドレスを記載し、スペースやタブで間を空けてから、ホスト名やドメイン名、FQDNを指定します。1対1である必要はなく、 ホスト名やドメイン名、FQDN は複数指定できます。

通常、名前解決にはDNSサーバを使うため、このファイルに様々なホストを設定することはありません。大抵の場合、上記のように「localhost」を呼び出すと自身が応答できるように設定されています。
※「127.0.0.1」や「::1」はループバックアドレスと言い、自分自身を表すための特殊なIPアドレスです。

では、試しに「centos7」を追加してみましょう。以下の通り実行してみてください。
「10.0.2.15」は、現在のこのシステムに割り当てられたIPアドレスです。

# echo '10.0.2.15 centos7’ >> /etc/hosts
# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.2.15 centos7

1行目のコマンドは、追記リダイレクトを利用した方法です。echoコマンドで画面に出力させるはずの文字列を、指定したファイルに追記リダイレクトします。
viを使わずに、ファイルの末尾に追記することができます。比較的よくつかわれる手法ですので覚えておくとよいでしょう。

追記が終わったら「centos7」を宛先としてpingを実行してみます。

# ping centos7
PING centos7 (10.0.2.15) 56(84) bytes of data.
64 bytes from centos7 (10.0.2.15): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from centos7 (10.0.2.15): icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from centos7 (10.0.2.15): icmp_seq=3 ttl=64 time=0.049 ms
(以下省略)

「centos7」はIPアドレスでもFQDNでもありませんが、Pingが通るようになりました。これは、/etc/hostsに追記したことで、コンピュータが「centos7=10.0.2.15」であると認識したためです。

このように/etc/hostsを用いると、ドメイン名の形をしていない名前でも名前解決ができ、また、DNSサーバにアクセスができなくても通信が可能であるというメリットを持ちます。

「DNSサーバを構築できないけど名前で通信したい」という場合には、/etc/hostsを代替として使用することは可能ですが、機器が追加やIPアドレス変更など、ネットワークの構成変更の都度、このファイルを自分で変更しなければならないというデメリットを生じます。また、自端末だけでなく、ネットワーク内全てのコンピュータで変更対応を実施しなければならないため、大規模なネットワークで使用するには不向きな仕組みと言えます。

/etc/nsswitch.confファイル

/etc/nsswitch.confファイルは、上記で紹介した2つの名前解決の方法のうち、どちらを優先させるかを決める設定値が記載されたファイルです。(その他の設定値が含まれています。)

実際に見てみましょう。

$ cat /etc/nsswitch.conf | grep hosts
#hosts:     db files ldap nis dns
hosts:      files dns

hosts:の項目にスペースで区切って1行で記載します。記載されている順に左から優先して名前解決をします。「files」は「/etc/hosts」の事を指し、「dns」は「/etc/resolv.conf」を指します。つまり、この場合は最初に/etc/hostsの中身を確認して名前解決を試みて、それでも解決ができない場合にはDNSサーバに問い合わせる、という動作となります。

順番を逆にして、「hosts: dns files」とすると、先にDNSサーバを参照し、DNSサーバで解決できない場合は/etc/hostsファイルを参照する、という動作になります。

名前 (FQDN)と正引き、逆引き

インターネット上で利用される「www.lpi.org」のようなFQDNからIPアドレスを確認する行為を「正引き」、逆にIPアドレスから名前を確認する行為を「逆引き」と呼びます。逆引きした場合、一般に「ホスト名はIPアドレスを逆にしたもの+.in-addr.arpa」として、名前解決が行われます。ただし、IPアドレスとFQDNは必ずしも一対一ではありません。また、正引きの結果と逆引きの結果は必ずしも一致しませんので気をつけて下さい。

nslookupコマンド

IPアドレスと名前の対応はいくつかのコマンドで調べることができます。

書式:

nslookup ターゲット [DNSサーバアドレス]

ターゲットの入力がホスト名の場合は正引き、IPアドレスの場合は逆引きの処理を行います。DNSサーバアドレスを指定すると、指定したDNSサーバを使って解決します。何も入力しない場合は、実行したコンピュータ自身に指定されたルールに基づいて名前解決します。

実習:nslookupを使った正引きと逆引き

# nslookup kernel.org
Server:		192.168.0.1
Address:	192.168.0.1#53

Non-authoritative answer:
Name:   kernel.org
Address: 198.145.29.83

上記は正引きした結果です。「kernel.org」は「198.145.29.83」であることがわかります。
次に逆引きをしてみます。上記で表示された「198.145.29.83」を逆引きして、ホスト名を確認します。

# nslookup 198.145.29.83
83.29.145.198.in-addr.arpa      name = kernel.org.

Authoritative answers can be found from:

「198.145.29.83」は「83.29.145.198.in-addr.arpa」として解決が行われたことがわかります。

hostコマンド

hostというコマンドでも同様に正引き、逆引きを確認することができます。

書式:

host [オプション] ターゲット [DNSサーバアドレス]

実習:hostを使った正引きと逆引き

# host kernel.org
kernel.org has address 198.145.29.83
kernel.org mail is handled by 10 mail.kernel.org.

上記は正引きした結果です。nslookupコマンドと同様に「198.145.29.83」に名前解決ができることがわかりました。2行目は、Priorityが10で設定されたMXレコードがあり、「mail.kernel.org」であることがわかります。

次に、逆引きをしてみます。

# host 198.145.29.99
99.29.145.198.in-addr.arpa domain name pointer mail.kernel.org.

「83.29.145.198.in-addr.arpa」として解決が行われたことがわかります。

DNSレコード

DNSサーバに問い合わせを行うと、それに対応した結果を得ることができます。これは、DNSサーバが保持している「対応表」の内容に基づいて返答するためです。「対応表」にはホスト名とそれに対応するIPアドレスや別ホスト名が書かれており、この一つ一つの情報を「レコード」と言います。レコードは多くの場合、ドメイン単位で書かれており、この単位のことをゾーンと呼びます。

例えば、kernel.orgというドメインを持っている管理者がWebサーバやメールサーバを公開する時、それに対応したFQDNを作成します。具体的に、Webサーバは「www.kernel.org」、メールサーバは「mail.kernel.org」と言った FQDN を作成してそれぞれにIPアドレスを割り当てます。

この場合、kernel.orgというゾーンを作成し、その中に「www.kernel.org」や「mail.kernel.org」をIPアドレスと組み合わせて「レコード」として登録していきます。

DNSサーバに設定されるゾーンファイルは以下のようになっています。

@	IN	SOA	kernel.org. root.kernel.org.  (
                  2000091801      ; Serial
                        3600      ; Refresh
                         900      ; Retry
                     3600000      ; Expire
                        3600 )    ; Minimum
        IN  NS    ns.kernel.org.
mail    IN  MX    0 kernel.org.
mail    IN  A     210.191.124.93
web     IN  A     210.191.124.94
www     IN  CNAME web.kernel.org.
v6web   IN  AAAA  2001:240:301:0:250:8bff:fe68:7546

各レコードの特性は、以下のとおりです。

行数レコード名説明
1-6SOAレコードゾーン独自の設定(管理者のメールアドレスや更新間隔や再問い合わせ等の時間)を行います。これらの設定はシリアルで管理されています。
7NSレコードこのゾーン情報を管理するDNSサーバを定義するレコード。
「kernel.org」ドメインが「ns.kernel.org」で管理されている事を示します。
8MXレコードメール配送先のホスト名を定義するレコード。
メールアドレスの@以降の部分のことで、左側に記載されたサブドメインを付与したものが使用されます。
つまり lpic-user@mail.kernel.org となります。
9-10AレコードIPアドレス(IPv4アドレス)の対応を指定するレコード。
名前解決要求を受けたときに返す、実際のIPアドレスです。
「mail.kernel.org」を解決し「210.191.124.93」を返します。
「web.kernel.org」を解決し「210.191.124.94」を返します。
11CNAMEレコード名前解決要求を受けたときに返す「別名」が定義されたレコード。
「別名」は最終的にAレコードで定義されます。
「www.kernel.org」を解決し「web.kernel.org」を返します。
12AAAAレコードAレコードのIPv6版です。IPv6は128bitですから、IPv4(32bit)が4つ合わさったレコード、という意味でつけられています。
PTRレコード上記には含まれていませんが、逆引き用のレコードを登録する場合はPTRレコードとして登録します。ただし、逆引きは専用のゾーンファイルを作成します。
正引きのゾーンファイルの中に記載することはありません。

ちなみに、PTRレコードは逆引き用のレコードです。正引き用のゾーンファイルに記載することはできません。
逆引き専用のゾーンファイルを作成し、その中に記載します。

$ TTL 3600;
$ ORIGIN 124.191.210.in-addr.arpa.
@	IN	SOA	kernel.org. root.kernel.org.  (
                  2000091801      ; Serial
                        3600      ; Refresh
                         900      ; Retry
                     3600000      ; Expire
                        3600 )    ; Minimum
        IN  NS   ns.kernel.org.
92      IN  PTR  ns.kernel.org.
93      IN  PTR  mail.kernel.org.
94      IN  PTR  www.kernel.org. 
PAGE TOP