如何防止与IPv6 AAAAlogging相关的延迟?

我们的Windows服务器正在使用我们的Windows DNS服务器注册IPv6 AAAAlogging。 但是,我们的networking中没有启用IPv6路由,所以这经常导致失速行为。

微软RDP是最严重的罪犯。 当连接到DNS中具有AAAAlogging的服务器时,远程桌面客户端将首先尝试IPv6,并且在连接超时之前不会回退到IPv4。 高级用户可以通过直接连接到IP地址来解决这个问题。 使用ping -4 hostname.fooparsingIPv4地址总是可以立即运行。

我能做些什么来避免这种延迟?

  • 在客户端禁用IPv6?
    • 微软表示, IPv6是Windows操作系统的强制性部分。
    • 太多的客户,以确保这是始终无处不在。
    • 当我们最终实现IPv6时,会导致更多的问题。
  • 在服务器上禁用IPv6?
    • 微软表示, IPv6是Windows操作系统的强制性部分。
    • 要求不方便的registry攻击来禁用整个IPv6堆栈。
    • 确保在所有服务器上正确设置是不方便的。
    • 当我们最终实现IPv6时,会导致更多的问题。
  • 掩盖用户设备DNS recursor上的IPv6logging?
    • 不,我们正在使用NLNet Unbound, 它不支持 。
  • 防止在Microsoft DNS服务器上注册IPv6 AAAAlogging?
    • 我不认为这是可能的。

在这一点上,我正在考虑编写一个脚本来清除我们的DNS区域中的所有AAAAlogging。 请帮助我find一个更好的方法。


更新: DNSparsing不是问题。 正如@joeqwerty在他的回答中指出的,DNSlogging是即时返回的。 AAAAAlogging都立即可用。 问题在于某些客户端( 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默认启用6to4

如果您的主机正在运行最新版本的Windows(Vista或更高版本),则当可公开路由的IPv4地址可用时,Windows将机会性地启用6to4隧道。 关键是,这适用于服务器和客户端。

要查明系统是否使用6to4,请运行ipconfig并查找以6to4前缀2002:开头的IPv6地址2002: 它看起来像这样。

 C:\> ipconfig Tunnel adapter 6TO4 Adapter: IPv6 Address. . . . . . . . . . . : 2002:1111:2222::1111:2222 
  • 如果您的端点连接到Active Directory,则可以使用组策略来禁用6to4和Teredo等转换协议。 这在KB929852中有详细logging 。 (把它应用到你的客户端或者服务器上就足够了,但是如果你正在采取这一步,那么在客户端服务器上的任何地方都可以禁用它。
  • 如果只pipe理less数主机,则可以根据具体情况禁用6to4。 这比完全禁用IPv6要好得多。 netsh int ipv6 6to4 set state disabled
  • 使用不同的客户端操作系统。 例如,Mac OS X默认不启用6to4。

正在使用可公开路由的IPv4地址

6to4只适用于具有可公开路由的IPv4地址的主机,所以这个问题不会影响NAT防火墙后面的主机。

  • 您可以将客户端和/或服务器移到NAT防火墙之后,并开始使用RFC1918寻址。 但在某些情况下,实际上首选可公开路由的地址。 改变整个networking的地址也可能是不现实的select。

6to4在networking上无法正常工作

在任播模式下对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中描述了这种故障(“入站黑洞”)和其他许多问题。

  • 将防火墙设置为从内部主机发送到networking时,大声拒绝IP协议41(带有TCP重置)。 这应该导致一个“快速失败”行为,比非确定性连接延迟更有意义。 这已被certificate在有限的testing环境中工作 。
  • 请您的ISP或第一跳转接服务提供商设置一个工作的6to4中继。 如果做得对,这将为最终用户带来最好的体验。 任何具有可公开路由的IPv4地址的最终用户都将能够参与到IPv6networking中。

dynamicDNS注册

在典型的Active Directory环境中,每台计算机都可以使用DNS服务器注册自己的地址。 当一个主机是多宿主时,它将注册所有的地址,甚至从一个6to4隧道。

大多数互联网服务不使用dynamicDNS,所以这个问题通常局限于客户端和服务器都在同一个networking“内部”的企业站点。

  • 您可以select禁用dynamicDNS更新。 然后,如果您不将任何AAAA资源logging放入区域文件,它们将永远不会被投放。 但是,内部DNS服务器通常需要dynamicDNS。 (如果你这样做,一定要删除任何可能已经存在的AAAAlogging。)
  • 设置DNS服务器不提供AAAA资源logging的答案。 但是不要这么做,因为当你想要开始实现IPv6的时候真的会给你带来麻烦。 (有人知道免费/开源的DNS防火墙吗?)

客户端应用程序不会优雅地失败

微软的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路由器。