如何防止与IPv6 AAAA记录相关的延迟?


11

我们的Windows服务器正在AAAA向我们的Windows DNS服务器注册IPv6 记录。但是,我们没有在网络上启用IPv6路由,因此这经常会导致停顿行为。

Microsoft RDP是最严重的违规者。当连接到AAAA在DNS 中有记录的服务器时,远程桌面客户端将首先尝试IPv6,直到连接超时才回退到IPv4。超级用户可以通过直接连接到IP地址来解决此问题。使用解析IPv4地址ping -4 hostname.foo始终可以立即生效。

我该如何避免这种延迟?

  • 在客户端上禁用IPv6?
  • 在服务器上禁用IPv6?
  • 在使用者专用DNS递归上屏蔽IPv6记录?
  • 阻止在Microsoft DNS服务器上注册IPv6 AAAA记录?
    • 我认为那是不可能的。

在这一点上,我正在考虑编写一个脚本来清除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
@joeqwerty服务器和用户位于单独的子网中,但是所有内容都是一个大站点。我们没有使用裂脑DNS,因此没有“内部DNS”的概念。
Nic

2
另外,我认为您会从RIPERFC 6343中找到这篇非常有趣且相关的文章。我个人对您的建议是完全放弃6to4。
迈克尔·汉普顿

Answers:


10

这个问题非常有趣,我必须承认我从未见过这种行为。为了更好地理解它,我花了一些时间从另一台W2K8R2服务器查询我的一台W2K8R2 RDS服务器,并且还捕获了从同一测试服务器到同一RDS服务器的RDP会话的代码段。 。Nslookup显示返回IPv6记录没有延迟,并且nslookup显示我的测试服务器在查询IPv6记录之前先查询IPv4记录。捕获中的时间增量在任何一个查询中均未显示任何明显的延迟(我可以确定)。


在此处输入图片说明


在此处输入图片说明


编辑

现在您正在做某事。

确保您正在捕获Microsoft 6To4适配器的流量,否则将看不到IPv6:

在此处输入图片说明


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

在此处输入图片说明


现在,这是我捕获的片段:

在此处输入图片说明


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

在此处输入图片说明


很显然,正如您已经确认的那样,DNS解析不是问题。问题是RDP连接优先使用IPv6而不是IPv4(这是Windows的默认设置-Windows优先使用IPv6而不是IPv4),并且由于IPv6运行不正常,这会导致从IPv6退回至IPv6时的延迟(如您所述) IPv4。您可以通过将客户端配置为更喜欢IPv4而不是IPv6来解决此问题,但是我认为那只会掩盖问题。更好的解决方案是弄清楚为什么IPv6无法正常工作并加以解决。我对IPv6知之甚少,但我猜测是DNS返回的IPv6记录是“本地”地址,仅在RDS主机所在的子网中有效,并且由于客户端位于其他子网中,因此它们可以“到达那些IPv6地址。


兄弟,您甚至使用RFC 1918吗?
瑞安·里斯

大声笑。他们起得很早,被分配了自己的/ 24块,并选择在内部使用它而不是处理NAT。他们使用了大约80%的区块,并采取了“如果没有破解就不要修复”的立场。
joeqwerty

@joeqwerty我对我的问题做了一些澄清。nslookup可以正常工作,但ping失败,并显示“常规失败”。
Nic

@joeqwerty感谢您的所有投入。我已经发布了该问题的答案,以阐明我的环境中发生了什么,并建议其他人在类似情况下可能会做什么。
Nic

9

称为6to4的IPv6过渡技术因引发此类问题而臭名昭著。有几个因素在起作用。它们各自是无害的,但是综合效果是最终用户会遇到连接延迟。

下文列出了促成因素和缓解措施的思路。


Windows默认启用6to4

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

要确定系统是否正在使用6to4,请运行ipconfig并查找以6to4 prefix开头的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协议= 41)将IPv6数据包封装到IPv4数据包中来工作。IPv4数据包被寻址到任播地址192.88.99.1,希望它能到达Internet上某个有效的6to4中继。如果幸运的话,它甚至可能在地理位置上。

实际上,某些6to4中继设置不正确,许多网络甚至不允许6in4流量穿越防火墙。通常,当防火墙允许所有出站流量,但没有明确允许IP协议41数据包通过防火墙返回时,就会发生这种情况。(TODO请注意相关的RFC,以进行故障排除。)此故障(“入站黑洞”)和许多其他故障在RFC 6343中进行了描述。

  • 将防火墙设置为从网络内部主机发送时大声拒绝IP协议41(带有TCP重置)。与非确定性连接延迟相比,这应导致“快速失效”行为更有意义。已经证明可以在有限的测试环境中工作
  • 要求您的ISP或第一跳转接提供商设置有效的6to4中继。如果做对了,将为最终用户带来最佳体验。具有可公开路由的IPv4地址的任何最终用户都将能够参与IPv6互联网。

动态DNS注册

在典型的Active Directory环境中,允许每台计算机向DNS服务器注册其自己的地址。当主机是多宿主的时,它将注册其所有地址,即使从6to4隧道也是如此。

大多数Internet服务不使用动态DNS,因此此问题通常仅限于客户端和服务器都在同一网络“内部”的企业站点。

  • 您可以选择禁用动态DNS更新。然后,如果您不将任何AAAA资源记录放入区域文件,则将永远不会提供它们。但是,内部DNS服务器通常需要动态DNS。(如果这样做,请确保还删除可能已经存在的所有AAAA记录。)
  • 将DNS服务器设置为不为AAAA资源记录提供答案。但是不要这样做,因为当您要开始实施IPv6时,这确实会给您带来麻烦。(有人知道免费/开源DNS防火墙吗?)

客户端应用程序不会正常失败

Microsoft的RDP客户端是客户端应用程序的一个示例,该应用程序无法正常处理IPv6路由问题。大多数网络浏览器在处理此类IPv6边缘情况方面比较擅长,因此它们不会表现出这种行为。

  • 尝试使用其他客户端。也许您会很幸运。

我将扩展有关6to4问题的讨论,并提及RFC 6598地址如何使问题变得更糟。如果有公共IPv4地址可用,大多数会自动启用6to4的软件就是在RFC之前编写的。因此,自然会检测到RFC 6598地址,就像它是公用IPv4地址一样。但是事实并非如此,并且在RFC 6598地址上运行6to4无法正常工作。如果在2002:6440 :: / 26中看到任何IPv6地址,则说明您遇到了6to4 + RFC 6598问题。
kasperd 2014年

仅在6to4主机和本机IPv6主机之间进行通信时才使用6to4任播中继,而在两个6to4主机之间进行通信时则不会使用6to4任播中继(具有讽刺意味的是,这意味着向某些(但不是全部)主机添加本机IPv6会使情况变得更糟)。
彼得·格林

2

我意识到这对这种情况不是很有帮助,但是对于面临类似困境的实现者,有一种称为“快乐眼球”(RFC 6555)的实现技术,该技术指定了一种用于同时连接到ipv4和ipv6并选择首先连接的技术。


0

这是我的解决方案。默认情况下,Windows为IPv6路由提供比IPv4路由更高的优先级。如果您编辑IPv6前缀策略,则可以更改此行为以使其优先使用IPv4而不是IPv6。

为了确保网络中的所有系统都以相同的方式设置,我在构建或翻新机器后将以下命令放入在软件安装过程中运行的.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行,在我的情况下,我有一个DHCPv6服务器和相关的基础结构,它们为隧道连接分配了IPv6

第二个命令块删除所有现有的IPv6路由前缀策略。

然后,第三块重新创建IPv6前缀策略,但使用一组不同的优先级。像这样,与IPv4对应的前缀优先于IPv6,并且机器将要使用IPv4,除非应用程序指定使用IPv6。

此解决方案保留了双栈功能,但是优先使用IPv4意味着具有不完整,不可靠或性能不佳的IPv6的站点将避免使用它,除非系统上的程序告知。

我认为使操作系统优先使用IPv6而不是IPv4实际上阻碍了采用。在过渡期间,有时主机会认为它具有IPv6连接性,但实际上并没有完全正常的连接,从而导致软件故障和大量延迟。我认识的许多人已经在其路由器上完全禁用了IPv6,这是在建立完全连接之前最初以破碎方式部署IPv6的ISP的一种解决方法,这些人会忘记再次启用它,而使他们不再使用IPv6,直到他们重新配置路由器。


+1表示禁用隧道传输,-1表示偏好IPv4。对于大多数人来说,这不是问题,仅应在特定情况下应用于特定用户。
迈克尔·汉普顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.