DNSサーバーと、DNSキャッシュサーバーを導入しましょう。
「え? ローカルネットワークでDNSだって? 大げさじゃねーのか!?」
というご意見もあるようですが、これから様々なサーバーソフトを動作させる場合、DNSがあるのとないのでは、楽さ加減が違ってきます。(つまり、あとで楽になるわけですね)
インストール
DNSというと、bindが有名ですが、bindの歴史はバグの歴史でもあります。なので、ウチの鯖では使いたくありません。ここでもご存知 djb の、 djbdns を導入します。
入手はこちらから
例によってコンパイルを行いますので、これを。
# mount /usr -o remount,rw # apt-get install make # apt-get install gcc パッケージリストを読みこんでいます... 完了 依存情報ツリーを作成しています... 完了 以下の追加パッケージがインストールされます: binutils gcc-cpp glibc-devel kernel-headers 以下のパッケージが新たにインストールされます: binutils gcc gcc-cpp glibc-devel kernel-headers アップグレード: 0 個, 新規インストール: 5 個, 削除: 0 個, 保留: 0 個 0B/15.1MB のアーカイブを取得する必要があります。 展開後に 47.0MB のディスク容量が追加消費されます。 続行しますか? [Y/n] Y ・ ・ ・ #
では、djbdnsをゲットして解凍します。
# cd /usr/src # lftp ftp://ftp.jp.qmail.org/qmail cd 成功、cwd=/qmail lftp ftp.jp.qmail.org:/qmail> get djbdns-1.05.tar.gz 85648 バイト転送済、3 秒経過 (30.5KB/s) lftp ftp.jp.qmail.org:/qmail>quit # tar xzvf djbdns-1.05.tar.gz # cd djbdns-1.05
さてさて、例によって error.h の一部を書き換えましょう。
#ifndef ERROR_H #define ERROR_H /*extern int errno;*/ #include <errno.h> extern int error_intr; extern int error_nomem; ・ ・ ・
あとは、例によって make、make setup check で。これで/usr/local以下にインストールされます。
# make ・ ・ ・ # make setup check ./install ./instcheck #
DNSキャッシュサーバーの設置
DNS。普通は、プロバイダから通知か指定されるグローバルアドレスだよね。 (例えば BIGLOBE だと211.123.2.xxとか、so-netだと133.205.3.xxだとか・・・)
通常はこれらのアドレスにアクセスしてサイト名やなんかを送信してもらって教えてもらうんだけど、djbdnsのキャッシュサーバーを導入しておくと、ルートサーバーに一度問い合わせた後、それらの設定を自前のキャッシュに格納していってくれる。DNS問い合わせが早くなり、かつDNSサーバーへの負担を軽くするというふうに働いてくれる。
まあつまり、このサーバーがヨソに問い合わせに行く頻度を最低限に抑えることができるようになるわけ。
まず最初に、DNSキャッシュサーバーと、それのログを管理するユーザーを作っておきます。私は、dnsc、dnsclogとし、グループはdjblogとしました。
# adduser dnsc -g djblog -d /home/djblog/dnsc -s /bin/false # adduser dnsclog -g djblog -d /home/djblog/dnsclog -s /bin/false
あとは、daemontoolsの設定を・・・・っと思うと、これがなんと! 自動で設定してくれるスクリプトがついておりました!。ありがてー! (^^)
構文はこれ。
設定コマンド | キャッシュを動かすユーザー | ログを取らせるユーザー | 設定をどこに作る? | サーバーのIP | ||||
dnscache-conf | Gdnscache | Gdnslog | /etc/dnscache | 10.53.0.1 |
では、実際にやってみよう。(サーバーのアドレスが192.168.1.44だったとします)
# dnscache-conf dnsc dnsclog /var/service/dnscache 192.168.1.44
さて、これで/var/serviceを見てみると・・・
# ls /var/service dnscache/ telnet/ #
おぉ!ちゃんと出来ているぞ! あとは、このディレクトリのリンクを /service 以下に張れば、キャッシュサーバーは稼動開始!
# cd /service # ln -s /var/service/dnscache
数秒待てば、もう動いているよ。
# ps x ・ ・ ・ 541 pts/0 S 0:00 su - 542 pts/0 S 0:00 -bash 587 ? S 0:00 tcpserver -l0 -R -H -v -c 3 -x ./tcp.telnet.cdb 0 tel 1407 ? S 0:00 supervise dnscache 1408 ? S 0:00 supervise log 1412 pts/0 R 0:00 ps x
キャッシュサーバに問い合わせをしてみる。
現在、このサーバーがDNSの問い合わせを行うIPは、/etc/resolv.confに書かれています。
こんな感じね。
search hideyosi.local nameserver 211.128.xx.xx
このnameserverの部分を、今回セッティングしたアドレス(192.168.1.xx つまり、サーバー自身のアドレス)に書き換えます。
search hideyosi.local #nameserver 211.128.xx.xx nameserver 192.168.1.44
これで、このサーバーはDNSを自分自身(で動いているDNSキャッシュサーバー)に問い合わせるようになります。
・・・しかし!
このサーバーは確かに192.168.1.44に問い合わせに行きますが、当の192.168.1.44(で動いているDNSキャッシュサーバー)はなにも答えてくれません。
知らないところからウチのサーバーに問い合わせをされて余分な負担が掛からないように、DNSキャッシュサーバーは答える相手を設定することができるのです。
この場合、ウチのローカルネットワーク内からの問い合わせには全て答えてあげるようにしましょう。/var/service/dnscache/root/ip/ に、答えてあげるサイトのIPアドレスと同じ名前の空ファイルを置くと、答えるようになります。
ウチのローカルネットワークは 192.168.1.x ですから、 192.168.1 という名前の空ファイルを作ります。
# touch /var/service/dnscache/root/ip/192.168.1
さあ、これでOKです。DNSに問い合わせをしてみましょう。
# dnsqr a www.yahoo.co.jp 1 www.yahoo.co.jp: 129 bytes, 1+6+0+0 records, response, noerror query: 1 www.yahoo.co.jp answer: www.yahoo.co.jp 300 A 202.229.199.136 answer: www.yahoo.co.jp 300 A 203.141.35.113 answer: www.yahoo.co.jp 300 A 210.81.3.241 answer: www.yahoo.co.jp 300 A 210.81.150.5 answer: www.yahoo.co.jp 300 A 211.14.15.5 answer: www.yahoo.co.jp 300 A 202.229.198.216
ほら!うまくいきましたね。yahooのIPアドレスを引いてくれました。
(www.yahoo.co.jpって、いっぱいアドレスあるんだなぁ・・・)
他のPCもDNSキャッシュが使える
・・・ちなみに。
このローカルネットワークのほかのPCは、多分プロバイダが用意したDNSアドレスを使っているはずです。その設定を 192.168.1.44 にすると・・・・
これで大幅にDNSアクセスが高速化されます。また、もう1つのメリットもあるんですよねぇ・・・
ローカルDNSサーバーを動かす
このサーバーも含め、ウチにあるいくつかのPCは、みなローカルネットワークであり、それ用のIPアドレスが振ってあります。(192.168.1.1 〜 192.168.1.245)
これらをちゃんとローカルネットワークとして動かすには、やはりサイト名が必要になります。
そういったことを管理し、司るのがDNSなんですが、当たり前ですが、こんなローカルIPアドレスを問い合わせたって、DNSが答えるわけはありません。
そこで、この、「ウチの中のローカルネットワーク専用のDNS」を設置する必要があるわけです。
先にサイト名を決める
DNSサーバーの設定を行う前に、サイト名とIPアドレスの対比を決めておきましょう。え?ウチにはPCは2台しかないって? いえいえ。それでも決めておきましょう。詳しくはあとで。
きめますた。
192.168.1.1 | ns1.hideyosi.local | DNSサーバー |
192.168.1.2 | router.hideyosi.local | ゲートウェイ。ま、ADSLルーター |
192.168.1.11 | www.hideyosi.local | httpサーバー |
192.168.1.22 | ftp.hideyosi.local | FTPサーバー |
192.168.1.33 | smtp.hideyosi.local | SMTPサーバー |
192.168.1.44 | router.hideyosi.local | DNSキャッシュサーバー |
192.168.1.55 | pop.hideyosi.local | POPサーバー |
192.168.1.66 | win.hideyosi.local | 普段使っているWindows機 |
さてさて。いま決めたこの情報。これらを答えてくれるDNSサーバー(192.168.1.1のこと。キャッシュサーバーじゃないよ)を用意します・・・・・・
用意しますって! オイオイ! だから、サーバーは一台しかないって言ったじゃん!!
ご安心くださいませ。
Linux(等のUNIX系OS)は、実は、一台で複数のIPアドレスを持つなんて、朝飯前なんですよ!!!!
現在、このサーバーはIPアドレスが一個だけです。(そりゃそうだ)
192.168.1.44が割り当てられています。
では、この、たった一台のマシンに他のIPアドレスを割り当ててみましょう。
まず、ちょっと現在の状態を見てみましょう。
# ifconfig eth0 リンク方法:イーサネット ハードウェアアドレス xx:xx:xx:xx:xx:xx inetアドレス:192.168.1.44 ブロードキャスト:192.168.1.255 マスク:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RXパケット:7947 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:1613 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RX bytes:660895 (645.4 Kb) TX bytes:144599 (141.2 Kb) 割り込み:11 ベースアドレス:0x4000 lo リンク方法:ローカルループバック inetアドレス:127.0.0.1 マスク:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RXパケット:15 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:15 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:0 RX bytes:1151 (1.1 Kb) TX bytes:1151 (1.1 Kb)
loはまあ、自分自身を表す特殊なデバイスなのでシカトするとして・・・・
現在、eth0というインターフェイルが1つあり、これに192.168.1.44が割り当てられています。
これの設定をしているのが、Vineの場合、/etc/sysconfig/network-scripts に置かれている、 ifcfg-eth0 というファイルです。ちょっと中を覗いて見ましょう。
# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static IPADDR=192.168.1.44 NETMASK=255.255.255.0 ONBOOT=yes
なるほどなるほど。eth0の設定が書かれていますね。
で!!!!!!!
こんなことをしてみます。まず、/etc/sysconfig/network-scripts/ifcfg-eth0 を複製します。
# cd /etc/sysconfig/network-scripts/ # cp ifcfg-eth0 ifcfg-eth0:1 #
そして、この複製した ifcfg-eth0:1 というファイルの中身を、こう書き換えます。
DEVICE=eth0:1 BOOTPROTO=static IPADDR=192.168.1.55 NETMASK=255.255.255.0 ONBOOT=yes
そして、networkそのものを再起動してみると・・・・
# /etc/init.d/network restart [root@penpen root]# ifconfig eth0 リンク方法:イーサネット ハードウェアアドレス 00:90:CC:A5:65:6C inetアドレス:192.168.1.44 ブロードキャスト:192.168.1.255 マスク:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RXパケット:8744 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:1940 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RX bytes:717685 (700.8 Kb) TX bytes:166752 (162.8 Kb) 割り込み:11 ベースアドレス:0x4000 eth0:1 リンク方法:イーサネット ハードウェアアドレス 00:90:CC:A5:65:6C inetアドレス:192.168.1.55 ブロードキャスト:192.168.1.255 マスク:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RXパケット:8744 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:1940 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RX bytes:717685 (700.8 Kb) TX bytes:166752 (162.8 Kb) 割り込み:11 ベースアドレス:0x4000 lo リンク方法:ローカルループバック inetアドレス:127.0.0.1 マスク:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RXパケット:18 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:18 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:0 RX bytes:1367 (1.3 Kb) TX bytes:1367 (1.3 Kb)
なんと! 1つのサーバーに複数にIPが!!!!!
ま、こういうことです。この調子で、eth0:2・eth0:3・・・・と増やしていけばそれでいいのです。
お待たせ。こんどこそDNSサーバー
さて、上記によって、必要なIPアドレスが決まり、かつ設定ができました。
では、DNSサーバーをインストールしてみます。なに、簡単です。例のスクリプトがありますから。
まずは、DNSサーバーを動かすユーザーとログを受け取るユーザーを作ります。私は、dnst、dnstlogとし、グループはdjblogとしました。
# adduser dnst -g djblog -d /home/djblog/dnsc -s /bin/false # adduser dnstlog -g djblog -d /home/djblog/dnsclog -s /bin/false
そして自動設定用のスクリプトを動かします。構文はこれ。
設定コマンド | DNSを動かすユーザー | ログを取らせるユーザー | 設定をどこに作る? | サーバーのIP | ||||
tinydns-conf | dnst | dnstlog | /etc/tinydns | 1.8.7.200 |
では、実際にやってみよう。(DNSサーバーのアドレスは192.168.1.1としてますね)
# tinydns-conf dnst dnstlog /var/service/tinydns 192.168.1.1
さて、これで/var/serviceを見てみると・・・
# ls /var/service dnscache/ telnet/ tinydns/ #
ほーら。ちゃんと出来てますね。あとは、このディレクトリのリンクを /service 以下に張れば、DNSサーバーは稼動開始!
# cd /service # ln -s /var/service/tinydns
数秒待てば、もう動いているよ。
・ ・ ・ 1407 ? S 0:00 supervise dnscache 1408 ? S 0:00 supervise log 3808 ? S 0:00 supervise tinydns 3809 ? S 0:00 supervise log 3812 pts/0 R 0:00 ps x
DNSにホスト名を登録
さあ、それじゃあ、さっそくこのDNSサーバーにホストやらなんやらを登録してみよう。
tinydns のホスト情報は、/var/service/tinydns/root/data というファイルに書き込んで行います。このディレクトリに移動してみましょう。
# cd /var/service/tinydns/root # ls Makefile add-alias* add-childns* add-host* add-mx* add-ns* data
ちなみにこの時点では、data にはなにも書かれていません。(カラッポ・・・)
また、なにやら add-host とかなんとかがいろいろとありますね。
data ファイルは、直接テキストエディタで編集してももちろんいいんですが、最初はこれら add-xx を使って登録してみて、あとでそれをコピペするというのが間違いないやり方だと思います。
では。まずは、ネームサーバーを登録しましょう。 add-ns を使います。
このネームサーバー(192.168.1.1)は、 xxx.hideyosi.local というホスト名と、 192.168.1.x というIPアドレスを管轄することになります。まずはそれを登録します。
# ./add-ns hideyosi.local 192.168.1.1 # ./add-ns 1.168.192.in-addr.arpa 192.168.1.1
さらに、ホストを登録してみましょう。add-host を使います。前に決めておいたホストを登録してみます。
# ./add-host ns1.hideyosi.local 192.168.1.1 # ./add-host router.hideyosi.local 192.168.1.2 # ./add-host www.hideyosi.local 192.168.1.11 # ./add-host ftp.hideyosi.local 192.168.1.22 # ./add-host smtp.hideyosi.local 192.168.1.33 # ./add-host router.hideyosi.local 192.168.1.44 # ./add-host pop.hideyosi.local 192.168.1.55 # ./add-host win.hideyosi.local 192.168.1.66
さて、この状態で、ちょっと dataファイルを見てみましょう。
# cat ./data .hideyosi.local:192.168.1.99:a:259200 .1.168.192.in-addr.arpa:192.168.1.99:a:259200 =www.hideyosi.local:192.168.1.4:86400 =ns1.hideyosi.local:192.168.1.1:86400 =router.hideyosi.local:192.168.1.2:86400 =www.hideyosi.local:192.168.1.11:86400 =ftp.hideyosi.local:192.168.1.22:86400 =smtp.hideyosi.local:192.168.1.33:86400 =router.hideyosi.local:192.168.1.44:86400 =pop.hideyosi.local:192.168.1.55:86400 =win.hideyosi.local:192.168.1.66:86400
・・・なあるほどぉ!。こういう風に入力されていくのですね。これ以降は、add-host とかを使ってもいいですし、dataファイルを直接編集してももちろんOKです。
そして、最後!!!!
この、作成された data ファイル。これは、tinydnsは直接扱うことができません。これをコンパイルする作業がいります。なに、単にコマンド一発です。
# /usr/local/bin/tinydns-data ./data
これで、data.cdbというファイルが出来ているはずです。これでDNSは完了。
ちなみに、tinydnsはこの方法でいつでもホストを追加したり削除したりできます。
では、さっそくテストをしてみましょう。今回設定したtinydnsに問い合わせを行ってみます。
# dnsq a www.hideyosi.local 192.168.1.1 1 www.hideyosi.local: 83 bytes, 1+1+1+1 records, response, authoritative, noerror query: 1 www.hideyosi.local answer: www.hideyosi.local 86400 A 192.168.1.4 authority: hideyosi.local 259200 NS a.ns.hideyosi.local additional: a.ns.hideyosi.local 259200 A 192.168.1.1 #
おぉぉ! うまく答えてくれましたね!
最後の仕上げ。ドメインを委託をする
さあ。これでOK。では、DNSキャッシュサーバーに問い合わせをしてみましょう。
# dnsqr a www.yahoo.co.jp 1 www.yahoo.co.jp: 129 bytes, 1+6+0+0 records, response, noerror query: 1 www.yahoo.co.jp answer: www.yahoo.co.jp 110 A 210.81.3.241 answer: www.yahoo.co.jp 110 A 210.81.150.5 answer: www.yahoo.co.jp 110 A 211.14.15.5 answer: www.yahoo.co.jp 110 A 202.229.198.216 answer: www.yahoo.co.jp 110 A 202.229.199.136 answer: www.yahoo.co.jp 110 A 203.141.35.113
うん。ちゃんと答えてくれますね。
では、こんどは
# dnsqr a www.hideyosi.local 1 www.hideyosi.local: 32 bytes, 1+0+0+0 records, response, authoritative, nxdomain query: 1 www.hideyosi.local
・・・・あれれ? 答えてくれませんね??? おかしいなぁ。ちゃんとDNSサーバーを設置したのに・・・・・
実は、現時点では、DNSキャッシュサーバーは、全ての問い合わせをインターネットに聞きにいってしまうのです。インターネットには、hideyosi.localなんてアドレスは絶対にありません。当然、答えは返ってきません。
じゃ、どうするのかというと、とても簡単です。ようするに、DNSキャッシュサーバーに、
- x.hideyosi.localだったら、192.168.1.1(ウチのDNSサーバー)に聞きにいけ
- 192.168.1.xだったら、192.168.1.1(ウチのDNSサーバー)に聞きにいけ
- それ以外は、インターネットに聞きにいけ
という設定をしてやればいいのです。
そのための設定は、/var/service/dnscache/root/servers で行います。
# cd /var/service/dnscache/root/servers # ls @
ここに、任せたいドメイン(hideyosi.local)の名前でファイルを作ります。そして内容は、そのドメインを管理しているDNS(ウチの192.168.1.1)のアドレスを書きます。
つまり、こういうことですね。
# echo '192.168.1.1' > hideyosi.local
また、逆引き用の設定も同じ要領で。
# echo '192.168.1.1' > 1.168.192.in-addr.arpa
こんな感じになればOKです。
# ls 1.168.192.in-addr.arpa @ mana.local # cat mana.local 192.168.1.1 # cat 1.168.192.in-addr.arpa 192.168.1.1
さあ。これですべてOKです。あとは、DNSキャッシュサーバーを再起動(停止しなくてもいいですよ)すれば反映されます。
# svc -t /service/dnscache
問い合わせを再びやってみると・・・・
# dnsqr a www.hideyosi.local 1 www.hideyosi.local: 48 bytes, 1+1+0+0 records, response, noerror query: 1 www.hideyosi.local answer: www.hideyosi.local 86400 A 192.168.1.4
よーーーし!!!!!
これでDNSはOKです。お疲れ様でした。