VITOCHA の DNS 環境

Date: 2019/12/08
Lastmod: 2019/12/08

本記事は DNS 温泉 Advent Calendar 2019 8 日目の記事です。

ブログ自体も初めての投稿になります。 よろしくお願いします。

今回は DNS 温泉のハンズオンで使われている VITOCHA アプライアンス内の DNS 環境について少し解説したいと思います。 鈴木教授の DNS 温泉 5 講義資料のハンズオン部分 もあわせてご覧ください。

VITOCHA

VITOCHA は中京大学の鈴木教授が開発された VIMAGE 仮想ネットワーク構築ライブラリです。 FreeBSD の仮想化機構である jail と、ネットワーク仮想化機構の VIMAGE を操作する Ruby ライブラリとなっています。 中京大学ではネットワーク実験などの講義で本ライブラリが活用されています。

使い方

VITOCHA のサイト から OVA 形式のファイルをダウンロードし、VirtualBox にインポートすることで使用できます。 VMware をお使いの方は paina さんのスクリプトを参考に変換することができるようです (しゅーとさんが修正したスクリプトを公開しています)。

インポートした仮想マシンには NIC が 2 つ接続されています。 アダプター 1 は NAT 用、アダプター 2 はホストオンリーアダプターとなっています。 ホストオンリーアダプターを利用することで、ホストから仮想マシンへ SSH できるようになり便利です。 Windows の方は初回起動前に一度アダプター 2 にホストオンリーアダプターを設定し直さないとエラーが出る場合があるのでご注意ください。

インポートした仮想マシンを起動します。 ユーザ名 guest、パスワード guest でログインできます。

ifconfig でアダプターに割り振られている IP アドレスを確認します。 em1 がホストオンリーアダプターになります。

続いて su で root になり、/jails/bin/simulator.rb を実行して演習環境の jail を起動します。 root にはパスワードは設定されていません。 なお、このアプライアンスには sudo はインストールされていません。

スクリプト実行後に jls で jail が起動しているかどうか確認します。

root@vitocha:~ # jls
   JID  IP Address      Hostname                      Path
   (snip)
    15                  server_nom1                   /jails/server_nom1
    16                  server_sld_nom1               /jails/server_sld_nom1
    17                  server_orz1                   /jails/server_orz1
    18                  server_sld_orz1               /jails/server_sld_orz1
    19                  server_bind1                  /jails/server_bind1
    20                  server_unbound1               /jails/server_unbound1
    21                  server_bind981                /jails/server_bind981
    22                  server_unbound_old            /jails/server_unbound_old
    23                  server_bind922                /jails/server_bind922
    24                  server_nsd419                 /jails/server_nsd419

JID は異なっていても問題ありません。

各 jail には jexec で入れます。

root@vitocha:~ # jexec server_nom1
root@server_nom1:/ #

DNS 環境

仮想の名前空間として . (root) ゾーンのほか、nom.orz. などの TLD、RFC 5155 の example. ゾーンなどが存在しており、実際にゾーンを作成したり DNSSEC について学んだりできる環境となっています。

権威サーバには NSD が使用されているほか、リゾルバとして Unbound や BIND が用意されています。

FreeBSD では各パッケージの設定ファイルは /etc 以下ではなく /usr/local/etc 以下に配置されています。 ゾーンファイルは各権威サーバの /usr/local/etc/nsd 配下にあります。

サーバ構成は以下のようになっています。

hostname 主な役割 IP アドレス
vitocha root ゾーンの管理 192.168.100.1
server_nom1 nom. ゾーンの管理 172.18.1.1
server_sld_nom1 nom. のセカンドレベル以下のゾーンの管理 172.18.1.2
server_orz1 orz. ゾーンの管理 172.18.5.1
server_sld_orz1 orz. のセカンドレベル以下のゾーンの管理 172.18.5.2
server_bind1 リゾルバ (BIND 9.10.4-P2) 172.18.9.1
server_unbound1 リゾルバ (Unbound 1.5.9) 172.18.9.2
server_bind981 リゾルバ (BIND 9.8.1-P1) 172.18.9.3
server_unbound_old リゾルバ (Unbound 1.4.7) 172.18.9.4
server_bind922 リゾルバ (BIND 9.2.2-P3) 172.18.9.5
server_nsd419 権威サーバ (NSD 4.1.9) 172.18.9.6

名前空間

root ゾーン

root ゾーンは vitocha 本体でホストされています。 実際には DNSSEC 署名されたゾーンファイル (root.zone.signed) の中身に基づいて応答を返します。

nom. ゾーン

TLD としての nom. は server_nom1 でホストされています。

nsd.confnom. のゾーンファイル (nom.zone) を見ていただければわかりますが、server_nom1 がホストする nom. 以下のゾーンは次の通りです。

  • nom.
  • nic.nom.
  • beer.nom.

他に www.scotch.nom. というドメイン名が存在します。

以下のゾーンは server_sld_nom1 や server_sld_orz1 に委譲されています。

  • wine.nom.
  • beer.nom.
  • bourbon.nom.
  • juice.nom.
  • water.nom.
  • awamori.nom.

orz. ゾーン

server_orz1 でホストされています。 以下のゾーンがホストされています。

  • orz.
  • example.orz.

また、example.orz. ゾーンは server_sld_orz1 に委譲されています。

リゾルバとコマンド

server_unbound1 などのリゾルバ環境に入ってクエリを送ります。 dig や ldns の drill のほか、djbdns の dnsq / dnsqr が用意されています。

各コマンドの対応は以下の通りです。

問い合わせ dig drill dnsq / dnsqr
再帰 dig [+rec] [-t type] name [@server] drill [-o RD] [type] name [@server] dnsqr type name
非再帰 dig +norec [-t type] name [@server] drill -o rd [type] name [@server] dnsq type name server

drill は第一引数にオプションを書きます。dnsq / dnsqr は引数の省略はできず、この順序で指定する必要があります。

各リゾルバにはルートヒントが設定されており、仮想環境のルートサーバを指しています。

使い方

www.wine.nom.example.orz. など、色々な名前やレコードタイプを問い合わせてみましょう。 再帰 / 非再帰を変えながら問い合わせて、応答を比べてみると勉強になります。

委譲応答を辿る

リゾルバの挙動を学ぶために、非再帰問い合わせで . から www.wine.nom. まで辿ってみましょう。 なお、本来は @ の後に IP アドレスを指定するのですが、今回は解説のため各サーバのドメイン名を指定しています。

  • . からの応答
root@server_unbound1:/ # drill -o rd www.wine.nom @a.root-servers.nom
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 24847
;; flags: qr ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;; www.wine.nom.	IN	A

;; ANSWER SECTION:

;; AUTHORITY SECTION:
nom.	86400	IN	NS	a.nic.nom.

;; ADDITIONAL SECTION:
a.nic.nom.	86400	IN	A	172.18.1.1

;; Query time: 0 msec
;; SERVER: 192.168.100.1
;; WHEN: Sat Nov 16 22:41:34 2019
;; MSG SIZE  rcvd: 66
  • a.nic.nom. からの応答
root@server_unbound1:/ # drill -o rd www.wine.nom @a.nic.nom
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 35455
;; flags: qr ; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 2
;; QUESTION SECTION:
;; www.wine.nom.	IN	A

;; ANSWER SECTION:

;; AUTHORITY SECTION:
wine.nom.	86400	IN	NS	ns.wine.nom.
wine.nom.	86400	IN	NS	ns2.wine.nom.

;; ADDITIONAL SECTION:
ns.wine.nom.	86400	IN	A	172.18.1.2
ns2.wine.nom.	86400	IN	A	172.18.5.2

;; Query time: 0 msec
;; SERVER: 172.18.1.1
;; WHEN: Sat Nov 16 22:41:41 2019
;; MSG SIZE  rcvd: 97
  • ns.wine.nom. からの応答
root@server_unbound1:/ # drill -o rd www.wine.nom @ns.wine.nom
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 60421
;; flags: qr aa ; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; QUESTION SECTION:
;; www.wine.nom.	IN	A

;; ANSWER SECTION:
www.wine.nom.	10	IN	A	172.18.1.2

;; AUTHORITY SECTION:
wine.nom.	300	IN	NS	ns.wine.nom.
wine.nom.	300	IN	NS	ns2.wine.nom.

;; ADDITIONAL SECTION:
ns.wine.nom.	300	IN	A	172.18.1.2
ns2.wine.nom.	300	IN	A	172.18.5.2

;; Query time: 0 msec
;; SERVER: 172.18.1.2
;; WHEN: Sat Nov 16 22:41:49 2019
;; MSG SIZE  rcvd: 113

応答の違いを学ぶ

本記事では触れないですが、この環境は演習目的で作られているので、親子同居や lame delegation などが起きているゾーンが存在します。 例えば beer.nom. の NS を a.nic.nom. に問い合わせると Answer が返ってきたり、water.nom.soda.nom. の委譲を辿ると REFUSED が返ってきたりします。

その他にも 内部名 (In-bailiwick) と 外部名 (Out-of-bailiwick)、In-domainSibling domain の委譲応答の違いも学べる設定になっています。

これらは DNS 温泉 5 の講義資料の pp.31-32 あたりを参考に色々試してみるといいと思います。

もしかしたら解説記事を書くかもしれません。

まとめ

VITOCHA の DNS 環境について少しだけ解説しました。 仮想名前空間を使って DNS の応答を学べる環境となっています。 ここで紹介したほかにも自分でゾーンを作ったり引越しの実験を行ったりできるので、手を動かして DNS を学びましょう!

DNS 温泉では RFC をもとに基礎を学習したうえで、ハンズオンを通してより理解を深めることができます。 また、講師に質問しながら進められるので是非参加してみてください。 紹介は他の記事にお任せしますが、参加者の皆様が全国から持ち寄った美味しいお酒も楽しめますよ!