【初心者勉強日誌】Bindのnamed.confの記載


bindのnamed.confファイルを読む機会があったので
意味を調べたりした結果を記載してみました。

まずBINDとは...みたいなところからのスタートだったのですが、
こちらの[エンベーダーさんの記事](https://envader.plus/article/212)をみて概要は掴みました。
記事と重なる箇所もありますが記載していきます。

## 0.　named.confとnamed.conf.options

まずは**named.conf**ファイルについて調べる。

「named.confは、他の設定ファイルをインクルードする（取り込む）ためのエントリポイントとして機能します。以下のようにインクルードのみを記述します。」

つぎに**named.conf.options**ファイルについて調べる。
「named.conf.optionsは、BINDの一般的なオプションを設定するファイルです。ここで設定できる主要なオプションを以下の表で示します。以下の表以外にも多くの設定オプションがあり、詳細な設定や特定のニーズに応じた設定が可能です。」（[記事](https://envader.plus/article/212)引用）

...あれ？とここで詰まる。

**私が見ているnamed.confファイルにはincludeだけじゃないし、optionもzoneも記載があるぞ...**

というところで調べてみた所、以下の結論になりました。

**【結論】**
**1.機能的には同じ**
　named.confファイルのoptionsブロックと、named.conf.optionsファイルは
 　**機能的には同じもの。BINDサーバのオプションを定義するものである。**

**2.構造の違いがある**
　**Debian系**では、named.conf.opotionsとして**options設定を分離**することが一般的
　**Red Hat系**ではnamed.confファイル内に**オプションを直接書く**ことが一般的


なるほど～確かに今見てたのRed Hat系だった！
Deiban系のnamed.confは[エンベーダーさんの記事](https://envader.plus/article/212)の通り、includeだけ記載してoptions(named.conf.options)やローカルで管理されるゾーン情報や追加の設定（named.comf.local）を分離して読み込ませるようですね。
ということで解決したので、ここからはRed Hat系のnamed.confの記載で確認していきます。
記事のお陰で違いに気が付けたのでラッキーです。


## 1.acl ブロック
アクセス制御リストを定義して、特定のIPアドレスやネットワークに対して特別なアクセス権限を付与します。

    acl "リスト名" {
    192.168.0.0/24; //ローカルアドレス
    127.0.0.1;　//127.0.0.1;はループバック（自分自身）を表すIPアドレス
    };

上記の"リスト名"のところは好きなように"trusted"やら"local"等のグループ名として指定し、そこに通してもいいセグメントのアドレスを記載することで今後、"trusted"やら"local"の好きな単語をOptionsブロック等で変数として使用できるというわけですね。


# 2.Optionsブロック
一般的、全体的なBINDサーバーの動作に関するオプションを定義するブロックです。
沢山種類がありました。
※下記、記載の内容は様々な資料から気になったオプションを記載したものです。
　実際の設定としてこれらすべてのオプションを使用するわけではありません。サーバの使い方次第で使用するオプションは異なるため（実際のファイルではコメントアウト（//）されていたものなども有）ためご注意ください。

 
    options {
        directory "/var/named";  # 1.ゾーンファイルのディレクトリ
        pid-file "/var/named/run/named/named.pid" #2.BINDサーバが起動時に生成するプロセスIDを格納するファイルパス指定
        listen-on port 53 { any; };  # 3.サーバーがリッスンするIPアドレス
        allow-query { any; };  # 4.クエリを許可するクライアント
        allow-transfer{ any; };　#5.指定先にゾーン転送を行う
        forward only; #6.失敗したときは、自分で名前解決しない指定
        forwarders{ 192.168.1.1　};7.192.168.1.1(ローカルのDNSサーバ）をフォワーダーとして指定
        recursion no;  # 8.再帰的なクエリを無効にする
        version "unknown"; #9.バージョン情報を問い合わされた時の回答を"unknown"にする
    };

1.**directory** : BINDの作業ディレクトリのパス。ゾーンファイル等の設定に関連するファイルがおかれている
2.**pid-file**  : BINDサーバが起動時に生成するプロセスIDを格納するファイルパスを指定する。
　　※プロセスの管理（stop,kill,restartでの指定）自動管理ツールとの連携に使われる。指定しない場合はデフォルトの場所（/run/named.named.pidまたは/var/run/named/named.pid)に自動的に作成される。
3.**listen-on port**：DNSサーバーがどのIPアドレスとポートでリッスン（待ち受け）するかを指定するためのオプション。
　 port53はDNSの標準ポート。
 　{any}はすべてのネットワークインターフェースという意味で、指定する場合はIPアドレスを記載する。
　 ※ローカルホスト記載の場合はサーバの動作テストや、内部DNSサーバで使用。
　 ※記載していない場合（デフォルト）はすべてのインターフェースのIPv4、IPv6で、ポート 53 をリッスンする。
4.**allow-query**：クエリを許可するホストやネットワークを指定。
　{any}ですべてのインターフェースを指定。aclブロックで指定したリストを記載する等も可能。
5.**allow-transfer**：他のDNSサーバに対してゾーンデータを転送できるかを制御する。
　　ゾーン転送：プライマリ（マスター）DNSサーバーからセカンダリ（スレーブ）DNSサーバーへ、DNSゾーンのデータ（ドメイン名やIPアドレス情報など）をコピーするために使用し、プライマリが落ちてもセカンダリが引き続いて応答できるようにする冗長性確保のために行う。
  
想定はaclブロックで指定したローカルや信頼できるアドレスにのみ許可する、セカンダリサーバの指定をする、などの使い方をするみたい。noneで無効化可能で、ゾーン転送による漏洩防止になる。セキュリティ上の観点から、外部の不正アクセスを防ぐために、信頼できるサーバーに限定するか、必要がなければ無効にするのが望ましい。デフォルトはすべてのクライアントに対してゾーンを転送する。
6.**forward** ：DNSクエリを他のDNSサーバー（フォワーダー）に転送する際の動作を制御するために使用する。
 フォワーダーの応答がなかったり、名前解決をしなかった時の動作を下記で指定します。
　 first：自分自身で名前解決を行い、ルートDNSサーバー等を用いて解決します。信頼性重視
　 only：それ以上の名前解決は行わず、クエリは失敗したという応答を返します。特定のフォワーダーに依存させる。セキュリティやトラフィック制限の為に有効。
7.**forwarder**：他のDNSサーバー（フォワーダー）にクエリを転送するための設定。特定のDNSサーバーに問い合わせを行いたい場合や、内部ネットワークでのDNS管理を最適化したい場合に有効。
8.**recursion**：サーバーがクライアントから受け取ったDNSクエリに対して、他のDNSサーバーに問い合わせを行い、再帰的に名前解決を行うかを制御するオプション。デフォルトはrecursion yes(再帰的名前解決を許可する）
 　yes（再帰的名前解決許可）は、内部向けDNSサーバ想定。ただしACLを組み合わせて内部ネットワークのクライアントだけに再帰的名前解決を許可するのが推奨。
   no(再帰的名前解決無効）は、権威DNSサーバーやインターネットに公開されるDNSサーバで不必要な外部クエリを防ぐために適している。（オープンリゾルバになってしまうとDDOS攻撃やDNSリフレクションが攻撃者によって仕掛けられてしまうため）
   
   【参考リンク】
   
   https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?sso_step=1&id=567

9.**version**：BINDのバージョン情報を求められた際のコメントを指定する。バージョン情報はセキュリティの観点から公開することが推奨されていない（特定のバージョンに存在する脆弱性を悪用する可能性があるため）コメントを指定してみられないようにする。

※その他、気になった設定
**auth-nxdomain**：DNSサーバがNXDOMAIN(存在しないドメイン）エラーに対する応答の際に、その応答が権威あり(authorotative)かなしかを教える。　yesだと権威ありになり、サーバーがそのゾーンの権威サーバーであることを示す。noだとそのサーバーがそのゾーンの権威でないことを示す。

# 3.Zoneブロック
DNSゾーン（ドメイン名やその関連情報のセット）を定義するために使用する。
DNSサーバがどのゾーンを管理し、どのような動作を行うか指定する重要なオプションで、DNSサーバーがどのゾーンを管理するか、そしてそのゾーンに対してどのような操作を行うかを指定する。


    zone "example.com" {　# 1.ゾーン名 example.comを指定
        type master;　# 2.ゾーンの種類指定。サーバーがそのゾーンのプライマリサーバとして機能する。
        file "/var/named/example.com.db";　#3.ゾーンデータを保存するファイルのパスを指定する
        allow-transfer { 192.168.1.2; }; #4.ゾーン転送を許可するIPアドレスやネットワークを指定する
    };


1.**zone** ： ゾーン名指定。ゾーン名は通常、ドメイン名を指定する。リバースDNSの場合は、IPアドレスの逆引き形式（例：0.198.192.in-addr.arpa)で指定する。
2.**type** ： ゾーンの種類を指定する。
  master:サーバーがそのゾーンのプライマリ（マスター）サーバとして機能する。
  slave：サーバーがそのゾーンのセカンダリ（スレーブ）サーバとして機能し、プライマリサーバからゾーン情報を取得する
  hint：ルートサーバーのヒントゾーン。BINDがDNSサーバにクエリを来るための初期データを持つ特別なゾーン
  forward：特定ゾーンのクエリを他のDNSサーバに転送する。
3.**file**：ゾーンデータを保存するファイルのパスを指定する。このファイルにはドメイン名とIPアドレスの対応情報が含まれる。







また何かあれば追加します。