NSD チュートリアルが 2024 年に更新されました: ゾーン転送が追加されました!

NSD チュートリアルが 2024 年に更新されました: ゾーン転送が追加されました!

NSDチュートリアル 2020年に、 NSD(ネームサーバーデーモン)を使ってVPSで実行できる権威DNSサーバーを作成する方法に関するチュートリアルを書きました。NSDはリソースをあまり必要とせず、BINDに比べて非常に軽量なので、趣味でDNSサーバーを構築する方に最適です。また、WebSiteTVでビデオチュートリアルも公開しました。

LEBのチュートリアルを作成した際、ゾーン転送にrsyncを使用しました。理由は…正直言って、なぜそうしたのか覚えていません。正しくは、DNSの中核部分であるNSDにゾーン転送を実行させるべきでした。ビデオチュートリアルで修正しました。

2024年版にアップデートされたテキスト形式のチュートリアルをもう一度確認してみましょう。今回は、適切な転送設定でDNSゾーンを設定します。さあ、始めましょう!

ドメインとVPS

ネームサーバーを2つ設定します。Vultrで仮想マシンを2台立ち上げました。どちらもDebian 12です。これらはlowend.vipドメイン用です。

 ns1.lowend.vip 149.28.254.206
ns2.lowend.vip 144.202.76.207

まずPorkbunから始めましょう。実は、レジストラはどこにあるのでしょうか?権威ネームサーバーとグルーレコードを設定する必要があります。レジストラによってパネルのインターフェースは異なりますが、どのレジストラでもこれらの設定を変更するためのインターフェースを提供しています。

権威ネームサーバーは、「このドメインの正当なネームサーバー(DNSサーバー)はどこか」という問いに答えます。しかし、ドメインを問い合わせる人は、自分の所在地をどのように把握するのでしょうか?これは鶏が先か卵が先かという問題です。DNSがどこにあるか知りたい場合、どうやってDNSエントリを検索すればいいのでしょうか?この問題を解決するのがグルーレコードです。グルーレコードは、DNSサーバー自体への最初のパンくずの道筋となるのです。

Porkbun では、ドメインのリストに移動し、「詳細」をクリックして、「Glue レコード」を選択します。

ポークバン NSD グルーレコード

次に、「管理」をクリックし、ns1 と ns2 のホスト名と IP を入力しました。

Porkbun NSD 権威ネームサーバー

次に、権威ネームサーバーを更新します。「詳細」に戻り、「権威ネームサーバー」をクリックします。

Porkbun NSD 権威ネームサーバー

デフォルトではPorkbunのDNSサーバーに設定されています。これを削除し、グルーレコードで定義したDNSサーバーを追加しました。

ポークバン NSD グルーレコード

レジストラでの手続きはこれで完了です。

NSDの設定

VPS で NSD を起動して実行してみましょう。

まず各ノードにインストールします。
 apt インストール nsd
NSDの設定を整理する方法はいくつかあります。設定の一部を/etc/nsd/nsd.conf.dに置くこともできますが、この簡単な例ではすべてを1つのファイルにまとめます。デフォルトのファイルを保存します。
 /etc/nsd をコピー
mv nsd.conf nsd.conf.dist

ns1 の nsd.conf は次のとおりです。

サーバ:
  IPアドレス: 149.28.254.206
  非表示バージョン: はい
  データベース: "/var/lib/nsd/nsd.db"
  サーバー数: 1
  冗長度: 2

鍵:
  名前: 「私の秘密」
  アルゴリズム: hmac-sha512
  秘密: abhnilvmqpVn9FODGFfCyj2gAhU21nQNLXWxLWOxVCw=

ゾーン:
  名前: lowend.vip
  ゾーンファイル: /etc/nsd/zones/lowend.vip
  通知: 144.202.76.207 マイシークレット
  提供-xfr: 144.202.76.207 私の秘密
それらのオプションを詳しく見ていきましょう。
「server」スタンザでは:
  • ip-address:これはns1.lowend.vipのIPアドレスです
  • hide-version:グリーティングやプロトコル応答において、NSDのバージョンを一切公開しません。将来NSDのゼロデイ脆弱性が発見された場合でも、少なくともパッチ未適用バージョンを実行していることを公表することはありません。
  • データベース:バイナリデータベースが保存される場所(人間が編集できるゾーンファイルではない)
  • server-count:実行時に起動するNSDデーモンの数。混雑したゾーンがある場合は、さらに起動する必要があるかもしれません。
  • verbosity:ログの詳細度。チュートリアル用に最大に設定しています。

「secret」スタンザは、ゾーン転送の認証を制御します。使用する共有秘密鍵を定義します。秘密鍵の名前は「my-secret」です。私は次のコマンドで秘密鍵を生成しました。

 openssl rand -base64 32

もちろん、好みの方法を使用することもできます。

最後に、ゾーンを定義します。ゾーンが多数ある場合は、各ゾーンをファイルに格納し、 include:ディレクティブを活用することを検討してください。このチュートリアルでは1つのゾーンのみを使用するため、ベースとなるnsd.confに記述しています。

  • 名前:ドメイン
  • ゾーンファイル:人間が編集できるテキストを保存する場所。この場合、ゾーンは/etc/nsd/zonesに保存します。
  • 通知:変更があったときにどの DNS スレーブに通知するか、またどのシークレットを使用するか
  • provide-xfr:どのサーバーがゾーン転送を許可され、どの秘密鍵を使用するか
DNSに関する簡単なメモ。ネームサーバーにファイアウォールがある場合は、いくつかのポートを開く必要があります。
  • ポート 53 udp: DNS レコードはこのように提供されるため、世界に公開する必要があります。
  • ポート 53 tcp:このポートは、他の DNS サーバーに対してのみ開く必要があります。DNS ゾーン転送(承認されたネームサーバー(この場合は ns2)によってのみ実行されます)は、ポート 53 tcp を介して行われます。

サーバー 2 では、セットアップは非常に似ていますが、いくつかの重要な変更点があります (赤で示されています)。

サーバ:
  IPアドレス: 144.202.76.207
  非表示バージョン: はい
  データベース: "/var/lib/nsd/nsd.db"
  サーバー数: 1
  冗長度: 2

鍵:
  名前: 「私の秘密」
  アルゴリズム: hmac-sha512
  秘密: abhnilvmqpVn9FODGFfCyj2gAhU21nQNLXWxLWOxVCw=

ゾーン:
  名前: lowend.vip
  ゾーンファイル: /etc/nsd/zones/lowend.vip
  通知許可: 149.28.254.206 私の秘密
  リクエスト-xfr: AXFR 149.28.254.206@53 私の秘密

サーバー スタンザの「ip-address」の変更は、ns1 の IP から ns2 の IP への変更だけです。

ゾーン スタンザでは、最後の 2 行を変更します。

  • allow-notify:これは、変更があった場合に通知することを許可されているサーバーのアクセス制御リストです(ここではns1)
  • request-xfr:これも、ゾーン転送を取得するために接続するサーバー (ここでも ns1) のアクセス制御リストであり、ポート 53 を使用します。

次に、ns1 上の lowend.vip のゾーン ファイルを作成します。

 /etc/nsd/zones を mkdir します。

以下は、/etc/nsd./zones/lowend.vip に記述した内容です。

 $ORIGIN lowend.vip。
$TTL 3600

@ IN SOA ns1.lowend.vip admin.lowend.vip (
  202404011 ; シリアル番号
  28800 ; 更新
  7200 ; 再試行
  864000 ; 期限切れ
  86400 ; 最小TTL
)

NS ns1.lowend.vip 内。
NS ns2.lowend.vip 内。

ns1 IN A 149.28.254.206
ns2 IN A 144.202.76.207
1.23.45.100 の bigvps
CNAME bigvps の www

すべての DNS レコード エントリを詳しく説明するわけではありませんが、重要なポイントをいくつか挙げます。

  • 両方のネームサーバーのDNSレコードを取得しました
  • 「bigvps」用の架空のIPアドレスがあります
  • 「www.lowend.vip」に「bigvps」のCNAMEを作成しました。
  • シリアル番号の形式はYYYYMMDD#です。

nsdを起動してみましょう:

 systemctl nsd を有効にする
systemctl nsd を再起動

/var/log/syslog に表示される内容は次のとおりです。

 2024-03-18T13:34:13.735090-07:00 ns1 systemd[1]: nsd.service - ネームサーバーデーモンを停止しました。
2024-03-18T13:34:13.741588-07:00 ns1 systemd[1]: nsd.service - ネームサーバーデーモンを起動しています...
2024-03-18T13:34:13.767625-07:00 ns1 nsd[16395]: nsd起動中 (NSD 4.6.1)
2024-03-18T13:34:13.767898-07:00 ns1 nsd[16395]: [2024-03-18 13:34:13.767] nsd[16395]: 通知: nsd を起動しています (NSD 4.6.1)
2024-03-18T13:34:13.804355-07:00 ns1 nsd[16398]: ゾーンlowend.vipの読み取りに成功しました
2024-03-18T13:34:13.808870-07:00 ns1 nsd[16398]: [2024-03-18 13:34:13.808] nsd[16398]: 情報: ゾーンlowend.vipの読み取りに成功しました
2024-03-18T13:34:13.809132-07:00 ns1 nsd[16398]: ゾーンlowend.vipがdbに書き込まれました
2024-03-18T13:34:13.809291-07:00 ns1 nsd[16398]: [2024-03-18 13:34:13.809] nsd[16398]: 情報: ゾーンlowend.vipがdbに書き込まれました
2024-03-18T13:34:13.815895-07:00 ns1 nsd[16398]: nsdが開始されました (NSD 4.6.1)、pid 16395
2024-03-18T13:34:13.815934-07:00 ns1 nsd[16398]: [2024-03-18 13:34:13.815] nsd[16398]: 通知: nsd が開始されました (NSD 4.6.1)、pid 16395
2024-03-18T13:34:13.817896-07:00 ns1 systemd[1]: nsd.service - ネームサーバーデーモンを開始しました。

ns2 から始めましょう:

 /etc/nsd/zones を mkdir します。
systemctl nsd を有効にする
systemctl nsd を再起動

/var/log/syslog には次のように表示されます。

 2024-03-18T13:47:47.869109-07:00 ns2 systemd[1]: nsd.service - ネームサーバーデーモンを開始しました。
2024-03-18T13:47:47.870845-07:00 ns2 nsd[15824]: xfrd: ゾーンlowend.vipがコミットしました。「2024-03-18T13:47:47に149.28.254.206@53からシリアル2024104011への更新を受信しました。キーmy-secretでTSIGが検証されました。」
2024-03-18T13:47:47.871385-07:00 ns2 nsd[15824]: [2024-03-18 13:47:47.870] nsd[15824]: info: xfrd: zone lowend.vip がコミットしました。「2024-03-18T13:47:47 に 149.28.254.206@53 からシリアル番号 2024104011 への更新を受信しました。キー my-secret で TSIG が検証されました。」
2024-03-18T13:47:47.872244-07:00 ns2 nsd[15825]: ゾーンlowend.vip。2024-03-18T13:47:47に149.28.254.206@53からシリアル2024104011への更新を受信しました。TSIGはキーmy-secretで検証され、233バイト、3.2e-05秒かかりました。
2024-03-18T13:47:47.872287-07:00 ns2 nsd[15825]: [2024-03-18 13:47:47.872] nsd[15825]: 情報: ゾーンlowend.vip。2024-03-18T13:47:47に149.28.254.206@53からシリアル2024104011への更新を受信しました。TSIGはキーmy-secretで検証され、233バイト、3.2e-05秒かかりました。
2024-03-18T13:47:47.876295-07:00 ns2 nsd[15824]: ゾーンlowend.vipシリアル0が2024104011に更新されました
2024-03-18T13:47:47.876349-07:00 ns2 nsd[15824]: [2024-03-18 13:47:47.876] nsd[15824]: 情報: ゾーンlowend.vipシリアル0が2024104011に更新されました

ns1 のログには次の内容が記録されます。

 2024-03-18T13:47:47.871552-07:00 ns1 nsd[16399]: lowend.vip の axfr。144.202.76.207 から
2024-03-18T13:47:47.872312-07:00 ns1 nsd[16399]: [2024-03-18 13:47:47.871] nsd[16399]: 情報: lowend.vip の axfr。144.202.76.207 から

甘い!

自宅のPCの場合:

 $ nslookup www.lowend.vip
サーバー: 8.8.8.8
住所: 8.8.8.8#53

非権威的な回答:
www.lowend.vip 正規名 = bigvps.lowend.vip。
名前: bigvps.lowend.vip
住所: 1.23.45.100

ということで、稼働を開始しました。

それではレコードを追加しましょう。/etc/nsd/zones/lowend.vip を以下のように変更します。

 $ORIGIN lowend.vip。
$TTL 3600

@ IN SOA ns1.lowend.vip admin.lowend.vip (
202404012 ; シリアル番号
  28800 ; 更新
  7200 ; 再試行
  864000 ; 期限切れ
  86400 ; 最小TTL
)

NS ns1.lowend.vip 内。
NS ns2.lowend.vip 内。

ns1 IN A 149.28.254.206
ns2 IN A 144.202.76.207
1.23.45.100 の bigvps
CNAME bigvps の www
サーバー1 IN A 4.5.6.7

server1.lowend.vip にレコードを追加し、シリアル番号を更新しました。その後、nsd をリロードします。これは停止/開始ではなく、設定をリロードしながらレコードの提供を継続するように nsd に指示するだけです。

 nsd-control のリロード

これにより、変更はns2にもプッシュされます。ns2のログには次のように表示されます。

 2024-03-18T13:53:48.758673-07:00 ns2 nsd[15824]: [2024-03-18 13:53:48.758] nsd[15824]: 情報: ゾーンlowend.vipシリアル2024104011が2024104012に更新されました
そして自宅では:

$ nslookup server1.lowend.vip
サーバー: 8.8.8.8
住所: 8.8.8.8#53

非権威的な回答:
名前: server1.lowend.vip
住所: 4.5.6.7

NSD は、両方のノードが稼働しており、両方のノードが同期されているかどうかを示します。

おすすめの記事