フォワーダーDNS要求をTCPモードに強制する


9

マルチホームサーバーのSLES10(現在は9.6をバインド)にDNSサーバーを設定しました。このサーバーは、すべての内部ネットワークからクエリを実行でき、すべての内部ネットワークに応答を提供します。2つの別個のDNS「マスター」ゾーンがあります。これらの各ゾーンは、いくつかの信頼できるWindows-DNSサーバーによってサービスされています。

現在、私のlinux-serverは、これらのゾーンの1つ(プライベート内部ゾーン)のセカンダリDNSサーバーであり、他のゾーン(パブリック内部ゾーン)のフォワーダーとして機能しています。

最近まで、このセットアップは問題なく機能していました。今私は-パブリック内部ゾーンをクエリすると(例えばhost、Linuxクライアントのコマンドによって)エラーメッセージが表示されます

;; 切り捨て、TCPモードで再試行

Wiresharkダンプが原因を明らかにしました:最初のクエリはUDPモードで送信され、回答はUDPに適合しません(信頼できるNSのリストが長いため)、TCPモードで再試行され、正しい回答が提供されます。

ここで質問: 最初にUDPを試行せずにTCPモードでフォワーダーをクエリするようにバインドを構成できますか?

更新:ASCIIアートを試してみる...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client|
                  +------+   +------+

これの小さな図が役に立つでしょう-私はあなたの説明からどのサーバーがどれであるかを理解するのに苦労しています。
アルニタク2012年

このhostコマンドを実行しているホストと送信されているクエリとの間がはっきりしていませんが、多少改善されています。
アルニタク2012年

クライアントは、SLES10を介してゾーンpublic internalのエントリを要求します。ゾーンのプライベート内部は影響を受けません-NSエントリが2つしかないためです。
Nils

クライアントは単なるスタブリゾルバですか?
アルニタク2012年

minimal-responses: yesSLES 10のBIND構成に追加することをお勧めします-応答サイズが小さくなる可能性があります。いずれにしても、ほとんどの通常のクエリは512バイトの制限を超えません。
オリオン座ゼータ星

回答:


8

まず、私はそれをエラーとは呼びません。単なる情報メッセージです。

次に、DNSサーバーは常にUDPクエリに応答し(少なくともBIND、UDPを無効にするオプションが見つかりません)、クライアントは常に(?)最初にUDPクエリを送信しようとします(たとえば、resolv.confにそれを変更するオプションはありません)またはJVM内)-それらがUDPパケットに収まる場合(リクエストは通常​​そうです)

特定の使用例がある場合は、TCPを使用するように指定できます。たとえば、シェルスクリプトでは、解決に「dig + tcp」または「host -T」を使用し、システムコール「sethostent / gethostbyname / endhostent」を使用できます(manを参照)ページ)他の場合はTCPを強制します。

本当にUDPを試してブロックしたい場合、私が見ることができる唯一のオプションはiptableルールを使用することですが、その設定が機能するかどうかはわかりません。DNS解決が失敗するだけだと思います。


名目上、UDPクエリが失敗することをアプリオリに知っていて、最初にTCPを試すことによるパフォーマンス上の利点があります。そのいくつかの議論については、RFC 5966を参照してください。
アルニタク2012年

@Alnitakと私はその利益を得たいと思います。
Nils

1
@Nilsので、どうしてEDNSが動作していないのかを明らかにする必要があります...
Alnitak

私は特別な使用例はありません-クライアントはリゾルバーライブラリを使用しますが、各リクエストと各回答はネットワークを2回通過します-それは好きではありません。
Nils

@Nils、問題はクライアントがUDP / TCPを決定することですが、サーバーは答えのサイズを知っています。
Dan Andreatta

4

BINDサーバー EDNS(RFC 2671を参照)を使用して、512バイトを超えるUDPパケットを許可する必要があります。

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

これにより、他の小さなクエリでTCP接続のオーバーヘッドを必要とせずに、大規模なNSセットをUDP経由で取得できるようになります。

ただし、これらは実際にはデフォルト値であることに注意してください。EDNSが使用されていない場合、何かがそれをブロックしているか、EDNSオプションを受信するサーバーがそれをサポートしていません。

また、hostEDNSはサポートされていません。フォワーダー->サーバークエリが既にEDNSを使用していることが完全に可能であり、ローカルクライアントで試したときにそれを見ることができません。

dig +bufsize=4096 @server hostname Aを使用する代わりに試してくださいhost


誰がこれを使うべきですか?おそらく私のサーバーとゾーン "public internal"の私のフォワーダーの両方ですか?
Nils

とにかく答えでNSの完全なリストを送る意味は何ですか?
Nils

@Nils DNSプロトコルでは、同じ(QNAME、QTYPE、QCLASS)タプルに一致するエントリの完全なセットが分割できない(別名 "RRset")
Alnitak

このRRsetに関するRFCを教えていただけますか?
Nils

1
Actaullyホストは標準のリゾルバーライブラリを使用し、私のワークステーションではEDNS0をサポートしています。要求がEDNS0を指定しているかどうかをテストするには、 'tcpdump -x port 53'を実行し、16進ダンプにOPT RRのバイナリ表現であるシーケンス0029 1000 0000 8000 0000(最後の方の追加セクション)が含まれている必要があります。
Dan Andreatta
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.