manekineko倉金家ホームページ

趣味の部屋/サーバー構築メモ その4

ネームサーバー named

2014年10月8日 2014年10月9日 更新
自分のドメインを公開するためのDNSサーバーとして、また同時にDNSキャッシングサーバー(リゾルバ)としてnamed bind9を稼働しました。
WEB閲覧時の表示がかなり速くなりました。


デスクトップもだいたい仕上げて好みに合ってきたのでそろそろふだんのパソコンとしても使いはじめました。
ところがブラウザ(Firefox)でWEB閲覧をしていてふと気がつきました。ちょっと遅い!
時折ステータスバーに、「...のアドレス解決をしています」などという文字が見えます。
アドレス解決ということはDNSの問題だな。マシンの性能から見れば遅いはずはありません。

現行サーバーは自前のDNSを立ち上げてますがこちらはまだです。ルーターの自動DNS機能を使っていますが、現行サーバーとはちがいかなり古いルーターです。
試しにネットワークの設定のDNSのところに現行サーバーのアドレスをセットしてそのDNSを使ってみると...、速い!

これはもう自前DNSを建てなくてはならないでしょう。いずれやらなくてはならないことだし。

OSインストール時にnamed bind-9.9.4を入れてあります。
/etc/named.conf を編集します。
以下の二通りの機能を設定します。
1.アドレス解決用(リゾルバ)として自分自身(localhost)とLAN内のみに公開。
2.自分がホストするドメイン(kuragane.jpなど)のDNSとして一般公開。

/etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

//// loggingを最初に書く。これを読み込む前の処理は記録されない...と昔聞いた。
logging {
channel named_log {
file "/var/named/data/log/named.log"; // …通常のように/var/logに置こうとしたらSELinuxにからまれた。
severity info; // ログレベル:debug,info,notice,warning,error。
print-time yes;
print-severity yes;
print-category yes;
};
category lame-servers { null; };
category default { named_log; };
// category queries { named_log; }; // 全クエリーを記録。最初のうちだけ。
};

//// 内部リゾルバ用アクセスコントロールリスト。view "internal"に適用。
acl "internal-acl" { 127/8; ::1; 192.168/16; };

options {
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";
//// いったんすべて拒否しておく。各viewで必要なものだけを許可。
allow-query { none; };
allow-query-cache { none; };
max-cache-size 104857600; // 仮にキャッシュを許したとしても100MBに制限。(ディフォルトは無制限でTTLにのみ依存。)
notify no;
allow-notify { none; };
recursion no;

forward first;
forwarders {
XXX.XXX.XXX.XXX; // プロバイダの PRIMARY DNS アドレス
XXX.XXX.XXX.XXX; // プロバイダの SECONDARY DNS アドレス
};


//// DNSSECを有効にするとセキュリティー上安全だとか。でも少し遅くなるようだ。
//// こちらのDNSSECを有効にするにはゾーンファイルに署名し、登録・更新などしなくてはいけないとか。
//// こちらのDNSSECは無効でも相手のDNSSEC確認の役にはたつだろう。
// dnssec-enable yes;
// dnssec-validation auto; // auto;の方がなんとなくいいみたい。
// dnssec-lookaside auto;
//// 結局有効だとつながらないサイトがあったりして無効にした。
dnssec-enable no;
dnssec-validation no;
dnssec-lookaside no;
// …無効に変更。有効だとつながらない場合がある。(後述)

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

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

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

//// 内部向けリゾルバとしてのview
view "internal" {
match-clients { internal-acl; };
allow-query { internal-acl; };
allow-query-cache { internal-acl; };
recursion yes;

//// root zone file
zone "." IN {
type hint;
file "named.ca"; // CentOS5ではnamed.root
};

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

//// LAN内にあるrouter、その他 マシン名を定義。実際はアドレスを直に書くので使われないと思うが。
//// localdomain正引き。
zone "localdomain" IN {
type master;
file "localdomain.zone";
allow-update { none; };
};
//// localdomain逆引き
zone "168.192.in-addr.arpa" IN {
type master;
file "localdomain.rev";
allow-update { none; };
};

//// このサーバーがホストするドメイン。ルーターによって要、あるいは不要。
//// 自分のグローバルアドレスも外に通し内部に振らないルータ(昔のルーターはそうだった)や、
//// 「NATループバック」や「ヘアピンNAT」対応ルータではいらない。
//// グローバルアドレスの代わりにこのマシンのローカルアドレスをポイント。

//// kuragane.jp
zone "kuragane.jp" IN {
type master;
file "internal.kuragane.jp.zone.master";
};

//// その他
// ........
};


//// 外部向けDNSサーバーとしてのview。上記view "internal"に合致しないアクセスはここに来る。
view "external" {
match-clients { any; };
allow-query { any; };
allow-query-cache { any; };
recursion no;

//// kuragane.jp
zone "kuragane.jp" IN {
type master;
file "kuragane.jp.zone.master";
notify yes;
also-notify { XXX.XXX.XXX.XXX; }; //// セカンダリDNSのアドレス。
};

//// その他
// ........
};

各ゾーンファイルの概要は、

localdomain.zone
$TTL	86400
@ IN SOA moonlight root.moonlight ( ; …moonlightは今回のマシンの名前。
2014100801 ; serial
3H ; refresh
15M ; retry
1W ; expiry
1D ; minimum
)
IN NS moonlight
router IN A 192.168.1.1 ; …ルーター。
jiji IN A 192.168.1.5 ; …バックアップサーバー、CentOS5。
cosmos IN A 192.168.1.6 ; …現行サーバー、CentOS6。
moonlight IN A 192.168.1.7 ; …このサーバー、CentOS7。
…LAN内正引き。

localdomain.rev
$TTL	86400
@ IN SOA moonlight.localdomain. root.moonlight.localdomain. (
2014100801 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ; Minimum
)
IN NS moonlight.localdomain.
1.1 IN PTR router.localdomain.
5.1 IN PTR jiji.localdomain.
6.1 IN PTR cosmos.localdomain.
7.1 IN PTR moonlight.localdomain
…LAN内逆引き。

internal.kuragane.jp.zone.master
; internal kuragane.jp zone master

$TTL 86400 ; 1 day
@ IN SOA ns.iroribata.net. donbei.iroribata.net. (
2014100801 ; serial
3600 ; refresh (1 hour)
600 ; retry (10 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
IN NS ns.iroribata.net.
IN NS ns.yunosato.net.
IN MX 10 mail.kuragane.jp.
;
@ IN A 192.168.1.7
* IN A 192.168.1.7
mail IN A 192.168.1.7
…下記の外部向けグローバルアドレスを内部(自分自身)に振り替えただけ。

kuragane.jp.zone.master
; kuragane.jp zone master

$TTL 86400 ; 1 day
@ IN SOA ns.iroribata.net. donbei.iroribata.net. (
2014100801 ; serial
3600 ; refresh (1 hour)
600 ; retry (10 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
;
IN NS ns.iroribata.net.
IN NS ns.yunosato.net.
IN MX 10 mail.kuragane.jp.
;
@ IN A 219.117.195.47
* IN A 219.117.195.47
mail IN A 219.117.195.47
…外部向け。

といった具合。しかしながら、namedの設定は多少よくわからない部分もあるが。

ちなみに当初、ディフォルトではログファイルは、
/var/named/data/named.run だったが、通例にしたがって
/var/log/named/named.log に変更したら見事にSELinuxに蹴られた。
namedは/var/logにアクセス権限をもっていないようだ。セキュリティー上の理由からか?

で、/var/named/data ならよさそうなので、せめて
/var/named/data/log/named.log として、logディレクトリを/var/logにnamedという名前でリンクしておいた。
ログは同じ場所にまとまっているほうがなんと言ってもわかりやすいからね。
ログのパスを変更したのでそれに合わせて/etc/logrotate.d/named のログのパスも修正。

そしてnamedを起動。
~]# systemctl start named.service
無事起動した。

ブラウザでWEB閲覧を試してみたら格段に速くなりました。

さらに起動設定。
~]# systemctl enable named.service
DNS公開のためファイアウォール設定。GUIツールでちょこっと設定:永続-ゾーン:public-サービス:dnsにチェック。

完了!

(2014.10.9 追記) つながらないサイトがある!
昨日このnamedを稼働して夜も遅かったので確認もそこそこに寝た。
今日いつものようにWEB閲覧をしていると、今迄いつも見ていたサイトのひとつが見れない。
どうしてもNot Foundとなる。おかしいな。でも別のパソコンで見るとちゃんと見れる。
変えたのはDNSだけなのでこれがあやしいと思い、
一番心配だったDNSSECの設定を無効にしてみたら、ちゃんと見れた。それに表示がさらに速くなった。
ちなみに見れなかったサイトは決してあやしいサイトではなく、DNSが乗っ取られているようにも思えない。

相手のDNSの設定によってはうまく認証できないのか、こちらのDNSSECの設定がどこかおかしいのかまではわからないが、とにかくDNSSECは無効にした。
仮にDNSSECを有効にするにしても、もう少し勉強してからにしよう。

でもこんなのがディフォルトで有効になっているというのが少し疑問。
他に何か設定が必要ならディフォルトは無効にしておくべきだろう。