CentOS8で構築する自宅サーバ:dnsサーバの構築 その1

いきなり大物です!dnsサーバを立ててみましょう。最近のdnsサーバはいろんな機能があるので、1回では済みそうにありません。以下のように分けて書いておこうと思います。

  • 基本的な設定で構築し動作確認
  • サーバ証明書取得機能追加
  • 迷惑 (なりすまし) メール対応機能追加
  • 権威dnsサーバのdnssec対応

基本的な設定で構築

インストールするソフトウェアは一般的なbindを使います。

また、パッケージによるchroot構成もできますが、今回は使いません。理由はSELinuxと同じで、使いにくい割に効果は今ひとつだからです。

bindは権限のないnamedユーザで起動するので、万が一bindがクラックされて侵入されたとしてもnamedユーザ権限の範囲でしかシステムをいじることができないでしょう。

[root@ace ~]# dnf install bind bind-utils
メタデータの期限切れの最終確認: 3:05:10 時間前の 2020年02月18日 20時41分25秒 に 実施しました。
依存関係が解決しました。
================================================================================
 パッケージ          Arch        バージョン                リポジトリー   サイズ
================================================================================
インストール:
 bind                x86_64      32:9.11.4-26.P2.el8       AppStream      2.1 M
 bind-utils          x86_64      32:9.11.4-26.P2.el8       AppStream      436 k
依存関係のインストール:
 bind-libs           x86_64      32:9.11.4-26.P2.el8       AppStream      170 k
 bind-libs-lite      x86_64      32:9.11.4-26.P2.el8       AppStream      1.1 M
 bind-license        noarch      32:9.11.4-26.P2.el8       AppStream       99 k
 python3-bind        noarch      32:9.11.4-26.P2.el8       AppStream      146 k

トランザクションの概要
================================================================================
インストール  6 パッケージ

ダウンロードサイズの合計: 4.1 M
インストール済みのサイズ: 10 M
これでよろしいですか? [y/N]: y
:
省略
:
インストール済み:
  bind-32:9.11.4-26.P2.el8.x86_64
  bind-utils-32:9.11.4-26.P2.el8.x86_64
  bind-libs-32:9.11.4-26.P2.el8.x86_64
  bind-libs-lite-32:9.11.4-26.P2.el8.x86_64
  bind-license-32:9.11.4-26.P2.el8.noarch
  python3-bind-32:9.11.4-26.P2.el8.noarch

完了しました!
[root@ace ~]#

dnfコマンドでbindとbind-utilsのパッケージをインストールします。bind-utilsにはdns関連のコマンドが入っていたんじゃないかな。

さっそく、設定ファイルの編集です。

[root@ace ~]# cp -p /etc/named.conf /etc/named.conf.orig
[root@ace ~]# vi /etc/named.conf
[root@ace ~]#
[root@ace ~]# cat /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { any; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { any; };

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion no;

        dnssec-enable yes;
        dnssec-validation yes;

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
        channel query-log {
                file "/var/log/named/query.log";
                severity info;
                print-category yes;
                print-severity yes;
                print-time yes;
        };
        channel update-log {
                file "/var/log/named/update.log";
                severity info;
                print-category yes;
                print-severity yes;
                print-time yes;
        };
        channel xfer-log {
                file "/var/log/named/xfer.log";
                severity info;
                print-category yes;
                print-severity yes;
                print-time yes;
        };
        channel default-log {
                file "/var/log/named/default.log";
                severity info;
                print-category yes;
                print-severity yes;
                print-time yes;
        };
        category queries { query-log; };
        category update { update-log; };
        category xfer-in { xfer-log; };
        category xfer-out { xfer-log; };
        category lame-servers { null; };
        category default { default-log; };
};

include "/etc/named.root.key";

view "internal" {

        match-clients { localhost; localnets; };
        allow-query     { localhost; localnets; };
        allow-recursion { localhost; localnets; };
        allow-query-cache { localhost; localnets; };
        recursion yes;

        zone "." IN {
                type hint;
                file "named.ca";
        };

        zone "zeke.ne.jp" {
                type master;
                file "internal/zeke.ne.jp.zone";
                allow-transfer { localhost; localnets; };
        };

        zone "lo.zeke.ne.jp" {
                type master;
                file "internal/lo.zeke.ne.jp.zone";
                allow-transfer { localhost; localnets; };
        };

        zone "0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.ip6.arpa" {
                type master;
                file "internal/lo.zeke.ne.jp.rev6";
                allow-transfer { localhost; localnets; };
        };

        zone "1.168.192.in-addr.arpa" {
                type master;
                file "internal/lo.zeke.ne.jp.rev";
                allow-transfer { localhost; localnets; };
        };

        include "/etc/named.rfc1912.zones";
:
省略
:
};

view "external" {

        match-clients { any; };
        allow-query     { any; };
        allow-recursion { none; };
        allow-query-cache { none; };
        recursion no;

        zone "zeke.ne.jp" {
                type master;
                file "external/zeke.ne.jp.zone";
                allow-transfer { none; };
        };
:
省略
:
};

[root@ace ~]#

optionsステートメントでは「listen-on port 53 { any; };」「listen-on-v6 port 53 { any; };」「allow-query { any; };」を変更してます。誰からでの問い合わせを受ける!

また「recursion no;」として、再帰問い合わせを行わないにしてます。yesだと自分で管理していないドメインに対してもIPアドレスを調べてくれるようになります。

デフフォルトでdnssecが有効になっています。これは、DNSキャッシュサーバとして他のドメインの問い合わせを行ったときに、証明書で正当なものかをチェックしてくれます。これはそのままにしておきます。

loggingステートメントではログをいっぱい出すように変更しました。chrootをかけてると/var/logにログをはけないと思います。

viewステートメントで、内部向けと外部向けの定義を分けています。これは内部向けにはプライベートIPアドレスを外部向けにはグローバルIPアドレスを返答するためです。IPv6みたいにみんなグローバルアドレスだったら分ける必要がないのに。面倒ですよね。

内部向けは「match-clients { localhost; localnets; };」で内部ネットワーク限定にして、「recursion yes;」再帰問い合わせ有り、「allow-query」「allow-recursion」「allow-query-cache」も許可にしてます。

また、各ゾーンファイルは以下の通り

[root@ace ~]# cat /var/named/internal/zeke.ne.jp.zone
$TTL    3600
@       IN      SOA     ns.zeke.ne.jp. root.ns.zeke.ne.jp. (
                        2020021701      ; Serial
                        3600            ; Refresh after 1 hour
                        600             ; Retry after 10 minute
                        1209600         ; Expire after 2 weeks
                        3600    )       ; Minimum TTL of 1 hour
;
        IN      NS      ns.zeke.ne.jp.
        IN      NS      joeker.zeke.ne.jp.
;
        IN      A       192.168.1.4
        IN      AAAA    2001:2c0:cd03:ca00::4
        IN      MX      10      mail.zeke.ne.jp.
;
ns      IN      A       192.168.1.4
        IN      AAAA    2001:2c0:cd03:ca00::4
        IN      MX      10      mail.zeke.ne.jp.
;
joeker  IN      A       192.168.1.4
        IN      AAAA    2001:2c0:cd03:ca00::4
        IN      MX      10      mail.zeke.ne.jp.
;
mail    IN      A       192.168.1.4
        IN      MX      10      mail.zeke.ne.jp.
;
www     IN      CNAME   ns
irc     IN      CNAME   ns
ftp     IN      CNAME   ns
redh    IN      CNAME   ns
shoot   IN      CNAME   ns
blog    IN      CNAME   ns
matomo  IN      CNAME   ns
info    IN      CNAME   ns
*.info  IN      CNAME   ns
;
myhome  IN      A       192.168.1.4
        IN      AAAA    2001:2c0:cd03:ca00::4
        IN      MX      10      mail.zeke.ne.jp.
;
ace     IN      A       192.168.1.1
        IN      AAAA    2001:2c0:cd03:ca00::ace
        IN      MX      10      mail.zeke.ne.jp.
[root@ace ~]# cat /var/named/internal/lo.zeke.ne.jp.zone
$TTL    86400
@               IN      SOA     ns.lo.zeke.ne.jp. root.ns.lo.zeke.ne.jp. (
                                2020021701      ; Serial
                                3600            ; Refresh after 1 hour
                                600             ; Retry after 1 minute
                                1209600         ; Expire after 2 weeks
                                86400 )         ; Minimum TTL of 1 day
                IN      NS      ns.lo.zeke.ne.jp.
;
                IN      A       192.168.1.4
                IN      AAAA    2001:2c0:cd03:ca00::4
                IN      MX      10      mail.zeke.ne.jp.
;
ns              IN      A       192.168.1.4
                IN      AAAA    2001:2c0:cd03:ca00::4
                IN      MX      10      mail.zeke.ne.jp.
;
mail            IN      A       192.168.1.4
                IN      MX      10      mail.zeke.ne.jp.
;
www             IN      CNAME   ns
irc             IN      CNAME   ns
ftp             IN      CNAME   ns
redh            IN      CNAME   ns
shoot           IN      CNAME   ns
blog            IN      CNAME   ns
matomo          IN      CNAME   ns
info            IN      CNAME   ns
*.info          IN      CNAME   ns
;
ace             IN      A       192.168.1.1
                IN      AAAA    2001:2c0:cd03:ca00::ace
                IN      MX      10      mail.zeke.ne.jp.
;
vm              IN      A       192.168.1.2
                IN      AAAA    2001:2c0:cd03:ca00::2
                IN      MX      10      mail.zeke.ne.jp.
;
ara             IN      A       192.168.1.3
                IN      AAAA    2001:2c0:cd03:ca00::3
                IN      MX      10      mail.zeke.ne.jp.
;
myhome          IN      A       192.168.1.4
                IN      AAAA    2001:2c0:cd03:ca00::4
                IN      MX      10      mail.zeke.ne.jp.
[root@ace ~]# cat /var/named/internal/lo.zeke.ne.jp.rev
$TTL    86400
@       IN      SOA     ns.lo.zeke.ne.jp. root.ns.lo.zeke.ne.jp. (
                                2020021701      ; Serial
                                3600            ; Refresh after 1 hour
                                600             ; Retry after 1 minute
                                1209600         ; Expire after 1 weeks
                                86400 )         ; Minimum TTL of 1 day
        IN      NS      ns.lo.zeke.ne.jp.
        IN      NS      joeker.lo.zeke.ne.jp.
;
0       IN      PTR     lo.zeke.ne.jp.
1       IN      PTR     ace.lo.zeke.ne.jp.
2       IN      PTR     vm.lo.zeke.ne.jp.
3       IN      PTR     ara.lo.zeke.ne.jp.
4       IN      PTR     myhome.lo.zeke.ne.jp.
[root@ace ~]# cat /var/named/internal/lo.zeke.ne.jp.rev6
$TTL    86400
$ORIGIN 0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.ip6.arpa.
@       IN      SOA     ns.lo.zeke.ne.jp. root.ns.lo.zeke.ne.jp. (
                                2019051801      ; Serial
                                3600            ; Refresh after 1 hour
                                600             ; Retry after 1 minute
                                1209600         ; Expire after 1 weeks
                                86400 )         ; Minimum TTL of 1 day
        IN      NS      ns.lo.zeke.ne.jp.
        IN      NS      joeker.lo.zeke.ne.jp.
;
$ORIGIN 0.0.0.0.0.0.0.0.0.0.0.0.0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.ip6.arpa.
;
0.0.0.0 IN      PTR     lo.zeke.ne.jp.
e.c.a.0 IN      PTR     ace.lo.zeke.ne.jp.
2.0.0.0 IN      PTR     vm.lo.zeke.ne.jp.
3.0.0.0 IN      PTR     ara.lo.zeke.ne.jp.
4.0.0.0 IN      PTR     myhome.lo.zeke.ne.jp.

もっとたくさんホストは定義してありますが、省略です。ポイントとしてネームサーバとメールサーバはAレコードで明示的にIPアドレスを書いておかないといけなかったと思います。

内部向けは、ローカルな独自ドメインlo.zeke.ne.jpに逆引きの設定も入れてます。

viewセクションで外部向けは「match-clients { any; };」でどこからの問い合わせもOK!、「recursion no;」で再帰問い合わせなし、「allow-query」は許可、「allow-recursion」「allow-query-cache」は不許可にしてます。

[root@ace ~]# cat /var/named/external/zeke.ne.jp.zone
$TTL    3600
@       IN      SOA     ns.zeke.ne.jp. root.ns.zeke.ne.jp. (
                        2020021701      ; Serial
                        3600            ; Refresh after 1 hour
                        600             ; Retry after 10 minute
                        1209600         ; Expire after 2 weeks
                        3600    )       ; Minimum TTL of 1 hour
;
        IN      NS      ns.zeke.ne.jp.
        IN      NS      joeker.zeke.ne.jp.
;
        IN      A       203.152.220.46
        IN      AAAA    2001:2c0:cd03:ca00:0:0:0:4
        IN      MX      10      mail.zeke.ne.jp.
;
ns      IN      A       203.152.220.46
        IN      AAAA    2001:2c0:cd03:ca00:0:0:0:4
        IN      MX      10      mail.zeke.ne.jp.
;
joeker  IN      A       203.152.220.46
        IN      AAAA    2001:2c0:cd03:ca00:0:0:0:4
        IN      MX      10      mail.zeke.ne.jp.
;
mail    IN      A       203.152.220.46
        IN      MX      10      mail.zeke.ne.jp.
;
www     IN      CNAME   ns
irc     IN      CNAME   ns
ftp     IN      CNAME   ns
redh    IN      CNAME   ns
shoot   IN      CNAME   ns
blog    IN      CNAME   ns
matomo  IN      CNAME   ns
info    IN      CNAME   ns
*.info  IN      CNAME   ns
;
myhome  IN      A       203.152.220.46
        IN      AAAA    2001:2c0:cd03:ca00:0:0:0:4
        IN      MX      10      mail.zeke.ne.jp.
;
ace     IN      AAAA    2001:2c0:cd03:ca00:0:0:0:ace
        IN      MX      10      mail.zeke.ne.jp.

再帰問い合わせなしなので、このゾーンの内容しか返答しません。

ディレクトリ、ファイルの権限変更

chrootを使わないので、各ファイルの権限はちゃんとチェックしておきましょう。

[root@ace ~]# ls -l /etc/named.conf
-rw-r----- 1 root named 4409  2月 19 20:48 /etc/named.conf
[root@ace ~]# 
[root@ace ~]# ls -alR /var/named/internal/
/var/named/internal/:
合計 28
drwxr-x--- 2 root named  178  2月 19 01:10 .
drwxrwx--T 7 root named  159  2月 19 03:07 ..
-rw-r----- 1 root named 1535  2月 19 00:57 lo.zeke.ne.jp.rev
-rw-r----- 1 root named  964  2月 19 00:58 lo.zeke.ne.jp.rev6
-rw-r----- 1 root named 3230  2月 19 01:09 lo.zeke.ne.jp.zone
-rw-r----- 1 root named  880  2月 19 01:10 zeke.ne.jp.zone
:
[root@ace ~]#
[root@ace ~]# ls -alR /var/named/external/
/var/named/external/:
合計 16
drwxr-x--- 2 root named  101  2月 19 01:25 .
drwxrwx--T 7 root named  159  2月 19 03:07 ..
-rw-r----- 1 root named 1415  2月 19 01:24 zeke.ne.jp.zone
:
[root@ace ~]#
[root@ace ~]# ls -alR /var/log/named/
/var/log/named/:
合計 8
drwxr-xr-x 2 named named   56  2月 19 02:38 .
drwxr-xr-x 9 root  root  4096  2月 19 00:38 ..
:
[root@ace ~]#

「/etc/named.conf」は秘密情報が入るので、rootは読み書きnamedユーザ読むだけにしています。ゾーンファイルやそのディレクトリは、公開情報しか書かれていませんが、同様にrootは読み書きnamedユーザ読むだけです。

ログディレクトリは、namedユーザで書き込めるようにしておきましょう。

動作確認

[root@ace ~]# named-checkconf /etc/named.conf
[root@ace ~]#
[root@ace ~]# named-checkzone "zeke.ne.jp" /var/named/internal/zeke.ne.jp.zone
zone zeke.ne.jp/IN: loaded serial 2020021701
OK
[root@ace ~]# named-checkzone "lo.zeke.ne.jp" /var/named/internal/lo.zeke.ne.jp.zone
zone lo.zeke.ne.jp/IN: loaded serial 2020021701
OK
[root@ace ~]# named-checkzone "lo.zeke.ne.jp" /var/named/internal/lo.zeke.ne.jp.zone
zone lo.zeke.ne.jp/IN: loaded serial 2020021701
OK
[root@ace ~]# named-checkzone "0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.IP6.ARPA" /var/named/internal/lo.zeke.ne.jp.rev6
zone 0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.IP6.ARPA/IN: loaded serial 2019051801
OK
[root@ace ~]# named-checkzone "1.168.192.IN-ADDR.ARPA" /var/named/internal/lo.zeke.ne.jp.rev
zone 1.168.192.IN-ADDR.ARPA/IN: loaded serial 2020021701
OK
[root@ace ~]# named-checkzone "zeke.ne.jp" /var/named/external/zeke.ne.jp.zone
zone zeke.ne.jp/IN: loaded serial 2020021701
OK
[root@ace ~]#

まずは、「/etc/named.conf」とゾーンファイルのチェックです。ほとんど現行からのコピーなので問題ありませんね。

[root@ace ~]# systemctl is-enabled named
disabled
[root@ace ~]# systemctl enable named
Created symlink /etc/systemd/system/multi-user.target.wants/named.service → /usr/lib/systemd/system/named.service.
[root@ace ~]# systemctl start named
[root@ace ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor prese>
   Active: active (running) since Wed 2020-02-19 22:59:37 JST; 6s ago
  Process: 1612 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (co>
  Process: 1609 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "y>
 Main PID: 1614 (named)
    Tasks: 4 (limit: 25027)
   Memory: 78.4M
   CGroup: /system.slice/named.service
           mq1614 /usr/sbin/named -u named -c /etc/named.conf

 2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: automatic empty zone: view inte>
 2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: automatic empty zone: view inte>
 2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: none:103: 'max-cache-size 90%' >
 2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: set up managed keys zone for vi>
 2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: none:103: 'max-cache-size 90%' >
 2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: configuring command channel fro>
 2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: command channel listening on 12>
 2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: configuring command channel fro>
 2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: command channel listening on ::>
 2月 19 22:59:37 ace.lo.zeke.ne.jp systemd[1]: Started Berkeley Internet Name D>
[root@ace ~]#

「systemctl is-enabled named」コマンドで、自動起動が無効になっていることを確認したので、「systemctl enable named」コマンドで有効にしておきます。

「systemctl start named」コマンドでbindを起動、「systemctl status named」コマンドでステータスを確認。「active (running)」とあるので、無事起動しています。

[root@ace ~]# nslookup
> server 127.0.0.1
Default server: 127.0.0.1
Address: 127.0.0.1#53
> ns.zeke.ne.jp
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   ns.zeke.ne.jp
Address: 192.168.1.4
Name:   ns.zeke.ne.jp
Address: 2001:2c0:cd03:ca00::4
> server ::1
Default server: ::1
Address: ::1#53
> ns.zeke.ne.jp
Server:         ::1
Address:        ::1#53

Name:   ns.zeke.ne.jp
Address: 192.168.1.4
Name:   ns.zeke.ne.jp
Address: 2001:2c0:cd03:ca00::4
> google.com
Server:         ::1
Address:        ::1#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.31.142
Name:   google.com
Address: 2404:6800:4004:808::200e
> exit

[root@ace ~]#

「nslookup」コマンドで、ns.zeke.ne.jpのホスト名からIPアドレスが引けるかを確認します。IPv4&IPv6ともに大丈夫なようですね。

外部のドメイン google.comも引けるので、再帰問い合わせが有効であることも確認できました。

Firewallの設定変更

[root@ace ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@ace ~]#
[root@ace ~]# firewall-cmd --permanent --add-service=dns
success
[root@ace ~]#
[root@ace ~]# firewall-cmd --reload
success
[root@ace ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@ace ~]#

「firewall-cmd –permanent –add-service=dns」コマンドで、ファイヤーウォールにdnsサービスが疎通できるように穴を開けときます。ただし、まだルータの設定を変更していないので、外部からの問い合わせには答えられませんが。

Kindle Unlimited入会で無料で読めます!

コメント