DNSサーバ BINDをソースコードからインストール

2024年12月13日

動作確認済みシステム 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用のユーザ、グループを作成します。

useradd -d /dev/null -s /sbin/nologin bind

必要なパッケージをインストールします。

apt install build-essential pkg-config libcrypto++-dev liburcu-dev libuv1-dev libnghttp2-dev libcap-dev libjemalloc-dev

ソースコードをダウンロードし、展開します。

cd /usr/local/src/
wget https://downloads.isc.org/isc/bind9/9.20.3/bind-9.20.3.tar.xz
tar Jxvf bind-9.20.3.tar.xz
cd bind-9.20.3

コンパイル、インストールします。

./configure --sysconfdir=/usr/local/etc/bind --with-openssl=/usr/local/ssl
make
make install

インストールされた共有ライブラリの読み込みのため、ldconfigを実行します。

ldconfig

/usr/local/etcにbindの設定ファイルのフォルダを作成する。

cd /usr/local/etc/
mkdir bind
cd bind

設定ファイルを作成する。内容は、一例であるので、各々の環境に合わせること。

vi named.conf
include "/usr/local/etc/bind/named.conf.options";
include "/usr/local/etc/bind/named.conf.local";
include "/usr/local/etc/bind/named.conf.internal-zones";
include "/usr/local/etc/bind/named.conf.external-zones";

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

vi 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; };
};

named.conf.localは、内容なし

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

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

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

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

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

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

empty-zones-enable no;
};

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

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

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

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

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

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

vi example.com.zone
vi 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 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.

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

vi db.local
$TTL    604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1
@ IN AAAA ::1

ループバックアドレス127.0.0.1の逆引きゾーン定義ファイルを作成します。

vi db.127
$TTL    604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
1.0.0 IN PTR localhost.

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

vi db.0
$TTL    604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.

ブロードキャストの逆引きゾーン定義ファイルを作成します。

vi db.255
$TTL    604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.

ヒントファイルは、https://www.internic.net/domain/named.root からダウンロードし、/usr/local/etc/bind/named.rootとして保存します。

wget https://www.internic.net/domain/named.root

rndc の設定

/usr/local/sbin/rndc-confgen > /usr/local/etc/bind/rndc.conf

rndc.confのコメントアウトされている部分を削除します。

rndc.confをrndc.keyにコピーします。

cp rndc.conf rndc.key

rndc.keyでは、keyd"〜" { }のところのみとし、あとは削除します。

rndc.keyのパーミッションを 400に変更します。

chmod 400 /usr/local/etc/bind/rndc.key

なお、rndc.confやrndc.keyには、秘密鍵が記されているので、取り扱いに注意してください。

/var/cache/bindディレクトリを作成し、所有ユーザ・所有グループとパーミッションの設定を行います。

mkdir /var/cache/bind
chown root:bind /var/cache/bind
chmod 775 /var/cache/bind

各ファイルの所有ユーザ、所有グループを設定します。

chown root:bind /usr/local/etc/bind/*

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

named-checkconf

bindサービスを作成します。

vi /etc/systemd/system/bind.service
[Unit]
Description=BIND Domain Name Server
After=network.target
Wants=nss-lookup.target
Before=nss-lookup.target

[Service] ExecStart=/usr/local/sbin/named -f -u bind
ExecReload=/usr/local/sbin/rndc reload
ExecStop=/usr/local/sbin/rndc stop
Restart=on-failure

[Install] WantedBy=multi-user.target
Alias=bind.service

systemdサービスを再読み込みします。

systemctl daemon-reload

bindサービスを自動起動設定し、起動します。

systemctl enable bind.service
systemctl start bind.service

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

ufw allow 'DNS'
ufw reload

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

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

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

systemctl reload named.service