淡々と備忘録を綴る

IT周りの行き詰まったところやメモを備忘録として記録します

BIND DNSサーバーのconfigあれこれ

自宅DNSサーバーを建てるに当たって、configの書き方を調べた&何回かエラーを起こしたので備忘録として記します。 bindはconfigの構文を間違っていると起動しないので注意しましょう。

主要な設定ファイル

  • named.conf: BINDの主設定ファイル。BINDサーバーの基本的な動作設定、ゾーンの定義、セキュリティポリシー、その他のオプションを含む。
  • named.conf.local: カスタムのゾーン定義など、ローカルで特有の設定を含むことが推奨される追加設定ファイル。これはnamed.confからインクルードされる。
  • named.conf.options: BINDサーバーのオプション設定を含むファイル。一般的には転送設定、リスニングポート、キャッシュの設定など。
  • named.conf.default-zones: デフォルトで提供されるゾーン(例えば、ルートヒントファイル、ローカルホストゾーンなど)の定義を含むファイル。これもnamed.confからインクルードされることが多い。

設定ファイルの構成要素

  • options { ... }: サーバー全体のオプションを設定します。ここにはディレクトリパス、転送設定、レートリミット、キャッシングポリシーなどが含まれます。
  • acl "name" { ... }; アクセスコントロールリスト(ACL)を定義します。特定のネットワークやホストへのアクセス許可や拒否を指定できます。
  • zone "name" { ... }; ゾーンを定義します。ゾーンはドメイン名に関連する情報(例えば、Aレコード、MXレコード)を含むDNSの単位です。ゾーンはプライマリ(マスター)またはセカンダリ(スレーブ)に設定できます。
  • key "name" { ... }; TSIG(Transaction SIGnature)キーまたはDNSSEC(DNS Security Extensions)のキー設定を含みます。これらはセキュリティ強化のために使用されます。
  • logging { ... }; ログ出力の設定を含みます。異なるカテゴリのログを異なるチャネルにルーティングするために使用されます。

ゾーンファイル

  • ゾーン定義の一部として、ゾーンデータファイルのパスが指定されます。これらのファイルには、ドメインに関連するレコード(A、MX、CNAME、NSレコードなど)が含まれます。

カテゴリの役割と使用方法

BIND DNSサーバーにおけるcategoryは、ログの種類やソースを分類するための概念です。ログをカテゴリごとに分けて管理することで、情報を適切にフィルタリングし、重要なイベントを見逃さないようにすることができます。

定義されているカテゴリ一覧

  • default: 特定のカテゴリに分類されない全てのメッセージ。
  • client: クライアントからのリクエストに関連するメッセージ。
  • network: ネットワーク関連のイベント。
  • queries: 受信したクエリに関するメッセージ。
  • lame-servers: Lame delegation(応答不能な名前サーバーからの応答)に関する警告。
  • config: 設定ファイルの読み込みや解析に関するメッセージ。
  • security: セキュリティ関連のイベントや警告。
  • resolver: 名前解決プロセスに関連するメッセージ。
  • xfer-in: ゾーン転送(受信)に関するメッセージ。
  • xfer-out: ゾーン転送(送信)に関するメッセージ。
  • notify: NOTIFYメッセージ処理に関するメッセージ。
  • update: ダイナミックアップデートに関するメッセージ。
  • dispatch: メッセージディスパッチシステムに関するメッセージ。
  • dnssec: DNSSEC(DNSセキュリティ拡張)操作に関するメッセージ。
  • delegation-only: "delegation-only" ゾーンに関する警告。
  • edns-disabled: EDNS(拡張DNS)が無効にされた際のメッセージ。
  • cname: CNAME関連の処理に関するメッセージ。
  • rate-limit: レートリミット機能に関するメッセージ。
  • rpz: 応答ポリシーゾーン(Response Policy Zone)に関するメッセージ。

カテゴリの使用方法

カテゴリはnamed.confloggingセクションで定義され、各カテゴリに対してどのログチャネルを使用するかを指定します。

logging {
    channel my_log_channel {
        file "path/to/logfile.log";
        severity info;
        print-time yes;
    };
    category queries {
        my_log_channel;
    };
};

チャネルの役割と定義方法

channelは、ログの出力方法や出力先を定義するための構成要素です。ログチャネルを使用することで、ログデータがどのように処理され、どこに記録されるかを細かく制御できます。

チャネルに指定できる項目

  • file: ログを記録するファイルのパス。
  • severity: 記録するログの重要度レベル。
  • print-time: ログエントリにタイムスタンプを含めるかどうか。
  • print-severity: ログエントリに重要度レベルを含めるかどうか。
  • print-category: ログエントリにカテゴリ情報を含めるかどうか。
  • versions: ログファイルのローテーションにおいて保持するファイルの数。
  • size: ログファイルがローテートされる前の最大サイズ。
  • syslog: システムログとして出力するかどうか。
  • stdout: 標準出力にログを出力するかどうか。
  • stderr: 標準エラーにログを出力するかどうか。

チャネルの定義方法

ログチャネルはnamed.confloggingセクションで定義します。

logging {
    channel example_channel {
        file "/var/log/named/example.log" versions 3 size 5m;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
    };
};

Severityの役割と使用方法

channel内で定義できるseverityは、ログエントリの重要度を指定するパラメータです。BINDで指定できるレベルは以下の通りです。
- critical: 致命的な問題が発生したことを示す。 - error: エラーが発生したが、サーバーは引き続き動作可能な状態。 - warning: 注意が必要な問題が発生した。 - notice: 通常の動作ですが、注目に値する事象が発生した。 - info: 情報提供のみ。 - debug: デバッグ情報。開発者やトラブルシューティング用。 - dynamic: ランタイムにおいて動的にログレベルを変更することができる。このレベルは、状況に応じてログの詳細度を調整する。

ログチャネルで指定されたレベル以上のメッセージのみが記録されます。

注意点

  • ログファイルは手動で作成し、BINDが実行されているユーザーがファイルに書き込めるように適切なパーミッションを設定しておく必要があります。
  • configファイルの構文が間違っているとbindの起動に失敗します。このとき、具体的にどこが間違っているかかがログに出ないのでトラブルシューティングに苦労しました。
  • configファイルの構文のチェックはnamed-checkconfコマンドや、named-checkzone [ゾーン名] /etc/bind/db.zone.pathコマンドで可能です。

結論

bindむずい。