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サーバーの構築の基本や手順を学ぶことができます。実際に手を動かしながら学ぶことで、理論だけではなく実践的なスキルも身につけることができます。

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

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

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

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

関連記事