bind9を触ってみた
はじめに
bind9を使ってDNSサーバを構築してみたのでその備忘録です。
ゴールは自分で建てたローカルなwebサーバに独自のドメインでアクセスできるようにします。
パッケージのアップグレード
sudo apt update
bind9 DNSサーバのアプリケーションをインストールする
sudo apt install bind9
bind9の検証を楽にするツール
bind9utilsを使いたいので入っているか確認
dpkg -l | grep bind9
bind9のバージョン確認(dpkgコマンドでも可)
named -v
bind9の実行状態(avtiveになっているか)を確認する
sudo systemctl status bind9
● named.service - BIND Domain Name Server # BIND DNSサーバーのサービス名と説明
Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: enabled) # サービスは正しく読み込まれ、有効化されている
Active: active (running) since Mon 2024-08-26 06:10:11 UTC; 15min ago # サービスが2024年8月26日 06:10:11 UTCに起動し、現在稼働中 (15分経過)
Docs: man:named(8) # 'named' コマンドのマニュアルページへのリンク
Main PID: 1827 (named) # メインプロセスIDは1827で、プロセス名は 'named'
Status: "running" # サービスが正常に稼働中であることを示す
Tasks: 5 (limit: 1130) # サービスによって実行されている5つのタスク (最大許容数は1130)
Memory: 6.6M (peak: 6.8M) # 現在のメモリ使用量は6.6MB、最大使用量は6.8MB
CPU: 38ms # サービスが消費したCPU時間は38ミリ秒
CGroup: /system.slice/named.service # サービスの属するコントロールグループ
└─1827 /usr/sbin/named -f -u bind # 'named' プロセスがフォアグラウンドで 'bind' ユーザーとして実行中
bind9の設定ファイルを確認する
cd /etc/bind
bind9内にある設定ファイルと用語
bind.keys
DNSSEC(DNS Security Extensions)用のトラストアンカーが格納されているファイル
※DNSSECとは
DNSの問い合わせにディジタル署名を用いることで、キャッシュポイズニング攻撃などの問い合わせレスポンスの改ざんを防ぐ。
具体的な流れ
・トップレベルドメイン(.)のサーバが以下のレスポンスとして返す
「次の階層の解決情報を持つDNSサーバ(jp)のIP」、「ディジタル署名」
・次のDNSサーバ(jp)に保管されている、トップレベルDNSサーバの公開鍵を取得し、ディジタル署名を検証し、あっていたら名前解決を行う。
上記を繰り返すが、この一つ上位の階層のディジタル署名を検証するための公開鍵を保存するファイル
db.0
0.0.0.0に関する逆引きが行われたときに返答する内容が保存されているファイル
※逆引きとは
IPアドレスからドメイン情報を取得すること。(システムとしてはなくても困らない)
使い道としては、アクセスログにあるIPを調べたいときに以下サイトで逆引きして情報を調べることがある。
0.0.0.0のアドレスはすべてのアドレスを表すため、逆引きが行われたときに正常なリクエストを返すために個別に定義している
db.127
前提として、127.0.0.1と指定すると、ループバックアドレスとなり、自分自身のPCを指す。
このループバックアドレスが逆引きされた際に、外部のDNSサーバに問い合わせを行わず、「localhost」と返す設定ファイル
db.255
ブロードキャストの逆引きを返す設定ファイル。
このファイルがあることで、ブロードキャストの逆引きを行ったときに外部のDNSサーバに問い合わせを行わないようになる
db.empty
逆引きの際にゾーンファイルが存在しなかった場合に返される情報を記載した設定ファイル。
もし、上記のdb.0、db.127が存在しないときなどリクエストされたIPに関する逆引き情報が存在しないときに使用される
db.local
「localhost」をループバックアドレス127.0.0.1に正引きする設定ファイル
named.conf
DNSの設定ファイルが記載されているファイル。
ただし、大きな設定の大枠ごとに、includしているのでこのファイル自体には設定情報が記載されていない。
named.confでincludeされているのは以下の3ファイル。
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian 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
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
named.conf.options
大きく分けて3つの設定区分がある
opiones
BIND全体にかかわる設定項目を設定できる
以下主要な設定項目
オプション名 | 説明 |
---|---|
directory |
BINDの作業ディレクトリのパスを指定します。通常、ゾーンファイルなどがこのディレクトリに格納されます。 |
listen-on |
BINDがリッスンするIPアドレスを指定します。 |
listen-on-v6 |
BINDがリッスンするIPv6アドレスを指定します。 |
forwarders |
クエリの転送先となるDNSサーバーのIPアドレスを指定します。 |
allow-query |
DNSクエリを許可するクライアントのアドレス範囲を指定します。 |
allow-transfer |
ゾーン転送を許可するクライアントのアドレス範囲を指定します。 |
recursion |
再帰クエリを許可するかどうかを指定します。通常、yes または no で設定します。 |
dnssec-enable |
DNSSECの機能を有効にするかどうかを指定します。 |
dnssec-validation |
DNSSECの検証を行うかどうかを指定します。 |
auth-nxdomain |
NXDOMAINの応答が権威的であるかどうかを指定します。 |
rate-limit |
クエリのレート制限を設定します。これにより、DDoS攻撃などからサーバーを保護することができます。 |
max-cache-size |
DNSキャッシュの最大サイズを指定します。 |
max-cache-ttl |
キャッシュされたレコードの最大TTL (Time To Live) を指定します。 |
version |
BINDのバージョン情報を非表示にするための設定です。攻撃者に対する情報開示リスクを低減するために使用されます。 |
logging
DNSサーバのログ出力に関する設定項目
以下bindドキュメントに記載されているログ設定のサンプルになります。
構文としては以下のようになっていて、以下の例では、カテゴリーがセキュリティのログをdefaylt_securityのチャンネルを利用して、defaylt_securityのチャンネルはdata/security.logにログを出力するように設定しています。
logging {
category "security" {
"default_security";
};
channel default_security {
file "data/security.log";
severity dynamic;
};
};
zone
ゾーンを宣言し、ゾーンファイルのパスを指定する。
例)test.comの正引きを行いたいとき
zone "test.com" IN {
type master;
file "test.com";
allow-update { none; };
};
例)172.16.0の逆引きを行いたいとき
zone "0.16.172.in-addr.arpa" IN { //ネットワークアドレスを逆にした数値を入力
type master;
file "test.com";
allow-update { none; };
};
設定項目 | 概要 |
---|---|
type | マスター/スレーブの関係を指定します。プライマリDNSサーバーの場合は「master 」、セカンダリDNSサーバーの場合は「slave 」を指定します。 |
file | 正引き用設定ファイルのパスを指定します。 |
allow-update | ゾーン情報の更新を許可するホストもしくはネットワークを指定します。 |
デフォルトでは以下の設定が書かれている
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/usr/share/dns/root.hints";
};
// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
やってみる
test.comの正引きができるようにする
1.新しいゾーンファイルを作成
sudo nano db.test.com
記述内容
$TTL 604800
@ IN SOA ns1.test.com. admin.test.com. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ; Negative Cache TTL
)
@ IN NS ns1.test.com.
@ IN A //名前解決の結果として返したいIPアドレス
ns1 IN A //DNSサーバのIPアドレス
2.test.comのゾーンファイルを指定する
sudo nano zones.create
記述内容
zone "test.com" {
type master;
file "/etc/bind/db.test.com";
allow-update { none; }; # ゾーン情報の更新を許可しない設定
};
3.zones.createをnamed.conf.localでincludeする
include "/etc/bind/zones.create";
4.名前解決ができているかテストをする
dig @DNSサーバのIPアドレス test.com
以下のように名前解決結果として指定した、182.168.0.xxxが返されていることが分かります。
逆引きができるようにする
今回は192.168.の名前解決を行うようにします。
1.新しいゾーンファイルを作成
$TTL 604800
@ IN SOA ns1.test.com. admin.test.com. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ; Negative Cache TTL
)
IN NS ns1.test.com.
168.192 IN PTR ns1.test.com.
168.192 IN PTR bind.test.com.
2.zones.createに上記で1で作成したゾーンファイルを指定
zone "168.192.in-addr.arpa"{
type master;
file "/etc/bind/db.168.192";
allow-update { none; };
};
3.名前解決ができているかテストをする
dig @DNSサーバのIPアドレス -x 192.168.xxx.xxx
以下のように指定したIPアドレスに紐づけられてるドメイン情報が表示されます。
webサイトの名前解決を行う
nginxをダウンロートしてActiveにする
sudo apt install nginx
sudo systemctl start nginx
使用するデフォルトのDNSサーバを変更する
/etc/resolv.confのnameserverを自分のIPアドレスに変更する
# This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
#
# This file might be symlinked as /etc/resolv.conf. If you're looking at
# /etc/resolv.conf and seeing this text, you have followed the symlink.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs should typically not access this file directly, but only
# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a
# different way, replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver xxxxxxxxx
options edns0 trust-ad
search ec2.internal
test.comでアクセスしてみる
以下のcurlコマンドを使用します
curl http://test.com
※test.comを127.0.0.1に変換するように設定しています
参考
Discussion