権威DNSサービス調査～たまに行くならこんな店（DNSControlではしごしてみた）～2023年4月21日
ミライコミュニケーションネットワーク
田中温子

自己紹介
• 名前田中温子• 所属

株式会社ミライコミュニケーションネットワーク
技術部運用チーム所属• 最近の出来事• 新卒入社で運用チームに配属された2人を育成中• 教案作って毎日講義（今はメールサーバ）• 娘とバレーボールにハマる• 家の中でやって照明を破壊• 調子に乗って腰を痛める

8/3 ChuNOG2
in 松本やるよ2

今日の内容• 複数のDNSプロバイダを管理するDNSControlを使ってみたお話• 「たまに行くならこんな店」（権威DNSサービスを使ってみた調査）の”寄り道”編

3

調査のきっかけ
無料のdeSECいいな、でも無保証だし単独では使いづらいな↓
オンプレとdeSECを併用するしても、一度に更新できるツールないのかな↓
DNSControlが対応してるらしい↓

ちょっと使ってみよう4

DNSControlとは• なにができる？
• 複数のDNSプロバイダに対してゾーン情報の更新• 対応するDNSプロバイダのゾーンをDNSControlの形式に変換• 変数やマクロが書ける• Stack Exchange社が開発したOSS• BIND、Route53など35以上のDNSプロバイダに対応

5

使い方(1)•

ローカルのBINDで使うシンプルな例でやってみる
AlmaLinux9

DNSControl

Linuxの場合はHomebrewを入れてBrew Install dnscontrol

BIND/var/named6使い方(2)(1)creds.jsonを作る{"bind":{"TYPE":"BIND","directory":"/var/named"}

更新先のDNSプ
ロバイダを書く}(2)dnscontrols.jsを作る// Providers:var REG_NONE = NewRegistrar('none'); // No registrar.
var DNS_BIND = NewDnsProvider('bind'); // ISC BIND.
// Domains:
更新対象のゾーン名と、ゾーンの全レコードを書く

D('tanaka.jp', REG_NONE, DnsProvider(DNS_BIND),
A('test', '1.2.3.4'));
7

使い方(3)(3)書式チェック$ dnscontrol checkNo errors.

(4)Dry-Run$ dnscontrol preview(5)実行

ゾーンファイルがdnsconfig.jsの内容に更新される（namedのreloadはされない）$ dnscontrol push******************** Domain: tanaka.jp
1 correction#1: GENERATE_ZONEFILE: 'tanaka.jp'. Changes:
CREATE A test.tanaka.jp 1.2.3.4 ttl=300
DELETE A awawa.tanaka.jp 192.168.220.237 ttl=3600
WRITING ZONEFILE: /var/named/tanaka.jp.zone
SUCCESS!
Done. 1 corrections.
8どんなシーンで使えるか考えてみた• 会社のドメインを、オンプレのDNSサーバだけで運用していて心配…
• コストをかけずに外部にもDNSサーバ立てたい• レジストラが二つ以上のDNSサーバを要求する• オンプレのDNSサーバ（BIND）のみの構成から、＋deSECを使用する構成にDNSControlを使えば簡単に変更できそう
9

BIND+deSECの検証 前提• atana.jpというゾーンがあるとする$TTL 3600@
3600 IN SOA ns.atana.jp. postmaster.atana.jp. 2023030300
7200 1800 1209600 86400
IN NS ns.atana.jp.
ns
IN A
210.172.xxx.xxx
wwwIN A
210.172.xxx.xxx
mailIN A
210.172.xxx.xxx@
IN MX 10 mail.atana.jp.
tomatoIN A
210.172.xxx.xxx

10

BIND+deSECの検証 導入の流れ②deSECへアカウント作成、トークンを発行
AlmaLinux9

DNSControl①ゾーン情報を
DNSControlのgetzonesでdnscontrol.jsの形式に変換③①で吸い出した
dnscontrol.jsでdeSECへまるっと登録

BIND/var/named④レジストリのNSへdeSECのネームサーバを追加
11

BIND+deSECの検証 BINDから吸い出す• DNSControlでget-zonesするための準備をする• Creds.jsonファイルを作る{"bind":{"TYPE":"BIND","directory":"/var/named"},}12

BIND+deSECの検証 get-zonesの実行• dnscontrol get-zonesを実行してdnsconfig.jsの形式に変換する$ dnscontrol get-zones --format=js bind - atana.jp > dnsconfig.js$ cat dnsconfig.js
var DSP_BIND = NewDnsProvider("bind");var REG_CHANGEME = NewRegistrar("none");D("atana.jp", REG_CHANGEME,DnsProvider(DSP_BIND),//SOA('@', 'ns.atana.jp.', 'postmaster.atana.jp.', 2023030300, 7200, 1800, 1209600,86400, TTL(3600)),//NAMESERVER('ns.atana.jp.'),A('ns', '210.172.xxx.xxx'),deSEC側で無効な行はA('www', '210.172.xxx.xxx'),
自動的にコメントアウト
A('mail', '210.172.xxx.xxx'),された
MX('@', 10, 'mail.atana.jp.'),13
A('tomato', '210.172.xxx.xxx'))

BIND+deSECの検証 トークンの発行• deSECでアカウントを作成、トークンを発行• 有効期限、アクセス元IPアドレスを指定する

一度だけ表示されるのでトークンを保存

14

BIND+deSECの検証 登録の準備• deSECへ登録する準備（creds.jsonとdnsconfig.jsを編集）{"desec": {"TYPE": "DESEC","auth-token": "FKrKk6mY******************"},"bind":{"TYPE":"BIND","directory":"/var/named"}

deSECの記述を追加取得したトークンを指定}

BINDとdeSECに対して
var REG_NONE = NewRegistrar("none"); // No registrar.
var DSP_DESEC = NewDnsProvider("desec"); // deSEC
更新をかけるよう編集
var DNS_BIND = NewDnsProvider('bind'); // ISC BIND.
D("atana.jp", REG_NONE, DnsProvider(DSP_DESEC), DnsProvider(DNS_BIND),
15

BIND+deSECの検証 deSECへ登録• deSECへレコードを登録する$ dnscontrol push******************** Domain: atana.jp
1 correction#1: GENERATE_ZONEFILE: 'atana.jp'. Changes:
DELETE NS atana.jp ns.atana.jp. ttl=3600
WRITING ZONEFILE: /var/named/atana.jp.zone
SUCCESS!
1 correction
deSECへ登録が#1: Changes:
SUCCESS!
CREATE A ns.atana.jp 210.172.xxx.xxx ttl=3600
DELETE A test.atana.jp 1.2.3.4 ttl=3600
MODIFY A tomato.atana.jp: (1.2.3.5 ttl=3600) -> (210.172.xxx.xxx ttl=3600)：SUCCESS!
16Done. 2 corrections.

BIND+deSECの検証 deSECで確認• deSECの管理画面で確認する

17

BIND+deSECの検証 その後の運用• その後のレコード更新などの運用はDNSControlで管理できそう

AlmaLinux9

DNSControl

BIND/var/named18使ってみて気になったこと• BINDはゾーンファイルの更新まででreloadはされない→ファイルのタイムスタンプをみてreloadをかける仕組みなど必要そう• 複数のDNSプロバイダに更新を行い、片方が失敗したときはどうなるの？

→両方更新されなかった• SOAレコードは一緒にできる？ →deSECは自動なのでできなかった…

$ host -t SOA atana.jp ns1.desec.io
atana.jp has SOA record get.desec.io. get.desec.io. 2023043881 86400 3600 2419200 3600

→SOAレコードがDNSプロバイダごとに違うとどんな問題あるだろう？
• DNSプロバイダへはどのポートでアクセス？

→deSECはhttps19

まとめ• DNSControl、使ってみるための最初の導入はやさしい• 各DNSプロバイダのAPIの仕様を吸収してくれるので、DNSプロバイダ間の移行が簡単にできる• オンプレからクラウドへの移行も簡単• 管理画面からひとつひとつ登録したり、APIの使い方を学習する手間がはぶける• 変数やマクロが使えるのは便利• DNSSEC署名ありは今後ためせるといい

20