DNSサーバ BINDをソースコードからインストール
動作確認済みシステム 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