Loading
BLOG 開発者ブログ

2020年12月9日

初歩から解説!BINDでシンプルDNSサーバー構築【構築編】

なかなか理解するのが難しいDNSサーバーについて、前後編に分けて BIND を設定しながら解説します。

この記事は アイソルート Advent Calendar 2020 9日目の記事です。

 

 

こんにちは。日々検証環境を構築しているプラットフォームソリューショングループのsuzuki.koです。

前回の【用語編】ではDNSの仕組みと登場する用語について簡単に解説しました。

今回は【構築編】として、 BIND を実際に構築していきましょう!

 

初歩から解説!BINDでシンプルDNSサーバー構築【用語編】

 

目次

 

DNSサーバー構築

BINDでDNSサーバーの構築を行っていきます。

前提としてVMの立ち上げ、IP設定、GW設定、DNSクライアント設定などは完了し、pingによる疎通は確立していることとします。

 

動作環境

検証環境の作成にはESXi、OSはCentOSを利用します。各種バージョンは以下の通りです。

  • ハイパーバイザ
    • VMware ESXi 6.7.0 Update 2 (build-13006603)
  • DNSサーバー
    • CentOS Linux release 8.2.2004 (Core)
    • bind-libs-lite-9.11.13-6.el8_2.1.x86_64
  • NTPサーバー
    • CentOS Linux release 8.2.2004 (Core)
    • chrony-3.5-1.el8.x86_64
  • Client (NTPを利用)
    • CentOS Linux release 8.2.2004 (Core)
    • chrony-3.5-1.el8.x86_64
  • 仮想ルーター
    • VyOS 1.3-rolling-202002180217

 

ネットワーク構成

今回のネットワーク構成はこちらです。

少し実践的な内容の構成にしています。

 

 

そして

  • Step1: NTPサーバー (192.168.20.200) からインターネット上の上位NTPサーバー(2.centos.pool.ntp.org) への 再帰問い合わせ 成功。
  • Step2: Client (192.168.10.10) から NTPサーバー (192.168.20.200) に対して 非再帰的な名前解決 の成功。

というところを目標に構築していこうと思います。

 

今回動作確認に利用する NTPサーバー 仮想ルーター に関しては別の記事にて解説を行っていますので、

気になる方はそちらも確認してみてください。

 

たった3行編集!ChronyでシンプルNTPサーバー構築

ESXi内のルーティングに必須!VyOSで仮想ルーター構築

 

インストール

ではさっそくBINDを構築していきましょう。

CentOSにBINDのインストールを行います。

yumからインストールできます。

 

Firewalld

Firewalldを編集しておきます。

FirewalldとはCentOSの標準ファイアウォール機能で、systemctl (システムコントロール) コマンドで操作することができます。

これが 初期状態で有効 であるため、そのままにしておくとフィルタリングが働いてしまいます。

設定を無効にするか、

DNSの通信を許可しておいてください。

 

BINDのステータス確認

BINDを起動させ、ステータスを確認してみます。

BINDはsystemctlコマンドで named を指定して操作を行います。

誤った設定を入れたりするとここにエラーが吐き出されます。

 

初期設定確認

初期状態の設定を確認してみましょう。

設定ファイルは /etc/named.conf にあります。

 

初期config (※ダブルクリックすると全文が確認できます。)

 

再帰問い合わせ

  • Step1: NTPサーバー (192.168.20.200) からインターネット上の上位NTPサーバー(2.centos.pool.ntp.org) への 再帰問い合わせ 成功。

となるように構築を行います。

 

 

設定ファイルの /etc/named.conf を編集していきましょう。

編集するのは次の4箇所です。

 

config (※ダブルクリックすると全文が確認できます。)

 

  • listen-on port 53
    • LISTENするIPアドレスを指定します。
      自身のIPアドレスを追記しています。
  • allow-query
    • 問い合わせを受け付けるネットワークを制限します。
      今回はClientのネットワークも含めた192.168.0.0/16で許可します。
  • forwarders
    • 再帰問い合わせ先を指定します。
      GoogleのパブリックDNSサーバーを指定します。
  • recursion
    • 再帰問い合わせ機能を利用するかを記述します。
      利用する場合は yes , 利用しない場合は no と記述します。

 

DNSサーバーを再起動して設定を反映させます。

 

動作確認

NTPサーバー(Chrony) を使って動作確認を行います。

 

まずは getentコマンド で名前解決が成功するか確認してみます。

※ちなみに nslookupコマンド はCentOS8では非推奨らしいです。知らなかった。

2.centos.pool.ntp.org というFQDNがIPアドレス(v6ですが)に変換されているのが確認できますね!

 

では次に FQDNで時刻同期 させてみましょう。

NTPサーバーの /etc/chrony.conf を編集します。(※ダブルクリックすると全文が確認できます。)

Chronyを再起動させます。

 

時刻同期のステータスを確認します。

IPアドレスの横に「*」があるので無事に FQDNを名前解決 した上で同期が完了していますね!

 

非再帰問い合わせ

  • Step2: Client (192.168.10.10) から NTPサーバー (192.168.20.200) に対して 非再帰的な名前解決 の成功。

となるように構築を行います。

今回は ntp.local 192.168.20.200 と解決されるように設定します。

 

 

まずconfigファイルでzoneを定義します。

 

config (※ダブルクリックすると全文が確認できます。)

 

  • zone “ゾーン名” IN
    • この記述でゾーンについて定義しています。
      今回はlocalゾーンを定義します。
  • file
    • 名前を引くための情報がどのファイルに記載してるかを示しています。
      今回は local.zone というファイルを作成してそこに記述します。
  • type
    • DNSのタイプを指定します。
      masterでプライマリーサーバ、slaveでセカンダリーサーバ、hintでキャッシュサーバとなります。
      今回はプライマリサーバーに指定します。
  • directory
    • ゾーンを定義するファイルの配置場所を記述します。
      /var/namedを指定しているので、/var/named/local.zone となるようにファイルを配置すればいいということになります。

 

次に /var/named/local.zone を作成し、その中で解決したいFQDNに関するレコードを書いていきます。

 

/var/named/local.zone

 

  • $ORIGIN
    • このファイルで利用されるドメインを記述します。
      ここでは local. を指定しているため、11行目で記述されている ntp は ntp.local. と認識して処理されます。
      また3行目にあるように @ と記述すると local. として処理されます。
  • $TTL
    • 再帰問い合わせを行った際にキャッシングする時間を秒で記述します。
      今回は利用しないのですが、お決まりの記述ですので残しておきます。
  • SOAレコード
    • この部分にDNSサーバー名と管理者のメールアドレス、DNSサーバーの各種設定を記述します。
      DNSサーバー名は9行目のNSで定義したもの、メールアドレスには適当なものを記述しています。
      注意点として、完全なFQDNで記述する必要があり、また @ は使えないため代わりにピリオド(.)で記述しなければなりません。
  • SOA 内パラメータ
    • SOA 内で記載されている各種パラメータは以下の通りです。
      • Serial:適当なシリアルナンバーを10桁で記述します。
      • Refresh:リフレッシュ値といい、セカンダリサーバーへのゾーン情報の転送間隔を記述します。
      • Retry:リフレッシュが失敗したときの再送間隔を記述します。
      • Expire:リフレッシュが失敗している時のセカンダリサーバの有効時間を記述します。
      • Minimum:存在しないドメイン名に対して「存在しない」という情報(=ネガティブキャッシュ)を保持する時間を記述します。
  • NSレコード
    • 9行目のNSレコードではこのゾーンを管理するDNSサーバーを定義します。
      セカンダリサーバーを定義するときNSレコードを追加で記述します。
  • Aレコード
    • 10-11行目のAレコードでホストとIPとの対応関係の定義を行ないます。
      ntp.local からNTPサーバのIPである 192.168.20.200 が引けるように記述しています。
      またDNSサーバー自身のIPについても記述する必要があります。

 

DNSサーバーを再起動して設定を反映させましょう。

 

動作確認

では同じ手順で NTPサーバー(Chrony) を使って動作確認を行います。

 

まずは getentコマンド で名前解決が成功するか確認してみます。

ntp.local というFQDNが 192.168.20.200 に変換されているのが確認できます!

 

では次に FQDNで時刻同期 させてみましょう。

NTPサーバーの /etc/chrony.conf を編集します。(※ダブルクリックすると全文が確認できます。)

Chronyを再起動させます。

 

時刻同期のステータスを確認します。

こちらも無事に FQDNを名前解決 した上で同期できていますね!成功です!

 
 

さいごに

今回は【用語編】【構築編】の2回にわたってDNSサーバーの構築について解説しました。

BINDの構築は難しいですが、やはりきちんと動いてくれると嬉しいですね。

この基本的な設定を土台にさらに応用的なDNSサーバーを構築していけるようにしていきたいと思います。

DNSの基礎について解説した【用語編】についてはこちらになりますので、ぜひ確認してみてください。

 

初歩から解説!BINDでシンプルDNSサーバー構築【用語編】

 

明日の記事は maruoka.n さんによる 理想のテレワーク環境をWVDで実現です、お楽しみに!