我们的Windows服务器正在使用我们的Windows DNS服务器注册IPv6 AAAAlogging。 但是,我们的networking中没有启用IPv6路由,所以这经常导致失速行为。
微软RDP是最严重的罪犯。 当连接到DNS中具有AAAAlogging的服务器时,远程桌面客户端将首先尝试IPv6,并且在连接超时之前不会回退到IPv4。 高级用户可以通过直接连接到IP地址来解决这个问题。 使用ping -4 hostname.fooparsingIPv4地址总是可以立即运行。
我能做些什么来避免这种延迟?
在这一点上,我正在考虑编写一个脚本来清除我们的DNS区域中的所有AAAAlogging。 请帮助我find一个更好的方法。
更新: DNSparsing不是问题。 正如@joeqwerty在他的回答中指出的,DNSlogging是即时返回的。 A和AAAAlogging都立即可用。 问题在于某些客户端( 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命令不会在Microsoftnetworking监视器中生成任何数据包。 同样,尝试与mstsc.exe到具有AAAAlogging的主机的连接,直到它回退到IPv4才会产生stream量。
更新:我们的主机都使用可公开路由的IPv4地址。 我认为这个问题可能归结为6to4configuration的破裂。 6to4在具有公共IP地址的主机与RFC1918地址上的行为不同。
更新:在我的networking上肯定有一些可疑的东西。 当我禁用Windows客户端上的6to4时,连接立即解决。
netsh int ipv6 6to4 set state disabled
但正如@joeqwerty所说,这只能掩盖问题。 我仍然试图找出为什么我们的networking上的IPv6通信是完全不工作的。
这个问题很有趣,我必须承认,我从来没有见过这样的行为。 为了更好的理解它,我从一个W2K8R2服务器上拿了一个nslookup查询我的一个W2K8R2 RDS服务器的一个片段,并且还从同一个testing服务器上捕获了一个RDP会话的片段到同一个RDS服务器。 Nslookup在返回IPv6logging方面没有任何延迟,nslookup显示我的testing服务器在查询IPv6logging之前查询IPv4logging。 捕捉中的时间增量在任一查询中都没有显示出明显的延迟(我可以确定)。


编辑
现在你正在做些什么。
确保您正在捕获Microsoft 6To4适配器的stream量,否则您将看不到IPv6:

这是我的RDS服务器的nslookup结果。 记下IPv6地址:

这里是我的一个片段:

最后,这是从netstat显示连接的片段:

很明显,正如你所确认的,DNSparsing不是问题。 问题在于RDP连接更倾向于使用IPv6 over IPv4(这是Windows的默认设置 – Windows比IPv4更喜欢使用IPv6),并且由于IPv6不能正常工作,从IPv6导致的延迟(如您所述) IPv4的。 您可以通过configuration客户端来使用IPv4 over IPv6来解决这个问题,但是我认为这只会掩盖问题。 更好的解决scheme是找出为什么IPv6不能正常工作并解决这个问题。 我不太了解IPv6的含义,但是我的猜测是,DNS返回的IPv6logging是仅在RDS主机所在子网上有效的“本地”地址,由于客户端位于不同的子网中,达不到这些IPv6地址。
被称为6to4的IPv6过渡技术因为引起像这样的问题而臭名昭着 。 有几个因素在起作用。 单独它们是无害的,但是最终用户可能会遇到连接延迟。
下面列出了有关减缓措施的启动因素和想法。
如果您的主机正在运行最新版本的Windows(Vista或更高版本),则当可公开路由的IPv4地址可用时,Windows将机会性地启用6to4隧道。 关键是,这适用于服务器和客户端。
要查明系统是否使用6to4,请运行ipconfig并查找以6to4前缀2002:开头的IPv6地址2002: 它看起来像这样。
C:\> ipconfig Tunnel adapter 6TO4 Adapter: IPv6 Address. . . . . . . . . . . : 2002:1111:2222::1111:2222
netsh int ipv6 6to4 set state disabled 6to4只适用于具有可公开路由的IPv4地址的主机,所以这个问题不会影响NAT防火墙后面的主机。
在任播模式下对6to4进行故障排除是非常困难的。 这是非常麻烦的,有一个正式的要求,IETF 6to4应该重新分类为历史 。 在这个作者看来,6to4已经被弃用了。
简言之,6to4通过使用称为6in4(IP协议= 41)的协议将IPv6数据包封装到IPv4数据包中工作。 IPv4数据包发往任播地址192.88.99.1 ,希望它能到达互联网上某个工作的6to4中继。 如果幸运的话,它甚至可能在附近的地理位置。
在实践中,一些6to4中继设置不正确,许多networking甚至不允许6in4stream量通过防火墙。 通常,这种情况发生在防火墙允许所有出站stream量时,但并不明确允许IP协议41数据包通过防火墙返回。 (TODO注意相关的RFC用于故障排除。)在RFC 6343中描述了这种故障(“入站黑洞”)和其他许多问题。
在典型的Active Directory环境中,每台计算机都可以使用DNS服务器注册自己的地址。 当一个主机是多宿主时,它将注册所有的地址,甚至从一个6to4隧道。
大多数互联网服务不使用dynamicDNS,所以这个问题通常局限于客户端和服务器都在同一个networking“内部”的企业站点。
微软的RDP客户端是客户端应用程序的一个例子,它不能正常处理IPv6路由问题。 大多数Web浏览器在处理像这样的IPv6边缘情况下更好,所以他们不倾向于显示这种行为。
我意识到这对于这种情况并不是很有帮助,但是对于面临类似困境的实现者来说,有一种被称为“Happy Eyeballs” (RFC 6555)的实现技术,它指定了一种同时连接到ipv4和ipv6的技术,并select先连接的任何一种技术。
这是我的解决scheme。 默认情况下,Windows使IPv6路由的优先级高于IPv4路由。 如果编辑IPv6前缀策略,则可以更改此行为,使其优先于IPv6使用IPv4。
为了确保我的networking中的所有系统都是以相同的方式设置的,在构build或翻新机器之后,我将以下命令放入软件安装期间运行的.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行禁用内置的隧道接口,因为它们对于大多数networking是冗余的。 如果你不给自己的机器IPv6地址,你可能不想使用这三行,在我的情况下,我有一个DHCPv6服务器和关联的基础设施分配IPv6隧道连接
第二个命令块将删除所有现有的IPv6路由前缀策略。
第三个块然后重新创buildIPv6前缀策略,但是使用一组不同的优先级。 像这样,与IPv4相对应的前缀优先于IPv6,并且除非应用指定使用IPv6,否则机器将要使用IPv4。
该解决scheme保留了双栈function,但是使用IPv4的优先select意味着不完整,不可靠或性能较差的IPv6站点将避免使用,除非系统上的程序告知该站点。
我认为使操作系统优先于IPv4使用IPv6实际上是阻碍采用。 在过渡期间,主机会认为自己具有IPv6连接性,但实际上并没有全function的连接,导致软件故障和大的延迟。 我知道很多人已经在路由器上完全禁用了IPv6,作为ISP在build立全连接之前以破碎的方式部署IPv6的一种解决方法,而这些人将只是忘记重新启用IPv6,直到他们重新configuration路由器。