Unbound + PowerDNS + MariaDB で DNS
以前 Unbound と NSD で DNS サーバーを構築していたのだが、NSD は起動から暫しないとゾーンファイルの内容が反映され得ない問題があった為、今回は PowerDNS と MariaDB を用いた方法で構築してみたいと思う。
- インストール
※ Ubuntu や BSD、Debian、MacOSX でのインストールはこちらをご覧ください。$ sudo dnf install pdns pdns-backend-mysql pdns-tools
- データベースとテーブル、ユーザーの作成
※赤字の部分は必ず変更してください。青字の部分はシステムによって異なります。$ mariadb -u root -p Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 296
Server version: 10.5.13-MariaDB-log MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE powerdns CHARACTER SET utf8;
Query OK, 1 row affected (0.001 sec)MariaDB [(none)]> GRANT ALL PRIVILEGES ON powerdns.* TO ‘powerdns’@’%’ IDENTIFIED BY ‘PASSWD‘;
Query OK, 0 rows affected (0.001 sec)MariaDB [(none)]> GRANT ALL PRIVILEGES ON powerdns.* TO ‘powerdns’@’localhost’ IDENTIFIED BY ‘PASSWD‘;
Query OK, 0 rows affected (0.001 sec)MariaDB [(none)]> use powerdns
Database changedMariaDB [powerdns]> source /usr/share/doc/pdns/schema.mysql.sql
Query OK, 0 rows affected (0.063 sec)
- ゾーンファイルからデータの作成
※ ゾーンから作成する方法以外に色々な方法があります。詳しくはコチラ。# zone2sql –gmysql=yes –zone=/var/lib/nsd/zone/magic-object.mydns.jp.zone | mariadb -u root –database=powerdns -p
1 domains were fully parsed, containing 22 records
Enter password:
# zone2sql –gmysql=yes –zone=/var/lib/nsd/zone/3.168.192.in-addr.arpa.zone | mariadb -u root –database=powerdns -p
1 domains were fully parsed, containing 12 records
Enter password:
#
※ ゾーンファイルの作成はコチラ。 - PowerDNS の基本設定
「/etc/pdns/pdns.conf」を編集します。- MariaDB の接続設定
参考はコチラです。launch=gmysql
gmysql-socket=/var/lib/mysql/mysql.sock
gmysql-host=localhost
gmysql-user=powerdns
gmysql-password=PASSWORD
gmysql-dbname=powerdns
- 問い合わせを受け付けるアドレスとポート
参考はコチラ&コチラです。#################################
# local-address Local IP addresses to which we bind
#
# Listen するアドレス
#
# local-address=0.0.0.0, ::
local-address=127.0.0.1, ::1#################################
# local-port The port on which we listen
#
# Listen するポート
#
# local-port=53
local-port=10053 - ログの設定
log-dns-details=yes
log-dns-queries=yes
log-timestamp=yes
logging-facility=0
loglevel=4 - 権威DNS設定
参考はコチラ&コチラ。権威サーバー設定が妥当だと思われるため。################################
# master Act as a primary
#
# master=no
master=yes#################################
# primary Act as a primary
#
# primary=no
primary=yes
- 問い合わせを受け付けるアドレス(ACL)
DNS として問い合わせを受け付けるアドレス。(ACL)参考はコチラ。################################
# query-local-address Source IP addresses for sending queries
#
# query-local-address=0.0.0.0 ::
query-local-address=127.0.0.1:1053 [::1]:1053
- 実行UID と GID
参考はコチラ&コチラ。#################################
# setgid If set, change group id to this gid for more security
#
setgid=pdns#################################
# setuid If set, change user id to this uid for more security
#
setuid=pdns
- WEB サービスの実現(任意)
※ これは「PowerAdmin」ではありません。あくまでスループットなどを見るモノです。
参考はコチラです。# webserver Start a webserver for monitoring (api=yes also enables the HTTP listener)
#
# webserver=no
webserver=yes#################################
# webserver-address IP Address of webserver/API to listen on
#
# webserver-address=127.0.0.1
webserver-address=127.0.0.1#################################
# webserver-allow-from Webserver/API access is only allowed from these subnets
#
# webserver-allow-from=127.0.0.1,::1
webserver-allow-from=127.0.0.1,::1,172.0.0.0/8,192.168.0.0/16#################################
# webserver-allow-from Webserver/API access is only allowed from these subnets
#
# webserver-allow-from=127.0.0.1,::1
webserver-allow-from=127.0.0.1,::1,172.0.0.0/8,192.168.0.0/16#################################
# webserver-loglevel Amount of logging in the webserver (none, normal, detailed)
#
# webserver-loglevel=normal
webserver-loglevel=detailed#################################
# webserver-max-bodysize Webserver/API maximum request/response body size in megabytes
#
# webserver-max-bodysize=2#################################
# webserver-password Password required for accessing the webserver
#
# webserver-password=#################################
# webserver-port Port of webserver/API to listen on
#
# webserver-port=8081
webserver-port=8053#################################
# webserver-print-arguments If the webserver should print arguments
#
# webserver-print-arguments=no
サンプル画面
- 「.te」ファイル
SELinux のパーミッションエラーが出たので .TE ファイルを作成しました。
「my-pdns.te」ファイル。コンパイルとインストールの方法はコチラ。module my-pdns 1.0;
require {
type unreserved_port_t;
type pdns_t;
class tcp_socket name_bind;
class udp_socket name_bind;
}#============= pdns_t ==============
#!!!! This avc can be allowed using the boolean ‘nis_enabled’
allow pdns_t unreserved_port_t:tcp_socket name_bind;#!!!! This avc can be allowed using the boolean ‘nis_enabled’
allow pdns_t unreserved_port_t:udp_socket name_bind;
- MariaDB の接続設定
Unbound の設定
- Unbound の設定は NSD を用いた方法と同じです。詳しくはコチラを確認して下さい。
確認
- 正引き
※ 「systemd-resolve」→「unbound」→「powerdns」の順番で検索しています。$ dig www.magic-object.com
; <<>> DiG 9.16.24-RH <<>> www.magic-object.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27793
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.magic-object.com. IN A;; ANSWER SECTION:
www.magic-object.com. 81204 IN CNAME nagato.magic-object.mydns.jp.
nagato.magic-object.mydns.jp. 81204 IN A 192.168.3.4;; Query time: 1 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sat Jan 15 03:11:09 JST 2022
;; MSG SIZE rcvd: 91
- 逆引き
$ dig -x 192.168.3.4
; <<>> DiG 9.16.24-RH <<>> -x 192.168.3.4
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64755
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;4.3.168.192.in-addr.arpa. IN PTR;; ANSWER SECTION:
4.3.168.192.in-addr.arpa. 86400 IN PTR nagato.magic-object.mydns.jp.;; Query time: 5 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sat Jan 15 03:16:13 JST 2022
;; MSG SIZE rcvd: 95※ 「systemd-resolve」→「unbound」→「powerdns」の順番で検索しています。
systemd-resolve を使用している場合
デスクトップ環境で「systemd-resolve」を使用している場合は、次の設定を行ってください。
- 「/etc/systemd/resolved.conf」を編集
※ 「Unbound」の参照と、見つからない場合は google で検索。DNS=127.0.0.1 ::1
FallbackDNS=8.8.8.8 8.8.4.4
- systemd-networkd の設定
※ ファイルが無ければ新規作成して下さい。
「/etc/systemd/network/dns_network.conf」[Network]
DNS=127.0.0.1 ::1 - systemd-networkd の再起動
# systemctl restart systemd-networkd - systemd-resolved の再起動
※ 「resolv.conf mode: stub」が「resolv.conf mode: foreign」になる事もありますが、どちらでも問題ありません。(foreign の方が正しい気もしますが…。)# systemctl restart systemd-resolved.service # systemd-resolve –status
Global
Protocols: LLMNR=resolve -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Current DNS Server: 127.0.0.1
DNS Servers: 127.0.0.1 ::1
Fallback DNS Servers: 8.8.8.8 8.8.4.4Link 2 (enp0s25)
Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 127.0.0.1
DNS Servers: 127.0.0.1 8.8.8.8 2001:a7ff:5f01::a 2001:a7ff:5f01:1::a
DNS Domain: flets-west.jp iptvf.jpLink 3 (virbr0)
Current Scopes: none
Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
#
systemd-resolve を無効化する場合
systemd-resolve を無効化する場合、「/etc/resolv.conf」のシンボリックリンク「/run/systemd/resolve/stub-resolv.conf」が生成されません。
この影響により、仮想マシンや GNOME-BOXES でネットワークが参照できない問題が発生する場合があります。
「systemd-resolve」の停止
# systemctl stop systemd-resolved # systemctl disable systemd-resolved
「/etc/resolv.conf.manually-configured」の作成
以下の内容で作成します。
[main] dns=127.0.0.1
シンボリックリンクの張り直し
# rm /etc/resolv.conf # ln -s resolv.conf.manually-configured resolv.conf