サーバ - BIND(RHEL)

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

DNSサーバ(BIND)は、rhel.comというドメイン名からIPアドレスを返したり、IPアドレスからドメイン名を返すサーバである。

内部でサーバにアクセスするときに、IPアドレスではなく、rhel.comでアクセスできるようにするのが、内部向けDNSサーバであり、
外部からサーバにアクセスするときに、自ドメイン名からIPアドレスへの変換(名前解決)を行なうようにするのが、外部向けDNSサーバである。

例えば、外部向けDNSサーバの設定により、自宅サーバが稼動中にも係わらず、
ダイナミックDNSサービス側が保守やトラブル等でサービスが停止したことにより、ドメイン名でサーバにアクセスできなくなるということがなくなる。

※注意
固定IPアドレスの場合は独自ドメイン取得済であること。
外部向けDNSサーバは固定IPアドレス環境の場合のみ。


BINDのインストール

DNSサーバを構築するため、BINDをインストールする。

sudo dnf install bind bind-chroot bind-utils



BINDの設定

BINDの設定ファイルを編集する。

sudo vi /etc/named.conf


options {
       # 全てListenする
       #listen-on port 53 { 127.0.0.1; };
       listen-on port 53 { any; };

       # IPv6を使用しない
       #listen-on-v6 port 53 { ::1; };
       listen-on-v6 { none; };

       version         "unknown";          ← BINDのバージョン情報の非表示化
       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";
       allow-transfer { none; };           ← 追加(ゾーン情報の転送を禁止)

       ...省略

       recursion yes;                      ← 再帰問合せ機能を有効化(内部DNSサーバとして動作)

       # 問い合わせを許可する範囲(内部ネットワークからのみ問い合わせを許可)
       # allow-query     { localhost; };
       allow-query     { localhost; 192.168.1.0/24; };

       # 内部からのみ再帰問合せを許可
       # allow-recursion { localhost; };
       allow-recursion { localhost; localnets; };

       # ゾーン情報の転送を許可する範囲(セカンダリDNSがいればその場所/範囲)
       # allow-query-cache { localhost; };
       allow-query-cache { localhost; 192.168.1.0/24; };

       # 本DNSサーバ管理外の問合せ先
       forwarders{ 192.168.1.1; 8.8.8.8; };

       ...省略

};

logging {
       channel default_debug {
               file "data/named.run";
               severity dynamic;
       };
       category lame-servers { null; }; ← 追加(error (connection refused) resolvingというエラーログの出力抑止)
};

# 内部向けDNSの設定
view "internal" {
       match-clients {
          localhost;
          192.168.1.0/24;
       };

       match-destinations {
          192.168.1.0/24;
       };

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

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

       include "/etc/named/named.rhel.com.zone";
};

# 外部向けDNSの設定(固定IPアドレスの場合のみ)
view "external" {
       match-clients {
          any;
       };

       match-destinations {
          any;
       };

       include "/etc/named/named.rhel.com.zone.wan";
};


rhel.comの内部向けゾーン定義ファイルを作成する。

sudo vi /etc/named/named.rhel.com.zone


zone "rhel.com" {
       type master;
       file "rhel.com.db";
};

zone "1.168.192.in-addr.arpa" {
       type master;
       file "1.168.192.in-addr.arpa.db";
};


rhel.comの外部向けゾーン定義ファイルを作成する。(固定IPアドレスの場合のみ)

sudo vi /etc/named/named.rhel.com.zone.wan


# 正引き設定
zone "rhel.com" {
       type master;
       file "rhel.com.db.wan";

       allow-query {
          any;
       };
};

# 逆引き設定(プロバイダから逆引き権限を委譲されている場合のみ)
zone "SUBxxx.xxx.xxx.xxx.in-addr.arpa" {
       type master;
       file "SUBxxx.xxx.xxx.xxx.in-addr.arpa.db.wan";
       allow-query { any; };
};


IPv4のみ有効にする。(error (network unreachable) resolvingというエラーログの出力を抑止する)

sudo echo OPTIONS="-4" >> /etc/sysconfig/named



ルートゾーンの更新と自動更新設定

ルートゾーンは、世界に13台しかないトップレベルドメインを管理するDNSサーバのIPアドレスを管理しているファイルである。
ルートゾーン(named.ca)を更新する。

dig . ns @198.41.0.4 +bufsize=1024 > /var/named/chroot/var/named/named.ca


また、各月で、ルートゾーンが最新かどうか確認し、更新されていればルートゾーンの更新およびBINDの再起動を自動的に行うようにするため、
ルートゾーンの自動更新スクリプトを作成する。
※ルートゾーンが更新されていた場合のみ、新旧ルートゾーン情報及び、新旧ルートゾーンの差分情報をroot宛にメールする。

sudo vi named.root_update


 #!/bin/bash
 
 new=`mktemp`
 errors=`mktemp`
 
 dig . ns @198.41.0.4 +bufsize=1024 > $new 2> $errors
 
 if [ $? -eq 0 ]; then
    sort_new=`mktemp`
    sort_old=`mktemp`
    diff_out=`mktemp`
    sort $new > $sort_new
    sort /var/named/chroot/var/named/named.ca > $sort_old
    diff --ignore-matching-lines=^\; $sort_new $sort_old > $diff_out
    if [ $? -ne 0 ]; then
       (
        echo '-------------------- old named.root --------------------'
        cat /var/named/chroot/var/named/named.ca
        echo
        echo '-------------------- new named.root --------------------'
        cat $new
        echo '---------------------- difference ----------------------'
        cat $diff_out
       ) | mail -s 'named.root updated' root
       cp -f $new /var/named/chroot/var/named/named.ca
       chown named. /var/named/chroot/var/named/named.ca
       chmod 644 /var/named/chroot/var/named/named.ca
       which systemctl > /dev/null 2>&1
       if [ $? -eq 0 ]; then
          systemctl restart named-chroot > /dev/null
       else
          /etc/rc.d/init.d/named restart > /dev/null
       fi
    fi
    rm -f $sort_new $sort_old $diff_out
 else
    cat $errors | mail -s 'named.root update check error' root
 fi
 
 rm -f $new $errors


ルートゾーンの更新スクリプトに実行権限を付加する。

sudo chmod 700 named.root_update


ルートゾーンの更新スクリプトを毎月自動実行されるディレクトリに移動する。

sudo mv named.root_update /etc/cron.monthly/



内部向け正引きゾーンデータベースの作成(ドメイン名からIPアドレス)

正引きゾーンデータベースを作成する。

sudo vi /var/named/rhel.com.db


$TTL    86400
@       IN      SOA     rhel.com.  root.rhel.com.(
                                     2020010101 ; Serial
                                     28800      ; Refresh
                                     14400      ; Retry
                                     3600000    ; Expire
                                     86400 )    ; Minimum
        IN NS    rhel.com.
        IN MX 10 rhel.com.
@       IN A     192.168.1.30  ;サーバのプライベートIPアドレスを指定(rhel.com用)
*       IN A     192.168.1.30  ;サーバのプライベートIPアドレスを指定(*.rhel.com用)



内部向け逆引きゾーンデータベースの作成(IPアドレスからドメイン名)

逆引きゾーンデータベースを作成する。

sudo vi /var/named/1.168.192.in-addr.arpa.db


$TTL    86400
@       IN      SOA     rhel.com.  root.rhel.com.(
                                     2020010101 ; Serial
                                     28800      ; Refresh
                                     14400      ; Retry
                                     3600000    ; Expire
                                     86400 )    ; Minimum
        IN      NS    rhel.com.  ; ネームサーバ名
30      IN      PTR   rhel.com.  ; サーバIPアドレス最下位部(192.168.1.30)とドメイン名を指定



外部向け正引きゾーンデータベースの作成(ドメイン名からIPアドレス)
(固定IPアドレスの場合のみ)

外部向け正引きゾーンデータベースを作成する。

sudo vi /var/named/rhel.com.db.wan


$TTL    86400
@       IN      SOA     ns1.rhel.com.  root.rhel.com.(
                                     2020010101 ; Serial
                                     7200       ; Refresh
                                     7200       ; Retry
                                     2419200    ; Expire
                                     86400 )    ; Minimum
        IN      NS    ns1.rhel.com.  ; ネームサーバ名
        IN      MX 10 rhel.com.      ; MXホスト名(メールサーバを構築する場合のみ)
ns1     IN      A     XXX.XXX.XXX.XXX  ; サーバのグローバルIPアドレスを指定(ns1.rhel.com用)
@       IN      A     XXX.XXX.XXX.XXX  ; サーバのグローバルIPアドレスを指定(rhel.com用)
www     IN      A     XXX.XXX.XXX.XXX  ; サーバのグローバルIPアドレスを指定(www.rhel.com用)
ftp     IN      A     XXX.XXX.XXX.XXX  ; サーバのグローバルIPアドレスを指定(ftp.rhel.com用)
mail    IN      A     XXX.XXX.XXX.XXX  ; サーバのグローバルIPアドレスを指定(mail.rhel.com用)
rhel.com. IN TXT "v=spf1 ip4:XXX.XXX.XXX.XXX ~all"  ;サーバのグローバルIPアドレスを指定(メールサーバを構築する場合のみ)



外部向け逆引きゾーンデータベースの作成(IPアドレスからドメイン名)
(固定IPアドレスでプロバイダから逆引き権限を委譲されている場合のみ)

外部向け逆引きゾーンデータベースを作成する。

sudo vi /var/named/SUBxxx.xxx.xxx.xxx.in-addr.arpa.db.wan


$TTL    86400
@       IN      SOA     ns1.rhel.com.  root.rhel.com.(
                                     2020010101 ; Serial
                                     7200       ; Refresh
                                     7200       ; Retry
                                     2419200    ; Expire
                                     86400 )    ; Minimum
       IN NS    ns1.rhel.com.
xxx    IN PTR   rhel.com.  ;サーバIPアドレス最下位部(xxx.xxx.xxx.xxx)とドメイン名を指定


※注意
ゾーン情報の変更時は、Serial行を年月日と通番2桁(yyyymmddxx)のようにして、必ず、変更前よりも大きな値に変更すること。
例えば、変更前のSerialが2020010101なら、変更後のSerialは2020010102にする。
これにより、後述するセカンダリ側へのゾーン情報の変更が正しく行われるようになる。


BINDの起動

sudo systemctl start named-chroot
sudo systemctl enable named-chroot



ファイヤーウォールのポート開放

ファイヤーウォールのポートを開放する。(TCP53番ポートとUDP53番ポート)

sudo firewall-cmd --add-service=dns --parmanent
sudo firewall-cmd --reload



ルータのポート開放

ルータ側の設定で、TCP53番ポートとUDP53番ポートへのアクセスをDNSサーバ (RHEL) に転送するように設定する。

※注意
ルータのポート開放の設定は、各ルータのマニュアルを参照すること。