DNS勉強会@ゼロスタに行ってきた
恒例の行ってきたエントリです。そういえば qpstudy 書き忘れてたけど、あれは勉強会じゃないからいいよね(;・∀・)
というわけで、今日は万難を排してゼロスタートコミュニケーションズで開催された「DNS 勉強会」に行ってきました。つぶやきまとめはこちらをご覧ください。途中の@sugyan さんがよくわかりません。
DNS ってなんじゃい!
BIND があまりにもよく使われるせいで、「DNS=BIND」的な感じで BIND の設定のはなしとかばっかりが世の中にはびこってるけど、そもそも DNS ってどういう仕組みでどういう登場人物がいるのかという話を、@zaki 社長自ら解説するという豪華な勉強会。最初かなりグダグダな感じ(始まってから「ハッシュタグ今決めました」とか)で大丈夫かなと思ったけど、参加者の方から「〇〇ってなんですか?」的な質問も出てきていい感じに進んでました。実況担当だったりすこさんがまさかの投稿数制限により途中でつぶやけなくなるという大失態を除けば大成功( ゚ д ゚)?
人見知りの僕的には、人数の少ない勉強会だったので参加者全員の簡単な自己紹介が最初にあってもよかったかなーと思いました。
あとは自分向けのメモー
“再帰”リゾルバについて
「再帰リゾルバ」って言葉、ずっとピンとこなかったんですが、すっきりしました。要は「反復リゾルバ」を持ったキャッシュサーバに対してのみ問い合わせるのが「再帰リゾルバ」で、DNS の名物であるツリーをたどって多重問い合わせをするのは「反復リゾルバ」の方という話。なんか、「再帰」って名前から連想するのはどうしても反復リゾルバ相当の仕事なので、意味分からんわーと思ってたけど、まぁ名前の問題なのね。
CIDR PTR
あまり逆引きについて詳しくなかったんですが、CIDR PTR の話はなるほどという感じでしたので以下紹介。習ったことが大体組み合わされてて、いい感じっすね。
DNS の逆引き(IP アドレス → ドメインの解決)を行う仕組みとしては、in-addr.arpa という特殊なドメインを使います。例えば、zaki さんが例に出していた lang-8.com の IP を調べてそれを逆引きしてみましょう。まずは正引き。
$ dig lang-8.com
;; ANSWER SECTION:
lang-8.com. 159 IN A 202.212.240.75
A レコードですね。1 つの名前に IP アドレスを結びつける最も基本的な RR になりますね。ただ、A レコードで返す IP は別に自分の管理してる IP でなくても返せてしまうわけで、帰ってきた IP が本当に lang-8.com のものなのか確認したくなります。そこで逆引きをしてみます。
IP アドレスは左側の上位のセグメントから右にいくに従ってだんだん細かく管理が別れていきます。一方 DNS の名前は左にいくほど細かく別れていきます。なので、逆引き用の名前は IP アドレスを「.」区切りで逆順にした形の名前を引くことになります。その際の上位のドメインとして in-addr.arpa を使います。逆引きのレコードの種類は PTR になります。
$ dig 75.240.212.202.in-addr.arpa ptr
;; ANSWER SECTION:
75.240.212.202.in-addr.arpa. 3600 IN CNAME 75.SUB72.240.212.202.in-addr.arpa.
75.SUB72.240.212.202.in-addr.arpa. 592 IN PTR lang-8.com.
おや、なんか変な感じですね。期待としては、75.240.212.202.in-addr.arpa の PTR レコードが lang-8.com になっていて欲しかったのですが、それは何故か CNAME になっています。CNAME というのは別名を付けるレコードで、シンボリックリンクの様な存在です。
では、75.SUB72.240.212.202.in-addr.arpa とは何者でしょうか?
$ dig 75.SUB72.240.212.202.in-addr.arpa. soa
;; AUTHORITY SECTION:
SUB72.240.212.202.in-addr.arpa. 234 IN SOA ns.a.lang-8.com. hostmaster.SUB72.240.212.202.in-addr.arpa. 1302765149 16384 2048 1048576 2560
SOA レコードというゾーンを管理するレコードを聞いてみると、SUB72.240.212.202.in-addr.arpa になるようですね。この人の NS レコードを聞いてみましょう。NS レコードとは、そのドメイン自体を管理している DNS サーバのことです。
$ dig ns SUB72.240.212.202.in-addr.arpa.
;; ANSWER SECTION:
SUB72.240.212.202.in-addr.arpa. 2461 IN NS ns.b.lang-8.com.
SUB72.240.212.202.in-addr.arpa. 2461 IN NS ns.a.lang-8.com.
ほぉほぉ。この謎のドメインは結局 lang-8.com のドメインで管理されているようです。そのため、先程の PTR を問い合わせた際の CNAME 先では正しく lang-8.com が返ってきていたということになります。
なんでこんなことに?
本来逆引きは、「75.240.212.202.in-addr.arpa」の PTR として直接指定されているのがいいんですが、それを設定できるのは「75.」の上位のドメインに当たる「240.212.202.in-addr.arpa」を管理している人になります。lang-8.com がそこを管理しているのなら何の問題もなく PTR を設定できます。
IP アドレスがまだまだたくさんあった頃は、IP アドレスの割り当ては「.」区切りで 256 個とかでどーんと渡されていました。その場合、IP アドレスの「.」の区切りと管理者の範囲が一致しています。そのため、上記の様に 240.212.202.in-addr.arpa の RR に PTR を書けます。
しかし、IP アドレスは少なくなり、今では CIDR(Classless Inter-Domain Routing)という形で「.」区切りの中のさらに一部だけを渡すということが行われています。(そしてつい先日それは枯渇しました。。。)
CIDR の場合、「202.212.240.0/24」の 256 個のアドレスが例えば 32 個ずつに分けて 8 つの会社に割り当てられるということが起こります。すると、先ほどの逆引き用の PTR レコードを設定しようにも、いちいち 240.212.202.in-addr.arpa を管理している人にそれぞれの会社が設定を依頼する必要が出てきてしまいます。これはどちらにとっても相当に面倒ですね。
そこで、lang-8.com の例で見たような CNAME を使ったテクニックが出てきました。8 つに分けて管理しているのであれば、それぞれの逆引き用 PTR レコードに対して以下の様な CNAME を設定してしまいます。
0.240.212.202.in-addr.arpa IN CNAME 0.SUB01.240.212.202.in-addr.arpa.
1.240.212.202.in-addr.arpa IN CNAME 1.SUB01.240.212.202.in-addr.arpa.
...
31.240.212.202.in-addr.arpa IN CNAME 31.SUB01.240.212.202.in-addr.arpa.
32.240.212.202.in-addr.arpa IN CNAME 32.SUB02.240.212.202.in-addr.arpa.
...
63.240.212.202.in-addr.arpa IN CNAME 63.SUB02.240.212.202.in-addr.arpa.
...
つまり、202.212.240.0〜202.212.240.31 の 32 個は SUB01.240.212.202.in-addr.arpa に、次の 32 個は SUB02.240.212.202.in-addr.arpa に、という感じ。そうしておいて、SUB0X.240.212.202.in-addr.arpa 自体の NS レコードをそれぞれの会社の DNS サーバに向けてあげれば、あとはそれぞれの DNS サーバにおいて、「75.SUB72.240.212.202.in-addr.arpa」などについて PTR レコードを自由に設定することができます。
いやー興味深い。
グルーレコード
NS レコードは DNS サーバを指定するんですが、もしそれがこれから解決しようとしているドメイン配下だと、どう頑張っても名前が解決できなくなります。具体的にみてみましょう。
$ dig ns google.com
;; ANSWER SECTION:
google.com. 152713 IN NS ns2.google.com.
google.com. 152713 IN NS ns3.google.com.
google.com. 152713 IN NS ns4.google.com.
google.com. 152713 IN NS ns1.google.com.
google.com の NS はこのように google.com のサブドメインになってしまっています。これについて com の NS サーバに問い合せてみましょう。f.gtld-servers.net というのは com の NS のひとつです。
$ dig a google.com @f.gtld-servers.net.
;; AUTHORITY SECTION:
google.com. 172800 IN NS ns2.google.com.
google.com. 172800 IN NS ns1.google.com.
google.com. 172800 IN NS ns3.google.com.
google.com. 172800 IN NS ns4.google.com.
;; ADDITIONAL SECTION:
ns2.google.com. 172800 IN A 216.239.34.10
ns1.google.com. 172800 IN A 216.239.32.10
ns3.google.com. 172800 IN A 216.239.36.10
ns4.google.com. 172800 IN A 216.239.38.10
ほぅほぅ。com を管理している(google.com は nsX.google.com に委任している)はずの f.gtld-servers.net に聞いたのに、なぜか、nsX.google.com の A レコードが追加で返ってきています。これがグルーレコードというものです。
NS 自体が解決したい先の管理下にあると、必ずループになってしまい名前解決ができなくなるのを防ぐため、あえて 1 つ上の管理ドメインから A レコードを返す形にしてあげています。こうして返ってきた IP アドレスに対して名前を聞いてみると正しく取れることが分かります。
$ dig a google.com @216.239.34.10
;; ANSWER SECTION:
google.com. 300 IN A 72.14.203.104
google.com. 300 IN A 72.14.203.103
google.com. 300 IN A 72.14.203.105
google.com. 300 IN A 72.14.203.106
google.com. 300 IN A 72.14.203.147
google.com. 300 IN A 72.14.203.99
無事取得できていますね!
おわりに
というわけで、復習も兼ねて dig を色々叩きながら書きました(←dig 初心者)。初心者なんで間違ってたら指摘してくだしあ>< こういう話題はどうやってゲットしたらいいのか悩んでいた所だったので、非常に楽しかったです。
DNS は仕組みはとてもシンプルなのですが、インターネットの根幹を支える仕組みですし、今後も必要な知識となってくると思いますので引き続き勉強していきたいですね。IPv6 対応については否が応でも必須となってきますので勉強する量が増えそう。。。
最後に、、、、
懇親会あった方がいいんじゃないかなぁ
|д ゚)チラッ
講師の@zaki さん、つぶやき担当の@RiscoMorino さんはじめ、ゼロスタの方々++!! 次回 zsstudy にも期待ですね!
-
りすこ 11-04-22 (金) 1:52
|д ゚)チラッ < ブログありがとう!!つぎ懇親会しよっかな!
-
riywo 11-04-22 (金) 23:05
>りすこさん
期待!!せっかく集まるのに勉強だけじゃもったいない!