服务器 2012R2 DNS 服务器对某些 AAAA 查询返回 SERVFAIL

服务器 2012R2 DNS 服务器对某些 AAAA 查询返回 SERVFAIL

(重写了这个问题的大部分内容,因为我的许多原始测试与新信息无关)

我在使用 Server 2012R2 DNS 服务器时遇到了问题。这些问题最大的副作用是 Exchange 电子邮件无法发送。Exchange 在尝试 A 记录之前会查询 AAAA 记录。当它看到 AAAA 记录的 SERVFAIL 时,它甚至不会尝试 A 记录,而是直接放弃。

对于某些域,当查询我的活动目录 DNS 服务器时,我得到 SERVFAIL 而不是 NOERROR,并且没有结果。

我已经从运行 DNS 的几个不同的 Server 2012R2 域控制器尝试过此操作。其中一个是完全独立的域,位于不同的网络上,位于不同的防火墙和互联网连接后面。

我知道导致此问题的两个地址smtpgw1.gov.on.camxmta.owm.bell.net

我一直dig在 Linux 机器上测试这个(192.168.5.5 是我的域控制器):

grant@linuxbox:~$ dig @192.168.5.5 smtpgw1.gov.on.ca -t AAAA

; <<>> DiG 9.9.5-3ubuntu0.5-Ubuntu <<>> @192.168.5.5 smtpgw1.gov.on.ca -t AAAA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 56328
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;smtpgw1.gov.on.ca.             IN      AAAA

;; Query time: 90 msec
;; SERVER: 192.168.5.5#53(192.168.5.5)
;; WHEN: Wed Oct 21 14:09:10 EDT 2015
;; MSG SIZE  rcvd: 46

但针对公共域控制器的查询按预期工作:

grant@home-ssh:~$ dig @4.2.2.1 smtpgw1.gov.on.ca -t AAAA

; <<>> DiG 9.9.5-3ubuntu0.5-Ubuntu <<>> @4.2.2.1 smtpgw1.gov.on.ca -t AAAA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 269
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 8192
;; QUESTION SECTION:
;smtpgw1.gov.on.ca.             IN      AAAA

;; Query time: 136 msec
;; SERVER: 4.2.2.1#53(4.2.2.1)
;; WHEN: Wed Oct 21 14:11:19 EDT 2015
;; MSG SIZE  rcvd: 46

正如我所说,我在两个不同的网络和域上尝试过此操作。一个是全新的域,它肯定具有 DNS 的所有默认设置。另一个已迁移到 Server 2012,因此 2003/2008 的一些旧设置可能已保留。我在这两个域上都得到了相同的结果。

禁用 EDNS 可以dmscnd /config /enableednsprobes 0解决这个问题。我看到很多搜索结果都说 EDNS 是 Server 2003 的问题,但与 Server 2012 中的情况不相符。两种防火墙都没有 EDNS 问题。不过,禁用 EDNS 应该只是一种临时解决方法 - 它会阻止使用 DNSSEC,并可能导致其他问题。

我也看到过一些关于 Server 2008R2 和 EDNS 问题的帖子,但这些帖子也说问题在 Server 2012 中已经得到修复,所以它应该可以正常工作。

我还尝试启用 DNS 的调试日志。我可以看到我预期的数据包,但它并没有让我深入了解它为什么返回 SERVFAIL。以下是 DNS 服务器调试日志的相关部分:

第一个数据包 - 从客户端到我的 DNS 服务器的查询

2015 年 10 月 16 日上午 9:42:29 0974 数据包 000000EFF1BF01A0 UDP Rcv 172.16.0.254 a61e Q [2001 D 无错误] AAAA (7)smtpgw1(3)gov(2)on(2)ca(0)
UDP 问题信息位于 000000EFF1BF01A0
  插座 = 508
  远程地址 172.16.0.254,端口 50764
  时间查询=4556080,排队=0,过期=0
  缓冲区长度 = 0x0fa0 (4000)
  消息长度 = 0x002e (46)
  信息:
    XID 0xa61e
    标志 0x0120
      QR 0(问题)
      操作码 0(查询)
      AA 0
      热电偶 0
      第一轮
      类风湿关节炎 0
      光盘 0
      广告 1
      RCODE 0(无错误)
    数量 1
    帐户 0
    NSCOUNT 0
    数量 1
    问题部分:
    偏移量 = 0x000c,RR 计数 = 0
    名称“(7)smtpgw1(3)gov(2)on(2)ca(0)”
      Q类型 AAAA (28)
      1级
    解答部分:
      空的
    权限部分:
      空的
    附加部分:
    偏移量 = 0x0023,RR 计数 = 0
    姓名“(0)”
      类型选择 (41)
      4096 类
      TTL 0
      DLEN 0
      数据   
        缓冲区大小 = 4096
        Rcode 扩展 = 0
        Rcode 满 = 0
        版本 = 0
        标志 = 0

第二个数据包 - 从我的 DNS 服务器向他们的 DNS 服务器进行查询

2015 年 10 月 16 日上午 9:42:29 0974 数据包 000000EFF0A22160 UDP Snd 204.41.8.237 3e6c Q [0000 无错误] AAAA (7)smtpgw1(3)gov(2)on(2)ca(0)
UDP 问题信息位于 000000EFF0A22160
  插座 = 9812
  远程地址 204.41.8.237,端口 53
  时间查询=0、排队=0、过期=0
  缓冲区长度 = 0x0fa0 (4000)
  消息长度 = 0x0023 (35)
  信息:
    XID 0x3e6c
    标志 0x0000
      QR 0(问题)
      操作码 0(查询)
      AA 0
      热电偶 0
      读 0
      类风湿关节炎 0
      光盘 0
      广告 0
      RCODE 0(无错误)
    数量 1
    帐户 0
    NSCOUNT 0
    数量 0
    问题部分:
    偏移量 = 0x000c,RR 计数 = 0
    名称“(7)smtpgw1(3)gov(2)on(2)ca(0)”
      Q类型 AAAA (28)
      1级
    解答部分:
      空的
    权限部分:
      空的
    附加部分:
      空的

第三个数据包 - 来自其 DNS 服务器的响应(无错误)

2015 年 10 月 16 日上午 9:42:29 0974 数据包 000000EFF2188100 UDP Rcv 204.41.8.237 3e6c RQ [0084 A 无错误] AAAA (7)smtpgw1(3)gov(2)on(2)ca(0)
UDP 响应信息为 000000EFF2188100
  插座 = 9812
  远程地址 204.41.8.237,端口 53
  时间查询=4556080,排队=0,过期=0
  缓冲区长度 = 0x0fa0 (4000)
  消息长度 = 0x0023 (35)
  信息:
    XID 0x3e6c
    标志 0x8400
      QR 1(响应)
      操作码 0(查询)
      AA 1
      热电偶 0
      读 0
      类风湿关节炎 0
      光盘 0
      广告 0
      RCODE 0(无错误)
    数量 1
    帐户 0
    NSCOUNT 0
    数量 0
    问题部分:
    偏移量 = 0x000c,RR 计数 = 0
    名称“(7)smtpgw1(3)gov(2)on(2)ca(0)”
      Q类型 AAAA (28)
      1级
    解答部分:
      空的
    权限部分:
      空的
    附加部分:
      空的

第四个数据包 - 我的 DNS 服务器对客户端的响应(SERVFAIL)

2015 年 10 月 16 日上午 9:42:29 0974 数据包 000000EFF1BF01A0 UDP Snd 172.16.0.254 a61e RQ [8281 DR SERVFAIL] AAAA (7)smtpgw1(3)gov(2)on(2)ca(0)
UDP 响应信息为 000000EFF1BF01A0
  插座 = 508
  远程地址 172.16.0.254,端口 50764
  时间查询=4556080,排队=4556080,到期=4556083
  缓冲区长度 = 0x0fa0 (4000)
  消息长度 = 0x002e (46)
  信息:
    XID 0xa61e
    标志 0x8182
      QR 1(响应)
      操作码 0(查询)
      AA 0
      热电偶 0
      第一轮
      放射科 1
      光盘 0
      广告 0
      RCODE 2(服务器故障)
    数量 1
    帐户 0
    NSCOUNT 0
    数量 1
    问题部分:
    偏移量 = 0x000c,RR 计数 = 0
    名称“(7)smtpgw1(3)gov(2)on(2)ca(0)”
      Q类型 AAAA (28)
      1级
    解答部分:
      空的
    权限部分:
      空的
    附加部分:
    偏移量 = 0x0023,RR 计数 = 0
    姓名“(0)”
      类型选择 (41)
      4000 级
      TTL 0
      DLEN 0
      数据   
        缓冲区大小 = 4000
        Rcode 扩展 = 0
        Rcode 完整 = 2
        版本 = 0
        标志 = 0

其他注意事项:

  • 其中一个网络具有原生 IPv6 互联网访问,另一个则没有(但服务器上的 IPv6 堆栈已启用,且采用默认设置)。这似乎不是 IPv6 网络问题
  • 它不会影响所有域。例如,dig @192.168.5.5 -t AAAA serverfault.com返回 NOERROR,但没有结果。同样的事情也会google.com正确返回 google 的 IPv6 地址。
  • 尝试安装修补程序KB3014171,没什么区别。
  • 来自的更新KB3004539已安装。

编辑于 2015 年 11 月 7 日

我已经设置了另一台未加入域的 Server 2012R2 计算机,并安装了 DNS 服务器角色,并使用命令进行了测试nslookup -type=aaaa smtpgw1.gov.on.ca localhost。 它没有同样的问题。

两个虚拟机都位于同一主机和同一网络上,因此消除了任何网络/防火墙问题。现在,问题的关键在于补丁级别或域成员/域控制器。

编辑于 2015 年 11 月 8 日

应用了所有更新,没有区别。仔细检查了我的新测试服务器和域控制器的 DNS 设置之间是否存在配置差异,结果确实存在差异 - 域控制器已设置转发器。

现在,我确信我在初始测试中尝试过使用和不使用转发器,但我只dig在 Linux 机器上尝试过。当我在 Windows 机器上使用 nslookup 时,使用和不使用转发器设置的结果确实略有不同(尝试使用 Google、OpenDNS、4.2.2.1 和我的 ISP DNS 服务器)。

设置转发器后,我得到了Server failed

如果没有转发器(因此它使用根 DNS 服务器),我得到的是No IPv6 address (AAAA) records available for smtpgw1.gov.on.ca

但这仍然与我得到的其他没有 IPv6 记录的域名的结果不同 - Windows 上的 nslookup 对其他域名没有返回任何结果。

无论有没有转发器,查询我的 Windows DNS 服务器时dig仍然显示SERVFAIL该名称。

即使我没有涉及我的 Windows DNS 服务器,问题域和其他看似相关的域之间也确实存在细微的差别:

dig -t aaaa @8.8.8.8 smtpgw1.gov.on.ca没有答案,也没有权威部分。

dig -t aaaa @8.8.8.8 serverfault.com不返回任何答案,但确实有权限部分。我尝试的大多数其他域名也是如此,无论我使用哪种解析器。

那么,为什么缺少该权限部分?为什么其他 DNS 服务器不将其视为故障,而 Windows DNS 服务器却将其视为故障?

答案1

我进一步研究了网络跟踪并阅读了一些资料。当不存在 AAAA 记录时,请求会返回 SOA。结果发现 SOA 针对的是与请求的域不同的域。我怀疑这就是 Windows 拒绝响应的原因。请求 mx.atomwide.com 的 AAAA。响应 lgfl.org.uk 的 SOA。我会看看我们能否利用这些信息取得一些进展。编辑:仅供将来参考,暂时关闭“安全缓存以防止污染”将允许查询成功。虽然不理想,但证明问题出在可疑的 DNS 记录上。RFC4074 也是一个很好的参考 - 简介和章节。

答案2

根据KB832223

原因

出现此问题的原因是 Windows Server DNS 中支持的 DNS 扩展机制 (EDNS0) 功能。

EDNS0 允许更大的用户数据报协议 (UDP) 数据包大小。但是,某些防火墙程序可能不允许大于 512 字节的 UDP 数据包。因此,这些 DNS 数据包可能会被防火墙阻止。

微软有以下解决方案:

解决

要解决此问题,请更新防火墙程序以识别并允许大于 512 字节的 UDP 数据包。有关如何执行此操作的详细信息,请联系防火墙程序的制造商。

微软提出了以下解决该问题的建议:

解决方法

要解决此问题,请关闭基于 Windows 的 DNS 服务器上的 EDNS0 功能。为此,请执行以下操作:

在命令提示符下,键入以下命令,然后按 Enter:

dnscmd /config /enableednsprobes 0

注意:在此命令中的“enableednsprobes”后输入 0(零)而不是字母“O”。

相关内容