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は脆弱性が発表されてるので要対策!
やりたいこと
先日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
#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
ルーター側のiptablesでDNSのポート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の脆弱性対策
→後日やる