BINDでのDNSサーバ構築

#概要
BINDを使用してDNSサーバを構築します。
DNSサーバは[google.com](https://www.google.com/)や[yahoo.co.jp](https://www.yahoo.co.jp/)のようなURLをIPアドレスに変換する機能があります。
IPアドレスはインターネット上の住所のようなものです。
([こちら](https://www.cman.jp/network/support/go_access.cgi)から自分やサイトのIPアドレスを確認することができます。)
IPアドレスは数字の羅列ですが、数字で毎回サイトを検索するのは面倒だと思います。
そこでIPアドレスを〜.comや〜.co.jpに変換することによって利便性を高めています。
そのDNSサーバの一つがオープンソースのBINDです。

この記事ではDNSサーバを構築し、次回の記事でメールサーバの構築に応用します。

#構築環境
MacBook Air(2019)
AWS EC2
BIND

#1.BINDインストール
まずはBINDをEC2上でインストールします。

```
# yum -y install bind
```
インストールが完了したら起動させます。
BINDはnamedという名前でインストールされています。

```
# systemctl start named
# systemctl enable named
# systemctl status named
```
お馴染みの3点セット。
今回は別の方法でもうまく起動しているかを確認してみます。

```
# ps -efH | grep named
# netstat -anp | grep named
```
ps：動作しているプロセスの確認
-e：実行しているコマンド名と環境変数を表示
-f：プロセスごとの実行状態などを表示
-H：それぞれのプロセスがどのプロセスの下で実行されているかを表示
| grep 〇〇：〇〇を指定(|はパイプ)

netstat：実行したコンピュータの通信状況を表示
-a：IPアドレスとポート番号の組を指定したものである全てのソケットを表示
-n：ホストやユーザーを数字のまま出力
-p：プロセスIP(PID)とプロセス名を表示
![スクリーンショット 2021-08-12 11.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860147/e7dfbec4-4ee5-f475-1a3a-9425643441e2.png)
今回はnamedという名前で指定していますが、ポート番号で指定するということも多いです。
それは追い追い。

#2.named.conf編集
DNSサーバを構築する上で必要な設定を行います。

```
# vi /etc/named.conf
```
DNSに限らず設定ファイルは「.conf」とつくことが多いです。(configuration/config：設定)
画像の白線部のように編集してください。
![スクリーンショット 2021-08-12 15.50.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860147/c77552d4-9889-dc76-b3f4-0938982887df.png)
listen-on port 53：LISTENするIPアドレスを指定。今回はどのIPアドレスも受け入れます。
listen-on-v6 port 53：上記のIPv6版
LISTENする：プロセスが応答しているかどうか
allow-query：問い合わせを受け付けるネットワークを制限。今回は特に制限なしです。

保存したのち、構文に間違いがないかをチェックします。

```
# named-checkconf
```
このコマンドを実行して何も出なければ問題ありません。

#3.ゾーンファイル編集

次にDNSサーバを使用するためのIPアドレスとドメイン名の対応表を作成します。

```
# vi /etc/ono.net.zone
↓
$ORIGIN ono.net.
$TTL 900
@            IN SOA   ns.ono.net. sample.ono.net. (
                        20210812         ; Serial
                        3600             ; Refresh
                        900              ; Retry
                        181440           ; Expire
                        900 )            ; Minimum
             IN NS    ns
ns           IN A       192.168.1.10
non          IN A       プライベートIP
```
用語がたくさん。ガンバッテ。
ファイル名はなんでもいいですが、「任意のドメイン名.zone」がわかりやすいです。

用語|説明
::|::
$ORIGIN|対象ドメイン名を補う。ex)「IN NS ns.ono.net.」を IN NS nsに省略
＄TTL|DNSサーバがゾーンファイルのデータをキャッシュする時間を指定
@|ドメイン名を表し、今回は @ は「ono.net」と同じ意味
ns.ono.net.|このゾーンファイルのデータを持つプライマリDNSサーバ
sample.ono.net.|ドメイン管理者のメールアドレスで管理者との連絡に使用される
Serial|ゾーンファイルのバージョンを表す数字で日付がよく使用される
Reflesh|セカンダリDNSサーバが再度ゾーン情報を取得しようと試みるまでの時間
Retry|セカンダリDNSサーバがRefreshに失敗した場合に再度Refreshを試みるまでの時間
Expire|セカンダリDNSサーバがゾーン情報のリフレッシュができない時、持っているゾーン情報をいつまで利用するかの時間
Minimum|存在しないドメイン名のキャッシュを維持する時間
プライマリDNSサーバ|ドメインの情報を管理するDNSサーバのうち、メインのサーバ
セカンダリDNSサーバ|ドメイン名の情報を管理するDNSサーバのうち、サブのサーバ

こんなもんですが、端折って書いているところもあるので詳しくは調べてみてください。

ns：上記プライマリDNSサーバに割り当てているIPアドレスです。
192.168.xxx.xxxはルータの設定等に割り当てられることが多いようです。
今回はとりあえずの基準として割り当てています。

non：今回使用するホストと現在のEC2のプライベートIPを対応させています。

ここまでゾーンファールの設定を終えたら、named.confと同様に構文チェックを行います。
少し書き方が違うのでご注意。

```
# named-checkzone ono.net /etc/ono.net.zone
```
実行したのち、OKと出れば問題ありません。
![スクリーンショット 2021-08-12 16.24.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860147/372d12a3-94d5-104d-9b26-35396dfdf436.png)
そろそろ終わりが見えてきました。
今編集したゾーンファイルをnamed.confに登録します。

```
# vi /etc/named.conf
↓ファイル最下段に追記
zone "ono.net" {
        type master;
        file "/etc/ono.net.zone";
};
```
![スクリーンショット 2021-08-12 16.27.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860147/a8097dcd-464b-9db5-d40f-ec58d49bbadd.png)
これでDNSのゾーンデータはこのファイルを参照してね、と登録できました。
再度構文チェックを行い、何も出なければOKです。

```
# named-checkconf
```
#4.名前解決

最後の設定としてドメイン名からIPアドレスを検索するDNSサーバの指定を行います。

```
# vi /etc/resolv.conf
↓下記を追記
#nameserver ○○○.○○○.○○○.○○○
nameserver 127.0.0.1
```
書き換えた「127.0.0.1」とはループバックアドレスといい、自分自身を表すIPアドレスです。
めちゃめちゃ重要なIPであり、概念なので暗記必須！！とのこと。
![スクリーンショット 2021-08-13 10.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860147/d56a2568-66ca-3fdb-c2d0-e69c9196a3a9.png)
設定を色々変更したのでnamedの再起動を行います。
何かの設定ファイルを書き換えた際は再起動が必要となる場合が多いです。

```
# systemctl restart named
```
きちんと設定が反映され、名前解決ができているか確認します。
DNSにおける名前解決とはドメイン名からIPアドレスを検索することを指します。
その確認を行うコマンドが下記です。

```
# dig non.ono.net @localhost
```
dig ドメイン名　(⇄)　@DNSサーバ：ドメインからIPアドレスを検索
non.ono.netというドメイン名をlocalhostすなわち自分自身のDNSで名前解決しています。
ちなみにlocalhostは127.0.0.1となります。
名前解決を行うDNSサーバが別にあるのであればそちらのIPアドレスを指定します。
![スクリーンショット 2021-08-13 9.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860147/c0c34a3e-624c-2757-9e86-fdac0a3d6186.png)
白線にIPアドレスが表示されていれば名前解決できています。

#最後に
長くなりましたが、以上でDNSサーバの構築は完了です。
意味がよくわからない部分が多々あると思いますが、繰り返し練習するといいです。
これは自分への言い聞かせです。

最後までご覧頂きありがとうございました。
少しでもお役に立てば幸いです。

間違い等あればご教示ください。

ono