centOS8.1にてDNSサーバーを立ち上げ

  • by

BINDのインストールと設定ファイル編集

参考ページ

CentOS8とbindでDNSサーバー構築

自宅でDNSサーバ構築実践

RedHat Customer Portal 第18章 BIND (BERKELEY INTERNET NAME DOMAIN)

後述しますが、RedHat Customer Portalはサービス起動時にSElinuxが邪魔していたため、原因と対処法を確認する際に参考にしました。

[1]BINDのインストール

yumでインストール出来ます。

[root@host ~]# yum install bind
[root@host ~]# yum install bind-utils

[2]Config編集

まずはnamed.confのコピーしてから編集

[root@host ~]# cp /etc/named.conf /etc/named.conf.old
[root@host ~]# vim /etc/named.conf

 

↓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.
//
acl "home" {
                192.168.xyz.0/24; 10.8.0.0/24; /* ※1 */
};

options {
        listen-on port 53 { 127.0.0.1; 192.168.xyz.1;  };
        listen-on-v6 port 53 { ::1; };
        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";
        //Only LocalNet DNS
        allow-query     { any; };
        //allow-recursion { localhost; localnets; };
        //allow-query-cache { localhost; localnets; };
        //allow-transfer { none;};
        forwarders{ 8.8.8.8; 8.8.4.4; };

        /*
         - 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 yes;

        dnssec-enable no;
        dnssec-validation no;

        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;
        };
};

view "internal" {
        match-clients { localhost; home; };

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

        zone "home.local" {
                type master;
                file "home.local.zone";
        };

        zone "100.168.192.in-addr.arpa" {
                type master;
                file "xyz.168.192.in-addr.arpa.rev";
        };

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

};
    • ※1  2022/7/3修正
      VPN接続時に使用するIPアドレスを追加しました。

[2]ゾーンファイルの作成

新規にゾーンファイルを作成します。

[root@host ~]# vi /var/named/home.local.zone

ゾーンファイルはローカルネットワークの環境に合わせてIPアドレスとホスト名を紐づけます。

$TTL 86400
@       IN      SOA     host.home.local.   root.home.local. (
          2020122500   ;Serial // serial
          3600         ;Refresh  // refresh 1hr
          300          ;Retry   // retry 5min
          360000       ;Expire   // expire 100hr
          86400   )    ;Negative // min 24hr

                        IN      NS      host.home.local.
host                    IN      A       192.168.100.1
host10                  IN      A       192.168.100.10
host20                  IN      A       192.168.100.20
host30                  IN      A       192.168.100.30

次に逆引き用ゾーンファイルを作成します。

[root@host ~]# vi /var/named/xyz.168.192.in-addr.arpa.rev

正引きに合わせて設定。

$TTL 3600
@                IN      SOA host.home.local. root.home.local. (
                         2020122501 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     host.home.local.
1                IN      PTR    host.home.local.
10               IN      PTR    host10.home.local.
20               IN      PTR    host20.home.local.
30               IN      PTR    host30.home.local.

[3]設定ファイルのチェック

[root@host ~]# named-checkconf -z

設定ファイルに間違いが無ければエラーは出力されずログのみ出力されます。エラーが出た場合は内容を確認して修正します。

firewallの設定とSElinuxの確認

[1]firewallの設定

まずサービスを許可します。基本的にはローカルネットワーク内だけで良い気もしますが、一応パブリックも通せるようにしておきます。

[root@host ~]# firewall-cmd --add-service=dns zone=home --permanent
[root@host ~]# firewall-cmd --add-service=dns zone=public --permanent
[root@host ~]# firewall-cmd --reload

次にポートの許可を追加します。使用するポートは53/udpです。

[root@host ~]# firewall-cmd --add-port=53/udp --zone=home --permanent
[root@host ~]# firewall-cmd --add-port=53/udp --zone=public --permanent
[root@host ~]# firewall-cmd --reload

firewall設定は以上です。最後にまとめて設定結果を見たい場合は、次のコマンドで確認出来ます。

[root@host ~]# firewall-cmd --list-all-zones

[2]サービス起動でエラーが出ないか確認

[root@host ~]# systemctl start named.service

私の場合はここでエラーが出ました。エラーの指示に従いログを確認するとSElinuxが原因のようで。一旦、selinuxを停止して再度起動を試みると無事に起動しました。

[3]SElinuxの設定

SElinuxが原因で立ち上がらない場合の対処は、冒頭のRedHatのリンクにありました。原因はゾーンファイルにnamedのラベルがついていないから読み込めないようなものらしいです。ラベルはls -Zコマンドで確認出来ます。

[root@host ~]# ls -Z /var/named
unconfined_u:object_r:named_zone_t:s0 xyz.168.192.in-addr.arpa.rev
unconfined_u:object_r:named_zone_t:s0 home.local.zone

こんな感じでラベルが"named_zone_t"となっていれば問題ありません。違う場合は下記コマンドでラベルの再割り当てを行います。(推測ですがはじめにネームファイル作成の場所を間違えたために"mv"コマンドで移動しました。これが原因だったかな?)

[root@host ~]#restorecon -R /var/

以上で設定完了です。

 

名前解決が問題無く行われているか確認

[1]端末のDNSサーバ設定変更

ここからはDNSクライアント側の作業となります。サーバーのnamed.serviceが無事に起動したら、別端末のDNSサーバ設定を変更します。centOS7~8の場合は下記のような流れでデバイス名確認からDNSサーバの変更、ネットワークの再起動ができます。(rootログインせずに実行しています)

[user@host10 ~]$ nmcli d
デバイス  タイプ    状態      接続
enp***    ethernet  接続済み  enp***
wlp***    wifi      切断済み  --
lo        loopback  管理無し  --
[user@host10 ~]$ sudo nmcli connection modify enp*** ipv4.dns 192.168.xyz.1
[user@host10 ~]$ sudo nmcli connection down enp***; nmcli connection up enp***

ちなみにcentOS7で最後のネットワークの再起動を行うと通信が落ちてpingすら通らなくなりました。仕方ないので外部スイッチで強制終了、再起動すると無事に起動しssh通信も出来るようになりました。centOS8は大丈夫でしたが、下記コマンドによるネットワーク設定変更の方が良いかもしれません。

[user@host10 ~]$ sudo systemctl restart NetworkManager

[2]名前解決の確認

host10端末でhost20端末の名前解決を行った例です。無事にサーバーで設定した通りにIPが取得出来れば確認完了です。

[user@host10 ~]$ nslookup host20
Server:         192.168.xyz.1
Address:        192.168.xyz.1#53

Name:   host20.home.local
Address: 192.168.xyz.20

[3]Windows10で名前解決の確認

Windows10ですが、なぜかDNSサーバーを設定しても変更が反映されず。トラブルシューティングで一旦ネットワーク設定を全てリセットしてから再設定すると出来るようになりました。Windows10の場合はコマンドプロンプトで行いましたがローカルネットワーク内でもドメインが必要なようです。

C:\Users\user>nslookup host10
サーバー:  host.home.local
Address:  192.168.xyz.1

*** host.home.local が host10 を見つけられません: Non-existent domain

C:\Users\user>nslookup host10.home.local
サーバー:  host.home.local
Address:  192.168.xyz.1

名前:    host10.home.local
Address:  192.168.xyz.10

 

openVPNの設定ファイルにDNSサーバー設定を追加

再度、openVPNの設定ファイルを開いて、DNS設定を追加します。

[root@host ~]# vim /etc/named.conf

コメントアウトを消して、サーバーIPに書き換えます。

# tunモードを指定
 52 ;dev tap
 53 dev tun
# 認証局、証明書、キーファイルを指定
 78 ca ca.crt
 79 cert issued/server1.crt
 80 key private/server1.key  # This file should be kept secret
# dhファイルを指定
 85 dh dh.pem
# VPN内で使用するサブネットを指定
101 server 10.8.0.0 255.255.255.0
# サーバー側のロカールネットワークを指定
142 push "route 192.168.xyz.0 255.255.255.0"
# DNS設定を追加
201 push "dhcp-option DNS 192.168.xyz.1"
# tls鍵を指定
245 tls-auth ta.key 0 # This file is secret
# 圧縮を有効
264 comp-lzo
# presistオプション有効
282 persist-key
283 persist-tun
# logの保管場所を変更
288 status /var/log/openvpn-status.log
# logの保管場所を指定
297 log         /var/log/openvpn.log
298 log-append  /var/log/openvpn.log
# ログレベル0~9、数字が大きい方が細かく残す
307 verb 3

サービスの再起動を行います。

[root@host ~]# systemctl restart openvpn-server@server

これでVPNに接続された状態でローカルネットワークの名前解決が行われるはず・・・と思いましたが、リモートデスクトップをホスト名で繋ごうとしても何故か上手く動いてくれません。でもIPアドレス直打ちでもそれほど不便ではないので、原因が分かったら追記します。

2022/7/3追記

VPN接続状態で名前解決が出来なかった原因は、前述のDNS設定時に"home"ネットワークにVPNで使用するIPアドレスを定義していないことが原因でした。

 

目次に戻る

「3.SkyLinkDDNSを設定」ページはこちら

コメントを残す

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

one × 5 =