Unbound + PowerDNS + MariaDB で DNS

以前 Unbound と NSD で DNS サーバーを構築していたのだが、NSD は起動から暫しないとゾーンファイルの内容が反映され得ない問題があった為、今回は PowerDNS と MariaDB を用いた方法で構築してみたいと思う。

  1. インストール

    $ sudo dnf install pdns pdns-backend-mysql pdns-tools
    ※ Ubuntu や BSD、Debian、MacOSX でのインストールはこちらをご覧ください。
     
  2. データベースとテーブル、ユーザーの作成

    $ 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 Server

    Copyright (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 changed

    MariaDB [powerdns]> source /usr/share/doc/pdns/schema.mysql.sql
    Query OK, 0 rows affected (0.063 sec)

     

    ※赤字の部分は必ず変更してください。青字の部分はシステムによって異なります。
     
  3. ゾーンファイルからデータの作成

    # 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:
    #
    ※ ゾーンから作成する方法以外に色々な方法があります。詳しくはコチラ
    ※ ゾーンファイルの作成はコチラ


  4. PowerDNS の基本設定

    「/etc/pdns/pdns.conf」を編集します。
     
    1. MariaDB の接続設定

      launch=gmysql
      gmysql-socket=/var/lib/mysql/mysql.sock
      gmysql-host=localhost
      gmysql-user=powerdns
      gmysql-password=PASSWORD
      gmysql-dbname=powerdns
      参考はコチラです。
       
    2. 問い合わせを受け付けるアドレスとポート

      #################################
      # 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

      参考はコチラ&コチラです。

    3. ログの設定

      log-dns-details=yes
      log-dns-queries=yes
      log-timestamp=yes
      logging-facility=0
      loglevel=4
       
    4. 権威DNS設定

      ################################
      # master Act as a primary
      #
      # master=no
      master=yes

      #################################
      # primary Act as a primary
      #
      # primary=no
      primary=yes

      参考はコチラ&コチラ。権威サーバー設定が妥当だと思われるため。
       
    5. 問い合わせを受け付けるアドレス(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

      DNS として問い合わせを受け付けるアドレス。(ACL)参考はコチラ
       
    6. 実行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

      参考はコチラコチラ
       
    7. 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

       

      参考はコチラです。

      サンプル画面

       
    8. 「.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;

Unbound の設定

  • Unbound の設定は NSD を用いた方法と同じです。詳しくはコチラを確認して下さい。

確認

  1. 正引き

    $ dig www.magic-object.mydns.jp

    ; <<>> DiG 9.16.24-RH <<>> www.magic-object.mydns.jp
    ;; 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.mydns.jp. IN A

    ;; ANSWER SECTION:
    www.magic-object.mydns.jp. 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

    ※ 「systemd-resolve」→「unbound」→「powerdns」の順番で検索しています。
     
  2. 逆引き

     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」を使用している場合は、次の設定を行ってください。

  1. 「/etc/systemd/resolved.conf」を編集

    DNS=127.0.0.1 ::1
    FallbackDNS=8.8.8.8 8.8.4.4
    ※ 「Unbound」の参照と、見つからない場合は google で検索。
     
  2. systemd-networkd の設定

    ※ ファイルが無ければ新規作成して下さい。

    「/etc/systemd/network/dns_network.conf」
    [Network]
    DNS=127.0.0.1 ::1

       
  3. systemd-networkd の再起動
    # systemctl restart systemd-networkd
       
  4. 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.4

    Link 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.jp

    Link 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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です