読者です 読者をやめる 読者になる 読者になる

ビットコイン・ブロックチェーン技術ブログ|合同会社ジャノム

ビットコイン・ブロックチェーン専門企業からの目線で、最新技術を一般の方に分かりやすく解説します

【設定メモ】ローカルDNSサーバ構築

↓の投稿でローカル向けに固定IPアドレスを配る仕組みを作ったのですが、いちいちIPアドレスは覚えていられませんので、ローカル向けのDNSサーバを構築しました。

blog.janom.co.jp

目標とか

  • BINDを使う
  • DDNSを用いて、DHCPサーバから自動的にDNSレコードを更新するようにする
  • ローカルのホスト名以外のリクエストの処理はルータへ投げる
  • 正引き・逆引き、ともにできるようにする

設定手順

BIND のインストール

何はともあれ、BINDをインストールしましょう。

$ sudo apt install bind9

動作設定

/etc/bind/named.conf.options を編集します。

@@ -10,15 +10,18 @@
        // Uncomment the following block, and insert the addresses replacing 
        // the all-0's placeholder.
 
-       // forwarders {
-       //      0.0.0.0;
-       // };
+       forwarders {
+               192.168.0.1;  # ルータのアドレスを指定する
+       };
+       forward only;  # デフォルトではフォワード先(ルータ)で名前解決に失敗した場合、再帰問い合わせを行って自力での解決を試みるが、これを行わないようにする(フォワードのみ)
 
        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
-       dnssec-validation auto;
+       dnssec-validation no;  # ルータがDNSSECに対応しておらずエラーになるため、DNSSECを無効にする。
                               # フォワード先が DNSSEC に対応していれば (ちなみに Google の 8.8.4.4, 8.8.8.8 は対応している) この設定は不要
 
        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };

ゾーン設定

ゾーンファイルを置くためのディレクトリ (/etc/bind/zones) をあらかじめ作っておきます。

$ cd /etc/bind
$ sudo mkdir zones

↓DDNSを利用する場合、ゾーンファイルと同じディレクトリにジャーナルファイル(?)が `bind` ユーザにより作成されるため、書き込めるように設定をする
$ sudo chown root:bind zones
$ sudo chmod g+w zones

ゾーンファイル指定

/etc/bind/named.conf.local にゾーンファイルの在り処を指定します。

# 正引き
zone "office.janom.co.jp" {
        type master;
        file "/etc/bind/zones/office.janom.co.jp";  # ゾーンの設定ファイルの場所
        allow-update {
                127.0.0.1;  # DDNSによるアップデートを許可するホストのIPアドレス。ここではローカルホストのみを指定する
        };
};
# 逆引き
zone "0.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/zones/0.168.192.in-addr.arpa";
        allow-update {
                127.0.0.1;
        };
};

正引きゾーンファイル

/etc/bind/zones/office.janom.co.jp に正引き用のゾーンファイルを以下のように作ります。

$TTL 3600       ; 1 hour
office.janom.co.jp      IN SOA  gw1.office.janom.co.jp. info.janom.co.jp. (
                                2016081513 ; serial
                                3600       ; refresh (1 hour)
                                600        ; retry (10 minutes)
                                604800     ; expire (1 week)
                                3600       ; minimum (1 hour)
                                )
                        NS      gw1.office.janom.co.jp.
gw1                     A       192.168.0.2

逆引きゾーンファイル

同様に逆引き用のゾーンファイルを /etc/bind/zones/0.168.192.in-addr.arpa に作っていきます。

$TTL 3600       ; 1 hour
0.168.192.in-addr.arpa IN SOA  gw1.office.janom.co.jp. info.janom.co.jp. (
                                2016081509 ; serial
                                3600       ; refresh (1 hour)
                                600        ; retry (10 minutes)
                                604800     ; expire (1 week)
                                3600       ; minimum (1 hour)
                                )
                        NS      gw1.office.janom.co.jp.
2                       PTR     gw1.office.janom.co.jp.

DHCPサーバ設定

次に、クライアントがネットワークに接続した際に自動的にDDNSの設定がされるよう、DHCPサーバの設定を編集します。 本番マシンではDDNSの設定以外も一部いじってありますが、その部分は今回の記事とは関係ないので省略しています。

@@ -10,18 +10,19 @@
 # attempt to do a DNS update when a lease is confirmed. We default to the
 # behavior of the version 2 packages ('none', since DHCP v2 didn't
 # have support for DDNS.)
-ddns-update-style none;
+ddns-update-style interim;  # DNSのアップデートを行うように指示。モードがいくつかありそうな雰囲気だが、いまのところ(古いdhcpd用の "ad-hoc" を除けば)"interim" しかない
+update-static-leases on;  # リースを更新した際にもDNSをアップデートするようにする(デフォルトでは新規割当 or 割当解除時のみ)
 
 # option definitions common to all supported networks...
-option domain-name "example.org";
-option domain-name-servers ns1.example.org, ns2.example.org;
+option domain-name "office.janom.co.jp";
+option domain-name-servers 192.168.0.2;  # DNSサーバのIPアドレスを指定する
 
 default-lease-time 600;
 max-lease-time 7200;
 
@@ -30,6 +31,72 @@
 # No service will be given on this subnet, but declaring it helps the 
 # DHCP server to understand the network topology.
 
+zone office.janom.co.jp. {
+       primary 127.0.0.1;  # 正引き用のDNSホストを指定する
+}
+zone 0.168.192.in-addr.arpa. {
+       primary 127.0.0.1;  # 逆引き用のDNSホストを指定する
+}
+
+# Network Devices.
+host router1 {
+       hardware ethernet 12:34:56:78:90:ab;
+       fixed-address 192.168.0.1;
+       ddns-hostname "router1";  # ホスト名を指定する。ここで指定しない場合には、クライアントから渡されるホスト名が代わりに利用されることになる
+}
+host gw1 {
+       hardware ethernet ab:90:78:56:34:12;
+       fixed-address 192.168.0.2;
+       ddns-hostname "gw1";
+}
 #subnet 10.152.187.0 netmask 255.255.255.0 {
 #}

動作確認

以上で設定は終わりで、最後に必要なサーバ類の再起動 and/or リロードをすれば完了です。

動作ログは /var/log/syslog に吐き出されます。 新しくクライアントが接続すると、以下のようなログが吐かれるはずです。

Aug 16 09:59:04 gw1 dhcpd: DHCPREQUEST for 192.168.0.100 from 12:34:56:78:90:ab via eth0
Aug 16 09:59:04 gw1 dhcpd: DHCPACK on 192.168.0.100 to 12:34:56:78:90:ab via eth0
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone 'office.janom.co.jp/IN': update unsuccessful: pc1.office.janom.co.jp: 'name not in use' prerequisite not satisfied (YXDOMAIN)
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone 'office.janom.co.jp/IN': deleting rrset at 'pc1.office.janom.co.jp' A
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone 'office.janom.co.jp/IN': adding an RR at 'pc1.office.janom.co.jp' A
Aug 16 09:59:04 gw1 dhcpd: Added new forward map from pc1.office.janom.co.jp to 192.168.0.100
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone '0.168.192.in-addr.arpa/IN': deleting rrset at '100.0.168.192.in-addr.arpa' PTR
Aug 16 09:59:04 gw1 named[28445]: client 127.0.0.1#49393: updating zone '0.168.192.in-addr.arpa/IN': adding an RR at '100.0.168.192.in-addr.arpa' PTR
Aug 16 09:59:04 gw1 dhcpd: Added reverse map from 100.0.168.192.in-addr.arpa. to pc1.office.janom.co.jp

次に、実際に正引き・逆引きができるか確認してみましょう。

まずは正引き。

$ dig pc1.office.janom.co.jp 

; <<>> DiG 9.10.3-P4-Ubuntu <<>> pc1.office.janom.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15143
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;pc1.office.janom.co.jp.    IN  A

;; ANSWER SECTION:
pc1.office.janom.co.jp. 300 IN  A   192.168.0.100

;; AUTHORITY SECTION:
office.janom.co.jp. 3600    IN  NS  gw1.office.janom.co.jp.

;; ADDITIONAL SECTION:
gw1.office.janom.co.jp. 3600    IN  A   192.168.0.2

;; Query time: 1 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Tue Aug 16 10:08:44 JST 2016
;; MSG SIZE  rcvd: 102

次に逆引き。

$ dig -x 192.168.0.100 

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -x 192.168.0.100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1929
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;100.0.168.192.in-addr.arpa.    IN  PTR

;; ANSWER SECTION:
100.0.168.192.in-addr.arpa. 300 IN  PTR pc1.office.janom.co.jp.

;; AUTHORITY SECTION:
0.168.192.in-addr.arpa. 3600    IN  NS  gw1.office.janom.co.jp.

;; ADDITIONAL SECTION:
gw1.office.janom.co.jp. 3600    IN  A   192.168.0.2

;; Query time: 4 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Tue Aug 16 10:08:34 JST 2016
;; MSG SIZE  rcvd: 127

このように無事に引けていればOKです。

これで例えばプリンタのウェブ管理画面に接続したい場合には、IPアドレスを直打ちするかわりに http://printer1.office.janom.co.jp/ へのアクセスで閲覧できます。 さらにDNSサフィックスが指定されいていますので、省略形の http://printer1/ でもアクセスできて非常にラクチンです♪