概要
DNSサーバ(BIND)は、centos.comというドメイン名からIPアドレスを返したり、IPアドレスからドメイン名を返すサーバである。
内部でサーバにアクセスするときに、IPアドレスではなく、centos.comでアクセスできるようにするのが、内部向けDNSサーバであり、
外部からサーバにアクセスするときに、自ドメイン名からIPアドレスへの変換(名前解決)を行なうようにするのが、外部向けDNSサーバである。
例えば、外部向けDNSサーバの設定により、自宅サーバが稼動中にも係わらず、
ダイナミックDNSサービス側が保守やトラブル等でサービスが停止したことにより、ドメイン名でサーバにアクセスできなくなるということがなくなる。
※注意
固定IPアドレスの場合は独自ドメイン取得済であること。
外部向けDNSサーバは固定IPアドレス環境の場合のみ。
BINDのインストール
DNSサーバを構築するため、BINDをインストールする。
sudo yum install bind bind-chroot
BINDの設定
BINDの設定ファイルを編集する。
sudo vi /etc/named.conf
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-transfer { none; }; ← 追加(ゾーン情報の転送を禁止)
...省略
recursion yes; ← 再帰問合せ機能を有効化(内部DNSサーバとして動作)
allow-query { localhost; localnets; }; ← 内部からのみ問合せを許可
allow-recursion { localhost; localnets; }; ← 内部からのみ再帰問合せを許可
allow-query-cache { localhost; localnets; }; ← 内部からのみキャッシュ問合せを許可
forwarders{ 8.8.8.8; 8.8.4.4; }; ← 本DNSサーバー管理外の問合せ先としてGoogleの公開DNSサーバーを指定
...省略
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
category lame-servers { null; }; ← 追加(error (connection refused) resolvingというエラーログの出力抑止)
};
# 内部向けDNSの設定
# --追記--
view "internal" {
match-clients { localnets; };
match-destinations { localnets; };
# ----
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
# 追記
include "/etc/named/named.centossrv.com.zone";
};
# ----
# 外部向けDNSの設定
# 追記(固定IPアドレスの場合のみ)
view "external" {
// 外部向け設定
match-clients { any; };
match-destinations { any; };
include "/etc/named/named.centossrv.com.zone.wan";
};
centos.comの内部向けゾーン定義ファイルを作成する。
sudo vi /etc/named/named.centossrv.com.zone
zone "centossrv.com" {
type master;
file "centossrv.com.db";
};
zone "1.168.192.in-addr.arpa" {
type master;
file "1.168.192.in-addr.arpa.db";
};
centos.comの外部向けゾーン定義ファイルを作成する。(固定IPアドレスの場合のみ)
sudo vi /etc/named/named.centossrv.com.zone.wan
# 正引き設定
zone "centossrv.com" {
type master;
file "centossrv.com.db.wan";
allow-query { any; };
};
# 逆引き設定(プロバイダから逆引き権限を委譲されている場合のみ)
zone "SUBxxx.xxx.xxx.xxx.in-addr.arpa" {
type master;
file "SUBxxx.xxx.xxx.xxx.in-addr.arpa.db.wan";
allow-query { any; };
};
IPv4のみ有効にする。(error (network unreachable) resolvingというエラーログの出力を抑止する)
sudo echo OPTIONS="-4" >> /etc/sysconfig/named
ルートゾーンの更新と自動更新設定
ルートゾーンは、世界に13台しかないトップレベルドメインを管理するDNSサーバのIPアドレスを管理しているファイルである。
ルートゾーン(named.ca)を更新する。
dig . ns @198.41.0.4 +bufsize=1024 > /var/named/chroot/var/named/named.ca
また、各月で、ルートゾーンが最新かどうか確認し、更新されていればルートゾーンの更新およびBINDの再起動を自動的に行うようにする。
※ルートゾーンが更新されていた場合のみ、新旧ルートゾーン情報及び、新旧ルートゾーンの差分情報をroot宛にメールする。
sudo 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
which systemctl > /dev/null 2>&1
if [ $? -eq 0 ]; then
systemctl restart named-chroot > /dev/null
else
/etc/rc.d/init.d/named restart > /dev/null
fi
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
ルートゾーンの更新スクリプトに実行権限を付加する。
sudo chmod 700 named.root_update
ルートゾーンの更新スクリプトを毎月自動実行されるディレクトリに移動する。
sudo mv named.root_update /etc/cron.monthly/
内部向け正引きゾーンデータベース(ドメイン名からIPアドレス)の作成
正引きゾーンデータベースを作成する。
sudo vi /var/named/centossrv.com.db
$TTL 86400
@ IN SOA centossrv.com. root.centossrv.com.(
2011062001 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS centossrv.com.
IN MX 10 centossrv.com.
@ IN A 192.168.1.3 ;サーバのプライベートIPアドレスを指定(centos.com用)
* IN A 192.168.1.3 ;サーバのプライベートIPアドレスを指定(*.centos.com用)
内部向け逆引きゾーンデータベース(IPアドレスからドメイン名)の作成
逆引きゾーンデータベースを作成する。
sudo vi /var/named/1.168.192.in-addr.arpa.db
$TTL 86400
@ IN SOA centossrv.com. root.centossrv.com.(
2011062001 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS centossrv.com.
3 IN PTR centossrv.com. ;サーバIPアドレス最下位部(192.168.1.3)とドメイン名を指定
外部向け正引きゾーンデータベース(ドメイン名からIPアドレス)の作成(固定IPアドレスの場合のみ)
外部向け正引きゾーンデータベースを作成する。
sudo vi /var/named/centos.com.db.wan
$TTL 86400
@ IN SOA ns1.centossrv.com. root.centossrv.com.(
2011062001 ; Serial
7200 ; Refresh
7200 ; Retry
2419200 ; Expire
86400 ) ; Minimum
IN NS ns1.centossrv.com. ← ネームサーバー名
IN MX 10 centossrv.com. ← MXホスト名(メールサーバーを構築する場合のみ)
ns1 IN A XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(ns1.centossrv.com用)
@ IN A XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(centossrv.com用)
www IN A XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(www.centossrv.com用)
ftp IN A XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(ftp.centossrv.com用)
mail IN A XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(mail.centossrv.com用)
centos.com. IN TXT "v=spf1 ip4:XXX.XXX.XXX.XXX ~all" ;サーバのグローバルIPアドレスを指定(メールサーバを構築する場合のみ)
外部向け逆引きゾーンデータベース(IPアドレスからドメイン名)の作成(固定IPアドレスでプロバイダから逆引き権限を委譲されている場合のみ)
外部向け逆引きゾーンデータベースを作成する。
sudo vi /var/named/SUBxxx.xxx.xxx.xxx.in-addr.arpa.db.wan
$TTL 86400
@ IN SOA ns1.centossrv.com. root.centossrv.com.(
2017012901 ; Serial
7200 ; Refresh
7200 ; Retry
2419200 ; Expire
86400 ) ; Minimum
IN NS ns1.centossrv.com.
xxx IN PTR centossrv.com. ;サーバIPアドレス最下位部(xxx.xxx.xxx.xxx)とドメイン名を指定
※注意
ゾーン情報の変更時は、Serial行を年月日と通番2桁(yyyymmddxx)のようにして、必ず、変更前よりも大きな値に変更すること。
例えば、変更前のSerialが2020010101なら、変更後のSerialは2020010102にする。
これにより、後述するセカンダリ側へのゾーン情報の変更が正しく行われるようになる。
BINDの起動
sudo systemctl start named-chroot sudo systemctl enable named-chroot
ファイヤーウォールのポート開放
CentOSのファイヤーウォールのポートを開放する。(TCP53番ポートとUDP53番ポート)
sudo firewall-cmd --add-service=DNS --parmanent sudo firewall-cmd --reload
ルータのポート開放
ルータ側の設定で、TCP53番ポートとUDP53番ポートへのアクセスをDNSサーバ(CentOS)に転送するように設定する。
※注意
ルータのポート開放の設定は、各ルータのマニュアルを参照すること。