こちらの記事では、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サーバーの構築は、以下の手順で進めていきます。
- BINDのインストール
- BINDの設定ファイルの編集
- BINDの設定の確認と起動
- ファイアウォールの調整
- デフォルトゲートウェイの変更
- 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サーバとして動作する場合などに必要となります。
- firewalldのインストール
$ sudo apt install firewalld -y
- ファイアウォールの適用
# TCP, UDPのポート53を開く
$ sudo firewall-cmd --add-port=53/tcp --permanent
$ sudo firewall-cmd --add-port=53/udp --permanent
# firewalldをリロードし、設定を反映させる
$ sudo firewall-cmd --reload
- 設定の確認
$ 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を学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.11.26
Git初心者必見!「git reset」と「git revert」の使い分け方
この記事の主な目的は「git reset (ギット リセット)」と「git revert(ギット リバート)」の基本的な使い方と、それぞれの適切な使用シチュエーションを理解してもらうことです。
- プログラミング
- インフラエンジニア
- git
2024.08.27
【脱ネットワーク初心者】CIDRとCIDR表記
CIDR表記はIPアドレスにサブネットマスクの情報を簡略化して付随する表記方法です。
- ネットワーク
2024.08.27
IPv6におけるCIDRの役割 IPv4との違いは?
この記事では、CIDRの基本概念を説明し、IPv4とIPv6での利用方法や役割の違いを詳しく解説することで、ネットワーク管理におけるCIDRの重要性を理解できるようにします。
- ネットワーク