13
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Power DNSで権威サーバを構築する

Last updated at Posted at 2021-07-23

概要

NAT64/DNS64の検証をしたい。そのために好きに使えるDNSサーバを立てたい。DNSといえばBIND。 でも、設計が古く複雑とのことで、脆弱性がよく報告されている。「オープンソースソフトウェアで」「比較的メンテナンスされており」「GUIもあるもの」としてPower DNS を選んだ。

Power DNS は、Version 4.0系から

  1. 権威サーバ(Authoritative Server)
  2. 名前解決サーバ(Recursive Server)
    の二つに分離された。
    この記事では権威サーバを構築する。二つ目の記事は以下で用意。

検証環境

Power DNSはバックエンドにDatabaseを持つ。PostgreSQL/MySQL/SQLite3どれでも利用できる、ハズ。PowerDNSのインストレーションガイドではSQLiteを例に、Power DNS AdminではMySQLをベースにしていた。Power DNS Adminは相当にStepが多く複雑。今回はSQLite3を使用する。

種別 ソフトウェア バージョン 備考
OS Ubuntu Server 20.04.2
DNSサーバ Power DNS 4.2.1-1build2 APTでいれる
DBサーバ SQLite3 - APTでいれる

PowerDNSの構築

PowerDNSのインストール

sudo apt install pdns-server pdns-tools

Ubuntuの場合、systemd-resolvedがUDP/53を使用しているため、PowerDNSを入れた段階では起動に失敗する。サービスを止めておけば動きそうだが、今度は名前解決できず、aptでパッケージを入れられない。ここは気にしない方向で進む。

Databaseの用意(SQLite3の場合)

必要なパッケージのインストール

sudo apt install pdns-backend-sqlite3 sqlite3 libsqlite3-dev

Database作成

/usr/share/doc/pdns-backend-sqlite3/schema.sqlite3.sql にあるスキーマファイルを流し込んで作成する。

sudo mkdir /var/lib/powerdns
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 < /usr/share/doc/pdns-backend-sqlite3/schema.sqlite3.sql
sudo chown -R pdns:pdns /var/lib/powerdns

Databaseの用意(PostgreSQLの場合)

必要なパッケージのインストール

sudo apt install pdns-backend-pgsql postgresql

PostgreSQL ユーザ pdns を作成

sudo -u postgres createuser -P -s -e pdns
オプション 意味
-P 新しいユーザのパスワードプロンプトを表示
-s 新しいユーザをスーパーユーザにする
-e サーバに送ったコマンドをエコー表示する

パスワードなしでも作れはするが、PowerDNSからアクセスするにはPasswordを設定しないと動いてくれなかった。

Databaseの作成

/usr/share/pdns-backend-pgsql/schema/schema.pgsql.sql にあるスキーマファイルを流し込んで作成する。

sudo -u pdns createdb pdns
sudo -u pdns sh -c "psql -U pdns -d pdns -a -f /usr/share/pdns-backend-pgsql/schema/schema.pgsql.sql"

初期設定の変更(pdns.conf)

利用するデータベースを指定する。オプション設定が結構違う。

sudo vi /etc/powerdns/pdns.conf

変更前

#################################
# launch        Which backends to launch and order to query them in
#
# launch=

変更後(SQLiteの場合)

#################################
# launch        Which backends to launch and order to query them in
#
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3

変更後(PostgreSQLの場合)

#################################
# launch        Which backends to launch and order to query them in
#
launch=gpgsql
gpgsql-host=/run/postgresql # 多分不要。ソケット通信を利用している場合のみ
gpgsql-host=127.0.0.1
gpgsql-port=5432
gpgsql-dbname=pdns
gpgsql-user=pdns
gpgsql-password="PostgreSQLにログインする際のパスワード"

サービス開始

UbuntuではDNS Clientとしてsystemd-resolvedが動いており、このままだとPower DNSと競合するため停止する。停止すると、そのままではaptできなくなるので注意。

sudo systemctl stop systemd-resolved
sudo systemctl start pdns.service

起動確認

うまくいけばこんな感じ。Active の項目が active (running) になってくれる。

systemctl status pdns
● pdns.service - PowerDNS Authoritative Server
     Loaded: loaded (/lib/systemd/system/pdns.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-07-23 04:00:18 UTC; 50s ago
       Docs: man:pdns_server(1)
             man:pdns_control(1)
             https://doc.powerdns.com
   Main PID: 4968 (pdns_server)
      Tasks: 10 (limit: 2279)
     Memory: 6.7M
     CGroup: /system.slice/pdns.service
             mq4968 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write-pid=no

正常性確認

Power DNSのチュートリアル 通り、example.comをネタにレコードを追加

$ sudo pdnsutil create-zone example.com ns1.example.com
Creating empty zone 'example.com'
Also adding one NS record
$ sudo pdnsutil add-record example.com '' MX '25 mail.example.com'
New rrset:
example.com. 3005 IN MX 25 mail.example.com
$ sudo pdnsutil add-record example.com. www A 192.0.2.1
New rrset:
www.example.com. 3005 IN A 192.0.2.1

digコマンドで返ってくれば成功。

$ dig +short www.example.com @127.0.0.1
192.0.2.1
$ dig +short example.com MX @127.0.0.1
25 mail.example.com.

DB側の確認(SQLiteの場合)

SQLite側でどのようなレコードで登録されたかを確認する。RECORDSテーブルに登録されていく様子が見て取れる。

$ sudo sqlite3 /var/lib/powerdns/pdns.sqlite3
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> 
sqlite> .schema records
CREATE TABLE records (
  id                    INTEGER PRIMARY KEY,
  domain_id             INTEGER DEFAULT NULL,
  name                  VARCHAR(255) DEFAULT NULL,
  type                  VARCHAR(10) DEFAULT NULL,
  content               VARCHAR(65535) DEFAULT NULL,
  ttl                   INTEGER DEFAULT NULL,
  prio                  INTEGER DEFAULT NULL,
  disabled              BOOLEAN DEFAULT 0,
  ordername             VARCHAR(255),
  auth                  BOOL DEFAULT 1,
  FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX orderindex ON records(ordername);
sqlite>
sqlite>
sqlite>
sqlite> select * from records;
1|1|example.com|SOA|ns1.example.com hostmaster.example.com 1 10800 3600 604800 3600|3600|0|0||1
2|1|example.com|NS|ns1.example.com|3600|0|0||1
3|1|example.com|MX|mail.example.com|3600|25|0||1
4|1|www.example.com|A|192.0.2.1|3600|0|0||1
sqlite> .quit

RestAPI

いろいろあるが、PowerDNS Adminを使うのが面倒なさそう。PowerDNS Admin は、PowerDNSをRestAPIでもって制御する。PowerDNS Adminは、PowerDNS本体と同じサーバで動作させる想定のため、apiapi-keyだけ変更すればひとまずは何とかなる。 webserver-passwordなんてのもあってパスワードも設定できる。ただ、いかなる理由かPowerDNS Admin 側ではAPI 設定でパスワードの入力項目を見つけられなかった。

パラメータ デフォルト値 設定変更後 備考
api no(コメントアウト) yes
api-key 空欄(コメントアウト) 適当な値を設定
webserver-address 127.0.0.1(コメントアウト) -
webserver-port 8081(コメントアウト) -
#################################
# api   Enable/disable the REST API (including HTTP listener)
#
api=yes

#################################
# api-key       Static pre-shared authentication key for access to the REST API
#
api-key=<任意のパスワード>

変更後はPower DNS の再起動が必要。

$ sudo systemctl restart pdns.service

正常性確認

公式サイトのマニュアルをもと、実際にAPIを叩いてみる。

$ curl -H 'X-API-Key: <任意のパスワード>' http://127.0.0.1:8081/api/v1/servers/localhost/zones | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   240  100   240    0     0  15000      0 --:--:-- --:--:-- --:--:-- 16000
[
  {
    "account": "",
    "dnssec": false,
    "edited_serial": 1,
    "id": "example.com.",
    "kind": "Native",
    "last_check": 0,
    "masters": [],
    "name": "example.com.",
    "notified_serial": 0,
    "serial": 1,
    "url": "/api/v1/servers/localhost/zones/example.com."
  }
]

Power DNS側の設定はここまで。Rest API を叩くPower DNS Admin側は別の記事。
この記事も長くなりそうなので、別エントリーにする。

13
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?