タグ・アーカイブ: bind

みなさんこんばんは、(っ´∀`)っ ゃー です。
ここんとこ無駄に忙しくてpopopoに書けるようなネタに困っていたのですが、
今日は久々に新しい小ネタができました。

(っ´∀`)っ ゃー がいる会社ではDNSサーバを持っているのですが、
外向きにはコンテンツサーバとして稼動させていて、再帰検索は
許可していませんでした。しかし、お客様から急遽「キャッシュサーバ作って♪」と
気楽に依頼されてしまったので、いそいそと作業することに。

■■ 環境

OS    CentOS release 4.6 (Final)
インストールしたもの    bind-9.2.4-28.el4

■■ bindインストール

■ yum コマンドでインストール

[root@hoge ~]# yum install bind

■■ named.conf編集

[root@hoge ~]# cd /etc/

※ デフォルトのnamed.confはこうなっています。

// Default named.conf generated by install of bind-9.2.4-28.el4
options {
       directory "/var/named";
       dump-file "/var/named/data/cache_dump.db";
       statistics-file "/var/named/data/named_stats.txt";
};
include "/etc/rndc.key";

ここに、必要な事項を書き加えてやります。
まずはオリジナルのファイルをバックアップしましょう。

[root@hoge etc]# cp -p named.conf named.conf.orig

そしてnamed.confの編集です。

[root@hoge etc]# vi named.conf
// Default named.conf generated by install of bind-9.2.4-28.el4
options {
       directory "/var/named";
//      dump-file "/var/named/data/cache_dump.db";
//      statistics-file "/var/named/data/named_stats.txt";

        allow-query { any; };
};

// prime the server with knowledge of the root servers
zone "." {
       type hint;
       file "/var/named/db.root";
};

zone "localhost" IN {
   type master;
   file "localhost.zone";
};

zone "0.0.127.in-addr.arpa" IN {
   type master;
   file "0.0.127.in-addr.arpa";
};
include "/etc/rndc.key";

■ ゾーンファイル作成

次に、ルートサーバのゾーンファイルと自分自身の名前解決のための
ゾーンファイルを作ってやります。

[root@hoge etc]# cd /var/named/

ルートサーバのnsレコードを検索して、db.rootというファイル名で
保存してやります。以下のコマンド一発でOKです。

[root@hoge named]# dig @A.ROOT-SERVERS.NET . ns > db.root

できあがったファイルを確認してみましょう。

[root@hoge named]# cat db.root
; <<>> DiG 9.2.3 <<>> ns . @a.root-servers.net.
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18944
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13

;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       518400  IN      NS      A.ROOT-SERVERS.NET.
.                       518400  IN      NS      B.ROOT-SERVERS.NET.
.                       518400  IN      NS      C.ROOT-SERVERS.NET.
.                       518400  IN      NS      D.ROOT-SERVERS.NET.
.                       518400  IN      NS      E.ROOT-SERVERS.NET.
.                       518400  IN      NS      F.ROOT-SERVERS.NET.
.                       518400  IN      NS      G.ROOT-SERVERS.NET.
.                       518400  IN      NS      H.ROOT-SERVERS.NET.
.                       518400  IN      NS      I.ROOT-SERVERS.NET.
.                       518400  IN      NS      J.ROOT-SERVERS.NET.
.                       518400  IN      NS      K.ROOT-SERVERS.NET.
.                       518400  IN      NS      L.ROOT-SERVERS.NET.
.                       518400  IN      NS      M.ROOT-SERVERS.NET.

;; ADDITIONAL SECTION:
A.ROOT-SERVERS.NET.     3600000 IN      A       198.41.0.4
B.ROOT-SERVERS.NET.     3600000 IN      A       192.228.79.201
C.ROOT-SERVERS.NET.     3600000 IN      A       192.33.4.12
D.ROOT-SERVERS.NET.     3600000 IN      A       128.8.10.90
E.ROOT-SERVERS.NET.     3600000 IN      A       192.203.230.10
F.ROOT-SERVERS.NET.     3600000 IN      A       192.5.5.241
G.ROOT-SERVERS.NET.     3600000 IN      A       192.112.36.4
H.ROOT-SERVERS.NET.     3600000 IN      A       128.63.2.53
I.ROOT-SERVERS.NET.     3600000 IN   &nbs
p;  A       192.36.148.17
J.ROOT-SERVERS.NET.     3600000 IN      A       192.58.128.30
K.ROOT-SERVERS.NET.     3600000 IN      A       193.0.14.129
;L.ROOT-SERVERS.NET.    3600000 IN      A       198.32.64.12
L.ROOT-SERVERS.NET.     3600000 IN      A       199.7.83.42
M.ROOT-SERVERS.NET.     3600000 IN      A       202.12.27.33

;; Query time: 81 msec
;; SERVER: 198.41.0.4#53(a.root-servers.net.)
;; WHEN: Sun Feb  1 11:27:14 2004
;; MSG SIZE  rcvd: 436

次に、ローカルホストの正引ファイルを作ってやります。

[root@hoge named]# vi localhost.zone
$TTL 300
@       IN      SOA     localhost.        root.localhost.(
                               2008013001      ; Serial
                               10800           ; Refresh
                               3600            ; Retry
                               604800          ; Expire
                               86400   )       ; Minimum
        IN      NS      localhost.
        IN      A       127.0.0.1

そして、ローカルホストの逆引ファイルを作ってやります。

[root@hoge named]# vi 0.0.127.in-addr.arpa
$TTL 300
@       IN      SOA     localhost.        root.localhost.(
                               2008013001      ; Serial
                               10800           ; Refresh
                               3600            ; Retry
                               604800          ; Expire
                               86400   )       ; Minimum
        IN      NS      localhost.
1       IN      PTR     localhost.

■■ 確認

named-checkzoneコマンドで、ゾーンファイルの書式を確認します。

[root@hoge named]# named-checkzone localhost localhost.zone
zone localhost/IN: loaded serial 2008013001
OK

[root@hoge named]# named-checkzone 127.0.0.1 0.0.127.in-addr.arpa
zone 127.0.0.1/IN: loaded serial 2008013001
OK

named-checkconfコマンドで、named.confの書式を確認します。

[root@hoge named]# named-checkconf /etc/named.conf

■■ named起動

■ syslog (/var/log/messags) をtailしながら、namedを起動

[root@hoge named]# cd
[root@hoge ~]# /etc/init.d/named start
Starting named:                                            [  OK  ]

[root@hoge ~]# tail -f /var/log/messages
Jan 30 16:25:08 hoge named[7117]: starting BIND 9.2.4 -u named
Jan 30 16:25:08 hoge named[7117]: using 1 CPU
Jan 30 16:25:08 hoge named[7117]: loading configuration from '/etc/named.conf'
Jan 30 16:25:08 hoge named[7117]: listening on IPv4 interface lo, 127.0.0.1#53
Jan 30 16:25:08 hoge named[7117]: listening on IPv4 interface eth0, 219.94.xxx.xxx#53
Jan 30 16:25:08 hoge named[7117]: command channel listening on 127.0.0.1#953
Jan 30 16:25:08 hoge named[7117]: command channel listening on ::1#953
Jan 30 16:25:08 hoge named[7117]: zone 0.0.127.in-addr.arpa/IN: loaded serial 2008013001
Jan 30 16:25:08 hoge named[7117]: zone localhost/IN: loaded serial 2008013001
Jan 30 16:25:08 hoge named[7117]: running
Jan 30 16:25:08 hoge named: named startup succeeded

■ namedの自動起動設定

まずは現状確認

[root@hoge ~]# chkconfig named --list
named           0:off   1:off   2:off   3:off   4:off   5:off   6:off

自動起動

[root@hoge ~]# chkconfig named on

自動起動確認

[root@hoge ~]# chkconfig named --list
named           0:off   1:off   2:on    3:on    4:on    5:on    6:off

プロセス確認

[root@hoge ~]# ps auxwww | grep [n]amed
named     7117  0.0  0.1 37240 2512 ?        Ssl  16:25   0:00 /usr/sbin/named -u named

■■ iptablesの設定

これまで、hogeサーバはメールサーバとして機能させていたので、tcp/udpの53番は
許可していませんでした。なので、iptablesの穴をあけてやることにします。

■ /etc/sysconfig/iptablesファイルの修正

[root@hoge ~]# cd /etc/sysconfig/
[root@hoge sysconfig]# cp -p iptables iptables.20080130
[root@hoge sysconfig]# vi iptables

以下を追記
# DNS
-A INPUT -p udp --dport 53 -j ACCEPT
-A INPUT -p tcp --dport 53 -j ACCEPT

[root@hoge sysconfig]# diff iptables iptables.20080130
56,59d55
< # DNS
< -A INPUT -p udp --dport 53 -j ACCEPT
< -A INPUT -p tcp --dport 53 -j ACCEPT
<
■ iptablesの解除タイマーを仕込む

万が一のOPミスでサーバにログインできなくなったらどうにもならないので、
iptablesをstopさせるよう、cronに仕込んでおきます。

[root@hoge sysconfig]# cd /etc/cron.d
[root@hoge cron.d]# vi iptables_clear
以下を追記
0,10,20,30,40,50 * * * * root /etc/init.d/iptables stop

■■ 事前確認

[root@hoge cron.d]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp dpt:22
ACCEPT     tcp  --  218.219.xxx.xxx      0.0.0.0/0           tcp dpt:22
ACCEPT     tcp  --  219.94.xxx.yyy       0.0.0.0/0           tcp dpt:22
ACCEPT     tcp  --  219.94.xxx.zzz       0.0.0.0/0           tcp dpt:22
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp dpt:23
ACCEPT     tcp  --  219.94.xxx.yyy       0.0.0.0/0           tcp dpt:23
ACCEPT     tcp  --  219.94.xxx.zzz       0.0.0.0/0           tcp dpt:23
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp dpt:4949
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp dpt:21
ACCEPT     tcp  --  218.216.xx.yyz       0.0.0.0/0           tcp dpt:21
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:465
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:587
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp dpt:5432
ACCEPT     tcp  --  219.94.xxx.zzz       0.0.0.0/0           tcp dpt:5432
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:110
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:995
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:143
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:993
ACCEPT     udp  --  210.255.xx.xx/28     0.0.0.0/0           udp dpt:161
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

■■ iptables 再起動

[root@hoge cron.d]# /etc/init.d/iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]

■■ 事後確認

[root@hoge sysconfig]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp
dpt:22
ACCEPT     tcp  --  218.219.xxx.xxx      0.0.0.0/0           tcp dpt:22
ACCEPT     tcp  --  219.94.xxx.yyy       0.0.0.0/0           tcp dpt:22
ACCEPT     tcp  --  219.94.xxx.zzz       0.0.0.0/0           tcp dpt:22
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp dpt:23
ACCEPT     tcp  --  219.94.xxx.yyy       0.0.0.0/0           tcp dpt:23
ACCEPT     tcp  --  219.94.xxx.zzz       0.0.0.0/0           tcp dpt:23
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp dpt:4949
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp dpt:21
ACCEPT     tcp  --  218.216.xx.yyz       0.0.0.0/0           tcp dpt:21
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:465
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:587
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
ACCEPT     tcp  --  210.255.xx.xx/28     0.0.0.0/0           tcp dpt:5432
ACCEPT     tcp  --  219.94.xxx.zzz       0.0.0.0/0           tcp dpt:5432
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:110
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:995
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:143
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:993
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 ← ここ
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53 ← ここ
ACCEPT     udp  --  210.255.xx.xx/28     0.0.0.0/0           udp dpt:161
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

■ iptablesの解除タイマーをoffにする

[root@hoge cron.d]# vi iptables_clear
以下、コメントアウトする
#0,10,20,30,40,50 * * * * root /etc/init.d/iptables stop

以上で、キャッシュサーバのできあがりです。
ね、簡単でしょ?

このblogを動かしてるサーバはDNSサーバも兼ねていて、10個のゾーンを管理しています。
そのうちDNSだけでも外出ししたいなー・・・と思っているので、予行演習を兼ねて、うちで持っているもう1台のサーバにもbindをインストールして、セカンダリとして動かすことにしました。

■■ 環境

プライマリネームサーバ   192.168.0.2
セカンダリネームサーバ   192.168.0.3

ちなみに、プライマリもセカンダリもCentOS4.5で、bind-9.2.4-27.0.1.el4をyumでインストールしています。

■■ プライマリ側の設定

既存のDNSサーバ(以下プライマリ)のnamed.confには

// 内部ネットワーク定義
acl localnet{
    192.168.0.0/24;
    127.0.0.1;
};

optionsのセクションに

                allow-transfer{ localnet; };

を忘れずに追記してください。この設定がないと、192.168.0.0のネットワークにあるセカンダリDNSサーバへゾーン転送ができません。

次に、ココを参考にして、dnssec-keygenコマンドを用いて鍵を生成します。

# dnssec-keygen -a HMAC-MD5 -b 512 -n HOST blogcube.info

こうすることで、カレントディレクトリに鍵が生成されます。
そして鍵をnamed.confに貼り付けるわけですが・・・

# ls -l
-rw-------  1 root root 122 12月  4 23:35 Kblogcube.info.+157+11353.key
-rw-------  1 root root 145 12月  4 23:35 Kblogcube.info.+157+11353.private

このように、公開鍵と秘密鍵ができるのです。どっちも中身は一緒で、フォーマットが違うだけなので、公開鍵のほうをcatコマンドで出力します。

# cat Kblogcube.info.+157+11353.key
blogcube.info. IN KEY 512 3 157 UR1t4erqhT~~~~~~~~==

そして、named.confのoptionsセクションの次あたりに

key "blogcube.info" {
      algorithm hmac-md5;
      secret "UR1t4erqh~~~~~~~~==";
};

と記述します。そして、例えばblogcube.infoのゾーンを定義するのには

zone "blogcube.info" IN {
        type master;
        file "blogcube.info.db";
        notify yes;
        allow-update { key blogcube.info; };
};

こう書きます。ちなみに、allow-update { localnet; };と書いてもよいのですが、namedをreloadするたんびに

Dec  4 22:06:52 shasta named[1184]: zone 'blogcube.info' allows updates by IP address, which is insecure

というログが出てしまうので、今回、鍵を登録することにしました。
さて、ここまでできたところで

# named-checkconf
でnamed.confの書式ミスがないか確認します。何も出力されなければOKです。ここまで確認したら、bind(named)をreloadしましょう。

次のエントリでセカンダリ側の設定を書きます。おやすみなさい。