微软RDP是最糟糕的罪犯.当连接到DNS中具有AAAA记录的服务器时,远程桌面客户端将首先尝试IPv6,并且在连接超时之前不会回退到IPv4.高级用户可以通过直接连接到IP地址来解决此问题.使用ping -4 hostname.foo解析IPv4地址始终可以立即生效.
我该怎么做才能避免这种延迟?
>在客户端禁用IPv6?
>不,微软说IPv6 is a mandatory part of the Windows operating system.
>客户太多,以确保始终如一地设置.
>当我们最终实施IPv6时,会导致更多问题.
>在服务器上禁用IPv6?
>不,微软说IPv6 is a mandatory part of the Windows operating system.
>需要一个不方便的registry hack来禁用整个IPv6堆栈.
>确保在所有服务器上正确设置这是不方便的.
>当我们最终实施IPv6时,会导致更多问题.
>屏蔽用户facnig DNS recursor上的IPv6记录?
>不,我们正在使用NLNet Unbound和it doesn’t support that.
>防止在Microsoft DNS服务器上注册IPv6 AAAA记录?
>我认为这甚至不可能.
此时,我正在考虑编写一个清除DNS区域中所有AAAA记录的脚本.请帮我找一个更好的方法.
更新:DNS解析不是问题.正如@joeqwerty在他的回答中指出的那样,DNS记录会立即返回. A和AAAA记录都可立即使用.问题是某些客户端(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通信完全不起作用.
解决方法
编辑
现在你要做点什么了.
确保您捕获Microsoft 6To4适配器的流量,否则您将看不到IPv6:
这是我的RDS服务器的nslookup结果.记下IPv6地址:
现在这里是我捕获的片段:
最后,这是netstat显示连接的片段:
很明显,正如您所确认的那样,DNS解析不是问题所在.问题是RDP连接更喜欢IPv6 over IPv4(这是Windows的默认设置–Windows更喜欢IPv6 over IPv4),而且由于IPv6运行不正常导致延迟(正如您所说)从IPv6回退到IPv4的.您可以通过将客户端配置为更喜欢IPv4 over IPv6来解决此问题,但我认为这只会掩盖问题.更好的解决方案是找出IPv6无法正常工作的原因并解决这个问题.我对IPv6的帮助不够了,但我的猜测是,DNS返回的IPv6记录是“本地”地址,仅在存在RDS主机的子网上有效,并且由于客户端位于不同的子网中,因此它们可以’达到那些IPv6地址.