Ubuntu

Ubuntu 12.04 で BIND9 を動かしてみる

■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を修正したらあっさり解決した。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他