Bind9に別れを:PowerDNSとWeb UI管理ツールPowerDNS-Adminの構築ガイド

Network tutorial - IT technology blog
Network tutorial - IT technology blog

なぜPowerDNSがBind9に代わる「本命」なのか?

Bind9でDNSを管理したことがある人なら、ゾーンファイルを編集するたびに「冷や汗」をかいた経験があるはずです。ドット一つの打ち間違いやシリアル番号のミスだけで、システム全体が停止してしまいます。私はかつて、200以上のDNSレコードを持つ小規模なデータセンターを管理していましたが、些細な変更のために手動でコマンドを打ち込む作業は、効率と精度の面でまさに悪夢でした

それが、私がPowerDNSに切り替えた理由です。エラーが発生しやすいフラットなテキストファイルでデータを保存する代わりに、PowerDNSはすべてをデータベース(MariaDB、PostgreSQL)で管理します。PowerDNS-Adminと組み合わせることで、エンタープライズ級のダッシュボードを手に入れることができます。このシステムは、権限管理(RBAC)や変更履歴の保存をサポートしており、CI/CDプロセスへの統合や、DNS-01チャレンジによるLet’s Encrypt証明書の自動発行に最適な強力なAPIを提供します。

押さえておくべき3つのコアコンポーネント

コマンドを入力する前に、設定ミスを防ぐために各コンポーネントの違いを明確にしておきましょう。

  • PowerDNS Authoritative Server: システムの心臓部です。自分が所有するドメインに対するインターネットからのDNSクエリに回答します。注意:google.comのIPを探しに行くわけではありません(それはRecursorの役割です)。
  • PowerDNS-Admin: Flaskで書かれたWebインターフェースです。コントロールパネルの役割を果たし、APIを通じてサーバーと通信します。
  • Backend (MariaDB): すべてのDNSレコードを保存する中央データベースです。

Ubuntu 22.04/24.04での詳細なインストール手順

ステップ1:ポート53の解放

PowerDNSが起動できない典型的な原因はポートの競合です。Ubuntuではデフォルトでsystemd-resolvedがポート53を占有しています。これをすぐに無効化する必要があります。

# デフォルトサービスの停止
sudo systemctl disable --now systemd-resolved

# サーバーがパッケージをダウンロードできるよう一時的にDNSを設定
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

ステップ2:MariaDBのインストールとデータベースの初期化

データベースの安定性は不可欠です。PowerDNS専用のスペースを作成します。

sudo apt update && sudo apt install mariadb-server -y

# データベースとユーザーの作成
sudo mysql -u root
CREATE DATABASE powerdns;
GRANT ALL ON powerdns.* TO 'pdns_user'@'localhost' IDENTIFIED BY 'ChouKyoryokuNaPassword';
FLUSH PRIVILEGES;
EXIT;

ステップ3:PowerDNS Authoritative Serverのインストール

システムがMariaDBからデータを読み取れるよう、サーバーパッケージとMySQLバックエンドをインストールします。

sudo apt install pdns-server pdns-backend-mysql -y

次に、データベースにテーブル構造(スキーマ)をインポートします。このファイルは通常、インストールパッケージのドキュメントディレクトリにあります。

sudo zcat /usr/share/doc/pdns-backend-mysql/schema.mysql.sql.gz | mariadb -u pdns_user -p powerdns

ステップ4:データベース接続とAPIの設定

/etc/powerdns/pdns.confファイルを開きます。既存の行を削除するかコメントアウトし、以下の設定内容を貼り付けてください。IPアドレスとAPIキーは実際の環境に合わせて変更してください。

# MySQLバックエンドを使用
launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=pdns_user
gmysql-password=ChouKyoryokuNaPassword
gmysql-dbname=powerdns

# PowerDNS-Admin用のAPIを有効化
api=yes
api-key=YourChosenSecretKey123
webserver=yes
webserver-address=0.0.0.0
webserver-allow-from=127.0.0.1,192.168.1.0/24

新しい設定を適用するために再起動します:

sudo systemctl restart pdns
sudo systemctl enable pdns

ステップ5:Dockerを使用したPowerDNS-Adminのデプロイ

Pythonのvenvを使用してPowerDNS-Adminを手動でインストールするのは、ライブラリのエラーなどで非常に手間がかかります。最も効率的な解決策は、Docker Composeを使用して30秒でデプロイすることです。

version: '3'
services:
  pdns-admin:
    image: powerdnsadmin/pda-legacy:latest
    container_name: pdns-admin
    ports:
      - "8080:80"
    environment:
      - SQLALCHEMY_DATABASE_URI=mysql+pymysql://pdns_user:[email protected]/powerdns
      - GUNICORN_TIMEOUT=60

注:172.17.0.1は通常、Dockerコンテナから見たホストマシンのIPアドレスです。

動作確認と運用

http://Server-IP:8080にアクセスしてアカウントを作成した後、以下の手順を実行してください。

  1. APIの接続: Settings -> PDNS に移動し、URL http://127.0.0.1:8081 と作成したAPIキーを入力します。
  2. 名前解決テスト: テスト用に lab.local ゾーンとAレコードを作成します。dig @localhost -t A test.lab.local コマンドで確認し、正しいIPが返ってくればシステムは正常に動作しています。

DNS運用のための「教訓」

データを失ってから後悔しないよう、以下の3つの重要な注意点を守ってください。

  • DBの自動バックアップ: DNSが停止すると、すべてのサービスが停止します。mysqldumpを毎晩実行し、バックアップファイルを別のサーバーに転送するように設定しましょう。
  • APIのセキュリティ: ポート8081をインターネットに公開しないでください。ファイアウォール(UFW/Iptables)でlocalhostまたはAdminサーバーのIPのみを許可するように制限してください。
  • 高可用性 (HA): 重要なシステムでは、2つのPowerDNSノードを運用してください。MariaDBのレプリケーション機能を使用して、2台のサーバー間でレコードデータを即座に同期させます。

PowerDNSへの移行は、コマンド入力の手間を減らすだけでなく、ネットワークインフラ管理をよりプロフェッショナルなものにします。構築の成功と、DNSトラブルに悩まされない安眠を祈っています!

Share: