PowerDNS on CentOS6.9

# PowerDNS を RPM だけで構成する

* レポジトリに remi を使ってなぜか Poweradmin だけ tar ボールから持ってきている記事が多いですが、ここでは epel の rpm だけで構成します
 * Poweradmin のインストール php スクリプトが rpm に入っていないのでここだけ tar ボールで持ってきます。 
 * 関連パッケージ `pdns-3.3.3-2.el6.i686`, `pdns-backend-mysql-3.3.3-2.el6.i686`, `poweradmin-2.1.4-1.el6.noarch`
* CentOS6.9


## ネットワーク構成

* ドメイン **jp.cysec** とします

| 相対ドメイン名 | FQDN | IP | I/F | 備考 |
|---|---|---|---|---|
| ns1 | ns1.jp.cysec | 10.233.5.1 | eth1 | PowerDNS, Poweradmin, MySQL |
| なし |  | 10.233.3.230 | wlan0 | 10.233.5.1 の WiFi |
| localhost | | 127.0.0.1 | lo | 10.233.5.1 のローカル IP |
| suttle | shuttle.jp.cysec | 10.233.3.35 | | 別サーバー | 

## RPM パッケージのインストール
```shell-session
# yum -y install epel-release
# yum -y install php php-mcrypt php-pdo php-mysql pdns pdns-backend-mysql mysql-server httpd poweradmin
```

## MySQL に powerdns 用のテーブルを作る

```shell-session
# service mysqld start
# chkconfig mysqld on
# mysql_secure_installation
# mysql -u root
mysql> create database powerdns;
mysql> create user 'powerdns'@'localhost' identified by 'powerdns';
mysql> grant all privileges on powerdns.* to 'powerdns'@'localhost';
mysql> use powerdns;
```
* ここで以下の SQL で PowerDNS 用のテーブルを作成します。

### PowerDNS 用のテーブルを作成

* 最も、テーブルを作成したところで Poweradmin でのインストール php スクリプト実行時に作り直すようです

```sql
CREATE TABLE domains (
id INT auto_increment,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
primary key (id)
);

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
id INT auto_increment,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(6) DEFAULT NULL,
content VARCHAR(255) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
primary key(id)
);

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 TABLE supermasters (
ip VARCHAR(25) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) DEFAULT NULL
);
```
終わったら

```shell-session
mysql> exit;
```

## PowerDNS のデーモン（pdns）の設定
### バックエンドを MySQL にする
```shell-session:/etc/pdns/pdns.conf
#################################
# launch        Which backends to launch and order to query them in
#
# launch=
launch=gmysql
gmysql-host=localhost
gmysql-user=powerdns
gmysql-password=powerdns
gmysql-dbname=powerdns
```

### PowerDNS で解決できないときは google に問い合わせる
```shell-session:/etc/pdns/pdns.conf
#################################
# recursor      If recursion is desired, IP address of a recursing nameserver
#
# recursor=no
recursor=8.8.8.8
```
### ログを出すようにします
* [log の設定も行っておきます（参考にしたサイトへのリンク）](https://qiita.com/sion_cojp/items/dbdd10ebd246add1177d)

```shell-session:/etc/pdns/pdns.conf
log-dns-details=on
loglevel=3
logging-facility=0
```

```shell-session:/etc/rcyslog.conf
# Save powerdns messages also to pdns.log
local0.*                                                /var/log/pdns.log
```
* 設定を有効にします

```
# service rsyslog restart
```

## Poweradmin の設定

```php:/etc/poweradmin/config.inc.php
<?php

$db_host                = "localhost";
$db_user                = "powerdns";
$db_pass                = "powerdns";
$db_name                = "powerdns";
$db_type                = "mysql";

$iface_lang             = "en_EN";

$dns_hostmaster         = "jp.cysec";
$dns_ns1                = "ns1.jp.cysec";
$dns_ns2                = "ns1.jp.cysec";

?>
```

* 各変数の詳しい説明は [Configuration File](https://github.com/poweradmin/poweradmin/wiki/Configuration-File) にあります
* \$dns_ns2 の設定もしてますが、セカンダリネーム―サーバーは今回作らないので、\$dns_ns1 と同じにしておきました。
* \$dns_hostmaster, \$dns_ns1 を設定しすると下のようになります（この時点ではまだ動きません）。
 * ルールからはずれたトップレベルドメインを指定していますが、後で手当てします

```shell-session
[yamachan@localhost inc]$ dig @localhost jp.cysec soa

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6 <<>> @localhost jp.cysec soa
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31587
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;jp.cysec.                      IN      SOA

;; ANSWER SECTION:
jp.cysec.               86400   IN      SOA     ns1.jp.cysec. jp.cysec. 2018061702 28800 7200 604800 86400

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Jun 18 09:41:11 2018
;; MSG SIZE  rcvd: 6
```

### ルールからはずれたトップレベルドメインを許可

* これで **.jp.cysec** の名前引きが許可される。

```shell-session:/usr/share/poweradmin/inc/config-me.inc.php

//$dns_strict_tld_check = "1";
$dns_strict_tld_check   = false
```

* トップレベルドメイン（TLD） が何かは [List of Top-Level Domains](https://www.icann.org/resources/pages/tlds-2012-02-25-en) みればすぐわかるでしょう。

### Poweradmin インストール画面を動かす

* 恐らく `poweradmin-2.1.4-1.el6.noarch` がインストールされているはずですが、このパッケージにはインストール php スクリプトがありませんので他から持ってきます。

#### ダウンロードとインストール

https://github.com/poweradmin/poweradmin/releases の v2.1.4

```shell-session
$ wget https://github.com/poweradmin/poweradmin/archive/v2.1.4.tar.gz
$ tar xvfz v2.1.4.tar.gz
$ cd poweradmin-2.1.4
$ sudo cp -rp install /usr/share/poweradmin/
``` 

* まだ動きません...

## apache の設定

* 同一サーバーから Poweradmin を Web で操作するときは不要です。

```shell-session:/etc/httpd/conf.d/poweradmin.conf
Alias /poweradmin /usr/share/poweradmin
<Directory /usr/share/poweradmin/>
   order deny,allow
   deny from all
   #allow from 127.0.0.1
   allow from all
</Directory>
```
```shell-session
# service httpd restart
# chkconfig httpd on
```

## iptable の設定

* DNS と http を許可します。必要なとこだけ書き出すとこんな感じ

```shell-session:/etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# PowerDNS for external clients
-A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
```
* 全部書き出すと

```shell-session:/etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*nat
:PREROUTING ACCEPT [21:1829]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# PowerDNS for external clients
-A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

```shell-session
# iptables reload
```

## Poweradmin インストール画面を出す

```shell-session
# service pdns start
# chkconfig pdns on
```

http://127.0.0.1/poweradmin/install （他から操作するのであれば 127.0.0.1 を自サーバーの IP アドレスに置き換えてください）。

* 以下 [CentOS 7 x86_64に PowerDNS Authoritative Server 4.0.4 をインストール](https://qiita.com/kto/items/c195241babd290bea8e2) から画面を借用しています

### Installation step 1 [借用元](https://qiita.com/kto/items/c195241babd290bea8e2)
![Installation step 1](https://camo.qiitausercontent.com/cf8524877c0de6ab40b4136dfd94b6631c4ff249/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138393537302f39343439313830342d396532632d343431392d636362652d3363396264353839373137612e706e67 "Installation step 1")

* poweradmin-2.1.4 には日本語の選択肢はありません。 **I prefer to proceed in english.** を選択。

### Installation step 2 [借用元](https://qiita.com/kto/items/c195241babd290bea8e2)
![Installation step 1](https://camo.qiitausercontent.com/3843af702b82fec69610ac6f1873a9b0d9b57107/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138393537302f31633733373836332d373733352d303232312d616661372d6463363435356433303433662e706e67 "Installation step 2")

### Installation step 3 [借用元](https://qiita.com/kto/items/c195241babd290bea8e2)
![Installation step 3](
https://camo.qiitausercontent.com/784ecd4c04d0a2dbf1e3622dc22bb720ee493a45/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138393537302f30646337356437662d326131622d323134342d653963652d3531326266656662393732392e706e67 "Installation step 3")

* Installation step 3 でデータベースが作り直されるようです
* Username: **powerdns**
 * 該当 SQL: create user '**powerdns**'@'localhost' identified by 'powerdns';
* Password: **powerdns**
 * 該当 SQL: create user 'powerdns'@'localhost' identified by '**powerdns**';
* Database Type: **MySQL**
* Hostname: **localhost**
* DB Port: **3306**
* Database: **powerdns**
 * 該当 SQL: create database **powerdns**;
* Poweradmin administrator password: **powerdns**
 * Poweradmin のスーパーユーザーのパスワードです。ID は **admin** です。

### Installation step 3 [借用元](https://qiita.com/kto/items/c195241babd290bea8e2)
![Installation step 4](
https://camo.qiitausercontent.com/30a214e4972e3427a68f23187101741eb1541ccd/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138393537302f39656466333635382d383663372d356262372d353362322d3030336365633936613233352e706e67 "Installation step 4")

* Username: **powerdns**
 * 権限が制限されたユーザーが作られるようだが実際できているのは Installation step 3 で作成された admin だけ

```shell-session
mysql> select * from users\G
*************************** 1. row ***************************
         id: 1
   username: admin
   password: 687e379ed58bd4fa8d75df5d83cf6ae7
   fullname: Administrator
      email: admin@example.net
description: Administrator with full rights.
 perm_templ: 1
     active: 1
1 row in set (0.00 sec)
```
* Password: **powerdns**
 * 上記 Username に対するパスワードだがこれも作成されない
* Hostmaster: **jp.cysec**
 * `/etc/poweradmin/config.inc.php` 中の \$dns_hostmaster
 * 後で表示されるひな型に利用、`config.inc.php` が書き換えられるわけではない
* Primary nameserver: **ns1.jp.cysec**
 * `/etc/poweradmin/config.inc.php` 中の \$dns_ns1
 * 後で表示されるひな型に利用、`config.inc.php` が書き換えられるわけではない
* Secondary nameserver: **ns1.jp.cysec**
 * `/etc/poweradmin/config.inc.php` 中の \$dns_ns2
 * 後で表示されるひな型に利用、`config.inc.php` が書き換えられるわけではない
* 各変数の詳しい説明は [Configuration File](https://github.com/poweradmin/poweradmin/wiki/Configuration-File) にあります

### Installation step 5 [借用元](https://qiita.com/kto/items/c195241babd290bea8e2)
![Installation step 5](
https://camo.qiitausercontent.com/c2a693182bce58350b38e067b8947b3f7a015f0f/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138393537302f61373130626634632d646130362d663637642d353266362d3366663331363739376431622e706e67 "Installation step 5")

* コピーして MySQL に投入しろということですが、既に「MySQL に powerdns 用のテーブルを作る」で実行済なので、Step 6 に進みます
*  [借用元](https://qiita.com/kto/items/c195241babd290bea8e2) の貼り付けなので、画像の SQL は実際とは違います

### Installation step 6 [借用元](https://qiita.com/kto/items/c195241babd290bea8e2)
![Installation step 6](
https://camo.qiitausercontent.com/abb0c4274922c4186265f9f515a339bcf5274525/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138393537302f66316235346365312d366362302d386436312d663935372d3236613337303233303239382e706e67 "Installation step 6")

* これも `/etc/poweradmin/config.inc.php` にコピペしろということですが、既に「Poweradmin の設定」で作成済なので、Step 7 に進みます
*  [借用元](https://qiita.com/kto/items/c195241babd290bea8e2) の貼り付けなので、実際とは違います。poweradmin-2.1.4 では \$db_layer と $session_key は表示されませんでした
* 各変数の詳しい説明は [Configuration File](https://github.com/poweradmin/poweradmin/wiki/Configuration-File) にあります

### Installation step 7 [借用元](https://qiita.com/kto/items/c195241babd290bea8e2)
![Installation step 7](
https://camo.qiitausercontent.com/4a4de164aa0c1d086a4e58599383dace7345b019/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138393537302f61323735613962382d313830632d633535632d386531302d6661663266373831386264612e706e67 "Installation step 7")

* 「Poweadmin インストール画面を動かす」でコピーした install ディレクトリを消せと指示が出ます
* Installation step 3 で設定したパスワードが確認できます

### install ディレクトリを消します

* 消さないと、Poweradmin ログイン画面に入れません

```shell-session
$ sudo rm -rf /usr/share/poweradmin/install
```

## Poweradmin から設定

http://127.0.0.1/poweradmin/ （他から操作するのであれば 127.0.0.1 を自サーバーの IP アドレスに置き換えてください）。

* Login: **admin** Password: **powerdns**
* Password は Installation step 3 で決めた値

![poweradmin_login.png](https://qiita-image-store.s3.amazonaws.com/0/209900/42399fec-61f6-e475-149b-37ad96297399.png)

### index（ログイン直後の画面）

![poweradmin_index.png](https://qiita-image-store.s3.amazonaws.com/0/209900/38e2e695-4c31-76ad-3170-9bc433473bcc.png)

### Add master zone をクリック

![poweradmin_add_master_zone.png](https://qiita-image-store.s3.amazonaws.com/0/209900/40e260c0-c1ac-9119-f370-15b247e0e995.png)

* mastger zone に jp.cysec を追加します
* Zone name: **jp.cysec**
* Owner: **Administrator** （デフォルト）
* Type: **Native** （デフォルト）
* Template: **none** （デフォルト）
* `/etc/poweradmin/config.inc.php` は SOA には反映されますが、master zone が自動的に作られるわけではないです
 
### List zones をクリック

![poweradmin_list_zone.png](https://qiita-image-store.s3.amazonaws.com/0/209900/56548986-5704-b167-8ab8-52e906d040f3.png)

* Add master zone で作成した値が反映されています。
* バケツの左、edit アイコンで A レコードを追加していきます

### Edit zone

![poweradmin_edit_zone.png](https://qiita-image-store.s3.amazonaws.com/0/209900/861892fd-1ebd-f1aa-63bf-f90e63b266f5.png)

| Name | Type  | Content  | Priority TTL |
|---|---|---|---|
| ns1  | A | 10.233.5.1  | 86400 |
| shuttle  | A  | 10.233.5.35 | 86400 |

* Name は .jp.cysec を省略してもいいです（ns1 だけ入れると、.jp.cysec が補完されます）
* ns1.jp.cysec については、`/etc/poweradmin/config.inc.php` にて指定しているので、ここで PowerDNS のサーバーに向くようにします

## 動作確認

### resolv.conf の書き換え禁止

* ネットワークマネージャーが勝手に `resolv.conf` を書き換えないようにします

```yaml:/etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifcfg-rh
dns=none
```

* 書き換えたら NetworkManager を再起動

```shell-session
$ sudo service NetworkManager restart
```

* ネームサーバーとして自身を使うようにします

```shell-session:/etc/resolv.conf
domain jp.cysec
search jp.cysec
nameserver 127.0.0.1
```

### 名前で Ping してみる

* FQDN で

```shell-session
$ ping ns1.jp.cysec
PING ns1.jp.cysec (10.233.5.1) 56(84) bytes of data.
64 bytes from 10.233.5.1: icmp_seq=1 ttl=64 time=0.152 ms
64 bytes from 10.233.5.1: icmp_seq=2 ttl=64 time=0.243 ms
64 bytes from 10.233.5.1: icmp_seq=3 ttl=64 time=0.311 ms
64 bytes from 10.233.5.1: icmp_seq=4 ttl=64 time=0.308 ms
64 bytes from 10.233.5.1: icmp_seq=5 ttl=64 time=0.313 ms

--- ns1.jp.cysec ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 13270ms
rtt min/avg/max/mdev = 0.152/0.265/0.313/0.064 ms
```

* ドメイン名（jp.cysec）省略

```shell-session
$ ping shuttle
PING shuttle.jp.cysec (10.233.3.35) 56(84) bytes of data.
64 bytes from 10.233.3.35: icmp_seq=1 ttl=64 time=1.91 ms
64 bytes from 10.233.3.35: icmp_seq=2 ttl=64 time=1.98 ms
64 bytes from 10.233.3.35: icmp_seq=3 ttl=64 time=3.53 ms
64 bytes from 10.233.3.35: icmp_seq=4 ttl=64 time=1.78 ms
64 bytes from 10.233.3.35: icmp_seq=5 ttl=64 time=3.14 ms

--- shuttle.jp.cysec ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4011ms
rtt min/avg/max/mdev = 1.789/2.473/3.539/0.722 ms
```

* 外

```shell-session
$ ping www.yahoo.co.jp
PING edge.g.yimg.jp (182.22.31.124) 56(84) bytes of data.
64 bytes from edge1000.img.vip.bbt.yimg.jp (182.22.31.124): icmp_seq=1 ttl=57 time=27.1 ms
64 bytes from edge1000.img.vip.bbt.yimg.jp (182.22.31.124): icmp_seq=2 ttl=57 time=58.5 ms
64 bytes from edge1000.img.vip.bbt.yimg.jp (182.22.31.124): icmp_seq=3 ttl=57 time=43.5 ms
64 bytes from edge1000.img.vip.bbt.yimg.jp (182.22.31.124): icmp_seq=4 ttl=57 time=51.7 ms
64 bytes from edge1000.img.vip.bbt.yimg.jp (182.22.31.124): icmp_seq=5 ttl=57 time=50.4 ms

--- edge.g.yimg.jp ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4503ms
rtt min/avg/max/mdev = 27.194/46.308/58.578/10.680 ms
```