BINDハンズオンしてみた

# 目標
LinuC202取得に向けて「[EC2上で内部向けDNSを構築してみる](https://qiita.com/mechamogera/items/574de60310fb19e088ca)」を参考にハンズオンを行いました。
本記事はLinuC202で役立ちそうな内容を追記したものです。

# BINDとは？
>世界でもっとも普及しているDNSサーバソフトウェア

https://openstandia.jp/oss_info/bind/

DNSサーバには、[権威DNSサーバ](https://wa3.i-3-i.info/word12272.html)と[フルリゾルバ](https://wa3.i-3-i.info/word12271.html)の2つのタイプがあります。

|DNSサーバソフトウェア|権威DNSサーバ|フルリゾルバ|
|:--|:--|:--|
|BIND|〇|〇|
|PowerDNS|〇|〇|
|NSD|〇||
|Unbound||〇|

# 環境
EC2を2つ起動します。
1. DNSサーバ用
SecurityGroupはHTTP 80番、DNS(TCP) 53番、DNS(UDP) 53番、カスタムTCP 953番、SSH 22番の5つを開放

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/098e6afa-6bf3-52b2-d917-82b07f3bfac3.png)
2. 確認用
SSH 22番のみ開放

# 1.Apacheインストール
DNSサーバ用EC2にApacheをインストール

```
sudo su -
yum update -y
yum install httpd -y
echo "BINDtest" | sudo tee /var/www/html/index.html
systemctl start httpd
systemctl enable httpd
curl http://[PublicIP]
```

BINDtestと表示されれば成功

# 2.BINDインストール
DNSサーバ用EC2にBINDをインストール

```:BINDインストール
yum install bind -y
```

`vi /etc/named.conf`でBINDの設定ファイルを編集

```:/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.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

// namedの動作詳細を設定
options {
        listen-on port 53 { 127.0.0.1; [PrivateIP]; };
        listen-on-v6 port 53 { ::1; };
        // namedの作業ディレクトリ
        // /etc/named.conf内に記述した相対パスはここが起点となる
        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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        // 問い合わせを受付けるホストを指定
        // any 全てのIPからDNSの問い合わせに応答
        allow-query     { any; };

        // 自信が保持しないドメイン情報の問合わせを転送するDNSサーバのアドレスを指定
        // 8.8.8.8; 8.8.4.4;は、Googleの公開DNSサーバ
        forwarders {  8.8.8.8; 8.8.4.4; };
        // 問合せ転送失敗時の動作設定
        // first 失敗時自分で問合せる , only 失敗時自分で問合せしない
        forward only;

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

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.root.key";

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

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

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

// 管理するドメインの範囲を定義
zone "." IN {
        type hint;
        file "named.ca";
};

zone "example.com" IN {
  type master;
  file "master.example.com";
};

// 指定した外部ファイルを読み込み、内容を/etc/named.confに追加
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
```

BINDの設定ファイルが正しく記述出来ているか確認します。
何も表示されなければ設定ファイルは正しく記述されており、エラーがある場合のみメッセージが表示されます。
Apacheの構文チェック(`httpd -t`)と違い、Syntax OKとは表示されません。

```:named.confの構文チェック
named-checkconf
```

`vi /var/named/master.example.com`で正引き用ゾーンファイル作成と編集

```:/var/named/master.example.com
$TTL 43200
example.com.     IN      SOA    help.example.com. ns01.example.com. (
                                1 ; serial
                                21600      ; refresh (6 hours)
                                7200       ; retry (2 hours)
                                1209600    ; expire (2 weeks)
                                43200)      ; minimum (12 hours)

example.com.              NS    ns01.example.com.
ns01                      A     [PrivateIP]
www                       A     [PublicIP]
```

```:BIND起動
systemctl start named
```

```:BINDのステータス表示
rndc status
```

# 3.resolve.confの設定

`vi /etc/resolv.conf`でresolveの設定ファイルを編集

```:/etc/resolv.conf
; generated by /sbin/dhclient-script
search ap-northeast-1.compute.internal
nameserver 127.0.0.1
```

`vi /etc/sysconfig/network-scripts/ifcfg-eth0`で`PEERDNS=no`に変更

```:/etc/sysconfig/network-scripts/ifcfg-eth0
host ns01.example.com
```
`ns01.example.com has address [PrivateIP]`と表示されれば成功


# 4.別サーバで確認
確認用サーバでも`host ns01.example.com`を実行し、上記と同様の結果が表示されるかを確認します。

`sudo vi /etc/resolv.conf`でresolveの設定ファイルを編集

```:/etc/resolv.conf
; generated by /sbin/dhclient-script
search ap-northeast-1.compute.internal
nameserver [DNSサーバのPrivateIP]
```

```
host www.example.com
```
`www.example.com has address [DNSサーバのPublicIP]`と表示されれば成功


```
curl www.example.com
```
BINDtestと表示されれば成功

# 5.接続拒否ホスト指定

`vi /etc/named.conf`でoptions {}内に下記記述を行う事で問合せを受け付けないホストを指定できます。
記述後`rndc reconfig`を実行する事で、プロセスを再起動することなく設定変更可能

```:/etc/named.conf
blackhole { [確認用サーバのPrivateIP]; };
```

確認用サーバで`host www.example.com`を実行し、
`;; connection timed out; no servers could be reached`と表示されれば接続拒否されています。

# 6.BINDのバージョン隠蔽
digコマンドでBINDのバージョンが露見します。

```
dig @[PublicIP] chaos txt version.bind
```

```:実行結果
;; ANSWER SECTION:
version.bind.0CHTXT"9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2" //BINDのバージョンが9.11.4と分かる
```

`vi /etc/named.conf`でoptions {}内に下記記述後、`rndc reload`を行う事でBINDのバージョンを隠蔽できます。

```:/etc/named.conf
version"DNS Server";
```

再度`dig @[PublicIP] chaos txt version.bind`を実行します。
/etc/named.confで指定した文字(今回はDNS Server)が表示され、BINDのバージョンが分からなくなっています。

```:実行結果
;; ANSWER SECTION:
version.bind. 0 CH TXT "DNS Server"
```