【Linux】DNSサーバーを構築する手順

LinuxペンギンDNS
この記事は約8分で読めます。

環境

  • OS
cat /etc/os-release | grep -i pretty
> PRETTY_NAME="Ubuntu 20.04.6 LTS"

※特別な記述がない限り、基本的にスーパーユーザー権限(root)での説明となります。

インストール と 確認

  • bind をインストール
apt install bind9 bind9utils
  • 状態確認
systemctl status named

以下のような文字が表示されればok!

● named.service - BIND Domain Name Server
     Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-08-09 22:26:02 JST; 4 days ago
       Docs: man:named(8)
   Main PID: 2313 (named)
      Tasks: 5 (limit: 971)
     Memory: 11.9M
     CGroup: /system.slice/named.service
             mq2313 /usr/sbin/named -f -u bind

※bind をインストールしたけど、named というデーモンで動きます。
しかし、設定ファイルのディレクトリは /etc/bind なので注意

設定ファイルの記述

  • 設定ファイル一覧
root@dns:/etc/bind# tree
bind.keys
db.0
db.127
db.255
                db.empty ← 使う
db.local
              named.conf ← 使う
named.conf.default-zones ← 使う
named.conf.local
      named.conf.options ← 使う
rndc.key
zones.rfc1918
ケン
ケン

← 使う というファイルを今後説明していきます!

zoneファイル と zoneファイル の読み込み設定

  • zoneファイルパス定義ファイルをコピー
    ↑よくわからない日本語ですが、いまは流して大丈夫です。
cp -a named.conf.default-zones named.conf.my-zones
  • まずは↑ファイルを読み込むように設定する
vi /etc/bind/named.conf
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz 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";
# ↓追加
include "/etc/bind/named.conf.my-zones";
  • 読み込んだzoneファイルパスを定義するファイルを編集する。
vi /etc/bind/named.conf.my-zones
zone "site" {
        type master;
        file "/etc/bind/db.site";
};
ケン
ケン

当ドメインが express-it.site なので、それに従って設定していきます!
多く使われている site ドメインを自分のzone として設定するのは適切ではない気がしますが、ここでは理解優先で設定していきます!

※ちなみに、ファイル名は /etc/bind/任意の名前 で問題ないですが、慣習的に db.${zone名} としています。

↑のファイルは、 「xxxx.site」 でリクエストが来たら、自分たちのゾーンなので、 /etc/bind/db.site の設定に従って、IPアドレスを応答するよという意味です。
なので、回りくどいよくわからない日本語で「zoneファイルパスを定義するファイル」と表現しました。

どのIPアドレスを応答するかの設定

  • まずはベースとなるファイルのコピー
cp -a /etc/bind/db.empty /etc/bind/db.site
  • ↑ファイルを編集
vi /etc/bind/db.site
$TTL    86400
@       IN      SOA     localhost. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL
;
@       IN      NS      localhost. ← 大事
express-it IN    A       192.168.4.10 ← 大事
ケン
ケン

← 大事 という部分にのみ着目してください。

それより上の行は興味ある人は調べてみてください!
ふーん、そうなんだくらいの理解でひとまず大丈夫です!

@ IN NS localhost. に関しては、DNSサーバ自身を定義しています。
※NSとは、NameServerの略です。

express-it IN A 192.168.4.10 に関しては、
express-it.site ドメインでリクエストがあったら、 192.168.4.10 を返すという設定をしています。
※Aとは、Aレコードと呼ばれるものです。

ちなみに ipv6 だと「AAAA」となり、メールだと 「mx」 となります。

検証

ひとまずDNSサーバーの設定が完了したので再起動して、検証していきます!

systemctl restart named

※冒頭でも述べたようにサービス名は named です。

前提として、
DNSサーバー自体のIPアドレスは 192.168.4.4 で、Hyper-Vを用いて仮想マシンで稼働。
ホストマシンは windows で IPアドレスは 192.168.4.1。
上記の前提を踏まえて、ホストマシンでコンソールを開いて以下を実行。

C:\>nslookup express-it.site 192.168.4.4
ケン
ケン

nslookup ドメイン DNSサーバーのIPアドレス

↑でワンライナーでDNSサーバーを指定して、リクエストを送れます。

すると、以下の結果が得られ設定したIPアドレスが返ってきてることが確認できました。

サーバー:  UnKnown
Address:  192.168.4.4

名前:    express-it.site
Address:  192.168.4.10
ケン
ケン

DNSサーバーの設定は以上ですが、余力がある人は発展も読み進めてください。

実運用する上では必須の設定もあります。

【発展】/etc/bind/named.conf.options でDNSサーバーの挙動設定

※ここから先は、vi /etc/bind/named.conf.options で編集しています。
また基本的に設定ファイルを編集した後は、設定を反映させるために named の再起動が必要です。

自分の zone でないときに次に問い合わせるDNSサーバーを設定

  • 以下を記述する
options {
    forwarders {
        192.168.4.3;
    };
    recursion yes;
};
ケン
ケン

さっきのDNSサーバーの IPアドレス は 192.168.4.4 だったね!

例えば、express-it.site がさっきのDNSサーバーの zone に設定されていなければ、

192.168.4.3 に次は問い合わせに行くよ!

DNSサーバーが返答するリクエスト元IPアドレスの範囲を設定する

  • 以下を記述する
acl my-network {
    192.168.4.0/24;
};

options {
    allow-query { my-network; };
};

my-network 部分はなんでも可!

ケン
ケン

リクエスト元IPアドレスの範囲を設定するから、さっきの検証では

ホストマシンの IPアドレス が 192.168.4.1 だったので、問題なく結果を取得できる。

しかし、 my-network 部分のIPアドレスを 192.168.3.0/24 に変更すると、結果は得られなくなります。

余談

※DNSサーバーがダウンすると、ユーザーからするとサイトが開けない(IPアドレスの取得ができない)ので、非常にまずい障害となってしまう。
そのため、データベース同様に プライマリセカンダリ という冗長構成をとるのが一般的です。

※また、DNSサーバーにはほかにも DNSSECTSIG などセキュリティや信頼性を強化する仕組みもあります。キーワードだけ押さえておいて、興味があればやってみてください!

コメント