2017年3月3日金曜日

CentOS 7にunboundをインストールしてDNSキャッシュサーバーにしてみた

DNSといえば昔からBINDが有名だが、BINDは機能が高度化して複雑になっており、それゆえ脆弱性の問題が多く発見される傾向にある。

以下サイトでまとめられているが、1か月に1回は脆弱性情報が公開される印象がある。

・JPRS DNS関連技術情報
https://jprs.jp/tech/

というわけで、単純なDNSキャッシュサーバーであれば、そろそろBINDを使わなくてもよいのではないか?ということで、unboundというOSSを使ってみることにした。

unbound導入手順

今回はCentOS 7.3にunboundを導入する。

1. yumでunboundをインストール

yumを使ってインストールする。

# yum install unbound
------------------------------
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.nus.edu.sg
 * extras: centos.usonyx.net
 * updates: mirror.vastspace.net
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ unbound.x86_64 0:1.4.20-28.el7 を インストール
--> 依存性の処理をしています: unbound-libs(x86-64) = 1.4.20-28.el7 のパッケージ: unbound-1.4.20-28.el7.x86_64
--> 依存性の処理をしています: ldns >= 1.6.16-10 のパッケージ: unbound-1.4.20-28.el7.x86_64
--> 依存性の処理をしています: libunbound.so.2()(64bit) のパッケージ: unbound-1.4.20-28.el7.x86_64
--> 依存性の処理をしています: libldns.so.1()(64bit) のパッケージ: unbound-1.4.20-28.el7.x86_64
--> 依存性の処理をしています: libevent-2.0.so.5()(64bit) のパッケージ: unbound-1.4.20-28.el7.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ ldns.x86_64 0:1.6.16-10.el7 を インストール
---> パッケージ libevent.x86_64 0:2.0.21-4.el7 を インストール
---> パッケージ unbound-libs.x86_64 0:1.4.20-28.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================
 Package              アーキテクチャー
                                     バージョン              リポジトリー  容量
================================================================================
インストール中:
 unbound              x86_64         1.4.20-28.el7           base         473 k
依存性関連でのインストールをします:
 ldns                 x86_64         1.6.16-10.el7           base         476 k
 libevent             x86_64         2.0.21-4.el7            base         214 k
 unbound-libs         x86_64         1.4.20-28.el7           base         296 k

トランザクションの要約
================================================================================
インストール  1 パッケージ (+3 個の依存関係のパッケージ)

総ダウンロード容量: 1.4 M
インストール容量: 4.4 M
Is this ok [y/d/N]: y
Downloading packages:
(1/4): ldns-1.6.16-10.el7.x86_64.rpm                       | 476 kB   00:00  
(2/4): unbound-1.4.20-28.el7.x86_64.rpm                    | 473 kB   00:00  
(3/4): unbound-libs-1.4.20-28.el7.x86_64.rpm               | 296 kB   00:00  
(4/4): libevent-2.0.21-4.el7.x86_64.rpm                    | 214 kB   00:00  
--------------------------------------------------------------------------------
合計                                               1.4 MB/s | 1.4 MB  00:00  
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction

~(中略)~

インストール:
  unbound.x86_64 0:1.4.20-28.el7                                              

依存性関連をインストールしました:
  ldns.x86_64 0:1.6.16-10.el7               libevent.x86_64 0:2.0.21-4.el7    
  unbound-libs.x86_64 0:1.4.20-28.el7    

完了しました!
------------------------------

yumが使えない場合は、rpmからインストールする必要があるが、依存するパッケージとインストール順序は以下の通りとなる。

------------------------------
 1 -> libevent-2.0.21-4.el7.x86_64.rpm
 2 -> ldns-1.6.16-10.el7.x86_64.rpm
 3 -> unbound-libs-1.4.20-28.el7.x86_64.rpm
 4 -> unbound-1.4.20-28.el7.x86_64.rpm
------------------------------

2. unbound設定

/etc/unbound/unbound.confを編集し、必要な設定を行う。デフォルトではすべてがコメントアウトされているので、必要な部分をコメントインしたり、追記したりすればよい。

以下に修正箇所を記載する。

------------------------------
server:
       interface: 0.0.0.0     ←すべてのアドレスからの問い合わせに回答(IPv4)
       interface: ::0       ←すべてのアドレスからの問い合わせに回答(IPv6)

       access-control: 0.0.0.0/0 refuse   ←デフォルト拒否(IPv4)
       access-control: 127.0.0.0/8 allow  ←ループバックアドレスを許可(IPv4)
       access-control: 192.168.1.0/24 allow ←問い合わせを許可するネットワーク
       access-control: ::0/0 refuse     ←デフォルト拒否(IPv6)
       access-control: ::1 allow       ←ループバックアドレスを許可(IPv6)
       access-control: ::ffff:127.0.0.1 allow ←ループバックアドレスを許可(IPv6)

 forward-zone:           ←コメントインする
       name: "."            ←すべてのドメインに対してフォワード
       forward-addr: 129.250.35.250 ←フォワード先DNS(今回はNTT America Technical Operations)
       forward-addr: 8.8.8.8      ←フォワード先DNS(今回はGoogle Public DNS)
------------------------------

3. 設定ファイルのチェック

unboundには設定ファイルをチェックするコマンドが用意されている。これはサービス起動時に自動で実行されるが、手動でも実行可能。

# unbound-checkconf
------------------------------
unbound-checkconf: no errors in /etc/unbound/unbound.conf
------------------------------

4. 設定ファイル再読み込みのため、unboundを再起動

最後に設定繁栄のためunboundを再起動する。

# systemctl restart unbound
# systemctl status unbound
------------------------------
unbound.service - Unbound recursive Domain Name Server
   Loaded: loaded (/usr/lib/systemd/system/unbound.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2017-02-25 12:03:22 JST; 2s ago
  Process: 28392 ExecStartPre=/usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -c /etc/unbound/icannbundle.pem (code=exited, status=0/SUCCESS)
  Process: 28391 ExecStartPre=/usr/sbin/unbound-checkconf (code=exited, status=0/SUCCESS)
 Main PID: 28395 (unbound)
   CGroup: /system.slice/unbound.service
           mq28395 /usr/sbin/unbound -d

~(以下略)~
------------------------------

5. DNS名前解決先を自分自身にする

必須ではないが、最後にOS自身の名前解決も自分自身に変えておく。

# vi /etc/resolv.conf
------------------------------
nameserver 127.0.0.1
------------------------------

以上でインストール作業は終了。私の環境ではインストールから半月ほど経過しているが、特に問題なく動作している。