macでBINDの設定

Tiger に元々入っている bind の設定例。
参考:http://www.atmarkit.co.jp/flinux/rensai/bind909/bind909a.html

@ITの記事を参考にして、chrootの環境を構築。1点注意は、mac の named はデフォルトでは /private/etc/named.conf を見に行くので、 シンボリックリンクをつくってやった。

# ln -s /var/named /var/named/private

named.conf設定

今回のDNSサーバは、グローバルIPが一つ、スレーブサーバーは無い設定になっている。

# rndc を使うための設定。ローカルからの接続しか受け付けない。
# 詳細はぐぐれ
controls {
        inet 127.0.0.1 port 54 allow {any;}
        keys { "rndc-key"; };
};
options {
        # 明示的に指定
        directory "/var/named";
        pid-file "/var/run/named.pid";
        # クエリはどこからでも受け付ける(デフォルト)
        allow-query { any; };
        # ゾーンの転送は行わない。
        allow-transfer { none; };
        # ステータスや統計のダンプファイル
        dump-file "/var/log/named_dump.db";
        statistics-file "/var/log/named.stats";
        # 自分で解決できない場合の問い合わせ先。プロバイダのDNSを指定
        forwarders {プライマリDNS; セカンダリDNS;};
        # まずフォワーダに問い合わせ、使えなければ再帰検索を行う。(デフォルト)
        forward first;
        # 自身からのみ再帰検索を行う。
        allow-recursion {127.0.0.1;};
        # バージョン隠蔽
        version "DNS Server";
};
# localのゾーンはデフォルトでOK。省略

# example.com のゾーン設定
zone "example.com" IN {
        type master;
        file "example.com.zone";
};
# example.com の逆引きゾーン設定
# 例えば、100.101.102.103 というIPだと、逆から指定する。
zone "103.102.101.100.in-addr.arpa" IN {
        type master;
        file "example.com.zone.rev";
};

ゾーンファイル

named.ca は最新ファイルを適切なところから持ってくる。

[ローカルのゾーン設定] localhost.zone
$TTL    86400
@                       1D IN SOA       @ root (
                                        44              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum

   IN NS        dns.example.com.
   IN A         127.0.0.1
[ローカルのゾーン逆引き設定] named.local
$TTL    86400
@       IN      SOA     example.com. root.example.com.  (
                                      2007111902 ; Serial
                                      3H       ; Refresh
                                      15M      ; Retry
                                      1W       ; Expire
                                      1H )     ; Minimum
        IN      NS      dns.example.com.

1       IN      PTR     localhost.
[example.comゾーン設定] example.com.zone
$TTL    86400
@       IN      SOA     example.com. root.example.com.  (
                                      2007111902 ; Serial
                                      3H       ; Refresh
                                      15M      ; Retry
                                      1W       ; Expire
                                      1H )     ; Minimum
        IN      NS      dns.example.com.
        IN      MX      10 mail.example.com.
@       IN      A       XXX.XXX.XXX.XXX
dns     IN      A       XXX.XXX.XXX.XXX
mail    IN      A       XXX.XXX.XXX.XXX
www     IN      CNAME   @
[example.comゾーン逆引き設定] example.com.zone.rev
@       IN      SOA     example.com. root.example.com.  (
                                      2007111902 ; Serial
                                      3H       ; Refresh
                                      15M      ; Retry
                                      1W       ; Expire
                                      1H )     ; Minimum
        IN      NS      dns.example.com.
        IN      PTR     example.com.

名前解決確認

nslookupがよく使われるが、最近は digらしい。

dig @DNSサーバ ホスト(ドメイン) [オプション]
# dig @localhost www.google.com SOA
# dig @localhost www.google.com MX

バージョン確認

# dig @調べるDNSサーバ chaos txt version.bind

自動起動

Tiger に bind の自動起動スクリプトは無い。適当に真似して作ってみた。ちょっと問題だったのが、chrootで動作させるため、PIDファイルの場所が異なるということだった。そのため、GetNamedPIDをコピーしてパスだけ修正。

以下のスクリプトを、/System/Lib/StartupItems/Bind に作成

#!/bin/sh

##
# Bind DNS server
##

. /etc/rc.common

GetNamedPID ()
{
    local program="$1"
    local pidfile="${PIDFILE:=/var/named/var/run/${program}.pid}"
    local     pid=""

    if [ -f "${pidfile}" ]; then
        pid=$(head -1 "${pidfile}")
        if ! kill -0 "${pid}" 2> /dev/null; then
            echo "Bad pid file $pidfile; deleting."
            pid=""
            rm -f "${pidfile}"
        fi
    fi

    if [ -n "${pid}" ]; then
        echo "${pid}"
        return 0
    else
        return 1
    fi
}

StartService ()
{
    if [ "${DNSSERVER:=-YES-}" = "-YES-" ] &&
       ! GetNamedPID named > /dev/null 2>&1; then

        echo "Starting DNS server"

        named -u named -t /var/named
    fi
}

StopService ()
{
    if pid=$(GetNamedPID named); then
        echo "Stopping DNS server"
        kill -TERM "${pid}"
    else
        echo "named is not running."
    fi
}

RestartService () { StopService; StartService; }

RunService "$1"

同じところに、StartupParameters.plist を作成

{
  Description     = "Bind DNS server";
  Provides        = ("DNS Server");
}

/etc/hostconfig に DNSSERVER=-YES- を追加して完了。