ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

CentOS6でDNSサーバーを構築して、LAN内サーバーでも名前解決が出来るようにする

CentOS6でDNSサーバーを構築して、LAN内サーバーでも名前解決が出来るようにする。

環境

サーバーA
ルーターDNSサーバーとする)
ゲストOS(CentOS6)
eth0:192.168.10.30
eth1:10.0.10.30
※eth0がWAN(グローバルネットワーク)に繋がっている

サーバーB
ゲストOS(CentOS6)
eth0:10.0.10.40
※WANにつながっていない

上記環境は下記記事で作成した。
toriaezu-engineer.hatenablog.com


DSNサーバー構築の為、bindを使用する。

※bindは脆弱性が発表されてるので要対策!

やりたいこと

  • 構築したDNSサーバーを参照してサーバーBから外部ドメインの名前解決を行う

先日CentOSルーターを構築してLANネットワーク構築を行ったのですが、LAN内ネットワークサーバーから名前解決が出来なかった事がきっかけでDNSサーバーを構築する事にしました。
ルーター構築後は、LAN内サーバーでのDNSサーバーはルーターを指定し、iptablesの設定でDSNのポート53をIPフォワードとかすれば出来るのかなと思ったら出来ず・・・
調べた所、LANネットワークで参照するDNSサーバーを構築する必要があるっぽい情報が多々ある気がしたのでDSNサーバーを構築する事に。

DNSサーバー構築時にはDSNサーバーの種類を構成を一読↓
toriaezu-engineer.hatenablog.com

手順

ライブラリをインストール。
bindサービスをchroot環境で実行する為にbind-chrootパッケージもインストールする。

yum -y install bind
yum -y install bind-chroot

バージョン9.7からはcaching-nameserverというパッケージも含まれているらしい。

chrootについてちょっと勉強。
DNSサービス(ポート53)は外部ホストに対して解放しなければならない為、クラッカーの攻撃対象になりやすい。
その対策として、BINDサービスをchroot環境で実行する事でchroot環境以外の設定ファイル等を操作されないようにするものみたい。

本来bindサービスの設定ファイルは

/etc/named.conf
/etc/named/

にインストールされるけど、bind-chrootをインストールする事でbindサービスをchroot環境で実行され、設定ファイルがは
/var/named/chroot/
配下にインストールされ、bindサービスは/var/named/chroot/より上の階層のディレクトリファイルは参照できずセキュリティ対策となる。

BINDサービス実行時は自動的にマウントが行われ以下のようになる。

$ df -h

/etc/named             18G  3.0G   14G  18% /var/named/chroot/etc/named
/var/named             18G  3.0G   14G  18% /var/named/chroot/var/named
/etc/named.conf        18G  3.0G   14G  18% /var/named/chroot/etc/named.conf

インストール作業に戻ります。

named設定ファイル追記

vi /etc/sysconfig/named 

最終行に追記。
IPv4のみ有効にするという設定。
IPv6 機能を無効化する事で、AAA レコードを探しに行ったりしてネットワークの遅延が発生する事、名前解決で時間が掛かる事を防ぐ。

OPTIONS="-4"

named.confファイルを編集

vi /etc/named.conf
options {
        # セキュリティ対策の為バージョンを隠す
        version "unknown";

        # 自分自身のIPのみ指定とならないようコメントアウト
        #listen-on port 53 { 127.0.0.1; };
        #listen-on-v6 port 53 { ::1; };
        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";

        # 任意からのqueryに対応
        allow-query     { 192.168.10.0/24; 10.0.10.0/24; };
        recursion yes;

        # messages の「named]の項目に「validating」というメッセージが大量に記録される現象の対策の為、
        # DNSSECを無効化すべくnoに設定
        dnssec-enable no;
        dnssec-validation no;

        # automatic empty zone: XXXXXのログ出力を停止
        empty-zones-enable no;

        # IPv6のポートを無効にする
        use-v6-udp-ports { };

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        # 自分自身で名前解決できない場合に転送するDNSサーバー
        forwarders       { 192.168.10.1; 192.168.10.1;};
};

logging {
        # デバッグモードのためのチャンネル
        channel default_debug {
                file "data/named.run";
                # ログレベル
                severity dynamic;
        };
        # categoryで指定したチャンネルのログを出力する
        category default { "default_debug"; };
};

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

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

named.rfc1912.zonesファイル編集

vi /etc/named.rfc1912.zones

IPv6に関する部分をコメントアウト

#zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {#       type master;
#       file "named.loopback";
#       allow-update { none; };
#};

bindでrndcを利用する場合は下記コマンドで共通鍵を作成する。
実行すると、/etc/rndc.keyとして共通鍵が生成される。

$ rndc-confgen -a -r /dev/urandom -t /var/named/chroot

wrote key file "/etc/rndc.key"
wrote key file "/var/named/chroot/etc/rndc.key"

named.conf構文チェック
何も表示されなければOK

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

bind起動

/etc/rc.d/init.d/named start

ルーター側のiptablesDNSのポート53を開放する
iptables実行、もしくはiptablesスクリプトに記述

iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

ここまでの設定後、
LANネットワークのサーバーBにて、DNSサーバーにサーバーAのIPを指定。

/etc/sysconfig/network-scripts/ifcfg-eth0

DNS1=10.0.10.30
DNS2=10.0.10.30

resolv.confファイルもnameserverをサーバーAに指定。
/etc/resolv.conf

nameserver 10.0.10.30

ネットワーク再起動

/etc/init.d/network restart

サーバーAでも名前解決できた!

$ ping yahoo.co.jp

PING yahoo.co.jp (183.79.135.206) 56(84) bytes of data.
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_seq=1 ttl=45 time=45.6 ms


前述のログ設定だと下記にログ出力される。

less /var/named/chroot/var/named/data/named.run

自動起動設定

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

ここまでの設定でDNSサーバーとは稼働可能。
他にやる事と言えば、、

・LANネットワーク内のサーバーに好きなドメイン指定してアクセスできる
toriaezu-engineer.hatenablog.com

・ルートゾーンファイルの自動更新
→後日やる

ドメインサービスから取得した独自ドメインのゾーン設定を行い、外部向けDNSサーバー設定する事により、
自身のサーバーが稼動中にも関わらず、ダイナミックDNSサービス側が保守やトラブル等によりサービス停止した事によりドメイン名でサーバーにアクセスできなくなるということがなくなる。
独自ドメイン持ってないから不要、&ドメインサービスのDNSを信じる

・master,slave設定
→後日勉強する

・bindの脆弱性対策
→後日やる