* [[BIND]]
DNSサーバです。

#contents

** 環境設定
インストールされているか確かめます。あれば、以下のコマンドで、一覧が表示されます。
 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の仕組みの基本を理解しよう>http://www.atmarkit.co.jp/fnetwork/rensai/dns01/dns01.html]]~
[[実用 BIND 9で作るDNSサーバ>http://www.atmarkit.co.jp/flinux/index/indexfiles/bind9index.html]]~
[[nslookup~DNSサーバに名前解決の問い合わせを行う>http://www.atmarkit.co.jp/fnetwork/netcom/nslookup/nslookup.html]]~
[[bind9で外向けと内向けの DNS を設定>http://www.bsddiary.net/doc/bind9.html]]~
[[DNSの仕組みの基本を理解しよう>http://www.atmarkit.co.jp/fnetwork/rensai/dns01/dns01.html]]~
[[クラスC未満の逆引きって?>http://www.ocn.ad.jp/tw/dns_18.html]]~
[[クラスC未満のDNS逆引きについて>http://www.turbolinux.co.jp/knowledge/public/309.html]]~
[[dig(nslookup)テスト>http://www.cman.jp/network/support/nslookup.html]]~
各種テストができますので、大変便利です。
[[第10回 DNSセキュリティの設定 >http://jibun.atmarkit.co.jp/lskill01/rensai/lpicdrill10/lpicdrill01.html]]~
** 参考書籍
[[DNS & BINDクックブック>http://www.amazon.co.jp/exec/obidos/ASIN/4873111250/worried-22]]~
[[図解標準 最新DNS&BINDハンドブック>http://www.amazon.co.jp/exec/obidos/ASIN/4798003980/worried-22]]~

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS