ebisawa / primdns

Simple DNS Contents Server

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

primdns - a simple dns contents server

* 特徴

  - 必要最低限の機能をコンパクトに実装することを目指した DNS コンテンツサーバです。
  - マルチスレッド処理により高い性能を発揮します。
  - モジュール化されたリソース DB エンジンにより、様々な特殊用途に対応可能です。
  - コンテンツサーバであるにもかかわらず、内部に DB 検索結果のキャッシュ機構を
    備えています。これにより低速な DB を参照する場合でも実用的な性能を発揮します。
  - BIND 等の設定に用いられる標準的なゾーンファイル形式をサポートします。
    また、djbdns (tinydns) 形式のデータファイルも利用できます。

* 動作環境

  BSD 系の OS、または Linux で利用することができます。
  例えば以下の環境で動作していた実績があります。

  - FreeBSD 8.2-RELEASE
  - Linux 2.6.35 (Ubuntu 10.10)
  - Mac OS X 10.5.8

  その他に、関連ツールの実行に Ruby が必要です。

* インストール

  基本的には configure して make install すればインストールできるように
  なっています。例えば次のようにして configure を実行してください。

    $ ./configure --prefix=/usr/local/primdns

  この例では /usr/local/primdns 以下のディレクトリがインストール先となります。

  次に、

    $ make
    # make install

  を実行すると、必要なバイナリのコンパイルとインストールが行われます。
  "Permission denied" 等といったエラーが表示される場合は、インストール先の
  ディレクトリへの書き込み権限を確認してください。

  なお、付属のツールの実行に Ruby が必要となりますので、ご利用の環境に
  Ruby がインストールされていない場合には、別途 Ruby のインストールが
  必要です。

* インストール (Debian)

  Debian パッケージをビルドするためのルールファイルを用意していますので、
  例えば次のようにして deb パッケージを作成することができます。

    $ debuild -uc -us -b

  パッケージが作成されたら、dpkg コマンドでインストールします。

    # dpkg -i primdns_0.8_i386.deb

* とりあえず実行してみる

  付属のサンプル設定で最低限の動作を確認するまでの手順を次に示します。
  以下の記載は、--prefix=/usr/local/primdns として make install した
  場合の例となっています。

  (1) インストール先に PATH を通す

    標準でないディレクトリにインストールした場合には、インストール先の
    ディレクトリに PATH を通る必要があります。

      # export PATH=$PATH:/usr/local/primdns/sbin

  (2) primdns-updatezone コマンドを実行

    primdns はテキストで記載されたゾーンファイルを、事前に専用の
    バイナリ形式にコンパイルする方式を採用しています。これは以下の
    コマンドを実行することにより行うことができます。

      # primdns-updatezone

  (3) primd の実行

    primdns の本体である primd を実行します。

      # primd -c /usr/local/primdns/etc/primd.conf

  (4) DNS 問い合わせをしてみる

    dig 等のツールを使って primd に問い合わせを行います。

      $ dig @127.0.0.1 localhost

* 起動オプション

usage: primd [options..]
options:  -4           ipv4 only
          -6           ipv6 only
          -b [addr]    listen on addr
          -c [path]    config file path
          -d           enable debug log
          -f           foreground mode
          -g [group]   setgid
          -p [port]    listen on port
          -q           enable query log
          -u [user]    setuid
          -v           show version
          -M [size]    cache pool size in MB
          -T [num]     number of worker threads

  -4    IPv4 でのみ問い合わせを受信します。
  -6    IPv6 でのみ問い合わせを受信します。
  -b    サーバが問い合わせを受信するアドレスを指定します。
        未指定時は全てのアドレスで受信します。
  -c    設定ファイルのパスを指定します。
        未指定時は /etc/primd/primd.conf となります。
  -d    デバッグ用ログを出力します。通常は指定する必要ありません
  -f    デーモンではなく、フォアグラウンドプロセスとして動作します。
  -g    指定されたグループ名で setgid(2) します。
  -p    指定されたポート番号で問い合わせを受信します。
  -q    問い合わせ内容をログに出力します。
  -u    指定されたユーザ名で setuid(2) します。
  -v    バージョン番号を表示します
  -M    キャッシュ用に確保するメモリサイズを MB 単位で指定します。
        デフォルトは 1MB です。
  -T    生成する DB 検索用ワーカスレッドの数を指定します。
        デフォルトは 0 で、メインのスレッドで DB 検索を行います。

* 設定ファイル書式

  zone <DOMAIN_NAME> [ <CLASS> ] {
      search {
          <ENGINE_NAME> <PARAMETER> ;
        [ <ENGINE_NAME> <PARAMETER> ; ]
        [ <ENGINE_NAME> <PARAMETER> ; ]
        [ ... ]
      };

    [ slaves {
          <SLAVE_IPV4_ADDR> ;
        [ <SLAVE_IPV4_ADDR> ; ]
        [ ... ]
      }; ]
  };

  - search

    ゾーンごとにリソース検索に用いるエンジンと、データファイル名等の
    パラメータを設定します。複数のエンジンが設定されている場合には、
    問い合わせのリソースが見つかるまで先頭から順にデータベースを検索
    していきます。

    <ENGINE_NAME> に指定できるものには以下のものがあります。

    (1) data エンジン

      データファイルを参照するエンジンです。データファイルは独自形式の
      バイナリファイルです。これはテキストで記述されたゾーンファイルを
      付属のツールにより変換することで得ることができます。

      パラメータとしてファイル名を記述します。

      [設定例]
      zone "localhost" {
        search {
          data "localhost.dat";
        };
      };

      zone "127.in-addr.arpa" {
        search {
          data "127.in-addr.arpa.dat";
        };
      };

    (2) external エンジン

      指定された外部コマンドを実行し、その結果を DNS 問い合わせ結果とします。
      パラメータとして実行ファイル名を記述します。

      [設定例]
      zone "example.com" {
        search {
          external "/usr/local/libexec/example.sh";
        };
      };

      問い合わせ内容は、外部コマンド実行時の引数として渡されます。

        argv[0]: コマンド名
        argv[1]: 問い合わせドメイン名
        argv[2]: 問い合わせクラス名
        argv[3]: 問い合わせタイプ名

      外部コマンドは、次の形式で結果を返さなくてはなりません。

        1行目: DNS リザルトコード (NOERROR=0, NXDOMAIN=3, RFC2136 参照)
        2行目: "<ドメイン名> <TTL> <クラス> <タイプ> <データ>" の形式
        3行目以降: レコードが複数続く場合は 2 行目と同形式で続ける

      外部コマンドが返却したデータは、最大で TTL 時間キャッシュされます。
      キャッシュ上にデータが存在する場合は外部コマンドが実行されません。

      なお、現在のところ、クラスは "IN" のみ、タイプは "A" および "PTR"
      のみのサポートなっています。

    (3) forward エンジン

      指定された別の DNS サーバに問い合わせを転送します。
      転送先には、recursive な問い合わせを行います。

      ※ 現在のところ、UDP での問い合わせのみ対応しています。

      [設定例]
      zone "example.net" {
        search {
          forward 192.0.2.1;
        };
      };

    (4) serverid エンジン

      サーバのホスト名、バージョン番号等を変える特別なレコートに応答します。
      具体的には次のレコードに応答します。

        - id.server CH TXT, hostname.bind CH TXT
          - サーバのホスト名を返します
        - version.server CH TXT, version.bind CH TXT
          - サーバのバージョン番号を返します

      [設定例]
      zone "server" CH {
        search {
          serverid;
        };
      };

      zone "bind" CH {
        search {
          serverid;
        };
      };

    (5) axfr エンジン

      AXFR によるゾーン転送により、指定されたマスタサーバに対するスレーブ
      サーバとして動作します。

      外部コマンドとして付属スクリプト群を実行するため、これらが PATH の
      通ったディレクトリにインストールされている必要があります。

      [設定例]
      zone "example.com" {
        search {
          axfr 192.0.2.100;
        };
      };

     ※ マスタよりゾーン転送を受けるゾーンについて、他のエンジンを併用
        するとスレーブサーバとしては適切でない動作となる場合があります。

  - 複数エンジンの利用

    ゾーン設定の search セクションにおいて複数のエンジンが設定されている
    場合には、先頭に記述されたものから順に問い合わせを行い、最初に発見した
    結果を採用してクライアントに応答します。

    次の例では、まず最初に外部コマンド実行し、問い合わせのリソースが見つから
    なかった場合に、データファイルを参照します。

    [設定例]
    zone "example.org" {
      search {
        external "/usr/local/libexec/example.org.sh";
        data "example.org.data";
      };
    };

    また次のようにすると、データファイルを複数のファイルに分割できます。

    [設定例]
    zone "example.org" {
      search {
        data "example.org.1.dat";
        data "example.org.2.dat";
        data "example.org.3.dat";
      };
    };

  - slaves

    ゾーン転送を許可するスレーブサーバの IP アドレスを記述します。
    ここに記載されたサーバからの AXFR によるゾーン転送を受け付けます。
    また、当該サーバに対し、起動時および SIGHUP による設定再読み込み時に
    NOTIFY を送信します。

    data エンジンを使用するゾーンのみゾーン転送を行うことができます。
    search リストに複数の data エンジンが含まれる場合、データファイルを
    またがって重複するレコードがないようにしてください。

    ※ 現在のところ、スレーブとの通信は IPv4 でのみ行うことができます。

    [設定例]
    zone "example.jp" {
      search {
        data "example.jp.dat";
      };

      slaves {
        198.51.100.1;
        198.51.100.2;
      };
    };

* ライセンス

  本ソフトウェアは、以下の通り、いわゆる BSD ライセンスにより自由に再頒布や
  使用をすることができます。

  本ソフトウェアは「現状のまま」提供されるものであって、何の保証もなされません。
  著作権者や貢献者は、本ソフトウェアの使用から発生した損害について一切責任を
  負わないものとします。

  Copyright (c) 2010-2012 Satoshi Ebisawa. All rights reserved.

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
  are met:
  1. Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.
  3. The names of its contributors may not be used to endorse or
     promote products derived from this software without specific
     prior written permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.

* 仕様

  以下の RFC それぞれに記載の仕様の全部または一部が実装されています。

  RFC 1034 - DOMAIN NAMES - CONCEPTS AND FACILITIES
  RFC 1035 - DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION
  RFC 1123 - Requirements for Internet Hosts -- Application and Support
  RFC 1982 - Serial Number Arithmetic
  RFC 1996 - A Mechanism for Prompt Notification of Zone Changes (DNS NOTIFY)
  RFC 2181 - Clarifications to the DNS Specification
  RFC 2308 - Negative Caching of DNS Queries (DNS NCACHE)
  RFC 2671 - Extension Mechanisms for DNS (EDNS0)
  RFC 3596 - DNS Extensions to Support IP Version 6
  RFC 3597 - Handling of Unknown DNS Resource Record (RR) Types
  RFC 4343 - Domain Name System (DNS) Case Insensitivity Clarification
  RFC 5936 - DNS Zone Transfer Protocol (AXFR)

* 制限事項

  現在のところ、ゾーンファイルに記述できるレコードは以下のものに限られます。

    - A
    - NS
    - CNAME
    - SOA
    - PTR
    - MX
    - TXT
    - AAAA

* 謝辞

  本ソフトウェアの実装・公開にあたり、お世話になった皆様に感謝いたします。

  Arc4 random number generator for OpenBSD.
  Copyright 1996 David Mazieres <dm@lcs.mit.edu>.

  thanks to: GREE, Inc.

About

Simple DNS Contents Server

License:Other


Languages

Language:C 77.5%Language:Ruby 11.3%Language:Shell 10.1%Language:C++ 1.0%