出租窝

内网 DNS 平台(7):治理与运营——护栏、僵尸与纠偏

背景

第一篇说过"带护栏的自助"。这一篇把护栏和上线后的运营治理写完整:哪些限制该有、哪些限制该砍、记录死了怎么办、记录"活着但不该活"怎么办。

先把治理哲学放在最前面,因为它决定了后面每一条具体规则的形状:

防误填,不防有意——别把人想得太坏。

内网治理的边界是防止误操作,不是防恶意。真要防恶意,一个想绕过平台的人有一百种方法(比如在自己电脑上跑个 dnsmasq,把自己的子域委托出去),平台根本拦不住;而为了拦这一百种方法加的层层校验,会把 九十九个正常用户的自助体验全部拖垮。治理的每一刀,都应该砍在"无心之失"上,而不是砍在"假想敌"上。

护栏四件套

初稿的护栏有六条,定稿时砍成了四条。先看留下的:

  1. 记录类型白名单 + 禁 NS/SOA。个人空间只允许 A、AAAA、CNAME、TXT、SRV。NS 和 SOA 禁掉——允许用户在个人子域里再开委托,等于让他把平台的责任边界撕开一道口子(委托出去的子域解析完全脱离平台控制,失效了平台还不知道,这在安全上叫 dangling delegation)。
  2. 配额。每个个人 zone 的记录数有上限(比如 50 条)。防的是脚本失控和"把个人 zone 当正式服务注册中心用"。
  3. TTL 上下限。默认 300 秒,允许 60~3600。TTL 太短刷权威,太长变更不生效——而用户总是倾向于"我的记录最重要,TTL 给最长",所以需要制度兜底。
  4. 前端提示防呆。建记录时实时校验格式、提示冲突、给默认值。大多数误填在输入框阶段就能拦下来,这是成本最低的护栏。

砍掉的是命名黑名单(不许起某些名字)和记录值强校验(比如强制校验 A 记录的 IP 是否在某段)。砍的理由:个人子域里起什么名字,危害不出自己的圈;值校验误伤面大(合法场景太多),而且防不了有意绕过。这两条都属于"防有意"的投入,按治理哲学砍掉。

治理的两个对象:僵尸,和活着但不该活的

上线后真正要处理的记录有两类,它们的治理动作完全不同。

第一类:僵尸(死的)。长期无查询、无更新、owner 账号已失效的记录。动作是标准三段式:提醒(邮件/IM 通知 owner)→ 冻结(暂停解析,看有没有人喊)→ 回收(删除)。冻结期是关键设计——直接删除的回收会制造事故,先冻结观察的回收几乎不会。

第二类:违规使用(活着但不该活的)。这类是我后来才意识到的:个人 zone 的记录指向生产网段的 IP、流量模式像个正式服务——用户把"试验场"当成了"免费的生产入口"。

对这类记录,治理动作不是删除,而是引导迁移:联系 owner,协助他把服务迁到公共 zone 走正式审批。原因有两层:一是它活着、有真实流量,删了就是生产事故;二是它的存在恰恰说明公共 zone 的流程可能有卡点(是不是审批太慢了?),治理应该顺手修复流程,而不只是消灭症状。

这条规则把"个人 zone = 试验场"从口号变成了可执行的判定:试验场的记录,流量画像应该是稀疏的、临时的;不像试验的,就该去它该去的地方。

还有一个对称的豁免规则:活跃豁免。有持续查询流量的记录自动续期,治理不打扰使用者。回收的矛只对僵尸,活跃的记录永远不用担心被误伤——这是用户敢用平台的前提。

TTL 与递归缓存的调试坑

运营期最高频的"平台 bug 报告",其实都不是平台的 bug:用户改了记录,dig 公司递归查到的还是旧值——递归缓存还没过期。

这类问题的解法是三件套:TTL 默认小(300s 是体验和缓存效率的平衡点)、文档里写明"调试请 dig @权威IP 直连权威"、平台前端提示"变更最长 N 分钟生效"。把预期管理做在前面,工单量能少一半。

数据埋点:治理可以后做,数据必须今天开始

治理逻辑不可能上线第一天就完善,但有一件事必须第一天就做:schema 里把治理需要的数据字段埋好

last_resolved_at(最近被解析时间)、查询计数、owner 账号状态——这些字段在第一天毫无用处,在第一百天是僵尸判定的唯一依据。治理逻辑可以迭代,历史数据补不回来。这条原则我在别的系统上吃过亏,这次写进了 schema 评审的硬要求。

审计:两个层面

审计分两层。操作层:平台的每一次增删改留痕(who/when/what/why),公共 zone 的变更还要关联审批单。数据层:个人 zone 每天自动导出快照进 git——这本来是备份设计(可靠性篇会讲),顺手就成了审计的时间机器:任何一条记录的历史版本,git log 都能翻出来。

最后

治理这一篇的规则都不复杂,复杂的是每条规则背后"防谁"的判断:

护栏防误填,治理防遗忘,两者都不防有意——有意的绕过拦不住,也不必拦。

回收的矛只对僵尸;活着的记录,治理动作是引导,不是删除。

治理逻辑可以后做,治理数据必须从今天开始积累。

到这里,平台的功能面基本讲完了。下一篇换个视角:这套东西挂了怎么办——可靠性设计,以及为什么 MVP 阶段我坦然接受单机。