web-dev-qa-db-ja.com

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

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

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

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

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

ワイヤーシャークダンプが原因を明らかにしました:最初のクエリが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|
                  +------+   +------+
9
Nils

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

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

特定のユースケースがある場合は、TCPを使用するように指定できます。シェルスクリプトでは、解決のために 'Dig + tcp'または 'Host -T'を使用し、システムコール 'sethostent/gethostbyname/endhostent'(manページを参照)を使用してTCP in otherケース。

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

8
Dan Andreatta

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

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

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

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

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

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

4
Alnitak