CentOS8とbindでDNSサーバ構築

#はじめに
どうも久しぶりの記事投稿ですyuji323です。
今回はJavaプログラミングとは少し離れて、NW寄りの記事になります。
タイトルの通りCentOSとBINDで仮想環境内DNSサーバ構築してみました。
お困りの方の一助になればと思います～

間違っている点等ありましたらコメントで教えていただけますとかなり喜びます。

#環境
ハイパーバイザ：VMWare WorkStation Player for Windows 15.0
ホストOS：Windows10 バージョン1909
ゲストOS1(DNSサーバ化/DHCP01)：CentOS Linux release 8.2.2004 (Core)
ゲストOS2(検証用/TEST01)：CentOS Linux release 8.2.2004 (Core)
ゲストOS3(検証用/TEST02)：CentOS Linux release 8.2.2004 (Core)

あと、最終的には以下のようなネットワーク図のように仮想環境を作成してみます。
今回の内容と全然関係ないものもるけどそれは無視の方向で...

![空白の図 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671330/015ca561-1762-ad16-0d2a-2e03fadbbebd.png)

#背景
会社で待機中に「今後の新入社員の教育用に、ネットワーク関係の勉強もさせたいから勉強資料作って～」と、しれっと作成を頼まれたんですが...

<br>
<b>僕開発職でこの会社はいったんですけど！</b>

<b>NWじゃなくて開発したいから前の会社辞めてきたんですけど！！</b>

<br>
とまあしがない中途採用者の愚痴はさておき、


前職のNWンジニアとしての経験を買われているらしく...
開発系の内容ではなくサーバ構築...しかもDNS...

ゴリゴリと開発の学習をしたいこの頃ですが、「まぁフルスタックエンジニア目指すならやっといて損はないでしょ」くらいの軽い気持ちで勉強してみました。

#構築
###前提として
それぞれ3台はIPアドレスとホスト名を設定してあり、仮想のNATネットワーク上のドメイン「testdomain.local」に参加させておく。各ゲストOSの情報はこんな感じ↓。
後々DNSのゾーン情報とか書くときに必要になるっぽいので事前に設定する。

| ゲストOS | ホスト名 | IPアドレス |　DNS |
|:-:|:-:|:-:|:-:|
| TEST01 | test01.testdomain.local | 192.168.146.10 | 192.168.146.140 |
| DNS01  | dns01.testdomain.local | 192.168.146.140 | 192.168.146.2 |

###BINDインストール
BIND(BerkeleyInternetNameDomain)(かっこいい)(略称を英語で略さず書くのいいよね)をインストールすると、導入したサーバがDNSサーバとして機能してくれるっぽい。DNSサーバ内にあるIPとホスト名の組み合わせを取得するときのもろもろの処理をbindが担当してくれるイメージ。

```dns01.
[root@dns01 ~]# yum install bind
[root@dns01 ~]# yum install bind-utils
```

「bind」がbind本体で、「bind-utils」はdig系のコマンドとかが入ってるので、検証時にdigコマンド使わないならbindだけのインストールでも可。

###Config編集
インストールしたbindのコンフィグファイルを編集。quiita投稿用にコメントかいてあのでコピペしても動かないかも。。。使うときはコメント削除したほうが吉◎
※いつでも元に戻せるように元ファイルはコピー推奨※

```dns01.
[root@dns01 ~]# cp /etc/named.conf /etc/named.conf.ORG
[root@dns01 ~]# vi /etc named.conf
```

```/etc/named.conf
options {
        listen-on port 53 { 127.0.0.1; 192.168.146.140;}; //リッスンポート
        //listen-on-v6 port 53 { ::1; };　　　　　　　　　 //ipv6は問い合わせ遅くなるらしいのでコメントアウト　　　
        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";

        recursion       yes;         //再帰問い合わせ許可
        allow-query     {any; };　　 //名前解決を許可するアドレス→すべて許可

        forwarders {　　　　　　　　　//ゾーンファイルに情報がない問い合わせの場合に別のDNSへ解決を投げるよ～
                192.168.146.2;};　　 //投げる先。ISPとかgoogleのDNSでいいらしい。一番近いルータでも可。今回はそれ。
        };

logging {　　　　　　　　　　　　　　　//ログの取得設定
//        channel default_debug {　　　　　　//デフォルトで設定されてる奴は情報が足りないのでコメントアウト
//                file "data/named.run";
//                severity dynamic;
//        };
        channel "default-log" {　　　　　　　//新しく取得設定を記述
                file "/var/named/log/default.log" versions 5 size 10M;
                severity debug;
              　print-time yes;
                print-severity yes;
                print-category yes;
        };

        category default{"default-log";};　　//default-logをつかうよ～
};

// zone "." IN {　　　　　　　　　　　　　　　//★解決しないアドレスはゾーン情報を持たないようにするのでコメントアウト。めっちゃハマった(大敗)
//      type hint;
//      file "named.ca";
// };

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

zone "testdomain.local" {　　　　　　　　　　//設定しといたドメインのゾーンファイルの場所指定
        type master;　　　　　　　　　　　　 //この後詳細書きます。
        file "testdomain.local.zone";
};
```

###ログ出力用ディレクトリ作成 / 構文チェック
↑で指定したログ出力のディレクトリを事前に作成しておきます。
「/etc/named.conf」「file」で指定したディレクトリを作成/パーミッションを設定しておこう～！

```dns01.
[root@dns01 ~]# mkdir /var/named/log
[root@dns01 ~]# chown named.named /var/named/log
```

終わったら構文チェック！！！！エラーがなくなり次第次へ。
(何行目でエラーとか割と細かく教えてくれます。)

```dns01.
[root@dns01 ~]# named-checkconf
```

###ゾーンファイル作成
DNSの <キモ>　ゾーンファイルを作成します。「ドメイン名：IPアドレス」対応表がファイルのメイン部分で、それ以外にもDNSリクエストが来た際の挙動についても少し記述します。以下！

```dns01.(新規作成)
[root@dns01 ~]# vi /var/named/testdomain.local.zone
```

```/var/named/testdomain.local.zone
$TTL 86400　                                      //↓管理者用メールアドレス。
@       IN      SOA     dns01.testdomain.local.   root.testdomain.local. (
          2020050502   ;Serial　//シリアル番号。ファイル更新したら更新！！日付+〇号機がよくつかわれるっぽい
          3600         ;Refresh  //ゾーン転送の感覚
          300          ;Retry　  //転送失敗時リトライの感覚
          360000       ;Expire   //ゾーンファイルの保持時間
          86400   )    ;Negative //他サーバでキャッシュされる時間

//↓↓ホスト名↓↓　　　　↓↓レコード種別↓↓　　　　↓↓IPアドレス↓↓
                        IN      NS      dns01.testdomain.local
dns01.testdomain.local  IN      A       192.168.146.140
dns01                   IN      A       192.168.146.140
db01                    IN      A       192.168.146.130
dhcp01                  IN      A       192.168.146.150
pr01                    IN      A       192.168.146.160
test01                  IN      A       192.168.146.10

```

そして構文チェック!!!!!

```dns01.
[root@dns01 ~]# named-checkconf -z
```

このチェックは成功/失敗問わずログが出力されるので、内容しっかり確認すること！
エラーだった場合は[systemctl status named]で詳細が確認可能です。

###ファイアウォール設定
元から切ってる人は無視してもらって大丈夫です。今回は検証環境なので全部OFFにしてもいいんですが...勉強もかねて穴あけ方式にします。

```dns01.
[root@dns01 ~]# firewall-cmd --add-service=dns
[root@dns01 ~]# firewall-cmd --reload
```

###IPv6無効化

```dns01.
[root@dns01 ~]# vi /etc/sysconfig/named
```
「OPTIONS="-4" 」を追加する！

###サービス起動

```dns01.
[root@dns01 ~]# status named.service
[root@dns01 ~]# status named-chroot.service
```
特にエラーがなければこれで構築はいったん終了です！お疲れさまでした。。。。
続けて名前解決ができるかどうかの検証もやってみましょう～

#検証
今回は正引きのゾーンファイルしか作成していないのでドメイン名からIPが引けるかどうかの検証をしてみます。
test01からドメイン名でdns01の名前解決ができるかどうかと、外部ドメインの名前解決を試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671330/555d64e1-4abf-13eb-ef8c-7c3338cabc4c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671330/b2f9c6da-b852-7c8b-b6d5-24aa8d8e3571.png)

<b>無事に引けました！</b>

#まとめ
これで192.168.146.0/24のネットワーク内にある機器は、ドメイン名で通信することができるようになりました！！今後新しいサーバを立てた際にもゾーンファイルにレコードを追加すればいいだけなので安心ですね◎
では！