IPv6 AAAAレコードに関連する遅延を防ぐ方法


11

WindowsサーバーはAAAA、Windows DNSサーバーにIPv6 レコードを登録しています。ただし、ネットワークでIPv6ルーティングが有効になっていないため、これによりストールが頻繁に発生します。

Microsoft RDPは最悪の犯罪者です。AAAADNSにレコードがあるサーバーに接続する場合、リモートデスクトップクライアントは最初にIPv6を試行し、接続がタイムアウトするまでIPv4にフォールバックしません。パワーユーザーは、IPアドレスに直接接続することでこの問題を回避できます。でIPv4アドレスを解決すると、ping -4 hostname.foo常に即座に機能します。

この遅延を回避するにはどうすればよいですか?

この時点で、DNSゾーンからすべてのAAAAレコードを削除するスクリプトの作成を検討しています。より良い方法を見つけてください。


更新: DNS解決は問題ではありません。@joeqwertyが答えで指摘しているように、DNSレコードは即座に返されます。どちらAAAAAレコードがすぐに利用できます。問題は、一部のクライアント(mstsc.exe)が優先的にIPv6経由で接続を試行し、IPv4にフォールバックするまでに時間がかかることです。

これはルーティングの問題のようです。ping宛先アドレスがルーティング不可能であるため、コマンドは、「一般的な失敗」のエラーメッセージを生成します。

C:\Windows\system32>ping myhost.mydomain
Pinging myhost.mydomain [2002:1234:1234::1234:1234] with 32 bytes of data:
General failure.
General failure.
General failure.
General failure.
Ping statistics for 2002:1234:1234::1234:1234:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

この動作のパケットキャプチャを取得できません。この(失敗した)pingコマンドを実行しても、Microsoftネットワークモニターでパケットは生成されません。同様に、レコードmstsc.exeを持つホストへの接続を試行しAAAAても、IPv4にフォールバックするまでトラフィックは生成されません。

更新:ホストはすべて、パブリックルーティング可能なIPv4アドレスを使用しています。この問題は、6to4構成が壊れている可能性があると思います。6to4は、パブリックIPアドレスとRFC1918アドレスを持つホストでは異なる動作をします。

更新:私のネットワークには、間違いなく6to4で怪しいものがあります。Windowsクライアントで6to4を無効にすると、接続はすぐに解決します。

netsh int ipv6 6to4 set state disabled

しかし、@ joeqwertyが言うように、これは問題を隠すだけです。私たちのネットワークでのIPv6通信が完全に機能しない理由を今でも探っています。


11
もちろん、ネットワークへのIPv6の展開を完了します。
マイケルハンプトン

1
このIPv6解決の失敗/遅延を確認するために、クライアントでネットワークキャプチャを実行しましたか?
joeqwerty

1
さておき、Microsoftが無効にいくつかの便利なフィックスイット・ツールを提供していたよう/様々なIPv6のコンポーネントを有効にする:support.microsoft.com/kb/929852
joeqwerty

1
@joeqwertyサーバーとユーザーは別々のサブネット上にありますが、すべてが1つの大きなサイトです。スプリットブレインDNSを使用していないため、「内部DNS」の概念はありません。
ニック

2
また、RIPEのこの記事RFC 6343が非常に興味深く、関連する読み物になると思います。個人的な推奨事項は、6to4を完全にダンプすることです。
マイケルハンプトン

回答:


10

この質問は非常に興味深いものであり、この動作を見たことがないことを認めなければなりません。試行錯誤しながら、別のW2K8R2サーバーからW2K8R2 RDSサーバーの1つに対するnslookupクエリのスニペットを取得し、同じテストサーバーから同じRDSサーバーへのRDPセッションのスニペットもキャプチャしました。NslookupはIPv6レコードを返すのに遅延を示さず、nslookupは、テストサーバーがIPv6レコードを照会する前にIPv4レコードを照会することを示しました。キャプチャの時間差は、どちらのクエリでもかなりの遅延(確認できる)を示していません。


ここに画像の説明を入力してください


ここに画像の説明を入力してください


編集

今、あなたは何かに取り組んでいます。

Microsoft 6To4アダプターのトラフィックをキャプチャしていることを確認してください。そうしないと、IPv6が表示されません。

ここに画像の説明を入力してください


これが私のRDSサーバーのnslookupの結果です。IPv6アドレスを書き留めます。

ここに画像の説明を入力してください


これが私のキャプチャのスニペットです。

ここに画像の説明を入力してください


最後に、接続を示すnetstatのスニペットを示します。

ここに画像の説明を入力してください


したがって、確認したとおり、DNS解決は問題ではありません。問題は、RDP接続がIPv4よりもIPv6を優先し(Windowsのデフォルト-WindowsがIPv4よりもIPv6を優先)、IPv6が正常に機能しないため、IPv6からフォールバックするときに遅延が発生することです(前述) IPv4。IPv6よりもIPv4を優先するようにクライアントを構成することでこれを修正できますが、それは単に問題を隠しているだけだと思います。より良い解決策は、IPv6が機能しない理由を見つけて修正することです。IPv6について十分な知識はありませんが、私の推測では、DNSによって返されるIPv6レコードは、RDSホストが存在するサブネットでのみ有効な「ローカル」アドレスであり、クライアントは異なるサブネットにあるため、これらのIPv6アドレスに到達しません。


ブロ、RFC 1918さえありますか?
ライアンリース

笑。彼らは早く入り、独自の/ 24ブロックを割り当てられ、NATを扱う代わりに内部で使用することを選択しました。ブロックの約80%を使用し、「壊れていない場合は修正しないでください」というスタンスをとっています。
joeqwerty

@joeqwerty説明をいくつか追加して質問を更新しました。nslookupは正常に機能しますが、pingは一般的な失敗で失敗します。
ニック

@joeqwertyご意見をお寄せいただきありがとうございます。私はこの質問への回答を投稿しました。これは、私の環境で何が起こったのかを明確にし、同様の状況で他の人が何をするかを示唆しています。
ニック

9

6to4と呼ばれるIPv6移行テクノロジーは、このような問題を引き起こすことで有名です。いくつかの要因が働いています。個々には無害ですが、組み合わせた効果は、エンドユーザーが接続の遅延を経験できることです。

有効化要因のリストとそれらの緩和に関する考えを以下に示します。


Windowsはデフォルトで6to4を有効にします

ホストが最新バージョンのWindows(Vista以降)を実行している場合、Windowsは、パブリックにルーティング可能なIPv4アドレスが利用可能な場合に6to4トンネリングを日和見的に有効にします。重大なことに、これはサーバーとクライアントの両方に適用されます。

システムが6to4を使用しているかどうかを調べるにはipconfig、6to4プレフィックスで始まるIPv6アドレスを実行して探します2002:。これは次のようになります。

C:\> ipconfig
Tunnel adapter 6TO4 Adapter:
IPv6 Address. . . . . . . . . . . : 2002:1111:2222::1111:2222
  • エンドポイントがActive Directoryに接続されている場合、グループポリシーを使用して、6to4やTeredoなどの移行プロトコルを無効にできます。これは、KB929852で十分に文書化されています。(これをクライアントまたはサーバーのいずれかに適用するだけで十分ですが、この手順を実行している場合は、おそらくクライアントサーバーの両方ですべての場所で無効にすることをお勧めます。)
  • 少数のホストのみを管理する場合は、ケースバイケースで6to4を無効にできます。これは、IPv6を完全に無効にするよりはるかに優れています。netsh int ipv6 6to4 set state disabled
  • 別のクライアントオペレーティングシステムを使用します。たとえば、Mac OS Xではデフォルトで6to4が有効になっていません。

パブリックにルーティング可能なIPv4アドレスが使用されています

6to4は、パブリックにルーティング可能なIPv4アドレスを持つホストでのみ機能するため、この問題はNATファイアウォールの背後にあるホストには影響しません。

  • クライアントやサーバーをNATファイアウォールの背後に移動して、RFC1918アドレッシングの使用を開始できます。しかし、場合によっては、公にルーティング可能なアドレスが実際に優先されます。ネットワーク全体のアドレス指定を変更することも非現実的な選択です。

6to4はネットワーク上で正しく機能していません

エニーキャストモードで6to4のトラブルシューティングを行うことは非常に困難です。IETFへの正式な要求があったので、6to4が歴史的なものとして再分類されるべきであるのはとても厄介です。この著者の意見では、6to4は廃止されました。

簡単に言えば、6to4は、6in4(IP protocol = 41)と呼ばれるプロトコルを使用してIPv6パケットをIPv4パケットにカプセル化することによって機能します。IPv4パケットは192.88.99.1、インターネット上のどこかで動作する6to4リレーに到着することを期待して、エニーキャストアドレスにアドレス指定されます。運が良ければ、地理的にも近いかもしれません。

実際には、一部の6to4リレーは正しくセットアップされておらず、多くのネットワークでは6in4トラフィックがファイアウォールを通過することさえ許可されていません。通常、これは、ファイアウォールがすべてのアウトバウンドトラフィックを許可するが、IPプロトコル41パケットがファイアウォールを通過することを明示的に許可しない場合に発生します。(TODOは、トラブルシューティングに関連するRFCに注意してください。)この失敗(「インバウンドブラックホール」)およびその他の多くは、RFC 6343で説明されています

  • ネットワーク内部のホストから送信されたIPプロトコル41(TCPリセット)を大声で拒否するようにファイアウォールを設定します。これにより、非決定的な接続遅延よりも意味のある「フェイルファースト」動作が発生します。これは、限られたテスト環境で機能すること実証されています
  • ISPまたはファーストホップトランジットプロバイダーに、動作する6to4リレーをセットアップするよう依頼してください。これが正しく行われると、エンドユーザーにとって最高のエクスペリエンスが得られます。パブリックにルーティング可能なIPv4アドレスを持つエンドユーザーは、IPv6インターネットに参加できます。

ダイナミックDNS登録

一般的なActive Directory環境では、すべてのコンピューターが自身のアドレスをDNSサーバーに登録することが許可されています。ホストがマルチホームの場合、6to4トンネルからであっても、ホストはすべてのアドレスを登録します。

ほとんどのインターネットサービスは動的DNSを使用しないため、この問題は通常、クライアントとサーバーがすべて同じネットワークの「内部」にあるエンタープライズサイトに限定されます。

  • 動的DNS更新を無効にすることもできます。その後、AAAAリソースレコードをゾーンファイルに配置しないと、それらは提供されません。ただし、内部DNSサーバーには動的DNSが望ましい場合がよくあります。(これを行う場合は、既に存在する可能性のあるAAAAレコードも必ず削除してください。)
  • AAAAリソースレコードの回答を提供しないようにDNSサーバーを設定します。ただし、IPv6の実装を開始するときに本当に問題が発生するため、これを行わないでください。(無料/オープンソースのDNSファイアウォールを知っている人はいますか?)

クライアントアプリケーションが正常に失敗しない

MicrosoftのRDPクライアントは、IPv6ルーティングの問題を適切に処理しないクライアントアプリケーションの一例です。ほとんどのWebブラウザは、このようなIPv6エッジケースの処理に優れているため、この動作を示す傾向はありません。

  • 別のクライアントを使用してみてください。たぶんあなたは幸運になるでしょう。

RFC 6598アドレスが問題を悪化させる可能性について言及して、6to4の問題に関する議論を拡張します。パブリックIPv4アドレスが使用可能な場合に6to4を自動的に有効にするほとんどのソフトウェアは、そのRFCの前に作成されました。したがって、RFC 6598アドレスは、パブリックIPv4アドレスであるかのように自然に検出されます。しかし、そうではなく、RFC 6598アドレスで6to4を実行しても機能しません。2002:6440 :: / 26からIPv6アドレスが見つかった場合、6to4 + RFC 6598の問題に直面しています。
カスペルド14

6to4エニーキャストリレーは、6to4ホストとネイティブIPv6ホスト間で通信する場合にのみ関連し、2つの6to4ホスト間で通信する場合には関連しません(皮肉なことに、すべてのホストではなく一部にネイティブIPv6を追加すると事態が悪化する可能性があります)。
ピーターグリーン

2

この状況ではあまり役に立ちませんが、同様のジレンマに直面している実装者には、「Happy Eyeballs」(RFC 6555)として知られる実装手法があります。これは、ipv4とipv6に同時に接続し、最初に接続する方を選択する手法を指定します


0

これが私の解決策でした。デフォルトでは、WindowsはIPv6ルートにIPv4ルートより高い優先度を与えます。IPv6プレフィックスポリシーを編集する場合、この動作を変更して、IPv6に優先してIPv4を使用するようにできます。

ネットワーク内のすべてのシステムが同じように設定されるように、マシンの構築または改造後のソフトウェアのインストール中に実行される.batスクリプトに次のコマンドを入れます。

netsh int ipv6 isatap set state disabled
netsh int ipv6 6to4 set state disabled
netsh interface teredo set state disable

netsh interface ipv6 delete prefixpolicy ::1/128
netsh interface ipv6 delete prefixpolicy ::/0
netsh interface ipv6 delete prefixpolicy 2002::/16
netsh interface ipv6 delete prefixpolicy ::/96
netsh interface ipv6 delete prefixpolicy ::ffff:0:0/96
netsh interface ipv6 delete prefixpolicy 2001::/32

netsh interface ipv6 add prefixpolicy ::1/128 50 0
netsh interface ipv6 add prefixpolicy ::ffff:0:0/96 40 1
netsh interface ipv6 add prefixpolicy ::/0 30 2
netsh interface ipv6 add prefixpolicy 2002::/16 20 3
netsh interface ipv6 add prefixpolicy ::/96 10 4
netsh interface ipv6 add prefixpolicy 2001::/32 5 5

これが何をするかを説明するには:

最初の3行は、ほとんどのネットワークで冗長であるため、組み込みのトンネリングインターフェイスを無効にします。マシンに独自のIPv6アドレスを与えない場合、これらの3行を使用したくない場合があります。私の場合、トンネル接続用にIPv6を割り当てるDHCPv6サーバーと関連インフラストラクチャがあります。

コマンドの2番目のブロックは、既存のすべてのIPv6ルーティングプレフィックスポリシーを削除します。

3番目のブロックは、IPv6プレフィックスポリシーを再作成しますが、異なる優先順位のセットを使用します。同様に、IPv4に対応するプレフィックスにはIPv6よりも優先度が与えられ、アプリケーションでIPv6の使用が指定されていない限り、マシンはIPv4を使用することになります。

このソリューションは機能的なデュアルスタック機能を保持しますが、IPv4を使用することは、IPv6が不完全、信頼できない、またはパフォーマンスが低いサイトでは、システム上のプログラムから指示されない限り、使用を回避することを意味します。

オペレーティングシステムにIPv4よりもIPv6を優先して使用させると、実際に採用が妨げられると考えています。移行期間中、ホストがIPv6接続はあるが、実際には完全に機能する接続を持たないと考え、ソフトウェアの誤動作と大きな遅延につながる場合があります。私が知っている多くの人々は、最初に完全な接続を確立する前に壊れた方法でIPv6を展開するISPの回避策として、ルーターでIPv6を完全に無効にしました。


トンネリングを無効にする場合は+ 1、IPv4を優先する場合は-1。これはほとんどの人にとって問題ではなく、特定の状況の特定のユーザーにのみ適用する必要があります。
マイケルハンプトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.