DNSの観測
- 前提の確認
手元の仮想マシンにはDNSサーバがインストールされておりwww.sample.localを172.16.0.100に名前解決する設定になっています。
127.0.0.1のポート53番に送信したDNSリクエストがNATのポートフォワードによって仮想マシンに転送されます。

仮想マシンを利用するためにWindowsのTCP/IPv4のプロパティを変更します。 この設定によりWindowsから仮想マシン上のDNSを参照できるようになります。 但しインターネット接続が出来なくなるため最後に設定を元に戻すことを忘れないでください。


- DNSリクエスト・レスポンスの確認
DDNSリクエストを発行するためにWindowsコマンドプロンプトからnslookupを使いwww.sample.localのIPアドレスを問い合わせます。
> nslookup www.sample.local
サーバー:  localhost
Address:  127.0.0.1
名前:    www.sample.local
Address:  172.16.0.100
この時のパケットから抜粋したDNSメッセージ(リクエストとレスポンス)を以下に示します。
主に確認すべき項目はQueries(IPアドレスを問い合わせたいホスト名)とAnswers(IPアドレス)です。
www.sample.localを問い合わせた結果172.16.0.100が返されていることが読み取れます。
Domain Name System (query)
    Transaction ID: 0x0002
    Flags: 0x0100 Standard query
    Questions: 1
    Answer RRs: 0
    Authority RRs: 0
    Additional RRs: 0
    Queries
        www.sample.local: type A, class IN
            Name: www.sample.local
            [Name Length: 16]
            [Label Count: 3]
            Type: A (Host Address) (1)
            Class: IN (0x0001)
Domain Name System (response)
    Transaction ID: 0x0002
    Flags: 0x8580 Standard query response, No error
    Questions: 1
    Answer RRs: 1
    Authority RRs: 1
    Additional RRs: 1
    Queries
        www.sample.local: type A, class IN
            Name: www.sample.local
            [Name Length: 16]
            [Label Count: 3]
            Type: A (Host Address) (1)
            Class: IN (0x0001)
    Answers
        www.sample.local: type A, class IN, addr 172.16.0.100
            Name: www.sample.local
            Type: A (Host Address) (1)
            Class: IN (0x0001)
            Time to live: 86400
            Data length: 4
            Address: 172.16.0.100
前置き
インターネット上のサーバの位置を識別する為にwww.yahoo.comやwww.google.comのようなホスト名を使います。
www.yahoo.comはyahoo.comドメインに属するwwwという名前のホストです。
このホストはyahoo.comドメインを運営している組織が管理しています。
組織によってはhost01.blog.yahoo.comやhost02.auction.yahoo.comのようにサブドメインを定義することもあります。
blog.yahoo.comやauction.yahoo.comがドメインでhost01やhost02がホストです。
yahoo.comのDNSサーバに問い合わせればblog.yahoo.comのDNSサーバを介してhost01.blog.yahoo.comのIPアドレス
を知ることが出来ます。
世界中の組織がこのようなドメインを運営しています。
yahoo.comのDNSにhost.google.comのIPを問い合わせても答えは返ってこないのでgoogle.comのDNSに問い合わせる必要があります。
どうやって各ドメインのDNSの位置を把握すれば良いのでしょうか。

DNSの階層構造
DNSは階層構造の分散データベースとして設計されています。
トップレベルドメインであるcomやnet等をまとめるルートネームサーバがあり、その配下にサブドメインが連なっています。
ルートネームサーバから順にDNSを辿ることで目的のドメインのDNSの位置を把握することが出来ます。
各組織のDNSには自身のドメイン情報を記述したゾーンファイルを用意します。
インターネットからアクセスしてもらう為には上位ドメインのDNSに情報を追加してもらう必要があるためドメインが重複することは有りません。

DNSレコードの登録
- 既存設定の確認
手元の仮想マシンのDNSにはwww.sample.localの設定が既に登録されています。
DNSの設定はゾーンという単位で管理します。
1台のDNSサーバが複数のゾーン情報を持つことが出来ます。

以下の例ではsample.localドメインに3つのホスト名が登録されている事が分かります。
sample.localのゾーンを確認する
# cat /var/named/sample.local.zone
@     IN    SOA    sample.local.  root.sample.local. (
                           2018062901  
                           10800       
                           3600       
                           604800     
                           86400 )
;
      IN    NS     ns.sample.local.
;
      IN    MX     0 mail.sample.local
;
ns    IN    A      172.16.0.100
www   IN    A      172.16.0.100
mail  IN    A      172.16.0.100
ゾーンの情報を読み込むためにDNSサーバの設定も必要です。
DNSサーバの設定ファイルを確認する
# cat /etc/named.conf
...省略
zone "sample.local" IN {
        type master;
        file "sample.local.zone";
};
...省略
- ゾーンの追加
www.practice.local=172.16.0.200という設定を追加するケースを考えます。
入力待ち受け状態に遷移する
END という文字が渡されるまで入力された文字をファイルに書き込み続ける
# cat >> /var/named/practice.local.zone << END
渡す文字列(この下の行からENDまでコピー&ペーストする)
@     IN    SOA    practice.local.  root.practice.local. (
                           2018062901  
                           10800       
                           3600       
                           604800     
                           86400 )
;
      IN    NS     ns.practice.local.
;
      IN    MX     0 mail.practice.local
;
ns    IN    A      172.16.0.200
www   IN    A      172.16.0.200
mail  IN    A      172.16.0.200
END
- DNSサーバ設定追加
practice.localのゾーン情報を読み込むための記述を追加します。
入力待ち受け状態に遷移する
# cat >> /etc/named.conf << END
渡す文字列(この下の行からENDまでコピー&ペーストする)
zone "practice.local" IN {
        type master;
        file "practice.local.zone";
};
END
- DNSサーバ再起動
再起動することで設定を読み込みます。 もし誤りがあれば再起動に失敗するのでエラーメッセージからトラブルシューティングを行います。
# systemctl restart named