问题出现得很突然,日志倒是留得挺全。公司内网访问 git.corp.example.com 解析到 203.0.113.20 这个公网地址,流量绕出去再回来,内网直连的 10.0.5.30 反而闲置,抓包能看到请求从公网出口出去又被防火墙挡回。

刚开始盯着「客户端缓存了旧的公网解析,TTL 还没到期」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。内网 DNS 上没有这条记录,递归查询拿到的就是公网权威的 A 记录。另一种情况是权威区里同时存在内外网两条 A,视图没按来源网段匹配。

另外,内网 DNS 把 corp 域也转发到公网,没有配条件转发。

上来先确认答案来自哪台服务器

dig git.corp.example.com | grep -E 'SERVER|ANSWER SECTION' -A2

直接问内网 DNS 有没有内网记录

dig +short git.corp.example.com @10.0.0.2

然后在 BIND 里补一个内网视图

grep -n -A6 'view "internal"' /etc/named.conf && named-checkconf -z /etc/named.conf

末了清掉客户端缓存再验证

resolvectl flush-caches 2>/dev/null || systemd-resolve --flush-caches

别只看报错消失,验证要多做一步。内网机器解析 git.corp.example.com 得到 10.0.5.30,抓包里不再有公网出口的往返,页面打开时间明显下降。

补一句。双视图要保证内网视图里包含全部内网域名,漏一条就回落到公网;改完先 dig 加 @ 指定服务器验证,别被本地缓存骗了。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189