DNSサーバを長年使用していたbind(bind9)からnsdへ移行しました。
目的としては以下です。
- キャッシュサーバとコンテンツサーバの分離
- 内部向け、外部向けを分離
- nsd, unboundは動作が軽いらしい
もともと、外部向け、内部向けを1台のマシンで共用していたのですが、
それぞれ1台の計2台のマシンで実現することにしました。
とはいっても2台のマシンは、xen上の仮想マシンなので物理的には1台のマシンです。
試行錯誤の結果、どうにか移行することができました。
以下その記録です。
環境
- OS: nsdbsd 4.0.1, netbsd 5.99.7
- nsd: 3.2.1
- unbound: 1.2.0
旧構成
基本的に以下をすべて一つのnamedで処理
- 外部ネットワークからの自ドメイン問い合わせ(コンテンツサーバ:許可)
- 外部ネットワークからの他ドメイン問い合わせ(キャッシュサーバ:禁止)
- 外部スレーブサーバから転送要求
- 外部スレーブサーバへ通知
- 内部ネットワークからの自ドメイン問い合わせ(コンテンツサーバ:許可)
- 内部ネットワークからの他ドメイン問い合わせ(キャッシュサーバ:許可)
- 内部スレーブサーバから転送要求
- 内部スレーブサーバへ通知
旧構成ネットワーク図
Internet (External)
|
|
+------------+
| NATBOX | port external:53 -> 192.168.1.2:53
+------------+
|192.168.1.1
| Internal Network 192.168.1.0/24
------------------------------------------------
|
|192.168.1.2
+------------------+
| named(*:53) |
| |
+------------------+
named.conf (主要な設定項目抜粋)
acl "internal" {
{
192.168.1.0/24;
127.0.0.0/8;
};
};
options {
allow-query { internal; };
allow-recursion { internal; };
allow-transfer {
external_slave_server_ip_addr;
internal_slave_server_ip_addr;
};
};
view "internal-network" {
match-clients { internal; };
zone "example.org." in {
type master;
file "primary/example.org.internal.zone";
};
zone "example.com." in {
type master;
file "primary/example.com.internal.zone";
};
};
view "external-network" {
match-clients { any; };
zone "example.org." in {
type master;
file "primary/example.org.external.zone";
};
zone "example.com." in {
type master;
file "primary/example.com.external.zone";
};
};
新構成
- 外部向けコンテンツサーバを専用マシン
コンテンツサーバ: nsd(port 53)
キャッシュサーバ: unbound(127.0.0.1 port 53)
マシンが単独で自立できるように自分向けのみに利用
- 内部向け専用マシンでは内部向けのコンテンツサーバとキャッシュサーバを動作
コンテンツサーバ: nsd(port 10053)
キャッシュサーバ: unbound(port 53)
コンテンツサーバ管理分は、10053(nsd)へフォワード
新構成ネットワーク図
Internet
|
|
+------------+
| NATBOX | port external:53 -> 192.168.1.2:53
+------------+
|192.168.1.1
| Local Network 192.168.1.0/24
------------------------------------------------
| |
|192.168.1.2 |192.168.1.3
+---------------------+ +----------------------+
|nsd(*:53) | |unbound(*:53) |
|unbound(localhost:53)| |nsd(*:10053) |
+---------------------+ +----------------------+
NetBSD 4.1 NetBSD 5.99.7
外部向けコンテンツサーバ 内部向けコンテンツ
兼キャッシュサーバ
外部向けマシン nsd.conf:
server:
ip-address: 192.168.1.2
key:
name: externalkey
algorithm: hmac-md5
secret: "SECRET_OF_EXTERNAL"
zone:
zonefile: "primary/example.org.external.zone"
notify: EXTERNAL_SLAVE_IP_ADDR externalkey
provide-xfr: EXTERNAL_SLAVE_IP_ADDR externalkey
外部向けマシン unbound.conf:
server:
interface: 127.0.0.1
port: 53
stub-zone:
name: "example.org"
stub-addr: 192.168.1.2
stub-zone:
name: "example.com"
stub-addr: 192.168.1.2
内部けマシン nsd.conf:
server:
port: 10053
key:
name: internalkey
algorithm: hmac-md5
secret: "SECRET_OF_INTERNAL"
zone:
zonefile: "primary/example.org.internal.zone"
notify: INTERNAL_SLAVE_IP_ADDR internalkey
provide-xfr: INTERNAL_SLAVE_IP_ADDR internalkey
内部向けマシン unbound.conf:
server:
interface: 0.0.0.0
port 53
// ローカルネットワークからのqueryを許可
access-control: 192.168.1.0/24 allow
// 192.168.1.X の逆引きを有効にする
// デフォルトでプライベートアドレスは許可されていない
local-zone: "1.168.192.in-addr.arpa." transparent
forward-zone:
name: "example.org."
forward-addr: 127.0.0.1@10053
forward-zone:
name: "example.com."
forward-addr: 127.0.0.1@10053
注意点
nsd3.2.1ではIXFRの応答ができないため、スレーブサーバではゾーン転送にAXFRを使う必要がある。
例: bind 9.Xの場合(内部ネットワーク用スレーブサーバ) named.conf
server 192.168.1.3 {
keys "internalkey";
// AXFRで転送すべし
request-ixfr no;
};
zone "example.org." in {
type slave;
file "slave/example.org.internal.zone";
masters {
192.168.1.3 port 10053;
};
notify no;
};