bindでのDNSサーバー構築

「SAVACAN」担当のMKです。

本ブログでは、BINDを用いたDNSサーバーの構築手順について解説いたします。
はじめに、BINDに馴染みのない方にもご理解いただけるよう、BINDの概要および代表的なDNSレコードについて整理します。その後、実際の設定手順を段階的にご紹介します。

なお、本記事ではDNSの基本的な仕組みそのものについての解説は行っておりません。あらかじめDNSの基礎知識をお持ちで、実際にDNSサーバーの構築を検討されている方を対象としています。

目次

BINDとは何か

BINDは、「Berkeley Internet Name Domain」の略でDNSサーバーとして動作するソフトウェアになります。
その歴史は古く、1980年代に始まったDNSの設計と同時期に開発が始まったとされています。インターネットの始まりとともに生まれ、現在でも広く利用されている偉大なソフトウェアの一つです。

まずBINDでできることと、特徴について解説いたします。

主な機能(この他多数の機能あり)

  • ドメイン名からIPアドレスを調べる(正引き)
  • IPアドレスからドメイン名を調べる(逆引き)
  • 自分が管理するドメイン情報を保持・提供する
  • マスター/スレーブ構成

特徴

  • 1986年にBIND4としてリリース(最新版はBIND9)
  • 多くの権威DNSサーバーで利用されている
  • オープンソースソフトウェア(無料、自己管理)
  • 多くのディストリビューションに標準パッケージとして搭載
  • ファイルベース、コマンドベース管理

正引きと逆引きについて

正引きとは、
ドメイン名から対応するIPアドレスを取得する仕組みを指します。
このプロセスは、Webサイトの閲覧やメールの送受信をはじめ、ドメイン名を利用する現在のインターネットの基盤となる重要な役割を担っています。

例(IPv4の場合)
ドメイン名:savacan.space-i.com → IPアドレス:219.164.238.120

逆引きとは、
IPアドレスから対応するドメイン名を特定する仕組みを指します。
メールにおけるスパム判定にも活用されており、正当な送信元かどうかを判別し、不一致または偽装の可能性がある場合にスパム判定の1要素として加味する仕組みが一般的に採用されています。

例(IPv4の場合)
IPアドレス:219.164.238.120 → ドメイン名:savacan.space-i.com

DNSレコードについて

主要なDNSレコードについて説明します。

A
IPv4でホスト名とIPアドレスの関連を登録

yourdomain.com.  IN  A  XXX.XXX.XXX.XXX

AAAA
IPv6でホスト名とIPアドレスの関連を登録

yourdomain.com.  IN  AAAA  XXXX:XXXX:X

CNAME
あるドメインまたはサブドメインの別名を登録
以下の設定では www.yourdomain.com にアクセスしたとき yourdomain.com のIPを返します。

www.yourdomain.com.  IN  CNAME  yourdomain.com.

MX
メールサーバーのホスト名を登録
10と20は優先順位で数値が小さいほど優先順位が高くなります。
慣習として10~100まで10単位とする場合が多いですが、 0~65535(16ビット整数)で指定可能です。

yourdomain.com.  IN  MX  10 mail1.yourdomain.com.
yourdomain.com.  IN  MX  20 mail2.yourdomain.com.

TXT
任意のテキスト情報を登録
現在はspf、DKIM、DMARCなどメール送信元認証用の設定や、DNS認証に活用される場面が非常に多いです。

yourdomain.com.  IN  TXT  "v=spf1 +ip4:XXX.XXX.XXX.0/24 ~all"
default._domainkey.yourdomain.com.  IN  TXT  "v=DKIM1; k=rsa; p=DKIM設定値"
_dmarc.yourdomain.com.  IN  TXT  "v=DMARC1; p=none; rua=mailto:admin@yourdomain.com; ruf=mailto:admin@yourdomain.com;"

NS
そのドメインの情報をどのDNSサーバーに問い合わせるか指定

yourdomain.com.  IN  NS  ns1.yourdomain.com.

PTR
リバースルックアップ(逆引き)でドメイン名を提供

XXX.XXX.XXX.XXX.in-addr.arpa.  IN  PTR  yourdomain.com.

SOA
ゾーン管理のための情報や設定

yourdomain.com.  IN  SOA  dns1.yourdomain.com. root.yourdomain.com. (
                2020011201 ; Serial(更新の度に大きい数値に変更します)
                10800       ; Refresh
                3600        ; Retry
                604800     ; Expire
                43200 )    ; Minimum TTL

・dns1.yourdomain.com
このゾーンの“権威DNSサーバー(プライマリDNS)

・root.yourdomain.com
DNS管理者のメールアドレス

BINDのインストール

BINDを設定する上で前提となる基礎知識を簡単に振り返ったところで、ここからはインストールおよび設定手順について解説していきます。
なお、BINDで実現可能な機能は多岐にわたりますが、本記事では基本となる「正引き」と「逆引き」の設定に焦点を当ててご紹介します。

まずはBINDをインストールします。

dnf install bind

インストール時に以下の設定ファイルが作成されます。

ls -al /var/named/
drwxrwx---   2 named named    6 11月  6 16:45 data
drwxrwx---   2 named named    6 11月  6 16:45 dynamic
-rw-r-----   1 root  named 2112 11月  6 16:45 named.ca
-rw-r-----   1 root  named  152 11月  6 16:45 named.empty
-rw-r-----   1 root  named  152 11月  6 16:45 named.localhost
-rw-r-----   1 root  named  168 11月  6 16:45 named.loopback
drwxrwx---   2 named named    6 11月  6 16:45 slaves

・ファイル
named.ca
ルートDNSサーバーの一覧です。
BINDサーバー自身に設定していないため答えられないDNS情報を問い合わせにいきます。
最新の設定内容は以下にありますのでコピーして使います。
https://www.internic.net/domain/named.cache

named.localhost
localhostの正引きゾーン

named.loopback
127.0.0.1の逆引きゾーン

named.empty
プライベートIPの逆引きを外部に出さない設定

・ディレクトリ
/var/named/data
BINDの作業用ディレクトリ

/var/named/dynamic
動的更新(Dynamic DNS)用のゾーン保存場所

/var/named/slaves
マスターDNSから転送(AXFR/IXFR)されたゾーンデータ
ls -al /etc/named*
-rw-r----- 1 root named 1705 11月  6 16:45 /etc/named.conf
-rw-r----- 1 root named 1029 11月  6 16:45 /etc/named.rfc1912.zones
-rw-r--r-- 1 root named 1070 11月  6 16:45 /etc/named.root.key

named.conf
BINDの設定ファイル

named.rfc1912.zones
localhostの名前解決、127.0.0.1・プライベートIPアドレスの逆引き設定

named.root.key
DNSSEC用のルート公開鍵

/etc/named.conf で正引きと逆引きの設定をします。
以下の設定はデフォルト設定から見直した箇所と、再起問い合わせの注意点になります。

options
{
  # 外部にポート公開
  listen-on port 53 { any; };
  # 指定されたIPアドレスゾーン情報の転送を許可
	allow-transfer {
	        XXX.XXX.XXX.0/24 ;
	};

  # 再帰問い合わせを有効
  # bindサーバー自身で答えれないときはルートDNS → TLD → 権威DNSへ順に問い合わせ
	recursion yes ;

  # DNSクエリ(名前解決)を許可するIPアドレス
	allow-query {
	        XXX.XXX.XXX.0/24 ;
	        127.0.0.1 ;
	};
};

# ルートDNSサーバの情報を参照するためのヒントファイル
zone "." IN {
        type hint;
        file "named.ca";
};

# ローカルホスト(localhost)に関する名前解決を行うためのゾーン
zone "localhost" IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};

# ループバックアドレス(127.0.0.1)の逆引き設定(IPアドレスからホスト名を解決)
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
};

# yourdomain.comの正引き
zone "yourdomain.com" {
        type master;
        file "db.yourdomain.com";
        allow-query { any; };
};

# IPは左から右へ書き、逆引きのゾーン名にはin-addr.arpaを末尾に付けます
# 111.222.333.x のIPアドレス帯に対する逆引き設定
zone "333.222.111.in-addr.arpa" {
        type master;
        file "db.111.222.333.0";
        allow-query { any; };
};

正引き用のゾーン設定ファイルを作成します。
配置先は、named.conf 内の directory “/var/named” で指定されたディレクトリとなります。
また、ファイル名はゾーン定義における file “db.yourdomain.com” の指定に従います。

vi /var/named/db.yourdomain.com

$TTL 1200
@ IN  SOA dns1.yourdomain.com. root.yourdomain.com. ( 2020011201 10800 3600 604800 43200 )
  IN  NS  dns1.yourdomain.com.
  IN  NS  dns2.yourdomain.com.

@                     IN  A    XXX.XXX.XXX.XXX
dns1                  IN  A    XXX.XXX.XXX.101
dns2                  IN  A    XXX.XXX.XXX.102

SOAレコードの @ はyourdomain.comを省略して書く記号です。

逆引き用のゾーン設定ファイルを作成します。

vi /var/named/db.111.222.333.0

$TTL 1200
@ IN  SOA dns1.yourdomain.com. root.yourdomain.com. ( 2026042301 3600 900 604800 86400 )
  IN  NS  dns1.yourdomain.com.
  IN  NS  dns2.yourdomain.com.

101     IN  PTR   dns1.yourdomain.com.
102     IN  PTR   dns2.yourdomain.com.

ここまでで設定できましたので、起動設定をします。

systemctl start named
systemctl enable named

firewallを開放します。

firewall-cmd --permanent --add-service=dns
firewall-cmd --reload

設定したDNSサーバーの動作確認

構築したbindサーバーとは別のAlmalinux8サーバーからdigコマンドを使って動作確認をしてみます。
問い合わせ結果が何も返ってこないときはbindサーバーでdnsのfirewallが解放されているか、bindのポート53が外部に開放されているかを確認してください。
(結果内容は実行アプリケーション、環境により異なる場合があります)

正引き
dns1.yourdomain.com のIPアドレスを構築したbindサーバーに問い合わせます。

dig dns1.yourdomain.com @bindサーバーのIPアドレス

;; ANSWER SECTION:
dns1.yourdomain.com.    1200    IN      A       XXX.XXX.XXX.101

;; AUTHORITY SECTION:
yourdomain.com.         1200    IN      NS      dns1.yourdomain.com.
yourdomain.com.         1200    IN      NS      dns2.yourdomain.com.

;; ADDITIONAL SECTION:
dns2.yourdomain.com.    1200    IN      A       XXX.XXX.XXX.102

逆引き

dig -x 111.222.333.101 @bindサーバーのIPアドレス

;; ANSWER SECTION:
101.333.222.111.in-addr.arpa. 1200 IN     PTR     dns1.yourdomain.com.

;; AUTHORITY SECTION:
333.222.111.in-addr.arpa. 1200    IN      NS      dns1.yourdomain.com.
333.222.111.in-addr.arpa. 1200    IN      NS      dns2.yourdomain.com.

;; ADDITIONAL SECTION:
dns1.yourdomain.com.    1200    IN      A       XXX.XXX.XXX.101
dns2.yourdomain.com.    1200    IN      A       XXX.XXX.XXX.102

設定した通りの問い合わせ結果が返ってきたらbindによるDNSサーバーの構築が完了です!

最後に

当社では、BINDを利用したDNSサーバーの15年以上の公開・運用実績がございます。ドメイン提供元のDNSサービスや、クラウドサービス提供のマネジメントサービスを利用する事例も増えてきましたが、カスタマイズ性や即時性を重視する際には独自管理有利な場面も多いです。
DNSに関するお悩みやご相談はお気軽にスペース・アイまでお問い合わせ下さい。

BINDは多機能が故にソースコード量も多く、脆弱性が発見される事も多くありました。またシェアが高く攻撃効率が良い為、攻撃対象とされる場合も多いです。そこで、当社ではよりスリムかつ権威DNSと再帰DNSを分離可能なPowerDNSの導入・運用にも力を入れております。いずれこの辺りもブログ化したいですね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次