ネットワーク #2 - DNS

Last Edited: 9/16/2024

このブログ記事ではDNSやNATなどについて紹介します。

DevOps

前回の記事では、コンピュータ間の通信がOSIモデルで説明できることを話しました。その際、 通信したいコンピュータのIPアドレスが分かっている前提で話を進めましたが、 実際には遠隔地にあるコンピュータのIPアドレスが必ずしもわかっているわけではありません。

また、ルーターというコンピュータについても紹介しましたが、その役割や、 どのようにして遠くのコンピュータに到達できるようにしているのかはまだ説明していません。 そこで、この記事ではそれらについて解説し、私たちがどうやってあらゆるウェブサイトやアプリケーションにアクセスできるのかを理解していきます。

DNS

まず最初に、アクセスしたいサーバーのIPアドレスをどうやって特定するのかを理解する必要があります。 Googleのようなウェブサービスにアクセスする際、私たちは「google.com」といったドメイン名を使ってアクセスし、 IPアドレスを直接入力することはありません。なぜなら、人間にとってIPアドレスは覚えにくいからです。では、 このURLからどのようにしてIPアドレスを見つけるのか、通信を確立するための手順を見ていきましょう。

DNS

ブラウザやオペレーティングシステムがまず最初に行うことは、最近そのサービスにアクセスしたかどうかを確認することです。 もしアクセスしていれば、ドメインに対応するIPアドレスがキャッシュされており、すぐにサーバーに接続できます。 しかし、最近アクセスしていない場合は、ISP(インターネットサービスプロバイダー)が管理するDNSリゾルバーに問い合わせを行い、IPアドレスを特定してもらいます。

DNSリゾルバーが私たちのコンピュータからリクエストを受け取ると、まず自分のキャッシュを確認し、 IPアドレスが見つかればすぐにそれを返します。しかし、見つからなかった場合は、他のサーバーに問い合わせを行い、 ドメインとIPアドレスの情報を得る必要があります。まずは、ルートサーバーに問い合わせを行います。 ルートサーバーには、トップレベルドメイン(TLD)サーバーの位置情報が保存されています。 TLDとは、.com.net.blogなど、ドメイン名の接尾辞のことです。 ルートサーバーはリゾルバーからのリクエストを見て、そのTLDに対応するTLDサーバーの位置情報を返します。

次に、リゾルバーはTLDサーバーに問い合わせを行い、権威DNSサーバーの場所を取得します。 このサーバーが私たちが必要としている、ドメインに対応するIPアドレスを保持しています。 リゾルバーが権威DNSサーバーの場所を取得した後、最終的にそのサーバーにリクエストを送り、IPアドレスを取得します。 この時、リゾルバーはドメインとIPアドレスのペアをキャッシュに保存し、私たちのコンピュータにもIPアドレスを返します。 この情報はコンピュータにもキャッシュされます。これで、目的のIPアドレスを持った状態でリクエストを転送できます。

なぜこれだけの手順が必要か?

なぜIPアドレスを取得するためにこれだけのステップが必要なのかと疑問に思うかもしれません。理論的には、 すべてのドメインとIPアドレスのペアを自分のデバイスに保存してしまえば、DNSへの問い合わせを省けます。しかし、 何十億ものドメインが存在しており、そのテーブルを保存するだけでコンピュータのメモリがいっぱいになってしまいます。 では、DNSリゾルバーにこのテーブルを保存すればよいと思うかもしれませんが、同じ問題が発生します。 さらに世界中のDNSリゾルバーに変更を伝える必要があるため、効率が悪いのです。

現在のDNSシステムは、膨大なデータとクエリを処理するために、タスクを複数のサーバーに分散するという分割統治戦略の賜物です。 ルートサーバーはTLDサーバーの位置だけを知っており、それはあまり頻繁には変わりません。したがって、メンテナンスが簡単です。 同様に、TLDサーバーは同じTLDを持つドメインに対する権威DNSサーバーの位置だけを管理しており、 ドメインとIPアドレスのペアを保持する役割は各々の権威DNSサーバーに任せています。 そのためドメインのIPアドレスを変更したい場合、権威DNSサーバーのエントリを変更するだけで済むのです。

ルーティング

次に、目的のIPアドレスを取得できた後、ルーターがどのようにして目的地までの最適な経路を見つけるのかを理解しましょう。

IPアドレスは2つの部分に分けることができます。最初の部分はそのアドレスが属するサブネット(ネットワーク)を表し、 後半はそのネットワーク内のより詳細な場所を示します。IPアドレスは、国や都道府県、街区を表す物理的な郵便住所に似ていると考えることができます。 このことからルーターは、IPアドレスのテーブルを持っていれば、最長一致プレフィックスを探すことで、最も近いルーターを見つけることができます。

ルーターは常に他のルーターと接続に関する情報を交換しており、ホップ数や帯域幅、遅延といったメトリクスを共有しています。 ルーターはこれらのデータをもとに、自分のIPアドレスのテーブルを更新します(この詳細なプロセスはこの記事の範囲外ですが、興味がある方はRIP、OSPF、BGPを調べてみてください)。 最長一致プレフィックスを持つ複数のルーターが存在する場合は、これらのメトリクスを用いて最適な経路を選択します。

NATとポートフォワーディング

前回の記事では、ルーターがプライベートIPアドレスをパブリックIPアドレスに置き換えると軽く触れました。 これにより、複数のデバイスが1つのパブリックIPアドレスを共有できるようになります。しかし、 すべてのデバイスが同じパブリックIPアドレスを使っている場合、ルーターは応答をどのデバイスに返せばいいのか、 どのようにして判断するのでしょうか?

NAT

多くのルーターは、**ポートアドレス変換(PAT)と呼ばれるネットワークアドレス変換(NAT)**の特定の実装を用いてこの問題を解決します。 PATは、パブリックポート番号と対応するプライベートIPアドレスのペアを保持するテーブルを持っています。応答が戻ってきたとき、 ルーターはそのポート番号をテーブルで調べ、正しいプライベートIPアドレスに応答を転送します。この操作は、ポート番号が定義される第4層のトランスポート層にまで及び、 第3層のネットワーク層でIPアドレスに変更を加えます。

もう1つ、ルーターの重要な役割は、プライベートネットワーク内のデバイスに対して外部からのリクエストを処理することです。 プライベートネットワーク内のデバイスでサーバーが稼働している場合、特定のパブリックポートからのリクエストを正しいプライベートIPアドレスとポートに転送するようにルーターを設定できます。 これをポートフォワーディングと呼びます。

結論

これで、目的のIPアドレスを取得する方法、ルーターが最長一致プレフィックスを使って最適な経路を見つける方法、 NATによって複数のデバイスが1つのパブリックIPアドレスを共有する方法について理解しました。これで我々がどのように インターネットにアクセスできているのかを簡単に理解することができます。

たとえば、「tkdev.blog」にアクセスしようとすると、まずはコンピュータがDNSリゾルバーに問い合わせ、 ドメインをIPアドレスに変換します。DNSリゾルバーは、ルートサーバー、TLDサーバー、権威DNSサーバーに順に問い合わせを行い、 最終的にIPアドレスを取得します。次に、そのリクエストはルーターに転送され、ルーターが最長一致プレフィックスとグメトリクスを使用して最適な経路を見つけます。

ルーターがサーバーにリクエストを転送するとき、プライベートアドレスをNATを使ってパブリックIPアドレスとポートに置き換えます。リクエストはポートフォワーディングを 通してサーバに受理され、サーバーがリクエストを処理し、応答が戻ってくると、ルーターはそのNATテーブルを使用して、 正しいプライベートIPアドレスに応答を転送します。これで、IPアドレスの基本的な仕組みが理解できたところで、次回の記事では、このメカニズムを使ったさまざまな通信方法について見ていきましょう。

リソース