クスクス り〜な!
雑記など

DNSサーバーと、DNSキャッシュサーバーを導入しましょう。

「え? ローカルネットワークでDNSだって? 大げさじゃねーのか!?」

というご意見もあるようですが、これから様々なサーバーソフトを動作させる場合、DNSがあるのとないのでは、楽さ加減が違ってきます。(つまり、あとで楽になるわけですね)

インストール anchor.png Edit

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
#
Page Top

DNSキャッシュサーバーの設置 anchor.png Edit

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-confGdnscacheGdnslog/etc/dnscache10.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
Page Top

キャッシュサーバに問い合わせをしてみる。 anchor.png Edit

現在、このサーバーが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って、いっぱいアドレスあるんだなぁ・・・)

Page Top

他のPCもDNSキャッシュが使える anchor.png Edit

・・・ちなみに。

このローカルネットワークのほかのPCは、多分プロバイダが用意したDNSアドレスを使っているはずです。その設定を 192.168.1.44 にすると・・・・

これで大幅にDNSアクセスが高速化されます。また、もう1つのメリットもあるんですよねぇ・・・

Page Top

ローカルDNSサーバーを動かす anchor.png Edit

このサーバーも含め、ウチにあるいくつかのPCは、みなローカルネットワークであり、それ用のIPアドレスが振ってあります。(192.168.1.1 〜 192.168.1.245)

これらをちゃんとローカルネットワークとして動かすには、やはりサイト名が必要になります。

そういったことを管理し、司るのがDNSなんですが、当たり前ですが、こんなローカルIPアドレスを問い合わせたって、DNSが答えるわけはありません。

そこで、この、「ウチの中のローカルネットワーク専用のDNS」を設置する必要があるわけです。

Page Top

先にサイト名を決める anchor.png Edit

DNSサーバーの設定を行う前に、サイト名とIPアドレスの対比を決めておきましょう。え?ウチにはPCは2台しかないって? いえいえ。それでも決めておきましょう。詳しくはあとで。

きめますた。

192.168.1.1ns1.hideyosi.localDNSサーバー
192.168.1.2router.hideyosi.localゲートウェイ。ま、ADSLルーター
192.168.1.11www.hideyosi.localhttpサーバー
192.168.1.22ftp.hideyosi.localFTPサーバー
192.168.1.33smtp.hideyosi.localSMTPサーバー
192.168.1.44router.hideyosi.localDNSキャッシュサーバー
192.168.1.55pop.hideyosi.localPOPサーバー
192.168.1.66win.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・・・・と増やしていけばそれでいいのです。

Page Top

お待たせ。こんどこそDNSサーバー anchor.png Edit

さて、上記によって、必要な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-confdnstdnstlog/etc/tinydns1.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
Page Top

DNSにホスト名を登録 anchor.png Edit

さあ、それじゃあ、さっそくこの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
#

おぉぉ! うまく答えてくれましたね!

Page Top

最後の仕上げ。ドメインを委託をする anchor.png Edit

さあ。これで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です。お疲れ様でした。

なにこれ?
お品書き
雑記など
XOOPS Cube PROJECT