目次
背景
自前のBind9を権威サーバーにしているドメインの移管を検討したのですが、セカンダリだけは自前ではなく お名前ドットコムのものを借りていることに気が付きました。この場合ドメインを移管してしまうと セカンダリがない状態になるのではないかと思いました。したがって、この記事ではセカンダリも自前で構築することを目指します。 なんだか時代に逆行していますね…
プライマリサーバーを設定する
初めにプライマリで色々設定する必要があります。
NSレコードの設定
以下のように設定します。
$ORIGIN .
$TTL 86400 ; 1 day
kusshie.com IN SOA ns.kusshie.com. root.kusshie.com. (
2020042696 ; serial
3600 ; refresh (1 hour)
1800 ; retry (30 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS ns.kusshie.com.
# 既存のセカンダリは要らないので消す
NS 2nd.dnsv.jp.
# これが新しいセカンダリ(やっすいVPSを契約しました...)
NS ns2.kusshie.com.
$TTL 300 ; 5 minutes
A 147.192.215.34
$ORIGIN kusshie.com.
blog A 147.192.215.34
cosylab A 52.45.177.84
hedgedoc A 147.192.215.34
$TTL 86400 ; 1 day
ns A 35.192.172.63
# これが新しいセカンダリのAレコード
ns2 A 164.70.117.49
$TTL 300 ; 5 minutes
storage A 147.192.215.34
vpn A 147.192.215.34
逆引きの設定
以下のように設定します。
$TTL 86400
@ IN SOA ns.kusshie.com. root.kusshie.com. (
2020042601 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS ns.kusshie.com.
# これが新しいセカンダリ
IN NS ns2.kusshie.com.
IN PTR ns.kusshie.com.
# これが新しいセカンダリ
IN PTR ns2.kusshie.com.
ゾーンファイルの編集
新しいセカンダリへのゾーン転送を許可する設定をします。
named.conf.external-zones
view "external" {
zone "kusshie.com" {
type master;
file "kusshie.com.wan";
allow-transfer {
# 古いセカンダリは消す
163.44.76.202;
# 追記する(こっちが新しいセカンダリ)
164.70.117.49;
};
also-notify {
# 古いセカンダリは消す
163.44.76.202;
# 追記する(こっちが新しいセカンダリ)
164.70.117.49;
};
allow-update {
key "kusshie.com";
};
check-names ignore;
};
zone "_acme-challenge.kusshie.com" {
type master;
file "_acme-challenge.kusshie.com";
allow-update {
key "kusshie.com";
};
check-names ignore;
};
zone "63.172.192.35.in-addr.arpa" {
type master;
file "63.172.192.35.db";
allow-update { none; };
};
};
docker-compose.ymlの修正
以前作成したdocker-compose.ymlですが、そもそもゾーン転送できない設定となっておりました。 TCP53が使ってゾーン転送しますので開けておく必要があります。サーバーのFWやクラウドのFWも設定しましょう。
docker-compose.yml
version: '2'
services:
bind9:
image: ubuntu/bind9:latest
ports:
- "53:53/udp"
- "53:53/tcp" // TCPも通している
environment:
- TZ=Asia/Tokyo
restart: always
volumes:
- ./data/named.conf:/etc/bind/named.conf
- ./data/named.conf.options:/etc/bind/named.conf.options
- ./data/named.conf.internal-zones:/etc/bind/named.conf.internal-zones
- ./data/named.conf.external-zones:/etc/bind/named.conf.external-zones
- ./data/Kkusshie.com.+157+64918.private:/etc/bind/Kkusshie.com.+157+64918.private
- ./data/Kkusshie.com.+157+64918.key:/etc/bind/Kkusshie.com.+157+64918.key
- ./data/namedb:/var/cache/bind
以上でプライマリサーバーの設定は完了です。
セカンダリの設定
セカンダリの設定はそれほど難しくありません。
コンフィグを3つ用意する
named.conf
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.external-zones";
include "/etc/bind/named.conf.default-zones";
named.conf.external-zones
zone "kusshie.com" IN {
type slave;
file "kusshie.com.wan";
# プライマリサーバーのアドレスを入れましょう
masters { 35.192.172.63; };
};
named.conf.options
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
// forwarders {
// 0.0.0.0;
// };
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
# 自分のドメインだけ解決したいのでNOにします
recursion no;
listen-on-v6 { none; };
};
ファイルの作成は以上で完了です。
dockerの準備
私のお作法でディレクトリ構成は整えますが気にしないで下さい。相対的な位置関係に問題がなければなんでも動きます。
mkdir docker
cd docker
mkdir bind9-slave
cd bind9-slave
mkdir data
mv ~/named* ./data/
先ほど作成したコンフィグの配置が完了しました。
docker-compose.ymlの作成
docker-compose.yml
version: '2'
services:
bind9:
image: ubuntu/bind9:latest
ports:
- "164.70.117.49:53:53/udp"
environment:
- TZ=Asia/Tokyo
restart: always
volumes:
- ./data/named.conf:/etc/bind/named.conf
- ./data/named.conf.options:/etc/bind/named.conf.options
- ./data/named.conf.external-zones:/etc/bind/named.conf.external-zones
以上で完了です。 (TCPは開けなくても動きました)
まとめ
ゾーン転送はTCPを使うという当たり前の事実に気づかされました。ここで4時間ぐらい消費しているので完全にやらかしています。 dockerで動かすこと自体はそこまで難しくありませんが、細かいところも気を付けるようにしなければいけないなと思った一日です。 最後までお読みいただきありがとうございました。