メインコンテンツまでスキップ

9. DNS Discovery of a Server (サーバーのDNS発見)

本セクションでは、STUNクライアントがドメインネームシステム (Domain Name System, DNS) 手順 [RFC1035] を使用してSTUNサーバーのIPアドレスとポートを発見するために使用できるオプションの手順について説明します。

使用法では、クライアントがこの手順を使用するタイミングを定義しなければなりません (must)。たとえば、使用法では、サーバー名をクライアントに手動でプロビジョニングできることを定義したり、構成プロトコルなどの他の手段を通じてクライアントが名前を発見できることを定義したりする場合があります。

クライアントが解決する名前を決定したら、その名前に対してAまたはAAAAレコードクエリを実行します。このクエリは1つ以上のIPアドレスを返します。STUN使用法が単一のウェルノウンポートを定義している場合、クライアントはそのポートを使用すべきです (SHOULD)。それ以外の場合、クライアントは名前に対してSRVクエリを実行します。SRVクエリは、優先度、重み、ポートとともにDNS名のリストを生成します。次に、クライアントは各DNS名に対してAまたはAAAAクエリを実行して、それらをIPアドレスに変換します。

クライアントがIPアドレスとポートのリストを取得したら、RFC 3484 [RFC3484] で説明されている手順に従ってリストを並べ替えます。次に、クライアントは最も優先されるアドレスから始めて、IPアドレスとポートの順序付きリストを使用してサーバーへの接続を開始します。クライアントは、応答性のあるサーバーが見つかるか、リストを使い果たすまで、リストを下に進みます。

SRVレコードを使用してサーバーアドレスとポートを取得する場合、クライアントは、DNS名がクライアントがクエリした名前と一致しないサーバーを使用すべきではありません (SHOULD NOT)。たとえば、クライアントが _stun._udp.example.com をクエリし、SRV応答に server1.otherdomain.com のDNS名が含まれていた場合、クライアントはそのサーバーに送信すべきではありません (SHOULD NOT)。これは、1つのドメインのDNSを制御する攻撃者が、STUN要求を別のドメインのサーバーにリダイレクトすることを防ぐためです。

クライアントは、DNSレコードの存続時間 (Time to Live, TTL) によって指定された期間、DNSルックアップの結果をキャッシュしてもよい (MAY)。DNS SRVレコードを通じて取得されたサーバーから妥当な時間内 (使用法で定義) に応答を受信できない場合、クライアントはDNSを再クエリすべきです (SHOULD)。クライアントはDNS TTL値を尊重すべきです (SHOULD)。

STUN使用法が特定のトランスポートのポートを定義し、そのトランスポートがSRVを使用する場合、使用法はそのSRVサービスのシンボリック名を定義しなければなりません (MUST)。シンボリック名は、アンダースコアが前に付いたサービス名、ピリオド、アンダースコアが前に付いたプロトコル名、ピリオド、その後にドメイン名が続きます。たとえば、使用法がポート3478でSTUNのUDPベースのトランスポートを定義し、ドメイン名が example.com の場合、シンボリック名は _stun._udp.example.com になります。