ローカルネットワーク内の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 ]