1. ホーム
  2. 記事一覧
  3. 【BIND入門実践】BINDでDNSサーバーを構築してみよう

2023.09.12

【BIND入門実践】BINDでDNSサーバーを構築してみよう

こちらの記事では、AWSのEC2(ubuntu)にBINDをインストールし、実際にDNSサーバーを構築する方法を解説します。DNSサーバーに関しての詳細な情報は下記の記事を参照してください。

https://envader.plus/course/12/scenario/1023

また、BINDに関する基礎的な概念については以下の記事で解説しています。不明点がある場合は、その記事を参照しながら本ハンズオンを進めてください。

https://envader.plus/article/212

本記事のゴール

BINDで構築したDNSサーバーを、DNSリクエストに応答するサーバーを構築することをゴールとします。DNSサーバにbind.dns.comの問い合わせを行い、DNSサーバーのIPアドレスが返されることをゴールとします。

※尚、BINDの設定以外のAWSの環境構築の方法や、SSH接続方法などには触れません。

BINDを利用したDNSサーバーの構築手順

BINDを利用したDNSサーバーの構築は、以下の手順で進めていきます。

  1. BINDのインストール
  2. BINDの設定ファイルの編集
  3. BINDの設定の確認と起動
  4. ファイアウォールの調整
  5. デフォルトゲートウェイの変更
  6. DNSリクエストのテスト

1. BINDのインストール

1-1. システムを最新の状態に更新する

インストールする前にシステムを最新の状態に更新します。以下のコマンドを実行してください。

$ sudo apt update
$ sudo apt upgrade -y

1-2. BINDと必要なパッケージをインストール

システムの更新後、以下のコマンドでBINDをインストールします。bind9utilsは必須ではないですが、digコマンドなどをデバッグで使用するためにインストールします。

$ sudo apt install bind9 bind9utils -y

1-3. インストールの確認

  • bind9のインストール確認
$ named -v

BIND 9.16.1-Ubuntu (Stable Release) <id:d497c32>
  • bind9utilsのインストール確認
$ dpkg -l | grep bind9utils

ii  bind9utils                         1:9.16.1-0ubuntu2.15              all          Transitional package for bind9-utils

1-4. BINDの実行状態の確認

インストールの完了後、以下のコマンドでBINDの実行状態を確認します。なお、Ubuntu22.04では、BINDのサービスは「named」という名前で動いています。

$ sudo systemctl status named

named.service - BIND Domain Name Server
     Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-08-21 07:51:17 UTC; 12min ago
       Docs: man:named(8)
   Main PID: 446 (named)
      Tasks: 5 (limit: 1126)
     Memory: 18.9M
     CGroup: /system.slice/named.service
             └─446 /usr/sbin/named -f -u bind

Aug 21 07:51:18 ip-10-255-244-11 named[446]: network unreachable resolving './NS/IN': 2001:7fe::53#53
Aug 21 07:51:18 ip-10-255-244-11 named[446]: network unreachable resolving './DNSKEY/IN': 2001:500:2f::f#53
Aug 21 07:51:18 ip-10-255-244-11 named[446]: network unreachable resolving './NS/IN': 2001:500:2f::f#53
Aug 21 07:51:18 ip-10-255-244-11 named[446]: network unreachable resolving './DNSKEY/IN': 2001:500:2::c#53
Aug 21 07:51:18 ip-10-255-244-11 named[446]: network unreachable resolving './NS/IN': 2001:500:2::c#53
Aug 21 07:51:18 ip-10-255-244-11 named[446]: network unreachable resolving './DNSKEY/IN': 2001:503:ba3e::2:30#53
Aug 21 07:51:18 ip-10-255-244-11 named[446]: network unreachable resolving './NS/IN': 2001:503:ba3e::2:30#53
Aug 21 07:51:18 ip-10-255-244-11 named[446]: network unreachable resolving './DNSKEY/IN': 2001:500:12::d0d#53
Aug 21 07:51:18 ip-10-255-244-11 named[446]: managed-keys-zone: Key 20326 for zone . is now trusted (acceptance timer complete)
Aug 21 07:51:18 ip-10-255-244-11 named[446]: resolver priming query complete

named.serviceのActiveがactive (running)となっていることを確認します。

2. BINDの設定ファイルの編集

2-1. 必要なファイルの作成

BINDの設定ファイルは/etc/bind/ディレクトリ内に格納されています。設定を行うため、このディレクトリに移動して作業を進めます。(cd /etc/bindを実行してください。)

分かりやすさを保つため、既存のファイルはそのまま使用し、新しい設定に必要なファイルは新たに作成します。BINDの設定方法は多岐にわたりますが、今回は基本的な設定のみを取り扱います。

最終的な構成は以下になります。

# ☆ => 新しく作成したファイル

.
├── 246.255.10.db                 # ☆逆引きゾーンファイル
├── bind.keys
├── db.0
├── db.127
├── db.255
├── db.empty
├── db.local
├── dns.com                       # ☆正引きゾーンファイル
├── named.conf
├── named.conf.default-zones      # ローカルホストと特定のブロードキャストアドレスのDNSゾーン設定を行う
├── named.conf.external-zones     # ☆外部向けのドメインとその関連IPアドレスのDNSゾーン設定を行う
├── named.conf.internal-zones    # ☆内部ネットワークのDNSゾーン設定を行う
├── named.conf.local
├── named.conf.options
├── rndc.key
└── zones.rfc1918

以下のコマンドでファイルを作成します。正引きファイル名、逆引きファイル名は自身の環境に応じて適宜変更してください。

$ sudo touch dns.com 246.255.10.db named.conf.external-zones named.conf.internal-zones

2-2. named.conf(BIND設定ファイル)

既存のnamed.confを編集します。以下のようにincludeのみを記述します。

$ sudo vim named.conf

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

// BIND設定オプションファイル
include "/etc/bind/named.conf.options";
// BINDゾーン情報ファイル
include "/etc/bind/named.conf.internal-zones";
include "/etc/bind/named.conf.external-zones";

2-3. named.conf.options(BIND設定オプションファイル)

既存のnamed.conf.optionsを編集します。

$ sudo vim named.conf.options

// ☆ => 新しく追記、または変更した箇所

// ☆ ここではシステム構成図の通り、vpc内のsubnet範囲を指定
acl public-subnet {
        10.255.240.0/21;
};

options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

				// ☆ コメントを外して追記
        forwarders {
                8.8.8.8;   // Google Public DNS
                8.8.4.4;   // Google Public DNSの別のアドレス
        };

        // ☆ 基本的には、自分自身と定義したACLを指定	
				allow-query {
                localhost;
                public-subnet;
        };

        // ☆ 内部ネットワークなので再起問い合わせは不要
        recursion no;

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        // ☆ IPv6ではリッスンしない
        listen-on-v6 { none; };

				// ☆ バージョンは教えない
				version "I won't tell you my version.";
};

2-4. BINDゾーン情報ファイル

  • named.conf.internal-zones

管理しやすいようにincludeのみを行います。

$ sudo vim named.conf.internal-zones

include "/etc/bind/named.conf.default-zones";
  • named.conf.external-zones
$ sudo vim named.conf.external-zones

# 正引きゾーンファイル
zone "dns.com" {
    type master;
    file "/etc/bind/dns.com";
    allow-update { none; };
};

# 逆引きゾーンファイル
zone "246.255.10.in-addr.arpa" {
    type master;
    file "/etc/bind/246.255.10.db";
    allow-update { none; };
};

2-5. dns.com(正引きゾーンファイル)

$ sudo vim dns.com

$TTL 86400
@       IN      SOA     dns.com. root.dns.com. (
                        2023070301      ;Serial
                        3600            ;Refresh
                        1800            ;Retry
                        604800          ;Expire
                        86400           ;Minimum TTL
)

@       IN      NS      dns.com.
@       IN      A       10.255.246.216 ;DNSサーバのプライベートIP
bind    IN      A       10.255.246.216

2-6. 246.255.10.db(逆引きゾーンファイル)

$ sudo vim 246.255.10.db

$TTL 86400
@       IN      SOA     dns.com.     root.dns.com. (
                2023070301      ;Serial
                3600            ;Refresh
                1800            ;Retry
                604800          ;Expire
                86400           ;Minimum TTL
)

        IN      NS      dns.com.
216     IN      PTR     bind.dns.com.

3. BINDの設定の確認と起動

  • BINDの再起動

ここまでの設定を反映させるために、以下のコマンドを実行します。

$ sudo systemctl restart named
  • BINDの状態の確認

named.serviceのActiveがactive (running)となっていれば、問題なく設定が行えています。

$ sudo systemctl status named

named.service - BIND Domain Name Server
     Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-08-30 03:14:25 UTC; 2s ago
       Docs: man:named(8)
   Main PID: 28883 (named)
      Tasks: 5 (limit: 1141)
     Memory: 10.8M
     CGroup: /system.slice/named.service
             └─28883 /usr/sbin/named -f -u bind

Aug 30 03:14:25 ip-10-255-246-216 named[28883]: network unreachable resolving './DNSKEY/IN': 2001:7fe::53#53
Aug 30 03:14:25 ip-10-255-246-216 named[28883]: network unreachable resolving './NS/IN': 2001:7fe::53#53
Aug 30 03:14:25 ip-10-255-246-216 named[28883]: network unreachable resolving './DNSKEY/IN': 2001:500:12::d0d#53
Aug 30 03:14:25 ip-10-255-246-216 named[28883]: network unreachable resolving './NS/IN': 2001:500:12::d0d#53
Aug 30 03:14:25 ip-10-255-246-216 named[28883]: network unreachable resolving './DNSKEY/IN': 2001:503:ba3e::2:30#53
Aug 30 03:14:25 ip-10-255-246-216 named[28883]: network unreachable resolving './NS/IN': 2001:503:ba3e::2:30#53
Aug 30 03:14:25 ip-10-255-246-216 named[28883]: network unreachable resolving './DNSKEY/IN': 2001:500:1::53#53
Aug 30 03:14:25 ip-10-255-246-216 named[28883]: network unreachable resolving './NS/IN': 2001:500:1::53#53
Aug 30 03:14:25 ip-10-255-246-216 named[28883]: managed-keys-zone: Key 20326 for zone . is now trusted (acceptance timer complete)
Aug 30 03:14:25 ip-10-255-246-216 named[28883]: resolver priming query complete

4. ファイアウォールの調整

BINDを使用するDNSサーバにファイアウォールを適用することは、サーバーのセキュリティを確保し、信頼性と安定性を向上させるために非常に重要です。

DNSはTCP/UDPの53ポートを使用します。以下の手順で設定を行い、外部から自身のDNSサーバにアクセスできるようにトラフィックを通過させることを許可する設定を行います。この設定は、自身がDNSサーバとして動作する場合などに必要となります。

  1. firewalldのインストール
$ sudo apt install firewalld -y
  1. ファイアウォールの適用
# TCP, UDPのポート53を開く
$ sudo firewall-cmd --add-port=53/tcp --permanent
$ sudo firewall-cmd --add-port=53/udp --permanent

# firewalldをリロードし、設定を反映させる
$ sudo firewall-cmd --reload
  1. 設定の確認
$ sudo firewall-cmd --list-ports
53/tcp 53/udp

5. DNSサーバの設定の変更

5-1. 設定変更ファイルの作成

BINDを設定したEC2が使用するDNSサーバを変更します。変更にはnetplanを使用します。以下のYAMLファイルを新しく作成します。値は自身の環境に合わせて設定してください。

$ sudo vim /etc/netplan/99-cloud-init.yaml

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
  ethernets:
    eth0:
      dhcp4: false
      dhcp6: false
      set-name: eth0
      addresses:
        - 10.255.246.216/21
      gateway4: 10.255.240.1
      nameservers:
        addresses: [10.255.246.216]
  version: 2

5-2. 設定の反映

以下のコマンドで、netplanの設定を反映させることができます。実行した際にエラーや警告が表示されていなければ成功です。

$ sudo netplan apply

5-3. 設定の反映の確認

  • ネットワークインターフェースの状態の確認

以下のコマンドで、ネットワークインターフェースの状態を確認することができます。

$ ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
    link/ether 06:d4:58:72:fa:17 brd ff:ff:ff:ff:ff:ff
    inet 10.255.246.216/21 brd 10.255.247.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4d4:58ff:fe72:fa17/64 scope link
       valid_lft forever preferred_lft forever

上記の情報から、eth0に今回設定したIPv4アドレスが割り当てられていることが確認できます。

  • ルーティングテーブルの確認

以下のコマンドでルーティングテーブルを確認することができます。

$ ip route

default via 10.255.240.1 dev eth0 proto static
10.255.240.0/21 dev eth0 proto kernel scope link src 10.255.246.216

上記の情報から、このホストは10.255.246.216のIPアドレスを持ち、10.255.240.0/21のサブネットに属していて、外部のネットワークへのトラフィックは10.255.240.1のゲートウェイを通じてルーティングされていることが分かります。

  • DNSの設定の確認

以下のコマンドでDNSの設定を確認することができます。

$ systemd-resolve --status

Global
       LLMNR setting: no
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      21.172.in-addr.arpa
                      22.172.in-addr.arpa
                      23.172.in-addr.arpa
                      24.172.in-addr.arpa
                      25.172.in-addr.arpa
                      26.172.in-addr.arpa
                      27.172.in-addr.arpa
                      28.172.in-addr.arpa
                      29.172.in-addr.arpa
                      30.172.in-addr.arpa
                      31.172.in-addr.arpa
                      corp
                      d.f.ip6.arpa
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

Link 2 (eth0)
      Current Scopes: DNS
DefaultRoute setting: yes
       LLMNR setting: yes
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 10.255.246.216

上記の情報から、eth0の使用するDNSサーバが自分自身のIPを指しており、DNSサーバとして設定できていることが確認できます。

6. DNSリクエストのテスト

実際にBINDを設定したDNSサーバーが名前解決を行えるか確認します。

  • 正引きルックアップ
$ dig bind.dns.com A

; <<>> DiG 9.16.1-Ubuntu <<>> bind.dns.com A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24213
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;bind.dns.com.			IN	A

;; ANSWER SECTION:
bind.dns.com.		86400	IN	A	10.255.246.216

;; Query time: 3 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sat Sep 02 07:36:08 UTC 2023
;; MSG SIZE  rcvd: 57

digコマンドを使用してbind.dns.comの正引き(Aレコード)を問い合わせた結果、正引きのテストは成功しました。ANSWER SECTION:で、bind.dns.comのIPv4アドレスは10.255.246.216として正しく解決されていることが分かります。

  • 逆引きルックアップ
$ dig @bind.dns.com -x 10.255.246.216

; <<>> DiG 9.16.1-Ubuntu <<>> @bind.dns.com -x 10.255.246.216
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19111
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 56dcb632a78c72d50100000064f54029278ceb428616eeb9 (good)
;; QUESTION SECTION:
;216.246.255.10.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
216.246.255.10.in-addr.arpa. 86400 IN	PTR	bind.dns.com.

;; Query time: 0 msec
;; SERVER: 10.255.246.216#53(10.255.246.216)
;; WHEN: Mon Sep 04 02:25:45 UTC 2023
;; MSG SIZE  rcvd: 110

digコマンドを使用して10.255.246.216の逆引き(PTRレコード)を問い合わせた結果、逆引きのテストも成功しました。ANSWER SECTION:で、10.255.246.216のIPアドレスはbind.dns.comとして正しく解決されていることが分かります。

まとめ

このハンズオンを通じて、BINDを使用したDNSサーバーの構築の基本や手順を学ぶことができます。実際に手を動かしながら学ぶことで、理論だけではなく実践的なスキルも身につけることができます。

ただし、こちらのハンズオンは必要最低限の名前解決を行うことをゴールにしたもので、セキュリティ対策などは考慮していませんので、その点はご留意ください。

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事