UNIXな生活
更新:2004/4/18  
Linuxな生活  FreeBSDな生活
 Solarisな生活
 JAVAな生活
 Practical use
 掲示版
Bindで作るDNSサーバ

DNSサーバbindの入門編です。
今回使用するのは、bind-9です。
ソースの入手先は下記アドレスから
http://www.isc.org/products/BIND/

BINDのイ ンストール
Debian
aptからインストール
#apt-get install bind9

FreeBSD
portからインストール
#cd /usr/ports/dns/bind9
#make install
標準のbind8を無効 にしておきます。
#chmod 444 /usr/sbin/named
rndcコマンドの設定
#cp /usr/local/etc/rndc.conf.sample  /usr/local/etc/rndc.conf
rndc.confの以下の部分を切り取り、/usr/local/etc/rndc.keyを作成します。
key "key" {
        algorithm     hmac-md5;
        secret "c3kgFRr8F********************************fEff7W";
};
rndc.confとrndc.keyのパーミッションを変更します。
#chown bind:bind rndc.conf
#chown bind:bind rndc.key
#chmod 400 rndc.conf
#chmod 400 rndc.key
起動の設定
/etc/rc.confに追記
named_enable = "YES"
named_program = "/usr/local/sbin/named"
named_flags = "-c /usr/local/etc/named.conf -u bind"
停止は、
#kill -INT 'cat /var/run/named/named.pid'

source
ソースから
#tar zxvf bind-9.2.2.tar.gz -C /usr/local/src/

#cd /usr/local/src
#cd bind-9.2.2
#./configure --prefix=/usr/local
#make
#make install clean
/usr/local下にBIND本体とユーティリティがインストールされます。
bind 用ユーザー、グループの作成。
bind ユーザを作成しておきます。
group = bind
user = bind
bindユーザはログインできる必要はありませんので、ログインシェルは/bin/falseなどにしておきます。
それぞれのOSの流儀にしたがってください。


基本設定
Bind9のファイルたち。
named.conf------BIND基本設定ファイル。(場所はOSに依存 します。)
named.ca--------キャッシュ用
domain.zone----- 正引き用ゾーンファイル
domain.rev------逆引き用ゾーンファイル
local.zone------ループバック正引き用ゾーンファイル
local.rev-------ループバック逆引き用ゾーンファイル
named.pid------- プロセスID(PID)ファイル

ここでは、ローカルネットワーク内のマスターゾーンサーバとキャッシュサーバを作成します。
*外部へのDNS問い合わせは可、外部からのDNS問い合わせは不可。

BINDの設定ファイル、 named.confを作成します。
acl my-network {
    192.168.100.0/26;
    127.0.0.1;
};

options {
    directory "/var/named";
    pid-file "/var/run/named/named.pid";
    recursion yes;
};

zone "." {
    type hint;
    file "named.ca";
};

zone "localhost" {
    type master;
    file "local.zone";
};

zone "0.0.127.in-addr.arpa" {
    type master;
    file "local.rev";
};

zone "hoge.com" {
    type master;
    file "domain.zone";
};

zone "100.168.192.in-addr.arpa" {
    type master;
    file "domain.rev";
};

logging {
   channel default debug {
    file "/var/log/named/named.log" version 4 size 5m;
    severity dynamic;
    print-time yes;
    print-category yes;
   };
   category default {default_debug;};
   category xfer-in {default_debug;};
   category xfer-out {default_debug;};
};
ア クセス制御用宣言名
プライベートネットワーク内からのみアクセスを許可
ローカルホストからの問い合わせを許可


動作全般の制御設定

設定ファイルの位置やnamedのワークディレクトリを指定
PIDファイルの指定


キャッシュサーバの設定
Type=hintを指定(キャッシュサーバ)
ルートサーバが記述されたファイルを指定

ここからマスター・ゾーンサーバとして動作させる ための設定

ループバックアドレス正引き用

マスターサーバの場合にtype masterで指定
localhostに対する正引き設定ファイル名
(option-directory "/var/named"の相対パス)

ループバックアドレス逆引 き用
127.0.0.1アドレスに対する逆引き用設定ファイル名の指定


ドメイン
ドメインに対する正引き設定ファイル名の指定

アドレス逆引き用
逆引き 用設定ファイルの指定






ログ出力の設定

出力先と、ログローテの設定
以下その他設定。

設定ファイルの格納ディレクトリの作成
#mkdir /var/named
#chown bind:bind /var/named
#chmod 700 /var/named
PIDファイルの格納場 所を作成
#mkdir /var/run/named
#chown bind:bind /var/run/named
#chmod 700
/var/run/named
ログファイルの出力先を 作成
#mkdir /var/log/named/
#chown bind:bind /var/log/named
#chmod 700 /var/log/named

各設定ファイルの作成
named.confで"/var/named"以下に配置する設定をしてあるので、そこに作成します。
ループバックの正引き用
/var/named/local.zone
$TTL 86400
@    IN   SOA  localhost. root.localhost. (
          2002122001 ; serial
          28800  ; refresh 8hr
          14400  ; retry 4hr
          604800 ; expire 1w
          86400  ; default_ttl 24hr
);
     IN   NS   localhost.
     IN   A    127.0.0.1
ドメインの正引き用
/var/named/domain.zone
$TTL 86400
@          IN   SOA   dns1.hoge.com. root.hoge.com. (
                2002122001 ; serial
                3600       ; refresh 1hr
                900        ; retry 15min
                604800     ; expire 1w
                86400      ; min 24hr
);
           IN   NS     dns1.hoge.com.
localhost  IN   A      127.0.0.1
dns1       IN   A      192.168.100.1
hoge1      IN   A      192.168.100.10
hoge2      IN   A      192.168.100.11
ループバックの 逆引き用
/var/named/local.rev
$TTL 86400
@    IN   SOA  localhost. root.localhost. (
          2002122001 ; serial
          28800  ; refresh 8hr
          14400  ; retry 4hr
          604800 ; expire 1w
          86400  ; default_ttl 24hr
);
     IN   NS   localhost.
1    IN   PTR  localhost.
ドメインの逆引き用
/var/named/domain.rev
$TTL 86400
@    IN   SOA   dns1.hoge.com. root.hoge.com.  (
          2002122001      ; Serial
          3600            ; Refresh
          900             ; Retry
          604800          ; Expire
          3600            ; Minimum
);
     IN   NS    dns1.hoge.com.
1    IN   PTR   dns1.hoge.com.
10   IN   PTR   hoge1.hoge.com.
11   IN   PTR   hoge2.hoge.com.
ループバックの設定は、基本的にどんな場合でも同じになります。
ドメインの正引き、逆引き用ファイルのみ、利用する環境に合わせて作成します。
今回は、ドメインが"hoge.com"で、"hoge1","hoge2"PCへの名前解決を行っています。

キャッシュサーバ用の設定
キャッシュサーバ用ファイルのnamed.caは、以下の URLより入手してください。
ftp://ftp.rs.internic.net/domain/named.root
入手したnamed.rootファイルを/var/named/named.caと してコピーします。
#cp named.root /var/named/named.ca

最後に、設定ファイルの所有者とパーミッションを変更しておきます。
#chown -R bind:bind /var/named
#chmod -R 700 /var/named

動作確認
とりあえず設定は終了したので、動作確認してみます。
Packageなどからインストールした場合は、起動スクリプトよりbindを起動してください。
ソースからインストールした場合の起動は以下のように、
#named -u bind -c named.conf
停止は、
#kill -INT `cat /var/run/named/named.pid`

resolv.confの設定
自ホストのDNS参照先を変更します。
/etc/resolv.conf
nameserver 127.0.0.1

bindの動作確認
bindの動作確認は、digコマンドで行います。
以下の物がきちんと動作するか確認しておきます。
localの正引き確認
dig localhost
localの逆引き確認
dig -x 127.0.0.1
SOAレコードの確認
dig hoge.com soa
NSレコードの確認
dig hoge.com ns
ドメインの正引き確認
dig dns1.hoge.com
ドメインの逆引き確認
dig -x 192.168.100.1
外部ホストの確認(キャッシュサーバの確認)
dig www.ya***.co.jp

この動作確認が終了すれば、ローカルネットワーク内のマスターゾーンサーバとキャッシュサーバとして動作します。

bindの設 定いろいろ
キャッ シュサーバのみのDNS
キャッシュサーバのみのDNSを作るには、先ほど作成したnamed.confか ら、
zone "hoge.com "{}と、zone "100.168.192.in-addr.arpa"{}を削除してください。

内部に httpサーバやメールサーバを設定する場合
まず、最初に作成したnamed.confを修正します。
最初に作成したものは、外部からの問い合わせを受けつけない設定になっているためです。
named.conf"acl my-network"{}を削除してください。
これで、外部からのDNS問い合わせに応答するようになります。
また、option{}内の、recursion yes;recursion no;に変更してください。
これは、自らで管理しているドメイン以外の応答には答えないようにするためです。
*キャッシュサーバは無効化されます。同居 させたい場合は、セキュリティーの考察(2.)を参考にしてください。

メー ルサーバを設置する場合。
メールサーバを追加する場合は、ドメインにMXレコードを追加する必要があります。
これにより、ドメインのメールサーバMXレコードのサーバであることを指定します。
下の例は、domain.zoneファイル(ドメインの正引き用)を編集し、mail1サーバを追加します。
domain.zoneに追加するのは、MXレコードとAレコードです。
/var/named/domain.zone
$TTL 86400
@          IN   SOA   dns1.hoge.com. root.hoge.com. (
                2002122001 ; serial
                3600       ; refresh 1hr
                900        ; retry 15min
                604800     ; expire 1w
                86400      ; min 24hr
);
           IN   NS     dns1.hoge.com.
           IN   MX 10  mail1.hoge.com.
localhost  IN   A      127.0.0.1
dns1       IN   A      192.168.100.1
hoge1      IN   A      192.168.100.10
hoge2      IN   A      192.168.100.11
mail1      IN   A      192.168.100.100

確認は、digコマンドで行ってください。
dig hoge.com  mx

httpサーバやftpサーバを設定す る場合。
webサーバやftpサーバを設定する場合は、以下のようになります。
/var/named/domain.zone
$TTL 86400
@          IN   SOA   dns1.hoge.com. root.hoge.com. (
                2002122001 ; serial
                3600       ; refresh 1hr
                900        ; retry 15min
                604800     ; expire 1w
                86400      ; min 24hr
);
           IN   NS     dns1.hoge.com.
           IN   MX 10  mail1.hoge.com.
localhost  IN   A      127.0.0.1

dns1       IN   A      192.168.100.1
hoge1      IN   A      192.168.100.10
hoge2      IN   A      192.168.100.11
mail1      IN   A      192.168.100.100
www        IN   A      192.168.100.101
ftp        IN   A      192.168.100.102
これで、www.hoge.comは192.168.100.101で、 ftp.hoge.comは192.168.100.102になります。


CANAME の利用
CANAMEと言う機能を使ってみます。
例えば、dns1で、httpサーバとftpサーバを兼用する場合は、以下のようになります。
/var/named/domain.zone
$TTL 86400
@          IN   SOA   dns1.hoge.com. root.hoge.com. (
                2002122001 ; serial
                3600       ; refresh 1hr
                900        ; retry 15min
                604800     ; expire 1w
                86400      ; min 24hr
);
           IN   NS     dns1.hoge.com.
           IN   MX 10  mail1.hoge.com.
localhost  IN   A      127.0.0.1

dns1       IN   A      192.168.100.1
hoge1      IN   A      192.168.100.10
hoge2      IN   A      192.168.100.11
mail1      IN   A      192.168.100.100
www        IN   A  CANAME    dns1.hoge.com
ftp        IN   A  CANAME    dns1.hoge.com
このメリットは、dns1.hoge.com(192.168.100.1)が故障して、dns1.hoge.comを192.168.100.2で代用 した場合に、wwwとftpのAレコードを編集する必要が無いことです。

BIND のセキュリティー
1.ゾーンサーバとキャッシュサーバの 分離
今回作成したDNSサーバで、外側からの問い合わせを許可する設定にしたサーバは、DMZ領域に置き、キャッシュサーバとは分離すべきです。そして、 キャシサーバはNATの内部に設置すべきです。
そして、当然、HTTPやMailサーバもDMZ領域に置くことになります。

2.ゾーンサーバとキャッシュサーバを 同居させる場合
この場合は、キャッシュサーバの不正利用を防ぐため、利用できるホストを制限します。
変更するのは、named.confoptions{}内にあるrecurisionを 削除し、allow-recurision追加しま す。
options {

       allow-recursion {
           192.168.100.0/24;
       };
};

3.攻撃者に余分な情報を与えな い。
BINDの使用しているバージョンを特定されないようにします。
BINDのバージョンは、外部から"dig @DNSサーバ version.bind chaos txt"で引き出せます。
で、これに応答しないようにします。
変更するのは、named.confoptions{}内に追加します。
options {
      version "DNS Server";
};
これで、先ほどのコマンドを 受けつけると、"DNS Server"とだけ返すようになります。

4.DoS 攻撃への対応
攻撃元が絞れれば、BINDで対応可能です。
その場合は、攻撃元のIPを全て無視させます。
変更するのは、named.confoptions{}内に追加 します。
options {
       blackhole {
           10.25.10.10 <-------ホスト指定
           10.25.10.0/24 <-----ネットワーク指定
       };
};

その他、chroot環境での利用や統計情報(rndc)なども利用できます。

起動ファイル
ソースからインストールした場合などは、起動ファイルを作 成する必要があります。
下記が起動ファイルのサンプルです。
#!/bin/sh
PROFILEDIR=/var/run/named
CONFFILE=/etc/named.conf
case "$1" in
start)
    if [ -f $PROFILEDIR/named.pid ]; then
            echo "Running named"
        else
           /usr/local/sbin/named -u named -c $CONFFILE
           echo  "Start named"
        fi
;;
stop)
       if [ -f $PROFILEDIR/named.pid ]; then
           kill `cat $PROFILEDIR/named.pid`
           echo "Stoping named"
       else
          echo "Not Runnning named"
       fi
;;
restart)
       if [ -f $PROFILEDIR/named.pid ]; then
           kill `cat $PROFILEDIR/named.pid`
           /usr/local/sbin/named -u named -c $CONFFILE
           echo "restarting named"
       else
          /usr/local/sbin/named -u named -c $CONFFILE
          echo "Start named"
       fi
;;
*)
     echo "Usage: `basename $0` {start|stop|restart}" 1>&2
     exit 1
     ;;
esac
exit 0


まとめ
非常に初歩的な設定ばかりですが、最低限使用に耐えられるかと思います。
BINDは設定しだいで、様々なことが出来るので、深く掘り下げても面白いサーバかもしれません。
但、グローバルアドレスを用いたBINDの設定は、いざ間違えるとよそ樣に迷惑をかけることになります。
くれぐれも慎重に作業してください。


Producted by Tomoya Sakurai