VITOCHA の DNS 環境
Date: 2019/12/08Lastmod: 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.conf
や nom.
のゾーンファイル (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-domain と Sibling domain の委譲応答の違いも学べる設定になっています。
これらは DNS 温泉 5 の講義資料の pp.31-32 あたりを参考に色々試してみるといいと思います。
もしかしたら解説記事を書くかもしれません。
まとめ
VITOCHA の DNS 環境について少しだけ解説しました。 仮想名前空間を使って DNS の応答を学べる環境となっています。 ここで紹介したほかにも自分でゾーンを作ったり引越しの実験を行ったりできるので、手を動かして DNS を学びましょう!
DNS 温泉では RFC をもとに基礎を学習したうえで、ハンズオンを通してより理解を深めることができます。 また、講師に質問しながら進められるので是非参加してみてください。 紹介は他の記事にお任せしますが、参加者の皆様が全国から持ち寄った美味しいお酒も楽しめますよ!