• Top
  • / で移動
  • 数字キーで Chapter ジャンプ
  • でテーマ切り替え
1 / 1

DNS温泉番外編in大阪 vol.4 ―― DNS浸透いうな

Web開発者が知っておくべきDNSの知識

『DNSの浸透を待たなくて済むように』

―― https://dns.lavoscore.org/ を書いてから2年が経った

Agenda

0. はじめに

0-1. 自己紹介

Twitter (X) @debiru_R
氏名 高井 実 (Takai Minoru)
プロフィール HTMLをこよなく愛するHTML専門家。
2000年頃からセマンティックHTMLを説いている。
本業はWebサイト/システム開発をするWebエンジニア。
DNSとの出会いは2014年12月、Twitterにて……
関連記事

高井 実の顔写真。晴れた空の下、黒一色の服装で公園の鉄棒の上に跨って手前側を見ている。

0-2. 出会い

「浸透いうな」にふぁぼられた

2014年12月22日に Twitter で debiru が「DNS レコード書き換えたんだけどまだ反映されないにゃ〜」と発言しているツイート。

0-3. 今日のお話

  • 1章:DNSに関する用語と基礎知識
  • 2章:DNSの理解を深めるためのネタ
  • 3章:Webサーバーのワイルドカード証明書を発行する方法
  • 4章:おわりに

1. DNSに関する用語と基礎知識

1-1. 「IPアドレス」と「ドメイン名」

Webブラウザで、YouTubeのWebサイトにアクセスするには、https://www.youtube.com/ のように「ドメイン名」を含むURLをアドレスバーに入力するのが一般的です。

しかし、コンピューターネットワークの通信プロトコルでは「IPアドレス」が分からなければ通信ができません。

YouTubeのWebサーバーは冗長化されているため複数のIPアドレスが存在しますが、例えば 142.250.206.238 がその具体値です。

アクセス先を指す名前としてIPアドレスは憶えにくいことや、アクセス先の冗長化などをしたい場合にはIPアドレスを直接扱わない方が都合が良いため、アクセス先を指す名前として「ドメイン名」という概念が導入されました。

1-2. 「ドメイン名」は買えない

ドメイン名を世界中で利用できるようにするには、「ドメイン名レジストラ」と呼ばれるドメイン名の登録機関を通じて、利用したいドメイン名の利用登録を行う必要があります。

youtube.com でも debiru.net でも、ドメイン名の利用者は「ドメイン名の利用登録」を行うことで、登録している期間だけ「そのドメイン名を利用(管理)できる」という構造になっています。

一定期間の利用登録をしているだけであって、購入しているわけではないのです。

携帯電話を買うことはできても電話番号を買うことができないのと同様です。電話番号の割当事業者と契約している期間だけその番号を占有して利用できますが、契約が切れた途端にその電話番号は自分のものではなくなるのです。

あくまで一時的に利用・取得できるものです。あなたができることは「ドメイン名の登録」であって「ドメイン名の購入」や「ドメイン名の永続的な取得」ができないことに注意しましょう。

1-3. 「ドメイン名」と「ドメイン」

「ドメイン名」のことを「ドメイン」と呼ぶ人がいますが、youtube.com のような文字列を「ドメイン」と呼ぶのは誤りです。

「私のTwitter(X)アカウントは debiru_R です」のように言うことがありますが、そのような表現が許容されるのは「実体」と「実体の名称」が同一視できる状況に限られます。

TwitterでIDや名前を変更したときに「Twitterアカウントを変更した」と表現しては意味が通らないでしょう。「TwitterアカウントのID/名前を変更した」と表現するはずです。

特に「ドメイン」に関しては、その実体である「IPアドレスが指す先のサーバー」の管理と実体の名前である「ドメイン名」の管理は独立して行われます。サーバーを契約・設置するときに、ドメイン名をその場で設定して使えるようにするわけではありません。

「ドメイン名」のことを「ドメイン」と呼ぶと混乱が生じるので、区別することを意識しましょう。

1-4. 「ドメイン名」と「ホスト名」と「サブドメイン」

文脈によって多少定義が異なることがあるが、ここでは以下のように定義しておく。

名称 説明
ドメイン名
(ラベルとドット)
ネットワークアドレスを指す目的で用意された youtube.com / www.youtube.com / foo.bar.debiru.net のようなドットで区切られた文字列全体のこと。localhost / 総務省.jp / com / jp もそれぞれドメイン名である。
ラベル ドメイン名の中で、ドットで区切られた一つ一つの文字列のこと。
www.youtube.com というドメイン名は wwwyoutubecom の3つのラベルから成る。
ホスト名 コンピューターやサーバーを指す名前のこと。名前解決が可能なドメイン名の中で、先頭のラベルのこと。
名前解決 ドメイン名をIPアドレスに変換すること。DNSに限らず、hostsファイルを用いて名前解決をすることもできる。
トップレベルドメイン (TLD) ドメイン名の中で、末尾のラベルのこと。www.u-tokyo.ac.jp のTLDは jp である。
セカンドレベルドメイン (SLD) ドメイン名の中で、末尾から2番目のラベルのこと。www.u-tokyo.ac.jp のSLDは ac である。
サブドメイン
(サブドメインのドメイン名)
あるドメイン名に対して、先頭側にラベルとドットの組が1個以上追加されたもの。
www.u-tokyo.ac.jpu-tokyo.ac.jp のサブドメインであるが、ac.jpjp のサブドメインでもある。
ドメイン?ドメイン名? ドメイン名のことなのに「TLD」とか「サブドメイン」に「名」という言葉が入っていないのが既にツラい。

1-4-2. 「登録可能ドメイン名」と「eTLD」

名称 説明
登録可能ドメイン名
(Registerable Domain Name)
ドメイン名レジストラで理論上登録が可能なドメイン名のこと。debiru.jp は登録可能ドメイン名だが ac.jp は登録可能ドメイン名ではない。u-tokyo.ac.jp は登録可能ドメイン名だが u-tokyo.debiru.jp は登録可能ドメイン名ではない。
登録可能ドメイン名の条件 eTLDの直下のサブドメインであること。(既に誰かに登録されていて登録できないという状況はここでは扱わない)
eTLD
(Effective TLD)
ドメイン名レジストリが予約しているドメイン名のこと。全てのTLDに加え、複数のラベルを持つ一部のドメイン名がこれに含まれる。ac.jpac.gov.br など。eTLDの一覧は Public Suffix List (PSL) で管理されている。
完全修飾ドメイン名
FQDN (Fully Qualified -)
上位(末尾側)のドメイン名を省略せずに、TLDまでを全て含んだドメイン名のこと。
www.debiru.net または www.debiru.net. のようなもの。特定の文脈では絶対ドメイン名表記とする必要がある。
相対ドメイン名 サブドメインを相対的に表したもの。debiru.net のDNSレコードとして www.debiru.net を設定するときの www など。
絶対ドメイン名 www.debiru.net. のように末尾にドットが付いたもの。末尾にドットが付いていれば相対ドメイン名ではないと分かる。

1-5. 「レジストリ」と「レジストラ」

名称 役割
ドメイン名レジストリ
(Domain Name Registry)
com, jp などのトップレベルドメイン(TLD)ごとに、そのTLDを持つドメイン名の登録データを管理している。レジストラからのドメイン名登録操作を受け付ける機関
ドメイン名レジストラ
(Domain Name Registrar)
エンドユーザーやリセラーからのドメイン名登録申請を受け付けて、対応するTLDのレジストリへ登録操作を行う機関。扱えるTLDはレジストラによって異なる。
リセラー
(Re-Seller)
レジストラの代理店。Webサーバーのホスティング会社などが、Webサーバー契約と併せてドメイン名の登録サービスを提供していることが多い。複数のレジストラと提携することで、多くのTLDのドメイン名登録を受け付けられる。
DNSゾーン管理サービス
(権威DNSサーバー)
ドメイン名を登録をした後は、そのドメイン名を管理する「権威DNSサーバー」を指定する必要がある。ドメイン名の登録管理とは別に、DNSの管理機能を提供するサービスが存在している。
ドメイン名登録作業者
(Worker)
登録者本人、またはWeb担当者やWebサイトの受託開発担当者。ドメイン名の利用者(登録者)の代理でドメイン名登録申請を行うことが多い。
ドメイン名登録者
(Registrant)
ドメイン名を利用する個人や組織。Whois情報として公開される。利用者情報をWhoisに載せたくない場合はレジストラ情報を代理公開することもできる。

1-5-2. 「レジストリ」と「レジストラ」の具体例

名称 事業者の例
ドメイン名レジストリ
(Domain Name Registry)
Verisign (.com .net) / JPRS (.jp) / GMO Registry (.tokyo) / SAKURA internet (.sakura) / Sharp (.sharp)
他は https://www.iana.org/domains/root/db を参照
ドメイン名レジストラ
(Domain Name Registrar)
Cloudflare Registrar / AWS Route 53 Domains / Enom / GoDaddy / GMO internet (お名前.com) / SAKURA internet (さくらのドメイン) / GMO Pepabo (ムームードメイン)
リセラー
(Re-Seller)
さくらのレンタルサーバー / ムームードメイン (GMO Pepabo) / Value Domain (GMO) / XServerドメイン / Wix / Shopify
DNSゾーン管理サービス
(権威DNSサーバー)
GoDaddy / お名前.com / Value Domain (GMO) / さくらのドメイン / Cloudflare DNS / AWS Route 53

上記の事業者は一例です。

1-6. DNSの仕組み

  1. www.debiru.net のIPアドレスをOS内部のスタブリゾルバーフルサービスリゾルバーに問い合わせる。
  2. フルサービスリゾルバーはルートゾーンに問い合わせる。
  3. ルートゾーンは「netのことはnetゾーンへ」と返答する。
  4. フルサービスリゾルバーはnetゾーンに問い合わせる。
  5. netゾーンは「debiru.netのことはdebiru.netゾーンへ」と返答する。
  6. フルサービスリゾルバーはdebiru.netゾーンに問い合わせる。
  7. debiru.netゾーンは「www.debiru.netのIPアドレスは162.43.35.209」と返答する。
  8. フルサービスリゾルバーは答えを得たので、スタブリゾルバーへ返答する。

1-6-2. DNSの仕組み:ゾーン(1)

  • あるドメイン名のDNSレコードを管理するスコープをゾーンと言います。
    • ゾーンでは、そのドメイン名自体と、子孫ドメイン名を管理することができます。
    • debiru.net のゾーンサーバーで debiru.netwww.debiru.net のDNSレコードを設定する、といった具合です。
  • net ゾーンで debiru.net とその子孫のDNSレコードを管理することもできますが、実際にはゾーンが分離されています。
    • net ドメイン名の管理者(Verisign)と debiru.net ドメイン名の管理者(私)が異なる。
    • 子ドメイン名までしか関心がない。孫以降の情報は、子(孫の親)に管理を任せたい。
  • ゾーンを分離することを「ゾーンカット」と言います。ゾーンカットした場合は、親ゾーンから子ゾーンへ委任(Delegation)をします。委任はNSレコードによって設定されます。

1-6-3. DNSの仕組み:ゾーン(2)

  • DNSのゾーンを分離することは、企業において次のように社員を管理することと似ています。
    • 社長は、役員の名前しか知らない。
    • 役員は、本部長の名前しか知らない。
    • 本部長は、配下の部長の名前しか知らない。
    • 部長は、配下の課長の名前しか知らない。
    • 課長は、配下の平社員を全員知っている。
  • 数千人、数万人規模の会社でも、このように管理することで各責任者(ゾーン管理者)がきちんとしていれば、全ての社員の情報をきちんと管理できます。
  • もちろん、社長や本部長が配下の全ての社員を把握して管理するような体制を採ることも可能です。DNSのゾーン管理はそれと同じように設計できます。

1-6-4. DNSの仕組み:ゾーン(3)

  • net ゾーンと debiru.net ゾーンを分離しておきながら、net ゾーンで www.debiru.net の情報を管理することはできません。委任したら、委任先の子孫の情報は扱えないということです。
  • 実在するゾーンサーバーは、ドメイン名のラベル毎にゾーンカットされているわけでもありません。例えば jp ゾーンサーバーがあり、u-tokyo.ac.jp ゾーンサーバーがありますが、ac.jp ゾーンサーバーがあるわけではありません。
  • ドメイン名の上位のラベル毎にゾーンカットすることもできますが、実際にゾーンカットすべきなのは「管理対象のドメイン名の管理者が、親ゾーンと異なる」という場合が典型的です。
  • あるいは、何らかの理由でDNSレコードを管理している権威DNSサーバーを分けたい場合です。例えば debiru.net ゾーンは AWS Route 53 で管理していますが、_acme-challenge.debiru.net ゾーンは自身のWebサーバー上の tinydns で管理しています。
    • ACME(アクミー)は、Automatic Certificate Management Environment(自動証明書管理環境)です。

1-7. フルサービスリゾルバーは返答をキャッシュする

  1. www.debiru.net のIPアドレスをOS内部のスタブリゾルバーフルサービスリゾルバーに問い合わせる。
  2. フルサービスリゾルバーはその答えをキャッシュに持っているので、162.43.35.209をスタブリゾルバーへ返答する。

1-8. DNSレコードを更新しても反映されない現象

  1. www.debiru.net のIPアドレスをOS内部のスタブリゾルバーフルサービスリゾルバーに問い合わせる。
  2. フルサービスリゾルバーはその答えをキャッシュに持っているので、162.43.35.209をスタブリゾルバーへ返答する。

新しい設定値185.199.108.153はいつ反映される?

1-9. DNSの仕組みのおさらい

  1. 通常、ユーザーが扱いたいドメイン名の名前解決はフルサービスリゾルバーを介して行われる。
  2. フルサービスリゾルバーは、権威DNSサーバーから受け取った情報を一定時間キャッシュする
  3. DNSレコードを管理しているあなたが触れるのは権威DNSサーバーだけであり、フルサービスリゾルバーのキャッシュを破棄することはできない。
  4. フルサービスリゾルバーは基本的にISP毎に存在している。誰でも使える Public DNS (8.8.8.8等) もある。
  5. フルサービスリゾルバーが情報をキャッシュする時間は、問い合わせに対する応答として設定されているDNSレコードのTTL秒である。

1-10. DNSの基礎知識をもっと知りたければ

この資料では、学習を手助けするための情報をここまでしか用意することができませんでした。

あるいは https://x.com/tss_ontap をフォローしてDNSを学習しましょう。

2. DNSの理解を深めるためのネタ

2-1. Web開発者がすべきこと

  • ドメイン名の管理およびDNSのゾーン管理に関する知識はWeb開発者が知っておくべき。
  • フロントエンドやバックエンドといった領域に依らず、理解する必要性に気づきましょう。
  • 業務でDNSを扱っているにも関わらず、DNSの仕組みを全く理解していない技術者も多いです。
  • そのような技術者から抜け出すために、学習のきっかけとなるネタを紹介していきます。
  • 紹介するキーワードについて、自分で深く調べてみてください。

2-2. DNSサーバーと言ってはいけない

名称 説明
スタブリゾルバー 「DNSクライアント」とも呼ばれる。
フルサービスリゾルバー 「フルリゾルバー」「キャッシュDNSサーバー」とも呼ばれる。
権威DNSサーバー 「コンテンツサーバー」「ゾーンサーバー」とも呼ばれる。
DNSサーバー 「フルサービスリゾルバー」なのか「権威DNSサーバー」なのか分からないため、この表現は安易に使うべきではない。「ネームサーバー」も同様。

2-3. 知っておくべきDNSレコードのタイプ

レコードタイプ 説明
SOA レコード ゾーンの管理情報を表すレコード。ゾーンカットしたドメイン名に対して設定する。
NS レコード ゾーンカットされた子孫のドメイン名が管理されている権威DNSサーバーの場所を表すレコード。ゾーン自身のドメイン名に対しては、自分自身の権威DNSサーバーを指すNSレコードが必要。
A レコード 管理下のドメイン名にIPv4アドレスを設定する際に用いる。
AAAA レコード 管理下のドメイン名にIPv6アドレスを設定する際に用いる。
CNAME レコード 管理下のドメイン名を名前解決できるようにするために別のドメイン名を参照する際に用いる。ただし、CNAMEレコードは他のDNSレコードと同時に設定できない。ゾーン頂点のドメイン名に対しては、SOAとNSのレコードが必要なため、CNAMEレコードを設定することができない。
MX レコード 管理下のドメイン名にメールが送信された際の受信メールサーバーの場所を表すレコード。
TXT レコード 管理下のドメイン名に任意のテキストを設定できる。TXTレコードを用いることで、ドメイン名の所有権確認をしたり、任意の設定値を表すことができる。
SPF/DKIM/DMARC TXT レコードで設定する。メールを送信した際の送信元ドメイン名に関する情報を表す。

2-4. 知らなくていいこと

  • DNSSEC
  • nslookup コマンド
    • いますぐ窓から投げ捨てよう。
    • 再帰クエリ非再帰クエリの違いも理解せずにこんなコマンドを使ってはいけません。
  • DNS Propagation Checker という謎ツール
    • こんなツールを使って「浸透」を待つと、期待する結果になるまでに余計に時間がかかる。
    • ネガティブキャッシュについて理解する必要がある。
  • 権威/キャッシュ兼用DNSサーバー
    • 歴史的遺産として調べる分にはよいかもしれない。
  • グルーレコード
    • In-domain / Sibling domain / In-bailiwick / Out-of-bailiwick あるいは Unrelated ……うっ!頭がッ!

2-5. DNS浸透いうな

  • DNSの浸透待ち
    • DNSレコードの設定後に「DNSの浸透」を待つ人が後を絶たない。
    • これはDNSサービス事業者が始めた嘘・デマが原因。
    • DNSサービス事業者が「DNSレコードの設定変更後は、インターネット全体に情報が浸透するまでに72時間かかります」などとデタラメを言っている。
  • DNS伝播待ち・DNS反映待ち
    • 「浸透」を「伝播」「反映」に置き換えればよいという問題ではない。
    • 待つ必要が生じている時点で何かが間違っていることに気づかなければならない。

2-6. 海外でも "DNS Propagation" と言われている?

  • 「浸透と言って何が悪い?」
    • "DNS propagation takes between 24-48 hours to complete" のような文章が散見される。
    • 海外で DNS Propagation と言われているから、その表現が正しいと思うのは危険。
    • 海外でも、日本と同様にDNSを誤解している人が多いだけ。
    • うそはうそであると見抜ける人でないと(DNSを使うのは)難しい
  • DNS には "propagation" という専門用語がある
    • プライマリゾーンサーバーのゾーン情報を書き換えた後、セカンダリゾーンサーバーにゾーン情報を転送する処理のことを propagation と言う。
    • これは、何時間も待つ必要があると言われるような "DNS Propagation" とは関係がない。

2-7. DNSを理解しない技術者による損失

  • 運用中のサイトやメールが2日間使えなくなる
    • 運用中の顧客のドメイン名のNSレコードを無意味に誤って変更してしまうWeb受託制作会社(実話)
    • レジストリ側のNSレコードのTTLが172800(2日間)の場合、復旧に2日間かかる。
  • 1日あたり7億7500万0000円の損失(1ドル155円換算)
    • NULL の発明は(40年間で)10億ドルの経済的損失と言われている(Billion Dollar Mistake)
    • DNS の浸透待ちは(40年間で)732億ドルの経済的損失と試算できる(Trillion Dollar Mistake?)
      • 1日あたり25万件のサイトが新設されている。10万件として計算しよう。
      • 10人に1人が浸透待ちをしているとしよう。つまり1日に1万件のサイトで浸透待ちが生じる。
      • 24時間待つ羽目になったとして、作業者の拘束時間(4時間×時給50ドル)とサイト公開遅延による機会損失(300ドル)で1件500ドルの損失。
      • 1日あたり1万件×500ドルで500万ドル。1年で18.3億ドル。40年で732億ドルの損失となる。
      • 少なく見積もってこの値である。浸透待ちをする人の割合は10人に1人よりももっと多いかもしれない。

2-8. DNSにまつわるセキュリティ

  • ドメイン名の乗っ取り
  • Lame Delegation
    • 間違ったNSレコードを設定する(あるいは不適切な設定が放置される)ことで、第三者がそのドメイン名のDNSレコードを設定できてしまう状態。
  • Dangling A/CNAME / Subdomain Takeover
    • 間違ったA/CNAMEレコードを設定する(あるいは不適切な設定が放置される)ことで、第三者がそのドメイン名の先のコンテンツを乗っ取れる状態。
  • ドロップキャッチ
    • ドメイン名を登録して利用した後に、ドメイン名を手放してしまうことで第三者にそのドメイン名を奪われてしまう問題。ドメイン名は安易に新規登録してはいけない。

2-9. DNSの設定変更でダウンタイムを出してはならない

  • 「サーバー移転作業のため、サイトにアクセスできません」
    • ドメイン名の移管なり、NS移転なり、A変更なりが必要であっても、サイトの可用性を落とす必要はない。
    • Webで商売しているのであればダウンタイムが発生するような計画で作業を実施してはいけない。
  • DNSの設定変更は待ち時間が発生するという誤解
    • TTLをコントロールする術を知らない人々
    • フルサービスリゾルバーにキャッシュを生成してしまう人々
    • 自分の環境(ISP)でアクセスできるかどうかを判断基準にしている人々
    • ダウンタイムが発生するという案内をする暇があるなら、DNSの仕組みを理解しよう
  • ダウンタイムの発生はセキュリティ事故
    • 可用性(Availability)はセキュリティ三大要素の一つ
    • 安易に可用性を落としてはならない。
    • 適切なDNSレコードの設定手順を知る必要がある。

2-10. ドメイン名を登録する際の心得

  • ドメイン名は信用資産
    • ドメイン名は一度公開・宣伝し利用したら、未来永劫に亘ってそのドメイン名の管理をしなければならない。
  • ドメイン名は「プロダクト名」ではなく「ブランド名」にすべし
    • 2025年末に見かけた良くないドメイン名:新作ごとにドメイン名を登録するつもり?
    • 制作元である Acacia というブランドのドメイン名のサブドメインにすることが望ましい。
  • Web制作会社がクライアントのドメイン名を登録すべきではない
    • そのドメイン名とコンテンツを永続的に保守し続ける覚悟があるのですか?
    • ドメイン名登録ではなく、サブドメインを使うべき。
    • クライアントの資産はクライアントに管理させましょう。

2-11. dig コマンド

  • DNSレコードの設定ができたかを確認するには
    • 権威DNSサーバーでDNSレコードを設定した後は、手元の端末から権威DNSサーバーに問い合わせる。
    • そのドメイン名にブラウザからアクセスしたり、フルサービスリゾルバーを経由して問い合わせてはいけない。
  • ネガティブキャッシュを防ぐ
    • DNSレコードが設定されていない状態でその情報を問い合わせると、「情報がなかった」という結果がキャッシュされてしまう。そのキャッシュの生存時間がどうなるかについてはSOAレコードの仕様を調べてみよう。
  • 権威DNSサーバーに直接問い合わせるには
    • 非再帰問い合わせができる dig などのコマンドを用いて、問い合わせ先DNSサーバーの指定非再帰問い合わせオプションを設定して問い合わせよう。
    • コマンド例: dig _acme-challenge.debiru.net txt @ns.debiru.net +norec

3. Webサーバーの
ワイルドカード証明書を発行する方法

3-1. 証明書を発行する流れ

最後にDNSを実践してみましょう。

  1. certbot コマンドで「ワイルドカードのドメイン名」に対して証明書を発行する
  2. ドメイン名の所有権確認を dns-01 challenge で実行する
  3. certbot コマンドの --manual-{auth,cleanup}-hook オプションにシェルファイルを指定して、dns-01 challenge のトークンを権威DNSサーバーのTXTレコードに設定する
  4. certbot コマンドの実行を cron で定期実行する

この仕組みを用意することで、自身のWebサーバーで用いているドメイン名に対して、その頂点ドメイン名直下の全てのサブドメインに有効なWebサーバー証明書を発行することができるようになります。

3-2. certbot コマンドのインストール

Ubuntu 24.04 LTS に構築する手順を紹介します。

sudo apt install snapd                # snapd のインストール
sudo snap install --classic certbot   # certbot のインストール
type certbot                          # certbot のパスが通っているかを確認
certbot --version                     # certbot コマンドの動作確認

3-3. tinydns のインストール

https://cr.yp.to/djbdns/install.html

https://debiru.hatenablog.com/entry/20220911/tinydns-stops-replying

cd /etc && sudo mkdir _tinydns && cd _tinydns                                # 作業ディレクトリへ移動する
sudo apt install daemontools                                                 # 手順書に daemontools が必要と書かれている

sudo wget http://cr.yp.to/djbdns/djbdns-1.05.tar.gz                          # tinydns をダウンロードする
sudo tar xzf djbdns-1.05.tar.gz && cd djbdns-1.05/                           # アーカイブを展開してディレクトリに移動する

sudo sh -c "echo 'gcc -O2 -include /usr/include/errno.h' > conf-cc"          # 手順書に書かれているもの
sudo perl -i -pe "BEGIN{undef $/;} s@-d300000@-d400000@smg" tinydns-conf.c   # メモリの softlimit を上げる

sudo make                                                                    # ビルドを実行する
sudo make setup check                                                        # setup と check を実行する

ls -la /usr/local/bin/ | grep tinydns                                        # tinydns コマンドが生成されたことを確認する

3-4. tinydns の起動

debiru.net というドメイン名は利用したいドメイン名に読み替えてください。

sudo apt install svtools daemontools-run
sudo useradd tinydns && sudo useradd axfrdns && sudo useradd dnslog
sudo tinydns-conf tinydns dnslog /etc/tinydns $(hostname -I | ag -o '\d+\.\d+\.\d+\.\d+')

sudo ln -s /etc/tinydns /etc/service   # サービス起動
sleep 5                                # 数秒待つ
sudo svstat /etc/service/tinydns       # 起動しているかを確認
cd /etc/service/tinydns/root           # root ディレクトリへ移動
sudo emacs data                        # data ファイルを編集
._acme-challenge.debiru.net::ns.debiru.net:60
'_acme-challenge.debiru.net:tinydns-install-succeeded:60
sudo make   # data を基に data.cdb を生成

# 自身の権威DNSサーバーに対して DNS 問い合わせを試す
dig _acme-challenge.debiru.net txt +norec @$(hostname -I | ag -o '\d+\.\d+\.\d+\.\d+')

3-5. certbot コマンドのフックスクリプトファイルの作成

certbot-auth-hook.sh

#!/bin/sh
DATA_PARENT_DIR="/etc/service/tinydns/root"
DATA_PATH="${DATA_PARENT_DIR}/data"
DOMAIN="_acme-challenge.${CERTBOT_DOMAIN}"         # _acme-challenge.debiru.net のようなドメイン名
TXT_RECORD="'${DOMAIN}:${CERTBOT_VALIDATION}:60"   # '_acme-challenge.debiru.net:xxxxx:60 のようなTXTレコード
echo "${TXT_RECORD}" >> ${DATA_PATH}               # data ファイルに追記する
make -C ${DATA_PARENT_DIR}                         # data から data.cdb を生成する
sleep 1

certbot-cleanup-hook.sh

#!/bin/sh
DATA_PARENT_DIR="/etc/service/tinydns/root"
DATA_PATH="${DATA_PARENT_DIR}/data"
DOMAIN="_acme-challenge.${CERTBOT_DOMAIN}"          # _acme-challenge.debiru.net のようなドメイン名
TARGET_RECORD="'${DOMAIN}:${CERTBOT_VALIDATION}:"   # '_acme-challenge.debiru.net:xxxxx: という文字列
sed -i.bak -e "/${TARGET_RECORD}/d" ${DATA_PATH}    # を含む行を削除する
make -C ${DATA_PARENT_DIR}                          # data から data.cdb を生成する

3-6. 証明書発行用のスクリプトを用意する

update_letsencrypt.sh

#!/bin/bash -eu

DOMAIN_APEX_LIST=(                     # 証明書を発行したいドメイン名
    lavoscore.org
    debiru.net
    coeurl.org
)
MAIL_ADDRESS="certbot@lavoscore.org"   # 証明書発行者のメールアドレス

SCRIPT_DIR="/etc/ssl"
AUTH_HOOK_PATH="${SCRIPT_DIR}/certbot-auth-hook.sh"
CLEANUP_HOOK_PATH="${SCRIPT_DIR}/certbot-cleanup-hook.sh"

for DOMAIN_APEX in ${DOMAIN_APEX_LIST[@]}; do   # 指定したドメイン名と、その一段階下のサブドメインに対するワイルドカード証明書を発行する
    certbot certonly --agree-tos --manual --preferred-challenges dns-01 --force-renewal \
        -d "*.${DOMAIN_APEX}" -d "$DOMAIN_APEX" -m "$MAIL_ADDRESS" \
        --manual-auth-hook "$AUTH_HOOK_PATH" --manual-cleanup-hook "$CLEANUP_HOOK_PATH"
done

3-7. cron でスクリプトを呼び出す

# Update sslcert (Let's Encrypt)
10 6    1 * *   root    /etc/ssl/update_letsencrypt_and_postprocess.sh

update_letsencrypt_and_postprocess.sh は証明書の発行(更新)に加えて、service apache2 restart のように証明書を利用しているサービスの再起動などを行っているスクリプトです。

Ubuntu で構築したWebサーバー上でワイルドカード証明書を自動発行する手順は https://server.lavoscore.org/#id-20 にも掲載しています。

自分で試してみたければ Linux サーバーでも用意してみてください。
XServer 無料VPS なんかがおすすめです。契約日数が2日間(手動で延長更新可能)ですが無料でVPSを使えます。

4. おわりに

4-1. これだけは覚えておこう