DNSサーバ BIND

2024年11月17日

動作確認済みシステム Debian 12

DNSは、ホスト名とIPアドレスを対応付けます。DNSを使って、ホスト名からIPアドレスを取得(正引き)したり、IPアドレスからホスト名を取得したり(逆引き)します。

DNSサーバを、BINDを使って構築します。外部からDNSのお問い合わせができるように設定します。

ここでは、ドメイン名をexample.com、ネームサーバ名をns.exmaple.com、IPアドレスを203.0.113.123とします。また、ネームサーバは1台のみで構築し、セカンダリサーバは、お名前.comのセカンダリDNS(Slave)を利用します。

BINDをインストールします。

apt install bind9 bind9-utils

インストールした後はBINDが起動しているので、止めます。

systemctl stop named.service

内部向けゾーンファイルを作成します。

vi /etc/bind/named.conf.internal-zones
view "internal" {
# 内部向けの対象範囲定義
match-clients {
localhost;
};

# 再帰検索を受け付ける
recursion yes;

# 正引きゾーン定義
zone "example.com" {
type master;
file "/etc/bind/example.com.zone";
allow-update { none; };
};

# 逆引きゾーン定義
zone "123.113.0.in-addr.arpa" {
type master;
file "/etc/bind/123.113.0.in-addr.arpa.zone";
allow-update { none; };
};

include "/etc/bind/named.conf.default-zones";

empty-zones-enable no;
};

外部向けゾーンファイルを作成します。

vi /etc/bind/named.conf.external-zones
view "external" {
# 外部向けの対象範囲定義
match-clients { any; }; # 全てを対象

# 再帰検索を受け付けない
recursion no;

# 正引きゾーン定義
zone "example.com" {
type master;
file "/etc/bind/example.com.zone";
allow-update { none; };
};

# 逆引きゾーン定義
zone "123.113.0.in-addr.arpa" {
type master;
file "/etc/bind/123.113.0.in-addr.arpa.zone";
allow-update { none; };
};
};

オプション設定ファイルを編集します。

vi /etc/bind/named.conf.options
options {
directory "/var/cache/bind";

# 問合わせを受け付ける範囲
# どこからも受け付ける
allow-query { any; };

# ゾーン情報の転送を許可する範囲
# ローカルホストやローカルネットワーク内のホストへのみ許可する
allow-transfer { localhost; localnets; };

# BINDのバージョン情報を公開しない
version "unknown";

dnssec-validation auto;

auth-nxdomain no;

listen-on-v6 { any; };
};

# "error (unexpected RCODE REFUSED) ..." 出力抑止
server 0.0.0.0 {
edns no;
};

# "DNS format error ... invalid response" 出力抑止
logging {
category resolver { null; };
};

正引きゾーン定義ファイルを作成します。

vi /etc/bind/example.com.zone
$TTL 86400
$ORIGIN example.com
@ IN SOA ns.example.com. administrator.example.com. (
2021112103 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire
300 ; Minimum
)
3600 IN NS ns.example.com.

3600 IN A 203.0.113.123
ns 3600 IN A 203.0.113.123
www 3600 IN A 203.0.113.123

@ 3600 IN MX 10 mail.example.com.

逆引きゾーン定義ファイルを作成します。

vi /etc/bind/123.113.0.in-addr.arpa.zone
$TTL 86400
@ IN SOA ns.example.com. administrator.example.com. (
2021112101 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire
300 ; Minimum
)
IN NS ns.example.com.
IN PTR example.com.
$TTL
再帰問い合わせを行った際にキャッシングする時間。
$ORIGIN
ドメイン名が明示されていないレコードで補完するドメイン名を記述。
SOAレコード
DNSサーバ名と管理者のメールアドレス、DNSサーバの各種設定を記述。 DNSサーバ名は、NSレコードで定義したもの。メールアドレスは、@は使えないため、その代わりにピリオドで記述。
SOA 内のパラメータ
Serial
10桁のシリアルナンバー。
Refresh
リフレッシュ値。セカンダリサーバへのゾーン情報の転送間隔。
Retry
リフレッシュが失敗したときの再送間隔。
Expire
リフレッシュが失敗しているときのセカンダリサーバの有効期間。
Minimum
存在しないドメイン名に対して「存在しない」という情報(=ネガティブキャッシュ)を保持する時間。
NSレコード
このゾーンを管理するDNSサーバ。セカンダリサーバを定義するときは、追加でNSレコードを定義。
Aレコード
IPv4でホスト名とIPアドレスの関連付けを定義。
AAAAレコード
IPv6でホスト名とIPアドレスの関連付けを定義。
CNAMEレコード
正規ホスト名に対する別名を定義。
MXレコード
対象ドメイン宛てのメールの配送先(メールサーバ)のホスト名を定義。
TXTレコード
ホスト名に関連付けるテキスト情報(文字列)を定義。
PTRレコード
IPアドレスに対応するホスト名を定義。1IPアドレスに対し、1レコード。

設定ファイルを編集し、作成した内部向けゾーンファイル、外部向けゾーンファイルを読み込むようにします。

vi /etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";

# コメント化
#include "/etc/bind/named.conf.default-zones";

# 追記
include "/etc/bind/named.conf.internal-zones";
include "/etc/bind/named.conf.external-zones";

OSのネームサーバ設定を編集します。

vi /etc/resolv.conf
domain example.com
search example.com
nameserver 127.0.0.1
nameserver xxx.xxx.xxx.xxx # (別のDNSサーバ1)
nameserver xxx.xxx.xxx.xxx # (別のDNSサーバ2)

nameserverの1個目が今回構築したネームサーバを指すようにします。

設定ファイルの文法チェックをします。

named-checkconf

BINDを起動します。

systemctl start named.service

ファイアウォールを設定します。

ufw allow 'DNS'
ufw reload

お名前.comで、セカンダリDNS(Slave)の設定を行い、プライマリネームサーバ IPアドレスを、今回構築したネームサーバのIPアドレスにします。
また、ネームサーバの変更を行い、ネームサーバ1を今回構築したネームサーバのIPアドレス、ネームサーバ2を2nd.dnsv.jp(お名前.comが指定しているもの)に変更します。

しばらく時間を置けば、ネームサーバの変更が反映されます。

レコードの追加などの変更を行った場合、以下のコマンドを実行します。

systemctl reload named.service