BIND

DNSサーバです。

環境設定

インストールされているか確かめます。あれば、以下のコマンドで、一覧が表示されます。

rpm -qa |grep bind
rpm -qa |grep caching

なければ、http://www.isc.org/index.pl?/sw/bind/から9.3.1をダウンロードしました。ダウンロードして、解凍して、解凍したディレクトリで

./configure  --enable-ipv6  <-ipv6を使わないのであれば指定する。遅いから
make
make test
make install

/usr/local/sbin/named にいました。ユーザを作っておきます。

groupadd named
useradd named -g named -m -d /var/named -s /sbin/nologin

次にrndc鍵を作成します。これはremote name server daemon controlの略で、ユーティティコマンドです。

rndc-confgen -a -b 256 -k rndckey

これで/etc/rndc.keyが出来ているかと思います。次にlogディレクトリです。

mkdir /var/log/named
chown named:named /var/log/named
cd /var/log/named
touch named.log
chown named:named named.log

ルートサーバーリストファイルを取得しておきましょう。

cd /var/named
wget ftp://ftp.rs.internic.net/domain/named.root

あとは/etcにnamed.confとゾーンファイルを作成します。こちらにサンプルがありました。ありがとうございます。http://www.syns.net/2/4/
では、起動用のスクリプトです。

!/bin/bash
#
# named           This shell script takes care of starting and stopping
#                 named (BIND DNS server).
#
# chkconfig: - 55 45
# description: named (BIND) is a Domain Name Server (DNS) \
# that is used to resolve host names to IP addresses.
# probe: true
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network
RETVAL=0
prog="named"
# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 0
[ -r /etc/sysconfig/named ] && . /etc/sysconfig/named
[ -x /usr/local/sbin/named ] || exit 0
[ -r ${ROOTDIR}/etc/named.conf ] || exit 0
start() {
       # Start daemons.
       if [ -n "`/sbin/pidof named`" ]; then
               echo -n $"$prog: already running"
               return 1
       fi
       echo -n $"Starting $prog: "
       if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then
               OPTIONS="${OPTIONS} -t ${ROOTDIR}"
       fi
       daemon /usr/local/sbin/named -u named ${OPTIONS}
       RETVAL=$?
       [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named
       echo
       return $RETVAL
}
stop() {
       # Stop daemons.
       echo -n $"Stopping $prog: "
       /usr/local/sbin/rndc stop
       RETVAL=$?
       [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named || {
               killproc named
               RETVAL=$?
               [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named
               echo
               return $RETVAL
       }
       success
       echo
       return $RETVAL
}
rhstatus() {
       /usr/local/sbin/rndc status
      return $?
}
restart() {
       stop
# wait a couple of seconds for the named to finish closing down
       sleep 2
       start
}
reload() {
       echo -n $"Reloading $prog: "
       /usr/local/sbin/rndc reload >/dev/null 2>&1 || /usr/bin/killall -HUP `/sbin/pidof -o %PPID named`
       [ "$?" -eq 0 ] && success $"$prog reload" || failure $"$prog reload"
       echo
       return $?
}
probe() {
       # named knows how to reload intelligently; we don't want linuxconf
       # to offer to restart every time
       /usr/local/sbin/rndc reload >/dev/null 2>&1 || echo start
       return $?
}
# See how we were called.
case "$1" in
       start)
               start
               ;;
       stop)
               stop
               ;;
       status)
               rhstatus
              ;;
       restart)
               restart
               ;;
       condrestart)
               [ -e /var/lock/subsys/named ] && restart
               ;;
       reload)
               reload
               ;;
       probe)
               probe
               ;;
       *)
               echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|probe}"
              exit 1
esac
exit $?

では実行してみます。

couldn't open pid file '/var/run/named.pid

なんだ?これ。/var/runにnamedの権限を与えろとでもいうのか。 --disable-threadsを指定するといけるらしいのですが、それはいやなので、chrootを使うことにします。

mkdir -p /chroot/named
cd /chroot/named
mkdir -p dev etc/namedb/slave var/run
cp -p /etc/named.conf /chroot/named/etc/
cp -a /var/named/* /chroot/named/etc/namedb/
chown -R named:named /chroot/named/etc/namedb/slave
mknod /chroot/named/dev/null c 1 3
mknod /chroot/named/dev/random c 1 8
chmod 666 /chroot/named/dev/{null,random}
cp /etc/localtime /chroot/named/etc/
cp /etc/rndc.* /chroot/named/etc/
chown root /chroot
chmod 700 /chroot
chown named:named /chroot/named
chmod 700 /chroot/named

とつらつら書いてますが、すべてhttp://www.linux.or.jp/JF/JFdocs/Chroot-BIND-HOWTO-1.htmlを参照しましょう。

couldn't install keys for command channel

/var/log/messagesをみると上記のエラーがでてたので、

cp /etc/rndc.* /chroot/named/etc/

しています。では設定ファイルを確認します。

/chroot/named/etc/namedb

にファイルを置いてます。 chrootで動かさない場合はnamed.confのoptionsに

pid-file "/var/run/named/named.pid";

を記述し、

mkdir /var/run/named/
chown  named:named /var/run/named/

としてやります。

  • /etc/host.conf
    # 1番目に/etc/hosts、次にをDNS検索
    order hosts,bind
    # /etc/hostsファイルのホストが複数のIPを持っているか調べる
    multi on
    # IPアドレスのスプーフィングされていないかをチェック
    nospoof on
  • /etc/resolv.conf
    domainname hidekazu.dhs1.sst.ne.jp
    nameserver 192.168.100.1
    nameserver 192.168.100.2
    nameserver 192.168.100.3
    domainnameは、不完全なホスト名を指定した時にこのドメイン名を引っ付けて検索します。
    nameserverは、3つまで指定できます。最初に書かれているサーバから検索にいきます。 http://www.linux.or.jp/JM/html/LDP_man-pages/man5/resolv.conf.5.htmlを参考にしてみてください。
  • /etc/named.conf 以下のゾーンを追加
    zone "hidekazu.dhs1.sst1.ne.jp" IN {
           type master;
           file "hidekazu.zone";
    };
    zone "100.168.192.in-addr.arpa" IN {
           type master;
           file "hidekazu.rev";
    };
  • /var/named/hidekazu.zone
    $TTL 86400
    @           IN    SOA dns.hidekazu.dhs1.sst.ne.jp. root.hidekazu.dhs1.sst.ne.jp. (
                     2004111702  ; serial
                     3600        ; refresh 1hr
                     900         ; retry 15min
                     604800      ; expire 1w
                     86400       ; min 24hr
    )
                IN    NS     dns.hidekazu.dhs1.sst.ne.jp.
    dns         IN    A      192.168.100.4
    hidekazu    IN    A      192.168.100.14
  • /var/named/hidekazu.rev
    $TTL 86400
    @           IN    SOA dns.hidekazu.dhs1.sst.ne.jp. root.hidekazu.dhs1.sst.ne.jp. (
                     2004111702  ; serial
                     3600        ; refresh 1hr
                     900         ; retry 15min
                     604800      ; expire 1w
                     86400       ; min 24hr
    )
                IN    NS     dns.hidekazu.dhs1.sst.ne.jp.
    4           IN    PTR    dns.hidekazu.dhs1.sst.ne.jp.
    14          IN    PTR    hidekazu.hidekazu.dhs1.sst.ne.jp. 

named-checkconfでconfのチェックをしておきましょう。また

named-checkzone xxxx.yyyy xxxx.yyyy.zone

で各ゾーンファイルが正常か確認しましょう。またファイアウォールを使っているときはTCP/UDP両方とも53をあけておきましょう。

起動・停止

上で作成した起動用のスクリプトを/etc/init.dにnamedで作成して、実行権限をつけてから、
起動

root@hidekazu named]# /etc/init.d/named start
namedを起動中:                                             [  OK  ]

停止

[root@hidekazu named]# /etc/init.d/named stop
namedを停止中:                                             [  OK  ]

設定

BIND9よりviewが導入され、外向けのDNSと内向けのDNSを1つで運用できます。

view "lan" {
  match-clients {
    127.0.0.0/8; 
    192.168.0.0/24;
  };
  recursion no;
  zone "." {
...

このmatch-clientsと一致しているクライアントはこのviewのlanの設定を参照します。 このrecursionとは再帰検索の意味でありnoにしていると再帰検索はしないということになる。またキャッシュサービスを提供しなくなります。ということはこれがYESとなっている場合は、DNS解決できるまで検索を行い、最終結果を返すことになる。これがフルサービス・リゾルバである。このとき問い合わせを行うPC等をスタブリゾルバという。また受け付けるがそれをほかのDNSに解決してもらうような場合は、フォワーダという。また

match-clients {
  127.0.0.0/8; 
  192.168.0.0/24;
};

としているが、これを

acl localnetwork {
  192.168.1.0/24;
  192.168.100.0/24;
  127.0.0.1;
};
match-clients {
 localnetwork;
};

とすることも可能だ。これでaclを書き換えるだけで、それを使用している情報はそれに置き換わるので管理がしやすくなる。

バージョンを指定したい場合は、

options {
 version "DNS Server";
 query-source address * port 53;
}

とversionを表記しておく。これはバージョンを隠すためにおこない、セキュリティを考慮する場合には指定しておく。またquery-sourceとは新しいBINDでは発信元ポートが53に固定されていない。そのためファイアーウォール等で固定であけたい場合は、これを指定する。これは最初はコメントされている。

ゾーンの定義で、

zone "test.xxx" IN {
     type master;
     file "test.xxx.zone";
     allow-transfer { none; };
     allow-query { any; };
};

としていると、このnoneとかはnone/any/localhost/localnetsの4つから標準で指定できる。allow-transferはゾーン転送できるリストを指定する。ACLでも指定できる。セカンダリ等に限定しておこう。allow-queryは問い合わせに答えるホストアドレスのリストを指定する。

ログ

なにも指定していなければ、/var/log/messagesに落ちるがこれではみにくいので、設定しておきます。

logging {
   channel default-log {
       file "/var/log/named/named.log" versions 3 size 10m;
       severity info;
       print-time yes;
       print-severity yes;
       print-category yes;
   }; 
   category lame-servers { null; };
   category default { default-log; }; 
};

fileで出力するファイルを指定します。上の指定では10Mで3世代管理する。severity は、infoとかdynamicとかありますが、infoレベルで出力してます。categoryはdatabaseやnotify、network、update、queries、client等いろいろと指定することができます。その中でも、category lame-servers { null; }は、DNS解決の際にほかのサーバで見つけた設定ミス(lame)の記録についてで、nullが指定してあるので、破棄します。このchannelとcategoryを使えばかなり細かくログをとることが可能です。print-time、print-severity、print-categoryはログファイル中の日時、ログレベル、ログカテゴリの表示・非表示をyes,noで切り替えることができます。ログができていない場合は、/var/log/messagesをみてみましょう。パーミッションが間違っているとかエラーが出ているはずです。

nslookup

このコマンドは推奨されていないのですが、windowsで使う場合に。

server xxx.yyy これでネームサーバをxxx.yyyに切り替えます。もしくはlserver
set q=ns  NSレコードを検索します。
set q=mx  MXレコードを検索します。
set q=a   Aレコードを検索します。デフォルトです。
set q=ptr PTR逆引きを検索します。
set q=any すべての資源レコードを検索します。

正引きの確認

set q=ns
.     ルートを管理しているのはだれ?
server A.ROOT-SERVERS.NET.
jp.       jpを管理しているのはだれ?
server a.root-servers.net.
jp.       jpを管理しているのはだれ?
server A.DNS.jp

とった感じで上へ上へ上がっていきます。

逆引きの確認

set q=ns
.     ルートを管理しているのはだれ?
server A.ROOT-SERVERS.NET.
arpa.    arpaを管理しているのはだれ?
in-addr.arpa. in-addr.arpaを管理しているのはだれ?
211.in-addr.arpa. 211.in-addr.arpaを管理しているのはだれ?
server NS.RIPE.NET.

といった感じであがっていきます。

dig

nslookupではなく、これからはこちらをつかいましょう。

dig www.yahoo.co.jp

これではレコードタイプが省略されてますので、Aレコードもしくは、CNAMEレコードが検索されます。

;; QUESTION SECTION:
;www.yahoo.co.jp.               IN      A
;; ANSWER SECTION:
www.yahoo.co.jp.        42      IN      A       203.216.235.201

てな感じでANSWERがかえってきます。レコードタイプを指定する場合は、

dig ahoo.co.jp NS

とすると

;; QUESTION SECTION:
;yahoo.co.jp.                   IN      NS
;; ANSWER SECTION:
yahoo.co.jp.            124     IN      NS      dnsg01.yahoo.co.jp.

とかえってきます。次はDNSを指定してみましょう。

dig @ns10.yahoo.co.jp www.yahoo.co.jp

この@以下がネームサーバです。ではANYを使ってすべての情報を確認してみましょう。

dig @ns10.yahoo.co.jp yahoo.co.jp ANY

上記と同じようにANSWERがかえってきてます。

;; ANSWER SECTION:
yahoo.co.jp.            900     IN      MX      10 mx1.mail.yahoo.co.jp.
yahoo.co.jp.            900     IN      NS      ns10.yahoo.co.jp.
yahoo.co.jp.            900     IN      TXT     "v=spf1 include:spf01.yahoo.co.jp include:spf02.yahoo.co.jp ~all

おっ、ここでおもしろいのがあります。3行目のv=spf1です。Sender Policy Frameworkですね。 次は、ゾーン転送よるデータを受信してみます。

dig @ns10.yahoo.co.jp yahoo.co.jp AXFR

かえってきたのが、

;; global options:  printcmd
; Transfer failed.

あたりまえです。許可しているはずがありせん。これで自分のところのテストができますね。 次は逆引きです。

dig -x 203.216.235.201

この-xでIPを指定して逆引きができます。

;; ANSWER SECTION:
201.235.216.203.in-addr.arpa. 163 IN    PTR     f3.top.vip.tnz.yahoo.co.jp.

TIPS

  • ゾーン転送されない。
    これはallow-transferがnoneになっているとか、シリアル値の上げ忘れです。
  • 変更後、キャッシュが残っていて以前の設定のまま
    ipconfig /flushdns
  • クライアントから名前解決されない...
    listen-on port 53 { any; };
    にするかコメントにしてみましょう。

リンク

DNSの仕組みの基本を理解しよう
実用 BIND 9で作るDNSサーバ
nslookup~DNSサーバに名前解決の問い合わせを行う
bind9で外向けと内向けの DNS を設定
DNSの仕組みの基本を理解しよう
クラスC未満の逆引きって?
クラスC未満のDNS逆引きについて
dig(nslookup)テスト
各種テストができますので、大変便利です。 第10回 DNSセキュリティの設定

参考書籍

DNS & BINDクックブック
図解標準 最新DNS&BINDハンドブック


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-10-29 (水) 10:27:00 (3487d)