■BIND9の設定目的
自宅のサーバーに外部(3Gや他のネットワーク)から接続する場合と、自宅LANから接続する場合で同じホスト名でアクセスしたい。(ex.www.hogeserver.hogeddns.jpでアクセスしたい)
ついでに稼働中のdhcpdと連携させ、他のPCが立ち上がったらホスト名でアクセスできるようにしたい。2013/04/30追記
■現状
無料のDynamicDNSサービスを使わせてもらっているので、www.hogehoge.hogeddns.jpで得られるIPアドレスはグローバルなIPアドレスとなり、外部からはサーバーに接続できるが自宅LANからアクセスができない状態。
- 外部からの接続[iPhone] – 3G -> [Grobal-IP:router:Local-IP] – LAN -> [自宅サーバー]
- 自宅LANからの接続[iPhone] – WiFi -> [WiFi-AccessPoint] – LAN -> [LocaL-IP:router:Grobal-IP]・・・自宅サーバーに到達できず
■設定のポイント 以下の通り設定したい。
- 内向きDNSを動作させ、外向きDNSは動作させない。
- ルーターをProxy DNS扱いとし、キャッシュ動作を行う。
- LAN内はまだIPv4のみなので、IPv6は使わない設定にする。
■設定作業 (1) bind9パッケージをインストール
$ sudo apt-get install bind9
グループ `bind' (GID nnn) を追加しています...完了。
システムユーザ `bind' (UID nnn) を追加しています...
新しいユーザー `bind' (UID nnn) をグループ `bind' に追加しています...
ホームディレクトリ `/var/cache/bind' を作成しません。
wrote key file "/etc/bind/rndc.key"
インストールした結果を見ると以下の通り。
- 関連する必要なパッケージ(bind9utils)がインストールされる。
- グループ bind が作られ、ユーザー bind も作られる。
調べたサイトでは、bindをrootで動かすと危ない!って書いてあったけど、パッケージをインストールするだけでグループとユーザーが作られるので問題はなさそう。 何ができたのか見てみると、こんな感じ。
$ ll /etc/bind
合計 68
drwxr-sr-x 2 root bind 4096 4月 19 00:10 ./
drwxr-xr-x 169 root root 12288 4月 20 00:40 ../
-rw-r--r-- 1 root root 2389 3月 29 05:17 bind.keys
-rw-r--r-- 1 root root 237 3月 29 05:17 db.0
-rw-r--r-- 1 root root 271 3月 29 05:17 db.127
-rw-r--r-- 1 root root 237 3月 29 05:17 db.255
-rw-r--r-- 1 root root 353 3月 29 05:17 db.empty
-rw-r--r-- 1 root root 270 3月 29 05:17 db.local
-rw-r--r-- 1 root root 2994 3月 29 05:17 db.root
-rw-r--r-- 1 root bind 463 3月 29 05:17 named.conf
-rw-r--r-- 1 root bind 490 3月 29 05:17 named.conf.default-zones
-rw-r--r-- 1 root bind 165 3月 29 05:17 named.conf.local
-rw-r--r-- 1 root bind 890 4月 19 00:10 named.conf.options
-rw-r----- 1 bind bind 77 4月 19 00:10 rndc.key
-rw-r--r-- 1 root root 1317 3月 29 05:17 zones.rfc1918
$ ll /var/cache/bind
合計 16
drwxrwxr-x 2 root bind 4096 4月 20 00:10 ./
drwxr-xr-x 23 root root 4096 4月 19 00:09 ../
-rw-r--r-- 1 bind bind 698 4月 20 00:10 managed-keys.bind
-rw-r--r-- 1 bind bind 512 4月 20 00:10 managed-keys.bind.jnl
(2) 必要ファイルの整理 /etc/bind配下のファイルは以下のようになっていた。 中身を見た感じ、こんなファイル構成だった。
named.conf
├ named.conf.options
├ named.conf.default-zones
│ ├ db.root
│ ├ db.local
│ ├ db.127
│ ├ db.0
│ └ db.255
└ named.conf.local
└ zones.rfc1918 ※ただしコメント化されている
それぞれは次のような内容。この中で//で付けたコメントはメモ。
named.conf
// 3つのファイルをインクルードする
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
named.conf.options
options {
// namedが起動した時のカレントディレクトリになるらしい
// bind9が設定ファイルを読み込む時、ディレクトリ指定がなかったら見る場所 ←2013/04/30追記
directory "/var/cache/bind";
// DNSSEC検証の設定、詳細は後で調べよう
dnssec-validation auto;
// RFC1035準拠、RFC1035は「ドメイン名-実装と仕様書」
auth-nxdomain no; # conform to RFC1035// IPv6の問い合わせを受け付ける
listen-on-v6 { any; };
};
named.conf.default-zones
// まとめるとこんなことが書いてある
zone "." { type hint; file "/etc/bind/db.root"; };
zone "localhost" { type master; file "/etc/bind/db.local"; };
zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; };
zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; };
zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; };
// これらはゾーンファイルについて書かれていて、
// ・ルートネームサーバーの一覧表である「ルートキャッシュ」は"db.root"
// ・localhostの正引き、逆引きは "db.local", "db.127"
// ・broadcastの逆引きは "db.0", "db.255"
// に書かれている。"db.0", "db.255"の内容は同一。
// 触らないほうが良さそう。
named.conf.local
// RFC1918は「プライベート網のアドレス割り当て」
//include "/etc/bind/zones.rfc1918";
// ローカルネットワークについてはここで書けば良さそう。
以上のことから、”/etc/bind/zones.hogehoge” というファイルを作り、そこにhogehogeサーバーのネットワークに関わる設定情報を書き込み、”named.conf.local” からインクルードすることに決めた。
named.conf
├ named.conf.options ←変更(基本動作を少しだけ変える)
├ named.conf.default-zones
│ ├ db.root
│ ├ db.local
│ ├ db.127
│ ├ db.0
│ └ db.255
└ named.conf.local ←変更
├ zones.rfc1918 ※ただしコメント化されている
└ zones.hogehoge ←追加 ┐
├ db.hogehoge.zone ←追加 ├ 運用を始めたらこの辺だけをいじるつもり
└ db.hogehoge.revz ←追加 ┘
(3) 各種ファイルの設定変更 IPv6は使わないので無効化。IPv6が先に解決に使われタイムアウトするまで待つから遅くなるとか何とか。試してないけど、後回し。
/etc/bind/named.conf.options
//変更前
listen-on-v6 { any; };
//変更後
//listen-on-v6 { any; };
named.conf.local
// ローカルのネットワーク設定
include "/etc/bind/zones.hogehoge";
zones.hogehoge
※以下の内容で作成。
// 正引き
zone "hogehoge.hogeddns.jp" {
type master;
file "/etc/bind/db.hogehoge.zone";
file "/var/cache/bind/db.hogehoge.zone";←2013/04/30修正
};
// 逆引き
zone "nnn.nnn.16.172.in-addr.arpa" {
type master;
file "/etc/bind/db.hogeserver.revz";
file "/var/cache/bind/db.hogeserver.revz";←2013/04/30修正
};
db.hogeserver.zone
※以下の設定で作成。
;
; ローカルネットワークの設定
; 2013/07/21全面改定
$TTL 86400
@ IN SOA dns.hogeserver.hogeddns.jp. root.hogeserver.hogeddns.jp. (
2013052611 ; Serial Number
3600 ; Refresh 60分
600 ; Retry 10分
259200 ; Expire 3日
86400 ) ; Negative Cache TTL 1日
;
;; Name Server
;
IN NS 172.16.nnn.nnn. ; DNSである自分自身
IN NS 172.16.nnn.1. ; ISPが用意するDNS
;
;; Mail eXchange
;
IN MX 10 smtp.hogeserver.hogeddns.jp.
;
;; Address
;
@ IN A 172.16.nnn.nnn
hogeserver IN A 172.16.nnn.nnn
dns IN CNAME hogeserver
www IN CNAME hogeserver
imap IN CNAME hogeserver
smtp IN A 172.16.nnn.nnn
router IN A 172.16.nnn.1
db.hogeserver.revz
;
; ローカルネットワークの設定(逆引き)
; 2013/07/21全面改定
$TTL 86400
@ IN SOA dns.hogeserver.hogeddns.jp. root.hogeserver.hogeddns.jp. (
2013052611 ; Serial Number
3600 ; Refresh 60分
600 ; Retry 10分
259200 ; Expire 3日
86400 ) ; Negative Cache TTL 1日
;
;; Name Server
;
IN NS dns.hogeserver.hogeddns.jp. ; DNSである自分自身
IN NS router.hogeserver.hogeddns.jp. ; ISPが用意するDNS
;
;; PoinTeR
;
IN PTR hogeserver.hogeddns.jp. ; 扱うドメインの名前
IN A 255.255.0.0 ; ネットマスク
;
;; Tables
;
nnn IN PTR hogeserver.hogeghoge.hogeddns.jp.
nnn IN PTR dns.hogeghoge.hogeddns.jp.
nnn IN PTR www.hogeghoge.hogeddns.jp.
nnn IN PTR smtp.hogeghoge.hogeddns.jp.
nnn IN PTR imap.hogeghoge.hogeddns.jp.
1 IN PTR router.hogeghoge.hogeddns.jp.
/etc/default/bind9
#OPTIONS="-u bind" ←無効化
OPTIONS="-u bind -4" ←-4を足してIPv4のみにする
(4) 動作確認 設定内容を反映させるため、bind9を再起動する。
$ sudo service bind9 restart
bind9が動作しているか確認する。
$ dig @127.0.0.1 www.dokokano-server.co.jp
; <<>> DiG 9.8.1-P1 <<>> @127.0.0.1 www.dokokano-server.co.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47131
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 0
;; QUESTION SECTION:
;www.dokokano-server.co.jp. IN A
;; ANSWER SECTION:
www.dokokano-server.co.jp. 290 IN A nnn.nnn.nnn.nnn
;; AUTHORITY SECTION:
dokokano-server.co.jp. 86390 IN NS taro.dokokano-server.co.jp.
dokokano-server.co.jp. 86390 IN NS jiro.dokokano-server.co.jp.
;; Query time: 2 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Apr 21 01:56:55 2013
;; MSG SIZE rcvd: 150
(5) その他 DNSサービスもufwでブロックされてしまったので、以下の設定も実施。
$ sudo ufw allow 53
また、VPNで接続した際にDNSが hogeserver じゃなく router になっていた。これはxl2tpdの設定でDNSを router のアドレスにしていたから。
/etc/ppp/options.l2tpd
ms-dns 172.16.nnn.1になっていたのを
ms-dns 172.16.nnn.nnnと hogeserver のアドレスに変更。
サービスを再起動させる。
$ sudo service xl2tpd restart
(6) dhcpdとの連携 2013/04/30追記 dhcpdと連携させようとしたところ、色々と問題が発生したので(3)を修正。 dhcpdとbind9を連携させると、db.hogeserver.zone, db.hogeserver.revz を更新するようになる。 実際には、
- db.hogeserver.zone.jnl → db.hogeserver.zone
- db.hogeserver.revz.jnl → db.hogeserver.revz
のようにジャーナルファイルに書き出した後に、実際のゾーンファイルに書き込む。 ということで、bindユーザーが読み書きできるディレクトリにファイルを移動した。 (中身がごちゃごちゃ変わるファイルを /etc に置いておくのもどうかと思って) で、dhcpdとbind9に連携設定を入れる。
/etc/dhcp/dhcpd.conf
ddns-update-style interim; ← bind9への更新を有効化
update-static-leases on; ← 固定IPアドレスを割り振ったものもbind9への更新対象にする
zone hogeserver.hogeddns.jp. {
primary 172.16.nnn.nnn;
}
zone nnn.nnn.16.172.in-addr.arpa. {
primary 172.16.nnn.nnn;
}
bind側もDinamicDNS機能を有効化させる。
/etc/bind/zones.hogeserver
// 正引き
zone "hogeserver.hogeddns.jp" {
type master;
file "/var/cache/bind/db.hogeserver.zone";
allow-update { ←追記
172.16.nnn.nnn;
};
};
// 逆引き
zone "nnn.nnn.16.172.in-addr.arpa" {
type master;
file "/var/cache/bind/db.hogeserver.revz";
allow-update { ←追記
172.16.nnn.nnn;
};
};
サービスを再起動する。
$ sudo service isc-dhcp-server restart
$ sudo service bind9 restart
実際にやってみたら次のエラーが出た!
dhcpd: Unable to add forward map from iphone to 172.16.nnn.nnn: timed out
これは、ネットで見てみてもなかなか答えが見つからなかったが、結論としては「db.hogeserver.zone」に不正な設定があり正しく読み込めていないので、dhcpdからの要求をbind9が受け付けられなかったために起きていた。 db.hogeserver.zoneを修正したらあっさり解決した。