DNSクエリは常にUDPを経由しますか?


33

私はこのトピックの調査に少し時間を費やしましたが、正確な答えを見つけることができないようですので、重複していないと確信しています。私の質問はセキュリティのニーズに基づいていますが、まだ安全だと思いますここで質問しますが、セキュリティコミュニティに移動する必要があるかどうかを教えてください。

基本的に、DNSクエリはTCPを使用しますか(使用している場合、どのようなシナリオが発生する可能性がありますか)?繰り返しますが、私は単にクエリについて話しているだけです。TCPを介して旅行することは可能ですか?ドメインの最大長が253バイトで、UDPパケットのサイズが512バイトの場合、クエリは常にUDPとして送信されませんか?解決可能なクエリは、TCPの使用を必要とするほど大きくなるとは思わなかった。DNSサーバーが253バイトを超えるドメインのリクエストを受け取った場合、サーバーはそれをドロップするか、解決しようとしませんか?ここでいくつかの誤った仮定をしたことは確かです。

いくつかのコンテキストでは、セキュリティグループと協力してDNSクエリをセキュリティ監視ツールに組み込み、さまざまな理由で、DNSサーバーおよびドメインコントローラーでの標準パケットキャプチャを介してこのトラフィックをキャプチャすることを決定しました。コア要件は、すべてのDNSクエリをキャプチャして、特定のドメインを解決しようとしたクライアントを特定できるようにすることです。この要件に基づいて、DNS応答やゾーン転送などの他のトラフィックをキャプチャする必要はありません。これは、ログボリュームを可能な限り制限する必要があるという事実によっても引き起こされます。そのため、DNSサーバー宛てでUDP経由で送信されるDNSクエリのみをキャプチャすることを計画しています。より多くのコンテキスト(ここに忍び寄る質問の種類)については、セキュリティを拡張する必要があるかもしれないということが明らかになりました。可視性により、DNSを介して実行される隠れチャネルなどのアクティビティを監視できます(DNS応答、さらにはTCPトラフィックもキャプチャする必要があります)。しかし、そのようなシナリオでさえ、アウトバウンドDNSトラフィックはルックアップ/クエリの形式であり、悪意のあるソースからのものであっても、これらは常にUDP経由であると考えました(最初の段落の私の理由のため)。そのため、次の追加の質問が表示されます。

  • 少なくとも、私が説明したアプローチで会話の半分をキャプチャすることになるでしょうか?または、クライアントはクエリの形式ではないDNSトラフィックを送信するでしょうか?(DNSサーバーの応答に対する何らかの応答のようであり、TCPを介して送信される可能性があります)

  • TCPを使用するようにDNSクエリを変更できますか?DNSサーバーは、TCP経由のDNSクエリを受け入れて応答しますか?

関連性があるかどうかはわかりませんが、DNSリクエストを許可されたDNSサーバーに制限し、ポート53経由のその他すべてのトラフィックをブロックします。私は間違いなく新人なので、質問が準拠していない場合は申し訳ありません。変更方法。


2
@Alnitakのページング、赤ちゃんについて話し合っています。:)
アンドリューB

デフォルトのDNSクエリをTCPモードで機能させるにはどうすればよいですか?。OS X / macOS q / aといくつかのmodがありますが、Linux / Windowsでも動作します。
クラノマス

... HTTPSとTLSとQUICを超えるすぐにDNSを超えるDNS経由もちろん最近はDNSとの
パトリックMevzek

すべてのDNSクエリを(a)選択したDNSサーバーにリダイレクトしないのはなぜですか?
クレイグヒックス

回答:


38

通常のDNSクエリはUDPポート53を使用しますが、より長いクエリ(> 512オクテット)は「切り捨てられた」応答を受信するため、TCP 53の会話が発生し、クエリ全体の送受信が容易になります。また、DNSサーバーはポート53にバインドしますが、クエリ自体はポート53に送信されるランダムな番号の大きいポート(49152以上)から発信されます。応答はポート53からこの同じポートに返されます。

DNSが使用するネットワークポート| Microsoft Docs

したがって、ネットワークからのDNSクエリでセキュリティスヌーピングを行うことを計画している場合は、上記を考慮する必要があります。

非ルックアップトラフィックに関しては、DNSはゾーン転送(クエリタイプAXFR)を使用して、他のDNSサーバーを新しいレコードで更新することも考慮してください。中間攻撃の攻撃者は、このような転送を開始できます。DDOSはプライマリネームサーバーを使用しているため、セカンダリに応答して更新されたレコードを要求することはできません。その後、ハッカーは同じプライマリをスプーフィングして「ポイズニングされた」レコードをセカンダリに送り、人気のあるDNSドメインを侵害されたホストにリダイレクトします。

したがって、セキュリティ監査はクエリタイプAXFRに細心の注意を払う必要があり、DNSシステムは特定のIPアドレスからのAXFR交換のみを受け入れる必要があります。

SANS Institute InfoSec閲覧室| sans.org


1
ジョージ、本当に助かりました!最初の文をすぐに明確にするために-UDPパケットは512バイトにしか収まりませんよね?DNSクエリが512より大きい場合、ゲートからすぐにTCPで開始しませんか?wiresharkを実行し、nslookupを使用して大規模なドメインを解決することにより、これを自分でテストしようとしましたが、200文字を超えるドメインを試すことをブロックしているようです(正確な数ではありませんが、このシナリオを完全にテストすることはできませんでした) 。
カデレード

3
512Bytesを超えるのは「クエリ」ではなく「応答」であり、クライアントは「応答」が何であるかを知りません。
-AbraCadaver

7
@Caderadeはい、TCPまたはUDPにできることは正しいですが、ゾーン転送のみがTCPとして開始されます。クライアントクエリは、truncateビットが設定されているサーバーから応答を取得しない限り、UDPになります。その後、TCPを使用できます。
-AbraCadaver

1
クライアントはとにかく小さな応答にTCPを使用できますか?
-Mehrdad

2
「UDPパケットは512バイトにしか収まらない」いいえ、クライアントのバッファーが512バイトにしか収まらないという仮定により、サーバーはこのように動作します。EDNSを使用して、より長いバッファーをサーバーに通知できます。
ブライアン

28

これはジョージの答えに対するコメントとして始まりましたが、長くなりました。全体像は、多少の歴史を理解する必要があるため、多少複雑です。

  • RFC 1035は当初、UDPフラグメンテーションを回避するために512バイトの制限を要求していました。DNSトランザクションのオーバーヘッドを最小限に抑えるため、フラグメント化されたUDPデータグラムとTCPが最終手段のオプションとして選択されました。ゾーン転送はその性質上512バイトを超えるため、ゾーン転送は常にTCPを使用します。(UDPから始めるのは帯域幅の無駄です)

  • 切り捨てでのTCP再試行は、1989 以来RFC 1123で指定されているため、広くサポートされています。

  • EDNS(0)はRFC 6891(2013)によって定義されおり、それ以前は1999年にさかのぼる提案標準として存在していました。クライアントとサーバーが512を超えるUDPサイズをネゴシエートできるメカニズムを定義します。EDNS(0)の新しさにより、多くのハードウェアアプライアンスは、準拠パケットが破棄される原因となるDNSパケットの構造を仮定します。最もよくある理由は、512バイトを超えるDNSメッセージが無効であるという仮定ですが、これはいくつかあります。

それを観察された動作に分解すると:

  1. DNSクエリは通常、応答が大きすぎて開始できないことが事前にわかっていない限り、UDPとして開始されます。(ゾーン転送)
  2. 返信はあり切り捨て応答が見られた場合、クライアントでTCP再試行をトリガーします。これはかなりよくサポートされています。
  3. 512バイトを超えるのA UDP応答ができるクライアントは、より大きなペイロードをアドバタイズするEDNS(0)を使用し、場合に見られる、それを受信側サーバがサポート。これは、2つのハードウェアの間にあるハードウェアが干渉せず、パケットがドロップまたは破損した場合にのみ発生します。
  4. クライアント、応答が見られない場合、より小さな広告ペイロードでEDNS(0)クエリを再試行することを選択できます、詳細は実装によって異なります。
    • 最終的に応答する応答が大きすぎて要求されたサイズに収まらない可能性があることに注意することが重要です。その結果、上記の動作#2が発生します。(yes olde TCP retry)
    • クライアント側、最終的に成功したサイズを記憶することを選択できます。これにより、不要なクエリが無駄に消費されないようにすることができます。そうしないと、特に最終結果にTCPフォールバックが必要な場合、かなり無駄になります。

また、RFC 7766ではTCPを介した接続の再利用が可能であり、TCPを介したクエリパイプラインが実際に発生する可能性があることにも留意してください。一部のツール、TCPセッションで最初に見られるものを超えるDNSクエリを検出しません。dnscapはそのような例です。


切り捨てビットを設定する理由の1つは、応答速度制限(RRL)です。DNS増幅の軽減手法として、サーバーは切り捨てられたパケットを送信して、正常に動作するクライアントをTCPに切り替え、偽アドレスからのパケットへの応答を防ぐことができます。
エディディル

接続の再利用:したがって、scantycladladies.comを要求する前に、まずgoogle.comを要求するようにリゾルバーに教えると、dnscapは通知しません。;-)
レンネ

6

そこである RFC 7766には、TCP上のDNS交通-実装要件

  1. 前書き

ほとんどのDNS [ RFC1034 ]トランザクションは、UDP [ RFC768 ]で行われます。TCP [ RFC793 ]は常にフルゾーン転送(AXFRを使用)に使用され、DNSプロトコルの元の512バイト制限を超えるサイズのメッセージによく使用されます。DNSセキュリティ(DNSSEC)とIPv6の展開が拡大しているため、応答サイズが増加しているため、TCPが使用されています。TCPの使用を増やす必要性は、アドレススプーフィング、したがってリフレクション/増幅攻撃でのDNSの悪用に対する保護によってもたらされています。現在、応答速度制限[ RRL1 ] [ RRL2 ]で広く使用されています。さらに、[ DNS-over-TLSなどのDNSプライバシーソリューションに関する最近の研究]は、DNS-over-TCP要件を再検討するもう1つの動機です。

[RFC1123]のセクション6.1.3.2は次のように述べています。

  DNS resolvers and recursive servers MUST support UDP, and SHOULD
  support TCP, for sending (non-zone-transfer) queries.

ただし、一部の実装者は、上記の引用テキストを使用して、TCPサポートがDNSプロトコルのオプション機能であることを意味しています。

DNSサーバーオペレーターの大半は既にTCPをサポートしており、ほとんどのソフトウェア実装のデフォルト構成はTCPをサポートすることです。このドキュメントの主な対象読者は、TCPのサポートが限定されているため、相互運用性が制限され、新しいDNS機能の展開が妨げられます。

したがって、このドキュメントでは、TCPのサポートが完全なDNSプロトコル実装の必須部分であるように、コアDNSプロトコル仕様を更新します。

TCPの使用の増加にはいくつかの利点と欠点があり(付録Aを参照)、考慮すべき実装の詳細もあります。このドキュメントでは、これらの問題に対処し、TCPをDNSの有効なトランスポート代替として提示します。[ RFC5966 ]の内容を拡張し、DNSおよび他のインターネットプロトコルでのTCPの研究、開発、および実装から学んだ追加の考慮事項と教訓を備えています。

このドキュメントでは、DNSサーバーのオペレーターが満たすべき特定の要件はありませんが、サーバーおよびネットワークでのTCPのサポートが最適であることを確認するためのいくつかの提案をオペレーターに提供しています。TCPのサポートの失敗(またはネットワーク層でのTCP経由のDNSのブロック)は、おそらく解決の失敗やアプリケーションレベルのタイムアウトにつながることに注意する必要があります。


2
ヘイロン-投稿する前に実際にそのRFCを読みましたが、たとえば、最初の段落を見ると、TCPがより大きな応答をサポートするために必要であることが強調されているようです-「DNS Security(DNSSEC)およびIPv6の成長する展開応答サイズが大きくなったため、TCPを使用しています」。繰り返しますが、私の質問はクエリに関するものでしたが、とにかく感謝します。
カデレード

4
RFCは、DNSでTCPをサポートする必要があることを絶対に明確にしており、クライアントによるTCPの使用について説明しています。たとえば、「DNSにTCPを使用するクライアントは、常に接続を再確立するか、未処理のクエリを再試行する準備をする必要があります。
Ron Maupin

いい視点ね。コメントが明確になったことを考えると、実際に助けになったと思います。私のポイントは、RFCを実際に読んだことであり、クエリがTCPを使用して開始できることはまだあまり明確ではなかったので、RFCをダンプして答えを出すだけで、コミカルではあるが、それはあまり役に立ちませんでした。クエリはUDPを経由し、応答が大きすぎる場合、DNSサーバーはクライアントにこれを最初からやり直し、TCP経由で実行する必要があることを通知します。したがって、元の要求を取得できたため、元の要件をまだ満たしていると思いました。とにかく、私はあなたの入力に感謝します。
カデレード

1
INTERNET STANDARDRFCはありtools.ietf.org/html/rfc1034PROPOSED STANDARDTCPを要求するために引用しています。
-AbraCadaver

3
これは、同じことについて以前のStandards Track RFCを更新したStandards Track RFCです。サーバー障害に関するこの回答では、このようなことを説明しています。あなたが参照する文書でさえ、「インターネットでは、クエリはUDPデータグラムで、またはTCP接続で伝えられます。」RFC 7766は、TCPがDNSのオプションではなく必須であることを明確にすることです。
ロンモーピン

3

TCP / 53をどの方向にもフィルタリングしないでください。たとえばnsupdate、リクエストが大きすぎるとすぐにクエリがTCPを使用する場合があります(高速に発生する可能性があります)。したがって、ポート53(IPv4およびV6で!)のUDPおよびTCPをすべての方向に流す必要があります。

また、DNS over TLSに向けてますます多くの作業が行われているため、双方向でTCPが必要になります。RFC7858を参照してください。


質問はフィルタリングとは関係がなく、あなたの答えは他の答えに何も追加しません
ブライアン

@ブライアン、あなたの非常に有用で有用なコメントをありがとう!
パトリックメヴゼク

@PatrickMevzek理解-私が言おうとしていたことは、ポート53を介して境界を越える特定のIPアドレスへのトラフィックのみを許可するということです(ただし、TCPとUDPは許可されます)。
カデレード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.