マルチホームサーバー上の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|
+------+ +------+
まず、私はそれをエラーとは呼びません。単なる情報メッセージです。
次に、DNSサーバーは常にUDPクエリに応答し(少なくともBIND、UDPを無効にするオプションは見つかりません)、クライアントは常に(?)最初にUDPクエリを送信しようとします(たとえば、resolv.confにそれを変更するオプションはありません)またはJVM内)-それらがUDPパケットに収まる場合(リクエストは通常そうです)
特定のユースケースがある場合は、TCPを使用するように指定できます。シェルスクリプトでは、解決のために 'Dig + tcp'または 'Host -T'を使用し、システムコール 'sethostent/gethostbyname/endhostent'(manページを参照)を使用してTCP in otherケース。
本当にUDPをブロックしたい場合、私が確認できる唯一のオプションはiptableルールを使用することですが、その設定が機能するかどうかはわかりません。 DNS解決が失敗するだけだと思います。
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
を試してください。