![仍有 DNS 转发问题](https://linux22.com/image/781090/%E4%BB%8D%E6%9C%89%20DNS%20%E8%BD%AC%E5%8F%91%E9%97%AE%E9%A2%98.png)
不久前我问过这个问题,但由于有很多主观意见,它被放到了聊天中。
原文信息在此供参考: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 转发”的路径了。
发生的情况是,.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 将此响应描述为主机名输入错误的示例,但这并不是唯一可能发生这种情况的情况。例如,如果记录被删除。
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 服务器的权威性并为其提供区域文件的副本。这可以更具弹性,因为转发器不再依赖于在需要查询时与权威服务器进行通信。