[Linux] PowerDNS recursorを使ってキャッシュDNSを作る

BIND以外のものを使ってみたい

現在、我が家のDNS構成としては、

  • 外部権威DNS:Route53⇒CloudFlare
  • 内部権威DNS:Windows DNS(Active Directory)
  • 内部キャッシュDNS:BIND

と言う構成になっています。

さらに、内部端末から外部に対する名前解決は、先の記事でも書いたように、Quad9を使用しています。概要構成図としては以下のような感じです。

もはや定番中の定番とも言えるBINDですが、その他にも色々DNSサーバとしてのソフトウェアが増えて来ているという事で、それ以外の製品利用としてPowerDNSを考えました。

PowerDNSとは

PowerDNSは、オランダのPowerDNS.COM BVが開発を行った、オープンソースソフトウェアのDNSサーバとのこと。バックエンドに単なるゾーンファイルだけでなく、RDB等様々なものが使えるというのが特徴のようです。

ここで、面白いなーと思ったのが、PowerDNSは複数のコンポーネントに分かれていて、権威DNS機能はPowerDNSが、キャッシュDNS機能はPowerDNS Recursorと言うものが担っているという点。なんと機能毎でパッケージが異なるんです。

確かにキャッシュDNSだけしかしないんであれば、それに特化したパッケージさえ入っていればよく、下手なゾーンファイルを作らずに済むならそれに越したことはありません。

今回、キャッシュDNSの入れ替えを行うということで、BINDをやめ、PowerDNS Recursorを使用してみることにしました。

リポジトリのインストール

どうやらepelリポジトリとremiリポジトリが必要っぽいので導入します。

■epelリポジトリのインストール
# yum -y install epel-release

■remiリポジトリのインストール
# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

PowerDNS Recursorのインストール

PowerDNS Recursorと関連ツールのみインストールします。

# yum -y install pdns-recursor pdns-tools

PowerDNS Recursorの設定

設定ファイルは/etc/pdns-recursor/recursor.conf となってるようです。コレを編集して各種設定を行います。

■既存ファイルのバックアップ
# cp -p /etc/pdns-recursor/recursor.conf ~/

■ファイルの編集
# vi /etc/pdns-recursor/recursor.conf

以下、編集例になります。

# UID,GIDの定義
setuid=pdns-recursor
setgid=pdns-recursor

#DNSクエリを許可するクライアントの定義
#IPv4/v6共に書けます。カンマで区切り、1行で書きます。バックスラッシュ使えます。
allow-from=127.0.0.0/8, \
192.168.0.0/16, \
::1/128, \
2403:****:****::/48

#フォワーダの指定
#<ドメイン名>=<フォワード先>の形式で書きます。DNSの区切りはセミコロンで行います。
#IPv4/v6共に書けます。ゾーンごとにカンマで区切り、1行で書きます。バックスラッシュ使えます。
forward-zones=bluecore.net=192.168.***.202;2403:****:****:****::111, \
***.168.192.in-addr.arpa=192.168.***.202;2403:****:****:****::111

#再起フォワーダの指定
#書き方はフォワーダの指定と同じです。
#外部向け名前解決はQuad9に指定しています。
forward-zones-recurse=.=9.9.9.9

#受付IPアドレスの定義
#IPv4/v6共に書けます。カンマ区切りで指定します。0.0.0.0や::0の指定もありです。
local-address=192.168.***.202,2001:****:****:****::202,127.0.0.1,::1

#待受ポートの指定(言わずと知れた53にしときます)
local-port=53

#最大キャッシュTTLを定義します。当環境では1800secに設定しています。
max-cache-ttl=1800

#否定応答されたキャッシュTTLを定義します。max-cache-ttlと同様1800secに設定しています。
max-negative-ttl=1800

BINDからの切り替え

■BINDの停止
# systemctl stop named

■BINDの停止確認
# nslookup yahoo.co.jp localhost ⇒応答しない。Ctrl+Cで停止

■PowerDNS Recursorの起動
# systemctl start pdns-recursor

■PowerDNS Recursorによる名前解決確認(外部)
# nslookup yahoo.co.jp localhost
Server: localhost
Address: ::1#53

Non-authoritative answer:
Name: yahoo.co.jp
Address: 183.79.135.206
Name: yahoo.co.jp
Address: 182.22.59.229

■PowerDNS Recursorによる名前解決確認(内部)
# nslookup kome.bluecore.net localhost
Server: localhost
Address: ::1#53

Non-authoritative answer:
Name: kome.bluecore.net
Address: 192.168.***.202

自動起動設定の変更

■BINDの自動起動を無効化
# systemctl disable named

■PowerDNS Recursorの自動起動を有効化
# systemctl enable pdns-recursor

以上で、キャッシュDNSをPowerDNS Recursorに変更が完了しました。

キャッシュDNSは簡単だが

以上のように、キャッシュDNS機能の切り替えは非常に簡単なのですが、権威DNS機能であるPowerDNSに関しては少々導入がめんどくさそうです。特にRDBをバックエンドに使う際、そのテーブル構造は現状Tips等をGoogle先生にお伺い立てる限りでは、手動で作っていく必要がありそうで。

今のところ、内部的な権威DNSはActive Directoryが握っているため、今回素直にキャッシュDNSだけ変更し、フォワードさせる仕組みにしたのですが、導入できるWindows Serverが2台しかなく、全部HQ側に寄せているため、いずれは副系DNSサーバが必要かなーと考えており、そう遠くないうちに災対サイト側に新規サーバを立てて、PowerDNSサーバを立てたほうが良いかなーとは思っています。

ただまぁ・・・なんといいますか、災対側ストレージの余裕があまりなく、これ以上サーバ立てるのが無理ゲーということで、もう少し金銭的余裕が出てから考えたいかなーとか思ってます。他にもActive Directory側のゾーン設定の見直し(セキュリティ周りなど)が発生しますしね・・・


追記:2017/12/23

一件指摘を頂きましたので追記します。

PowerDNSについて、今回はremiリポジトリから入手しましたが、PowerDNS自体がリポジトリを構えていることを知りました。

https://repo.powerdns.com/

当てはまるプラットフォームを選択し、導入したいバージョン(本日時点で恐らく4.1.xがStable)を選ぶとリポジトリ追加手順について記載されていますので、それを参考にするとよいかと思います。

本記事で導入した際のバージョンが3.7.1でしたが、4.1に上がると、プロセスの引数も変わってました。Hinemos側の監視設定も変更が必要になったりしています。3.x⇒4.xでおそらくは仕様が若干変わっていると思われますので、確認することをお勧めしときます。