Unboundを使って内向きの名前解決を行う

ローカルネットワーク内のWebサーバーに対し、ドメイン名でアクセスできるようにするため、Unboundを使った内向きの名前解決を行うDNSサーバーを構築する。

これによりhostsの書き換えを行うことなく、ローカルネットワーク内で稼動するWebアプリケーションへドメイン名付きのURLでアクセスできるようになる。
またhostsファイルの書き換えができないiPhoneからWifi経由で
同様にアクセスできることが期待できる。

Unboundのホームページ http://www.unbound.net/

インストール

> sudo apt-cache show  unbound
Version: 1.4.18-1~ubuntu12.04.1
Homepage: http://www.unbound.net/
> sudo apt-get install unbound

インストール直後の状態

モジュールは/usr/sbin、設定ファイルは/etc/unboundにインストールされる。

/usr/sbin
-rwxr-xr-x 1 root root 727800  2月  8  2012 unbound
-rwxr-xr-x 1 root root  34572  2月  8  2012 unbound-anchor
-rwxr-xr-x 1 root root 411876  2月  8  2012 unbound-checkconf
-rwxr-xr-x 1 root root 108224  2月  8  2012 unbound-control
-rwxr-xr-x 1 root root   5217  2月  8  2012 unbound-control-setup

/etc/unbound
-rw-r--r-- 1 root root  364  2月  6  2012 unbound.conf
-rw-r----- 1 root root 1277  5月 12 18:02 unbound_control.key
-rw-r----- 1 root root  802  5月 12 18:02 unbound_control.pem
-rw-r----- 1 root root 1277  5月 12 18:02 unbound_server.key
-rw-r----- 1 root root  790  5月 12 18:02 unbound_server.pem

パッケージインストールされると、起動シェルが/etc/init.d/unboundに作成される

unbound.confの設定

  • 前提条件
  • ドメイン名はhoge.comとする
  • サーバーのIPアドレスは192.168.0.2、ホスト名はwww
  • ルーターのIPアドレスは192.168.0.1
  • サブネットマスクは255.255.255.0

※ホスト名やIPアドレスは、環境に合わせて読み替える

  • 設定内容
  • 内向きなので、アクセス制限をローカルネットワーク内限定とする
  • hoge.comにする正引きのクエリに対し、192.168.0.2を返すようにする
  • サブドメインはワイルドカード設定とする
     (つまり、www.hoge.com, blog.hoge.com, xyz.hoge.comなど*.hoge.comでアクセスしてきたらすべて192.168.0.2を返すようにする)
  • 逆引きは192.168.0.2のクエリに対し、www.hoge.comを返すようにする
server:
  # log
  verbosity:2
  logfile: "/var/log/unbound.log"
  use-syslog: no

  # interface
  interface:0.0.0.0
  do-ip4:yes
  do-ip6:no

  # access
  access-control:127.0.0.1/32 allow
  access-control:192.168.0.0/24 allow
  
  # zone
  local-zone: "hoge.com" redirect

  # forward lookup
  local-data: "hoge.com. IN A 192.168.0.2"

  # reverse lookup
  local-data-ptr: "192.168.0.2 www.hoge.com."

サブドメインにワイルドカードを使った設定のポイント
BINDのように*は使えないのでlocal-zoneを使って定義する

local-zone: "hoge.com" redirect
local-data: "hoge.com. IN A 192.168.0.2"

ワイルドカードを使わない場合の違いは以下になる

www.hoge.comのみ192.168.0.2として解決される
(local-zoneは定義しない)

local-data: "www.hoge.com. IN A 192.168.0.2"

複数設定
local-dataを複数定義する

local-data: "www.hoge.com. IN A 192.168.0.2"
local-data: "blog.hoge.com. IN A 192.168.0.3"

確認

注意点
すでにサーバー上でdnsmasqが起動している場合、ポートが競合して起動できないケースがある。サービス起動する前に直接コンソールから実行して動作するか確認する

> sudo unbound -c /etc/unbound/unbound.conf

dnsmasqが稼働している場合、不要なので停止させる。
Network-Managerのdns設定をコメントアウトする。
確実に停止させるため、一旦サーバーを再起動する。
(再起動しない方法もあったが、停止しなかったため)

>sudo vi /etc/NetworkManager/NetworkManager.conf
:
[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

nslookupなどでちゃんと名前解決しているか確認する

> nslookup www.hoge.com
Server:		127.0.0.1
Address:	127.0.0.1#53

Name:	www.hoge.com
Address: 192.168.0.2

Unboundの起動

apt-getでパッケージインストールすると、起動シェルがインストールされているはずなので、他のデーモンと同じようにserviceコマンドで起動する。

> sudo service unbound start

以下のようなエラーが発生する場合、Unboundと同一ポート(53番)を使って、すでに稼動しているサーバーがいる可能性がある。

 * Starting recursive DNS server unbound
[1463046225] unbound[3758:0] error: bind: address already in use
[1463046225] unbound[3758:0] fatal error: could not open ports

自身の環境だとdnsmasqデーモンがすでに稼動していたので、停止させる必要があった。

> sudo lsof -nPi | grep :53
avahi-dae   904     avahi   13u  IPv4    8976      0t0  UDP *:5353 
avahi-dae   904     avahi   14u  IPv6    8977      0t0  UDP *:5353 
dnsmasq    1422    nobody    4u  IPv4   10187      0t0  UDP 127.0.0.1:53 
dnsmasq    1422    nobody    5u  IPv4   10188      0t0  TCP 127.0.0.1:53 (LISTEN)

dnsmasqの停止

/etc/NetworkManager/NetworkManager.conf内のdns=dnsmasqをコメントアウト

/etc/NetworkManager/NetworkManager.conf

[main]
plugins=ifupdown,keyfile
#dns=dnsmasq
no-auto-default=00:30:67:DA:EE:FF,
[ifupdown]
managed=false

マネージャを再起動する

> sudo restart network-manager

dnsmasqが停止したか確認

> sudo lsof -nPi | grep :53
avahi-dae   904     avahi   13u  IPv4    8976      0t0  UDP *:5353 
avahi-dae   904     avahi   14u  IPv6    8977      0t0  UDP *:5353

もう一度、Unboundを再起動する

> sudo service unbound start
 * Starting recursive DNS server unbound    [ OK ]
-->