出租窝

内网 DNS 平台(6):IP 溯源与元数据——一次自我纠偏

背景

这一篇是系列里写法最特殊的一篇:它不是"问题→方案"的直线叙事,而是我在设计过程中两次推翻自己的记录。第一次推翻发生在 PTR 上,第二次发生在 TXT 上。两次纠偏的结论都不算惊艳,但思辨过程比结论更有价值——所以我尽量把当时的推理还原出来。

第一版设计:PTR 找人

最初的设计里,IP 反向溯源有两条路:PTR 记录(协议层)和段台账(数据层)。我对 PTR 寄予厚望:拿到一个陌生 IP,dig -x 一下就出名字,从名字就能找到人。

这个想法在个人空间确实成立:

10.42.3.17  →  api.zhangsan.user.xx  →  owner 显然是 zhangsan

第一次纠偏:PTR 不找人

写到一半我自己停住了:这是个人 zone 的命名红利,不是 PTR 的能力。

把场景换到公共 zone:

10.42.3.17  →  payment-api.devops.example.com  →  这是谁的?

payment-api 只是个服务名,不包含任何人。PTR 能告诉你"这是什么",但对"这是谁的"一无所知。我之前把命名规范(个人 zone 带用户名)产生的可追溯性,错误地记在了 PTR 头上。

修正后的分工:

两个结论都很朴素,但顺序很重要:台账登记才是正菜,PTR 是协议甜点。因果不能倒置。

第二次思辨:DNS 当半个 CMDB?

纠偏完 PTR,我又动了另一个念头:既然 DNS 到处都能查、协议标准化,能不能把元数据直接放进 TXT 记录,让 DNS 承担半个 CMDB 的职能?

这个想法有正当的先例:SPF 和 DKIM 用 TXT 发布邮件策略,ACME 用 TXT 做证书验证,SRV 记录发布服务端点——DNS 早就是一个合法的声明式数据存储。我在总纲篇里也写过 _meta TXT 的玩法。

但认真推演后,CMDB 的"半个"卡在三处:

  1. CMDB 的核心是反查聚合。“列出 payments 团队的所有服务"是 CMDB 的日常查询;DNS 是精确的键值查询,没有"列出所有 owner=payments 的记录"这种操作。
  2. 无 schema。TXT 是自由文本,owner=zhangsanOwner: zhangsan负责人=张三 都是合法值,没有校验,没有约束,数据质量随时间腐烂。
  3. 全员可见 + 缓存语义。TXT 里的内容对所有能查 DNS 的人可见,且会被各级缓存——敏感信息和频繁变化的信息都不适合进去。

落地:台账是档案,TXT 是名片

两次思辨的最终落地是一个分层架构:

台账(平台数据库)        = 档案:权威源,支持反查聚合,可含敏感信息,权限受控
TXT 记录(DNS 投影)      = 名片:只读,简短,非敏感,机器免登录可读

实现上这个架构几乎是白送的:平台本来就有投影引擎(数据库 → DNS 记录),在投影 A/PTR 的同时,把 owner、purpose、environment 这几个字段多投影一份 TXT 就行:

_meta.payment-api.devops.example.com. 300 IN TXT "owner=payments-team"
_meta.payment-api.devops.example.com. 300 IN TXT "purpose=支付网关联调"
_meta.payment-api.devops.example.com. 300 IN TXT "environment=prod"

什么信息放名片、什么放档案,我给自己定了一个判断标准:

信息的性质放哪
需要反查聚合(“列出某团队所有服务”)档案
有敏感性(负责人手机、成本、漏洞信息)档案
机器要免登录读取(Agent 启动时发现归属)名片
高频变化(状态、版本、负载)都不放,放监控系统

一句话版本:

DNS TXT 是 CMDB 的只读名片投影,不是本体。

最后

这篇的两个结论:

PTR 解决"这是什么”,不解决"这是谁的"——命名规范带来的可追溯性,不能记在协议头上。

元数据的权威源必须是可反查、可授权、可演化的系统(台账);DNS 只拿一份只读投影。

写下来之后我还想多说一句关于"自我纠偏"本身。设计讨论里被打脸不是坏事——第一版"PTR 找人"如果没被质疑,上线后就会在公共 zone 场景失效,那时改的就是系统而不是文档了。结论被质疑,质疑让设计更精确,这是整个系列里我最想保留的工作方式。

下一篇转向运营视角:平台上线后,护栏、僵尸记录和违规使用怎么管。