クラウドエンジニアのためのDNS入門 ― 名前解決の流れを追う

この記事は約5分で読めます。

こんにちは!松浦です。

GCPでシステムを組んでいると、「名前解決できない」「別のサーバーにつながらない」といったトラブルに出会うことがありますよね。私も最近、Cloud DNSと別プロジェクトのDNSサーバーとの通信でつまずきました。調べていくうちに、そもそもDNSの仕組みをなんとなくしか理解していないことに気づきました。

そこで今回は、DNSの基本を整理しながら、Google CloudのCloud Shellを使って名前解決の動きを実際に確かめてみました。

本記事でわかること

  • DNSの役割と、名前解決にかかわる登場人物
  • 名前解決がどんな順番で行われるか
  • Cloud ShellでDNSの動きを確認する方法

DNSの基本

DNSとは

DNS(Domain Name System)は、www.example.com のような名前から、通信に使うIPアドレスを調べる仕組みです。この「名前からIPアドレスを調べること」を名前解決と呼びます。

電話帳をイメージすると分かりやすいです。人間は名前で覚えるほうが楽ですが、電話をかけるには電話番号が必要です。同じように、人間は名前で覚え、コンピュータはIPアドレスで通信します。その間をつないでくれるのがDNSです。

名前解決の登場人物

名前解決には3つの役割が登場します。大事なのは、「聞きに行く係」と「答えを持っている係」が別にいるという点です。

  • スタブリゾルバー(DNSクライアント)
    PCやサーバーの中で「この名前のIPアドレスを教えて」と依頼する
  • フルサービスリゾルバー(キャッシュDNSサーバー)
    依頼を受けて、答えが見つかるまで代わりに調べ回る
  • 権威DNSサーバー
    自分が担当する名前について、正解を持っていて答える

名前解決の流れ

  • クライアント → リゾルバー ① www.example.comは?
  • リゾルバー → ルートサーバー ② 問い合わせ → ③「.comに聞いて」
  • リゾルバー → .comの権威サーバー ④ 問い合わせ → ⑤「example.comに聞いて」
  • リゾルバー → example.comの権威 ⑥ 問い合わせ → ⑦「192.0.2.10です」
  • リゾルバー → クライアント ⑧ 192.0.2.10です

クライアントはリゾルバーに丸投げするだけでぐるぐる再帰問い合わせが始まります。リゾルバーは、上の階層から順番に聞いて回ります。

キャッシュとTTL

リゾルバーは一度調べた結果をキャッシュとして覚えておき、同じ問い合わせにはキャッシュから答えます。覚えておいてよい時間がTTLです。「DNSの設定を変えたのにすぐ反映されない」のは、古い答えがTTLの間キャッシュに残っているからです。

実際にやってみた

IPアドレスを調べてみる

Cloud Shellだけで進めてみます。

Google Cloud コンソールの右上にある [Cloud Shell をアクティブにする] ボタンをクリックします。画面下にターミナルが開けば準備完了です。

Cloud Shellには nslookup と dig が最初から入っています。

まずは一番シンプルな nslookup で、名前からIPアドレスを調べてみます。

nslookup www.google.com

結果の Server: が、Cloud Shellが問い合わせたリゾルバーです。Address: 以降が、名前解決の結果のIPアドレスです。

問い合わせ先を変えてみる

問い合わせるリゾルバーは自分で指定できます。今回はGoogle Public DNS(8.8.8.8)を指定してみます。

nslookup www.google.com 8.8.8.8

Server: が 8.8.8.8 に変わりました!「どのDNSサーバーに聞いているか」を切り替えられるこの使い方は、後のシリーズでトラブルを切り分けるときにそのまま役立ちます。

digで詳しく見てみる

次は dig を使ってみます。nslookup より多くの情報が見られます。

dig www.google.com

答えのレコードが表示されます。レコードの横にある数字がTTL(秒)です。何回か続けて実行すると、TTLの数字が減っていくことがあります。これは、リゾルバーのキャッシュから答えが返ってきている証拠です。

動作確認(dig +trace)

最後に、+trace を付けて名前解決の流れそのものを見てみましょう!

dig +trace www.google.com

上から順に、ルートサーバー(.)、com. を担当するサーバー、google.com. を担当するサーバーへと問い合わせが進んでいくのが分かります。先ほどの図の②〜⑦の流れを、実際に目で確認することができました!

GCPではどこが担っている?

最後に、ここまでの登場人物がGCPでは何にあたるのかを軽く整理します。

  • リゾルバー(インターネット向け)
    Google Public DNS(8.8.8.8)
  • VMから見たリゾルバー
    メタデータサーバー(169.254.169.254)
  • 権威DNSサーバー
    Cloud DNS

ポイントは2つ目です。Google Cloudのドキュメントによると、VMはメタデータサーバーのIPアドレス(169.254.169.254)をネームサーバーとして使うよう設定する必要があり、Cloud DNSはVPCネットワークの名前解決の順序に従って問い合わせを処理します。 つまりGCPでは、「どのVPCから聞いたか」によって見える名前が変わることがあります。私がつまずいた別プロジェクトのDNSとの通信も、まさにこの点が関係していました。

まとめ

今回はDNSの基本を整理して、Cloud Shellで名前解決の動きを確かめてみました。

基礎を学び直したことで、トラブルのときに「どの係のところで止まっているのか」と考えられるようになり、切り分けがしやすくなると感じました。特に dig +trace は、図で理解した流れを実際に目で見られるので、とてもおすすめです!

次回は、検証の土台として「GCPでVPCとサブネットを作ってみる」をお届けします。皆さんもぜひCloud Shellで dig を叩いてみてください!

コメント

タイトルとURLをコピーしました