docker
PowerDNS
Armbian
TinkerBoard

おうちDNSをPowerDNSのDockerイメージで(PowerDNS Recursorインストール編)

はじめに

前項ではPowerDNS Authoritative ServerとPowerDNS-Adminをインストールした。
今回はPowerDNS Recursorをインストールすることで本格的におうちの中で利用できるDNSサーバを構築することができる。

今回の構築イメージ。

クライアントPC
  ↓
PowerDNS Recursor → localドメイン → PowerDNS Authoritative Server 
  ↓
localドメイン以外
  ↓
Internet

Dockerイメージ

前回のDockerファイルにさらに、PowerDNS RecursorのDockerイメージを追加した。

また、docker-composeでブリッジを作成し各コンテナのIPアドレスを固定で設定することで、PowerDNS Authoritative ServerとRecursorの経路を固定した。

linkの設定では、PowerDNS Authoritative ServerとRecursor同士の通信が正しく行えない問題があったためである。

また、内向きで利用するドメインとその検索先をforward-zonesの項目に設定する。
今回は.localドメインを追加するので下記の用に設定した。

転送先の設定例
forward-zones=local=<転送先のDNSサーバー>

それ以外の設定は特にいじっていないため、必要に応じてrecursor.confを編集する。

以上で、Dockerファイルの準備は完了した。

このDockerファイルもここにPushしてある。

この状態でコンテナを立ち上げると、以下の様なエラーが発生しポートのバインドに失敗する。

0.0.0.0:53: bind: address already in use

事項で、調査方法と設定変更法を記載する。

Armbianの設定

以下のコマンドで、53番ポートを使用しているアプリを調査。

sudo lsof -i -P | grep "LISTEN"

ポートを占有していた正体は、dnsmasqである。

詳細は割愛するが、簡易DNSサーバである。

Armbianは起動時に、NetworkManger経由でたちあげているようなので、以下のコマンドで設定変更・停止する。

NetworkManagerの設定ファイル
$ sudo vi /etc/NetworkManager/NetworkManager.conf
viで編集する項目/[main]のdnsをコメントアウト
[main]
dns=none
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=true
[keyfile]
unmanaged-devices=interface-name:p2p0
NetworkMangerを再起動
$ sudo systemctl restart network-manager

DNSの設定確認

ブラウザのアドレスバーにArmbianのIPアドレスを打ち込むとPowerDNS-Adminが表示される。

新規にDNSを登録し、正常に登録されればdigやhostコマンドなどで動作を確認する。

(例)digコマンド
$ dig @<ArmbianのIPアドレス> <作成したアドレス>

もし、PowerDNS-Adminでエラーが出る場合はdocker-compose upをしたターミナルを見るとPowerDNSのログが出ている。

発生しやすいエラーとして、SQLiteへの書き込みが出来ない場合である。

その場合は、ファイルの権限を見直しPowerDNSだけを再起動すれば正しく読み込むことが出来る。

今後の課題

リバースプロキシを設定したが、現在の設定だとPowerDNS以外のサービスの提供が難しい。

そこで、uWSGIを利用してパスを分けようとしたが、正しく起動することが出来なかった。

参考

UBUNTU DNSMASQを停止する