2021年10月16日土曜日

BINDを使ってDNS権威サーバを構築する

LinuxでDNSサーバとしてデファクトスタンダードとなっている「BIND」は、キャッシュサーバと権威サーバの両方の機能を持つ。多機能であるがゆえ、脆弱性も多く見つかることから、本番環境で利用する際にはかなり気を使って構築する必要がある。

とはいえ、テスト用途として内部でDNSサーバが欲しい場合には、簡単にレコード設定ができるため重宝する。

今回は、BINDに対して必要最低限の設定を行い、DNS権威サーバとして動作させるまでの設定手順を記載する。

環境

以下の環境にてBINDを構築する。

  • OS : RHEL 7.6
  • Bind : BIND 9.9.4-RedHat-9.9.4-72.el7
  • DNSサーバのIPアドレス : 192.168.11.191
  • ドメイン : example.comexample2.com

BINDインストール手順

1. yumを使ってインストール

まずはyumを使ってBINDをインストールする。

# yum install bind bind-utils -y
読み込んだプラグイン:product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
リポジトリー 'dvd' は構成中に名前がありませんので ID を使います
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ bind.x86_64 32:9.9.4-72.el7 を インストール

~(中略)~

インストール:
  bind.x86_64 32:9.9.4-72.el7         bind-utils.x86_64 32:9.9.4-72.el7

依存性関連をインストールしました:
  audit-libs-python.x86_64 0:2.8.4-4.el7
  bind-libs.x86_64 32:9.9.4-72.el7
  checkpolicy.x86_64 0:2.5-8.el7
  libcgroup.x86_64 0:0.41-20.el7
  libsemanage-python.x86_64 0:2.5-14.el7
  policycoreutils-python.x86_64 0:2.5-29.el7
  python-IPy.noarch 0:0.75-6.el7
  python-ply.noarch 0:3.4-11.el7
  setools-libs.x86_64 0:3.3.8-4.el7

完了しました!

2. 初期設定

BINDの設定ファイルは/etc/named.confとなる。最低限動作させるために以下設定を行う。

設定値 説明
listen-on port 53 { any; }; デフォルトでは127.0.0.1のみ許可されており、外部からの名前解決を受付できないようになっているため、anyに変更する。
allow-query { any; }; フォルトではlocalhostのみ許可されており、外部からの名前解決を受付できないようになっているため、anyに変更する。
recursion no; 再帰的問い合わせは不要となるため、noとする。
zone "[ドメイン名]." IN { ~(省略)~ }; ゾーンの設定を記載する。fileにはゾーン情報を記載したゾーンファイルのファイル名を記載し、それ以外は定型文として後述する設定例のように記載すればよい。

以下が実際に設定した/etc/named.confの記載例となる。

options {
        listen-on port 53 { any; };
        ~(中略)~
        allow-query     { any; };
        ~(中略)~
        recursion no;
        ~(中略)~
};

~(中略)~

zone "example.com." IN {
        type master;
        file "example.com.zone";
        allow-update { none; };
};

zone "example2.com." IN {
        type master;
        file "example2.com.zone";
        allow-update { none; };
};

3. DNSゾーンファイルを作成

/var/named/配下にDNSレコードを記載したゾーンファイルを配置する。ファイル名はnamed.confにてfileにて記載したファイル名で配置する。たとえば、example2.comのドメインであれば、/var/named/example2.com.zoneにゾーンファイルを作成すればよい。

以下、ゾーンファイルexample2.com.zoneの記載例となる。NSレコード、MXレコード、SPFレコード (TXTレコード) 、Aレコードを一通り設定している。

# cat /var/named/example2.com.zone
$TTL	3600
@		IN	SOA	ns.example2.com.	root.example2.com.(
		2020082801	; Serial
		10800		; Refresh
		3600		; Retry
		604800		; Expire
		10800 )		; Minimum
;
		IN	NS		ns.example2.com.
		IN	MX	10	mail.example2.com.
		IN	TXT		"v=spf1 +ip4:192.168.11.191 +ip4:192.168.11.192 -all"
;
ns		IN	A		192.168.11.191
mail	IN	A		192.168.11.192

4. configチェックとBIND起動

BINDのconfigチェック用にnamed-checkconfというコマンドが用意されているので、実行しておこう。特にメッセージが表示されなければOKとなる。

# named-checkconf
# echo $?
0

configに問題がなければ、BINDを起動させる。

# systemctl start named
# systemctl enable named
# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2021-08-28 11:27:30 JST; 10s ago
 Main PID: 12922 (named)
   CGroup: /system.slice/named.service
           mq12922 /usr/sbin/named -u named -c /etc/named.conf

 8月 28 11:27:37 RHEL7 named[12922]: network unreachable resolving './DNSK...53
 8月 28 11:27:37 RHEL7 named[12922]: network unreachable resolving './DNSK...53
 8月 28 11:27:37 RHEL7 named[12922]: network unreachable resolving './NS/I...53
 8月 28 11:27:37 RHEL7 named[12922]: network unreachable resolving './NS/I...53
 8月 28 11:27:37 RHEL7 named[12922]: network unreachable resolving './NS/I...53
 8月 28 11:27:38 RHEL7 named[12922]: network unreachable resolving './DNSK...53
 8月 28 11:27:38 RHEL7 named[12922]: network unreachable resolving './NS/I...53
 8月 28 11:27:39 RHEL7 named[12922]: network unreachable resolving './DNSK...53
 8月 28 11:27:39 RHEL7 named[12922]: network unreachable resolving './NS/I...53
 8月 28 11:27:40 RHEL7 named[12922]: managed-keys-zone: Unable to fetch DN...ut
Hint: Some lines were ellipsized, use -l to show in full.

5. 動作確認

実際にBINDに対して名前解決ができることを確認しておこう。他サーバからdigコマンドを使ってレコードの確認を行うと、以下の通りゾーンファイルで設定したレコード情報を取得することができた。

# dig @192.168.11.191 -t any example2.com

; <<>> DiG 9.11.26-RedHat-9.11.26-4.el8_4 <<>> @192.168.11.191 -t any example2.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29678
;; flags: qr aa rd; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example2.com.                  IN      ANY

;; ANSWER SECTION:
example2.com.           3600    IN      SOA     ns.example2.com. root.example2.com. 2020082801 10800 3600 604800 10800
example2.com.           3600    IN      NS      ns.example2.com.
example2.com.           3600    IN      MX      10 mail.example2.com.
example2.com.           3600    IN      TXT     "v=spf1 +ip4:192.168.11.191 +ip4:192.168.11.192 -all"

;; ADDITIONAL SECTION:
ns.example2.com.        3600    IN      A       192.168.11.191
mail.example2.com.      3600    IN      A       192.168.11.192

;; Query time: 2 msec
;; SERVER: 192.168.11.191#53(192.168.11.191)
;; WHEN: 日  9月 19 15:27:56 JST 2021
;; MSG SIZE  rcvd: 216

以上でBINDの設定は完了となる。

0 件のコメント:

コメントを投稿

人気の投稿