dockerにbindをのっけてセカンダリDNSを構築する

目次

背景

自前の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で動かすこと自体はそこまで難しくありませんが、細かいところも気を付けるようにしなければいけないなと思った一日です。 最後までお読みいただきありがとうございました。




Archives

2022 (6)
2021 (3)
2020 (4)

Writer

筆者のイメージ画像
kusshie

情報系学部に所属していた社会人1年生です。大学ではネットワークを学んでいましたがまだまだです。 最近は友達に誘われてISPごっこに足を踏み入れました (AS63791)。