仍有 DNS 转发问题

仍有 DNS 转发问题

不久前我问过这个问题,但由于有很多主观意见,它被放到了聊天中。

原文信息在此供参考:https://chat.stackexchange.com/rooms/139176/discussion-on-question-by-sabre-dns-forwarding-issue

我还发现了一个看似类似的问题,但也没有答案。 条件转发间歇性故障

所以我想我会尝试将其整合到基本信息中并再试一次。使用日志文件进行演示。

核心问题是,在没有报告错误的情况下,DNS转发器为什么会随机选择性地对一个主机失败,然后稍后恢复正常运行? 细节如下...


编辑:我可以补充一点,这个问题今天上午(帖子发布后的第二天)再次发生。日志显示,事件发生时,一个查询正确进行,然后不到一秒钟后,询问其 WAN 转发器与其缓存或 LAN。这会缓存外部 IP,从那时起,每个人都失败,直到我们删除缓存。之后的第一个查询遵循转发器并缓存正确的 IP。这进一步使这变得神秘,如果缓存了,它无论如何都不应该要求新的 IP?


我有两台 DNS 服务器,两个域,均在 LAN 上,且均为各自 AD 域的 DC 和 DNS。

一个域是 .local,因此无法从公共 DNS 查询,另一个是 .ORG。.ORG 分为 LAN 上的主机和互联网上的主机。在这种情况下,我们只关心拦截 LAN 上的主机,其余的则由公共 DNS 处理。因此,LAN 主机由本地服务器处理,其他任何主机(非 LAN 主机)都由下一个转发器(即 openDNS)处理(最终我们的 SOA 是 GoDaddy)。我了解到这就是所谓的 SplitBrains DNS,对于像我这样的混合 DNS 场景来说,这显然是正常现象。

因此,如果您向 DNS 服务器询问 A.local 上 B.org 上的某个主机在哪里,它应该并且几乎总是会询问 B.org 在哪里(并且永远不会离开 LAN,除非它在那里找不到匹配的主机名。)

我附加了一张无法转发的主机的图片,这样我们就不会再走“没有 DNS 转发”的路径了。

DNS 配置

发生的情况是,.org 域上的主机随机无法解析,因为 .local DNS 服务器不会询问 .org 域上的 DNS 服务器,这意味着它从不尝试条件转发器,我现在已通过在两个主机上同时捕获数据包来确认这一点,路径是 A.local=>openDNS,而不是 A.local=Forward=>B.org。

当它失败时,.local 甚至不会尝试发送到 .org,并且 .org 确认永远不会收到任何请求。

如果您直接查询 .org 而不通过转发器 (NSLOOKUP),它会正常工作,主机在那里,我可以看到它的 DNS 记录。同时,对于 .org 域上的其他主机,转发器在此期间也正常工作。并且出现这些故障的特定主机并不总是相同的。

这种情况时断时续地发生,非常罕见且随机,配置没有变化,稍后恢复正常运行,配置同样没有变化。

附加日志文件(来自发生故障的 .local DNS 服务器上的 DNS 日志),其中有正确链和不正确链。IP 10.1.1.250 是 .org 的 DNS 服务器,10.1.0.16 是请求主机解析的客户端的 IP。

记录更正

  • 客户要求
  • 向 .org DNS 服务器发出请求 (Forward/10.1.1.250)
  • .org DNS 服务器对 .local DNS 服务器的响应
  • 利用通过转发获得的信息回复客户。

登錄失敗

  • 客户要求
  • 来自 .local DNS 服务器的响应,将其定向到外部 DNS(转发器从未询问)

希望这些细节能够让它停留在问题层面,而不是聊天层面:-)

谢谢。

日志更正:

10/12/2022 9:48:12 AM 0758 PACKET  000000883A640200 UDP Rcv 10.1.0.16       001e   Q [0001   D   NOERROR] A      (3)myhost(4)mydomain(3)org(0)
UDP question info at 000000883A640200
  Socket = 592
  Remote addr 10.1.0.16, port 57756
  Time Query=2147027, Queued=0, Expire=0
  Buf length = 0x0fa0 (4000)
  Msg length = 0x001e (30)
  Message:
    XID       0x001e
    Flags     0x0100
      QR        0 (QUESTION)
      OPCODE    0 (QUERY)
      AA        0
      TC        0
      RD        1
      RA        0
      Z         0
      CD        0
      AD        0
      RCODE     0 (NOERROR)
    QCOUNT    1
    ACOUNT    0
    NSCOUNT   0
    ARCOUNT   0
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(3)myhost(4)mydomain(3)org(0)"
      QTYPE   A (1)
      QCLASS  1
    ANSWER SECTION:
      empty
    AUTHORITY SECTION:
      empty
    ADDITIONAL SECTION:
      empty

10/12/2022 9:48:12 AM 0758 PACKET  000000883A4581A0 UDP Snd 10.1.1.250      d94e   Q [0001   D   NOERROR] A      (3)myhost(4)mydomain(3)org(0)
UDP question info at 000000883A4581A0
  Socket = 10476
  Remote addr 10.1.1.250, port 53
  Time Query=0, Queued=0, Expire=0
  Buf length = 0x0fa0 (4000)
  Msg length = 0x0029 (41)
  Message:
    XID       0xd94e
    Flags     0x0100
      QR        0 (QUESTION)
      OPCODE    0 (QUERY)
      AA        0
      TC        0
      RD        1
      RA        0
      Z         0
      CD        0
      AD        0
      RCODE     0 (NOERROR)
    QCOUNT    1
    ACOUNT    0
    NSCOUNT   0
    ARCOUNT   1
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(3)myhost(4)mydomain(3)org(0)"
      QTYPE   A (1)
      QCLASS  1
    ANSWER SECTION:
      empty
    AUTHORITY SECTION:
      empty
    ADDITIONAL SECTION:
    Offset = 0x001e, RR count = 0
    Name      "(0)"
      TYPE   OPT  (41)
      CLASS  4000
      TTL    32768
      DLEN   0
      DATA   
        Buffer Size  = 4000
        Rcode Ext    = 0
        Rcode Full   = 0
        Version      = 0
        Flags        = 80 DO

10/12/2022 9:48:12 AM 0758 PACKET  000000883E98E210 UDP Rcv 10.1.1.250      d94e R Q [8085 A DR  NOERROR] A      (3)myhost(4)mydomain(3)org(0)
UDP response info at 000000883E98E210
  Socket = 10476
  Remote addr 10.1.1.250, port 53
  Time Query=2147027, Queued=0, Expire=0
  Buf length = 0x0fa0 (4000)
  Msg length = 0x0039 (57)
  Message:
    XID       0xd94e
    Flags     0x8580
      QR        1 (RESPONSE)
      OPCODE    0 (QUERY)
      AA        1
      TC        0
      RD        1
      RA        1
      Z         0
      CD        0
      AD        0
      RCODE     0 (NOERROR)
    QCOUNT    1
    ACOUNT    1
    NSCOUNT   0
    ARCOUNT   1
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(3)myhost(4)mydomain(3)org(0)"
      QTYPE   A (1)
      QCLASS  1
    ANSWER SECTION:
    Offset = 0x001e, RR count = 0
    Name      "[C00C](3)myhost(4)mydomain(3)org(0)"
      TYPE   A  (1)
      CLASS  1
      TTL    1200
      DLEN   4
      DATA   10.1.1.218
    AUTHORITY SECTION:
      empty
    ADDITIONAL SECTION:
    Offset = 0x002e, RR count = 0
    Name      "(0)"
      TYPE   OPT  (41)
      CLASS  4000
      TTL    32768
      DLEN   0
      DATA   
        Buffer Size  = 4000
        Rcode Ext    = 0
        Rcode Full   = 0
        Version      = 0
        Flags        = 80 DO

10/12/2022 9:48:12 AM 0758 PACKET  000000883A640200 UDP Snd 10.1.0.16       001e R Q [8081   DR  NOERROR] A      (3)myhost(4)mydomain(3)org(0)
UDP response info at 000000883A640200
  Socket = 592
  Remote addr 10.1.0.16, port 57756
  Time Query=2147027, Queued=2147027, Expire=2147032
  Buf length = 0x0200 (512)
  Msg length = 0x002e (46)
  Message:
    XID       0x001e
    Flags     0x8180
      QR        1 (RESPONSE)
      OPCODE    0 (QUERY)
      AA        0
      TC        0
      RD        1
      RA        1
      Z         0
      CD        0
      AD        0
      RCODE     0 (NOERROR)
    QCOUNT    1
    ACOUNT    1
    NSCOUNT   0
    ARCOUNT   0
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(3)myhost(4)mydomain(3)org(0)"
      QTYPE   A (1)
      QCLASS  1
    ANSWER SECTION:
    Offset = 0x001e, RR count = 0
    Name      "[C00C](3)myhost(4)mydomain(3)org(0)"
      TYPE   A  (1)
      CLASS  1
      TTL    1199
      DLEN   4
      DATA   10.1.1.218
    AUTHORITY SECTION:
      empty
    ADDITIONAL SECTION:
      empty

登錄失敗

10/12/2022 9:39:38 AM 0748 PACKET  000000883EE821D0 UDP Rcv 10.1.0.16       3858   Q [0001   D   NOERROR] A      (3)myhost(4)mydomain(3)ORG(0)
UDP question info at 000000883EE821D0
  Socket = 592
  Remote addr 10.1.0.16, port 62365
  Time Query=2146514, Queued=0, Expire=0
  Buf length = 0x0fa0 (4000)
  Msg length = 0x001e (30)
  Message:
    XID       0x3858
    Flags     0x0100
      QR        0 (QUESTION)
      OPCODE    0 (QUERY)
      AA        0
      TC        0
      RD        1
      RA        0
      Z         0
      CD        0
      AD        0
      RCODE     0 (NOERROR)
    QCOUNT    1
    ACOUNT    0
    NSCOUNT   0
    ARCOUNT   0
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(3)myhost(4)mydomain(3)ORG(0)"
      QTYPE   A (1)
      QCLASS  1
    ANSWER SECTION:
      empty
    AUTHORITY SECTION:
      empty
    ADDITIONAL SECTION:
      empty

10/12/2022 9:39:38 AM 0748 PACKET  000000883EE821D0 UDP Snd 10.1.0.16       3858 R Q [8081   DR  NOERROR] A      (3)myhost(4)mydomain(3)ORG(0)
UDP response info at 000000883EE821D0
  Socket = 592
  Remote addr 10.1.0.16, port 62365
  Time Query=2146514, Queued=0, Expire=0
  Buf length = 0x0200 (512)
  Msg length = 0x0067 (103)
  Message:
    XID       0x3858
    Flags     0x8180
      QR        1 (RESPONSE)
      OPCODE    0 (QUERY)
      AA        0
      TC        0
      RD        1
      RA        1
      Z         0
      CD        0
      AD        0
      RCODE     0 (NOERROR)
    QCOUNT    1
    ACOUNT    0
    NSCOUNT   1
    ARCOUNT   0
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(3)myhost(4)mydomain(3)ORG(0)"
      QTYPE   A (1)
      QCLASS  1
    ANSWER SECTION:
      empty
    AUTHORITY SECTION:
    Offset = 0x001e, RR count = 0
    Name      "[C010](4)mydomain(3)ORG(0)"
      TYPE   SOA  (6)
      CLASS  1
      TTL    466
      DLEN   61
      DATA   
        PrimaryServer: (6)pdns07(13)domaincontrol(3)com(0)
        Administrator: (3)dns(5)jomax(3)net(0)
        SerialNo     = 2022083000
        Refresh      = 28800
        Retry        = 7200
        Expire       = 604800
        MinimumTTL   = 600
    ADDITIONAL SECTION:
      empty

答案1

这似乎是针对不存在的记录请求(缓存时不存在)的缓存非权威性引用响应。这可能是正常响应。

您需要查看之前的日志,以查看条件转发器对 myhost.mydomain.org 发出的上一次出站请求期间发生了什么。我怀疑一个有效的缓存条目已经过时,已从缓存中删除,请求进入,条件转发器尝试转发该请求,但权威服务器没有响应,因此转发器改为通过转发器或根提示进行常规查找,并缓存该请求。

它是缓存的,因为您看不到任何来自条件转发器的传出数据包。它是非权威的,因为 DNS 服务器作为条件转发器运行,因此它没有权威区域文件。它是引荐的,因为响应没有应答记录,只有权威记录。

RFC 1034 将此响应描述为主机名输入错误的示例,但这并不是唯一可能发生这种情况的情况。例如,如果记录被删除。

RFC 1034 域名 - 概念和设施

6.2.5. QNAME=SIR-NIC.ARPA,QTYPE=A

如果用户输入了错误的主机名,我们可能会看到这种类型的查询。

C.ISI.EDU 会这样回答:

标头 操作码=查询,响应,AA,RCODE=NE
问题 QNAME=SIR-NIC.ARPA., QCLASS=IN, QTYPE=A
回答 <空>
权威 .SOA SRI-NIC.ARPA.HOSTMASTER.SRI-NIC.ARPA.870611 1800 300 604800 86400
额外的 <空>

此响应表明该名称不存在。此情况在标头的响应代码 (RCODE) 部分中表示。

权威部分中的 SOA RR 是可选的负面缓存信息,它允许使用此响应的解析器假定该名称在 SOA MINIMUM(86400)秒内不存在。

转介响应期望客户端跟进权威服务器以获得权威答案。在这种情况下,结果似乎是它们被定向到外部记录而不是内部记录。

一般而言,如果记录没有输入错误、被删除或受到其他影响,则您的配置是正确的,应该可以正常工作。这可能是一个缺陷,但我不认为是这样。仔细查看其他流量和日志,我怀疑您会发现 DNS 正在按预期工作,即使它不像您预期​​的那样。

话虽如此,虽然条件转发器是一种有效的解决方案,但它们也存在一些弱点。特别是,它要求两个 DNS 服务器在需要(未缓存的)查询时进行通信。如果服务器关闭、LAN 关闭或发生其他通信故障,DNS 查询将失败。请注意,DNS 首先使用 UDP,这不是一种可靠的协议(它“可靠”但不能保证数据将到达目的地)。条件转发器对区域不具有权威性,因此它不能直接以否定响应进行回答。条件转发器仅限于在转发配置中输入的服务器,这些服务器可能少于区域 NS 记录中存在的服务器。

作为替代方案,您的域是否作为单个林加入?从您的命名来看似乎不是,但是如果是这样,请考虑使用 Active Directory 集成 DNS 区域,以便林中的所有 DNS 服务器都是权威的,并通过 Active Directory 包含所有域的完整复制区域。这可能会产生副作用,即条件转发器在与权威服务器通信时更加“实时”,而 Active Directory 副本会因 AD 复制延迟而略微落后。

如果您没有单个林,请考虑使用旧式区域传输副本。与上面的 AD 一样,它会提升 DNS 服务器的权威性并为其提供区域文件的副本。这可以更具弹性,因为转发器不再依赖于在需要查询时与权威服务器进行通信。

相关内容