🦁

bind9を触ってみた

2024/08/27に公開

はじめに

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を調べたいときに以下サイトで逆引きして情報を調べることがある。
https://www.cman.jp/network/support/ip.html

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ドキュメントに記載されているログ設定のサンプルになります。
https://kb.isc.org/docs/aa-01526

構文としては以下のようになっていて、以下の例では、カテゴリーがセキュリティのログを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

記述内容

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に変換するように設定しています

参考

https://hogetech.info/network/server/bind
https://envader.plus/article/212
http://cos.linux-dvr.biz/archives/87

Discussion