DNSサーバを立ち上げる(1)

2021年4月5日

MyDNS.JPのサービスで、DDNSのサブドメインを取得し、そのドメイン名を使ってWebサーバにアクセスするところまで記載しました。

マシン名(ホスト名)に www と付けた立場は…、ということで、DNSサーバの話に移っていきたいと思います。

ローカルネットワーク内で名前を解決する

仮に、IPアドレスの割り振りを下記の通りとします。

マシン名IPアドレスDNSサーバ
(ルータ)グローバル側123.456.789.012プロバイダのDNS1(プライマリ)
プロバイダのDNS2(セカンダリ)
(ルータ)LAN側192.168.0.1
www(Webサーバ)192.168.0.3192.168.0.1
MYPC(クライアントWindows PC)192.168.0.10192.168.0.1

今のところ、DNSサーバはありませんから、MYPCから、www.●●●.live-on.netでhttp接続すると、ホスト名がwwwかどうかなどは関係なく、●●●.live-on.net のサーバが不明なため、DNSサーバに設定した 192.168.0.1 のルータに問い合わせに行きます。

●●●.live-on.netのIPアドレスは、MyDNS.JPに通知したIPアドレスになりますから、MYPCが問い合わせたIPアドレスは123.456.789.012となります。ルータが受ける、ということです。

http://www.●●●.live-on.net ですから、ルータは、httpプロトコル(ポート80)に設定されたアドレス、192.168.0.3のポート80に変換します。

一旦、外(グローバル)に出ないと、名前の解決が出来ません。

そこで、●●●.live-on.net のDNSサーバを立てることになります。

live-on.net のDNSサーバは、MyDNS.JPの管理ですが、そのサブドメインである●●●.live-on.netは、自身で管理することが出来ます。

※以降の記載は、あくまでも仕組みを理解するための試験的な運用です。セキュリティ面に関しては、責任を負いかねます。

DNSサーバを設置する

ESXi7.0上に立てた仮想マシン CentOS 7 へのインストールになります。使用するのは、DNSコンテンツサーバ用のソフトウェア、BINDです。

インストールは、

# yum install bine

dnsサービスへのアクセスを通すようにファイアウォールの設定を変更します。

# firewall-cmd --add-service=dns
success
# firewall-cmd --runtime-to-permanent
success

ゾーンデータファイルの作成

次に、ゾーンデータファイルを作成します。

名前からアドレスを検索するための正引きを行うためのデータファイルです。ファイル名は絶対にこれ、ではなく、後で記載する named.conf に定義しますので、自由です。

/var/named/●●●.live-on.net.zone

$TTL 1D
@ IN SOA ns1.●●●.live-on.net. root.●●●.live-on.net. (
                2021031100 ; serial
                1D ; refresh
                1H ; retry
                1W ; expire
                3H ) ; minimum
        IN NS   ns1.●●●.live-on.net.
www     IN A    192.168.0.3
ns1     IN A    192.168.0.2

ns1 は、DNSサーバのホスト名です。

キャッシュの有効期限が 1D = 1日間
リフレッシュ間隔が 1D = 1日間
リトライ間隔が 1H = 1時間
情報破棄時間が 1W = 1週間
情報有効時間が 3H = 3時間
です。

2行目の root.●●●.live-on.net. は、 root@●●●.live-on.net というメールアドレスを示していますが、特にDNSサーバの運用において通知されることもないようです。

IPv4用逆引きゾーンファイルの作成

次に、IPv4用逆引きゾーンファイルを作成します。こちらのファイル名も決まったルールはありません。

/var/named/●●●.live-on.net.rev

$TTL 1D
@ IN SOA ns1.●●●.live-on.net. root.●●●.live-on.net. (
                2021031100; serial
                1D ; refresh
                1H ; retry
                1W ; expire
                3H ) ; minimum
        IN NS           ns1.●●●.live-on.net.
2       IN PTR          ns1.●●●.live-on.net.
3       IN PTR          www.●●●.live-on.net.

最後の2行、2 は、 192.168.0.2 の、 3 は、192.168.0.3 の省略形になります。

正確には、 2.0.168.192.in-addr.arpa. の略、3.0.168.192.in-addr.arpa. の略となります。

※ IPv4 のみでの運用を想定しているため、IPv6用逆引きゾーンファイルは作成しません。

named.confファイルの編集

/etc/named.conf

options {
        listen-on port 53 { 127.0.0.1;
                            192.168.0.0/24; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     {
                127.0.0.1;
                192.168.0.0/24;
         };
        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;

        allow-recursion { localhost; localnets; };
        allow-query-cache { localhost; localnets; };
        forwarders{
        XXX.XXX.XXX.XXX;
        XXX.XXX.XXX.XXX;
                };

        dnssec-enable yes;
        dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.root.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
        category lame-servers { null; };
};

// 内部向け設定
view "internal" {
        match-clients {
                localnets;
                192.168.0.0/24;
        };
        #match-destinations { localnets; };

        zone "." IN {
                type hint;
                file "named.ca";
        };

        zone "●●●.live-on.net" IN {
                type master;
                file "●●●.live-on.net.zone";
                allow-update { none; };
        };

        zone "0.168.192.in-addr.arpa" IN {
                type master;
                file "●●●.live-on.net.rev";
                allow-update { none; };
        };

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

};

forwarders に記載の XXX.XXX.XXX.XXX は、プロバイダのDNSを設定しておくことで、DNSサーバで解決できない名前をこちらに振ります。ですので、「名前解決できない」という問題を防ぎます。

黄色のファイル名は、先に作成した正引き・逆引きのゾーンファイルの名前です。

編集・作成した3ファイル以外は、BINDインストール時のオリジナルで問題ありません。

DNSサーバを稼働させる

では、BINDのサービスを起動させてみます。

# systemctl start named.service

自動起動の設定もやっておきます。

# systemctl enable named.service

正しく動いているか確認する

hostコマンドで確認します。最後のパラメータはDNSサーバのIPアドレスになります。

■正引きの確認

# host www.●●●.live-on.net 192.168.0.2
Using domain server:
Name: 192.168.0.2
Address: 192.168.0.2#53
Aliases:

www.●●●.live-on.net has address 192.168.0.3

■逆引きの確認

# host 192.168.0.3 192.168.0.2
Using domain server:
Name: 192.168.0.2
Address: 192.168.0.2#53
Aliases:

3.0.168.192.in-addr.arpa domain name pointer www.●●●.live-on.net.

ひとまず、DNSサーバとしては、機能しそうな感じがします。

続きは、DNSサーバを立ち上げる(2)になります。