* [[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]]~