スポンサードリンク

2012年8月21日火曜日

内部向DNSサーバ

自宅サーバを用意したものの、LAN内からドメインでのサイトアクセスができない。
coregaのルータを使用しているときは何も気にせずアクセスできていたが、
NECのAtermにかえてからできなくなった。

内部向けDNSサーバを構築することで、内部からでもwwwアクセスできるらしい。
そのときの備忘録。

なお、構築に関して、こちらのサイトを参考にさせていただきました。
とても参考になりました。
http://centossrv.com/bind.shtml

ホスト名:websaba.com 
内部IP:192.168.0.20
DNSソフト : BIND
内部向けDNSサーバとして構築し、外部向け設定は省略する。(※1)

すべての操作はrootで行う。
#は、rootユーザでの操作を意味する。


朱色はコメントアウト箇所
赤色は追加箇所
青色は変更箇所

注意点として、
設定ファイルの"}"のあとは、";"(セミコロン)が必要なので注意!


1. BIND一連のソフトをインストールする

#yum -y install bind bind-chroot caching-nameserver


2. chroot化(※2)のためスクリプトを作成する。

#vi bind-chroot-admin

↓ ----- ここからスクリプト本文
#!/bin/sh
# bind-chroot install check
rpm -q bind-chroot > /dev/null 2>&1
[ $? -ne 0 ] && echo bind-chroot not install && exit 1

# bind-chroot enabled
sed -i '/^ROOTDIR=/d' /etc/sysconfig/named
echo ROOTDIR=/var/named/chroot >> /etc/sysconfig/named

# file copy
filelist=`mktemp`
rpm -ql bind|grep ^/etc >> ${filelist}
rpm -ql bind|grep ^/var >> ${filelist}
for file in `cat ${filelist}`
do
  # directory make
  if [ -d ${file} ]; then
      DIRNAME=/var/named/chroot${file}
      [ ! -d ${DIRNAME} ] && mkdir -p ${DIRNAME}
  fi
  # file copy
  if [ -f ${file} ]; then
      DIRNAME=/var/named/chroot`dirname ${file}`
      [ ! -d ${DIRNAME} ] && mkdir -p ${DIRNAME}
      /bin/cp -a ${file} ${DIRNAME}
  fi
done
rm -f ${filelist}

chown named:named /var/named/chroot/var/named/data
chmod 770 /var/named/chroot/var/named/data
chown named:named /var/named/chroot/var/named/dynamic
echo "Finished."
exit
↑ ----- ここまでスクリプト本文


3. chrootスクリプト(2.で作成したスクリプト)を実行する

#sh bind-chroot-admin


4. BIND設定ファイル書き換える前に別名保存(待避)させておく。

#cp /var/named/chroot/etc/named.conf /var/named/chroot/etc/named_original.conf


5. BIND設定ファイル書き換える。

#vi /var/named/chroot/etc/named.conf


↓ ----- ここからBIND設定ファイル本文
options {
        #listen-on port 53 { 127.0.0.1; };
        #listen-on-v6 port 53 { ::1; };
        version         "unknown"; ← bindのバージョン情報の非表示化
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        #サーバー及び、サーバーと同じネットワーク内のホストからの問合せのみ許可する。
        allow-query     { localhost; localnets; };
        recursion yes;
        
        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";
        forwarders{
#ルータ経由の場合は、ルータのアドレスを設定する
                192.168.0.1;
#プロバイダのDNSサーバを設定する ex)フレッツ東日本の場合
                220.210.194.67;
                220.210.194.68;
        };
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
#error (connection refused) resolvingエラーログの出力抑止
        category lame-servers { null; };
};
#内部向け設定
view "internal" {
        match-clients { localnets; };
        match-destinations { localnets; };

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
        include "/etc/named.websaba.com.zone";
};
↑ ----- ここまでBIND設定ファイル


6.内部向けDNS用のゾーン定義ファイルを作成する

#vi /var/named/chroot/etc/named.websaba.com.zone

↓ ----- ここから設定ファイル本文

zone "websaba.com" {
        type master;
        file "websaba.com.db";
};
zone "0.168.192.in-addr.arpa" {
        type master;
        file "0.168.192.in-addr.arpa.db";
};
↑ ----- ここまで設定ファイル本文


7. IPv4のみ有効にする(error network unreachable resolvingエラーログの出力抑制)

#echo OPTIONS="-4" >> /etc/sysconfig/named


8. ルートゾーン最新化

#dig . ns @198.41.0.4 +bufsize=1024 > /var/named/chroot/var/named/named.ca


9. ルートゾーン自動更新スクリプト作成

#vi named.root_update


↓ ----- ここからスクリプト本文
#!/bin/bash

new=`mktemp`
errors=`mktemp`

dig . ns @198.41.0.4 +bufsize=1024 > $new 2> $errors

if [ $? -eq 0 ]; then
    sort_new=`mktemp`
    sort_old=`mktemp`
    diff_out=`mktemp`
    sort $new > $sort_new
    sort /var/named/chroot/var/named/named.ca > $sort_old
    diff --ignore-matching-lines=^\; $sort_new $sort_old > $diff_out
    if [ $? -ne 0 ]; then
        (
         echo '-------------------- old named.root --------------------'
         cat /var/named/chroot/var/named/named.ca
         echo
         echo '-------------------- new named.root --------------------'
         cat $new
         echo '---------------------- difference ----------------------'
         cat $diff_out
        ) | mail -s 'named.root updated' root
        cp -f $new /var/named/chroot/var/named/named.ca
        chown named. /var/named/chroot/var/named/named.ca
        chmod 644 /var/named/chroot/var/named/named.ca
        /etc/rc.d/init.d/named restart > /dev/null
    fi
    rm -f $sort_new $sort_old $diff_out
else
    cat $errors | mail -s 'named.root update check error' root
fi
rm -f $new $errors
↑ ----- ここまでスクリプト本文


10. ルートゾーン自動更新スクリプトの実行権限を変更

#chmod 700 named.root_update


11. ルートゾーン自動更新スクリプト自動実行 (月次実行)

#cp named.root_update /etc/cron.monthly


12.内部向け正引きゾーンデータベース作成

#vi /var/named/chroot/var/named/websaba.com.db


↓ ----- ここから設定ファイル本文
$TTL    86400
@       IN      SOA     websaba.com.  root.websaba.com.(
                                      2011062001 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN NS     websaba.com.
        IN MX 10 websaba.com.
@       IN A     192.168.1.20 ← サーバーのプライベートIPアドレスを指定(websaba.com用)
*       IN A     192.168.1.20 ← サーバーのプライベートIPアドレスを指定(*.websaba.com用)
↑ ----- ここまで設定ファイル本文


13.内部向け逆引きゾーンデータベース作成

#vi /var/named/chroot/var/named/0.168.192.in-addr.arpa.db


↓ ----- ここから設定ファイル本文
$TTL    86400
@       IN      SOA     websaba.com.  root.websaba.com.(
                                      2011062001 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
              IN      NS    websaba.com.
20             IN      PTR   websaba.com.  ← 行先頭にサーバのLANの最下位アドレスを指定すること
↑ ----- ここまで設定ファイル本文


14.bind再起動

#/etc/rc.d/init.d/named restart
or
#service named restart


15. ルータの53番ポートをTCP/UDP共に解放する。
ここはルータ毎の設定によるので、詳細は省略。


16. iptablesでファイアウォール構築している場合は、53番を解放する。

17. 自宅内のパソコンのDNS設定を変更する

DNSサーバのIPが192.168.0.20
ルータのIPが192.168.0.1
の場合、
DNSに上記IPを割り当てればよい。

結果、自宅内部からwwwドメインで自分のサイトにアクセスできるようになった。


(※1)
      著者の環境は固定IPではないため、内部向けのDNSサーバとする。
      固定IPでなければ外部向けDNSサーバは構築できないようです。


(※2)
      chrootとは、もしサーバが乗っ取られた場合にそのパス以外にアクセスできない
ようにする機構のこと。

0 件のコメント:

コメントを投稿