↓の投稿でローカル向けに固定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.
次に、クライアントがネットワークに接続した際に自動的に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/ でもアクセスできて非常にラクチンです♪