摘要

  • RFC 9726 说明,MUD 文件里的 DNS 名称只是制造商意图;控制器必须把它解析成带有时间、解析器、缓存与地理位置的地址集合,设备看到的集合完全可能不同。
  • 可审计的控制链必须分别保留 MUD 版本与签名、功能名称、设备和控制器的解析器选择、完整 DNS 应答与 TTL、ACL 生成和安装回执、数据包命中、端点身份、固件验证以及设备结果,任何一层都不能替后一层作证。

设备在凌晨完成一次正常的 DNS 查询。制造商没有换掉更新服务的名称,只是 CDN 把这台设备引向了一个新节点。与此同时,MUD 控制器的缓存仍然有效,防火墙里的允许列表也是几小时前从旧应答生成的。设备连接新地址时被拦截,告警系统写下“违反制造商策略”。

这条告警在语法上无懈可击,在事实层面却可能完全错误。设备没有绕开名称,制造商没有撤销服务,解析器没有返回伪造记录,防火墙也没有失灵。错误来自一个被省略的转换:MUD 用名称表达持久意图,执行点却只能对当下的 IP 地址和传输字段作决定。

RFC 9726 的价值正在这里。它把“允许一个名称”拆成一条可以追问的执行链,而不是让一份干净的策略文件替整个系统背书。

名称不是规则,解析是一次有期限的投影

MUD 的吸引力在于让制造商描述设备预期的网络行为。更新、遥测和时间同步可以各自使用制造商控制的功能名称,而无需把未来每一个地址写死。这比把 CDN 节点、IPv4 地址或临时托管位置固化进设备策略更适合长期运维。

但防火墙处理数据包时通常看不到这个名称。它看到源地址、目的地址、端口和协议;HTTPS 路径不可见,共享托管还会让多个服务共用一个地址。控制器必须查询名称、取得地址集合,再把集合编译为实际 ACL。

因此,生成物不是“DNS 策略本身”,而是某个时间点、某个解析器、某个网络位置、某种缓存状态和某个编译版本下的投影。ACL 安装成功只证明一组规则到达了一个执行点。它不能证明设备随后得到相同应答,不能证明地址只服务于那个名称,更不能证明允许访问的端点会交付正确固件。

记录必须保持分层。原始 MUD 字节、签名与授权链是一层;功能名称是一层;DNS 应答、CNAME 链、TTL、解析器身份与查询时刻是一层;生成规则与安装回执是一层;包命中、TLS 身份、应用事务和设备结果又是后续层。若把这些材料压成一个“compliant”字段,调查者将永远无法知道究竟是谁偏离了谁。

两个诚实的解析器可以给出不兼容的现实

最简单的 DNS 轮询只改变完整地址集合的顺序,控制器与设备如果都得到同一全集,顺序并不会改变允许范围。现代流量调度却常常只返回与地点、网络、负载或客户端子网相关的子集。云端控制器从一个地区查询,住宅网关里的设备从另一个地区查询,双方拿到不同但都有效的答案并不反常。

缓存又加入时间差。控制器在九点生成规则,权威服务在九点零四分改变应答;设备所在的递归缓存刚好刷新,控制器的旧 TTL 尚未结束。双方都“遵守 DNS”,但并不共享地址集合。EDNS Client Subnet 还可能把拓扑信息带进选择过程;不同递归服务可以忽略、替换或以不同方式解释它。

RFC 9726 倾向让设备和控制器使用同一个递归解析器,因为共享缓存可以减少地理、集合和 TTL 的分歧。在家庭网关里,解析器、MUD 控制器与防火墙甚至可能共同重启,视图自然更接近。企业或云管理设备队列则困难得多:控制器可能不知道设备使用哪个解析器,也可能无法从设备所在网络发起等价查询。

所以关键指标不是“DNS 成功率”,而是决策组件是否共享一个有意设计的解析视图。若无法共享,就必须记录并调和差异。否则,任何新地址都会被模糊地归类为设备异常。

加密 DNS 改变了见证者

设备若直接使用公网加密 DNS,本地观察者看不到查询内容,隐私的一部分得到改善;外部解析服务则获得了这个视图。问题是,MUD 控制器也可能失去生成相同 ACL 所需的唯一见证。

RFC 9726 建议 IoT 设备优先采用 DHCP 或路由器通告提供的解析器。IPv6 路由器通告可以携带 DNS 配置,网络指定的加密解析器也可以被发现。这样,本地链路可以加密,同时设备和控制器仍共享解析视图。

这并不意味着本地 DNS 永远可信。恶意、故障或完全不可达的本地服务会损害可用性,受控回退有时是必要的。但回退必须有边界:只有在持续的整体故障后启用,周期性重新评估本地服务,并保证回退解析器本身在 MUD 允许范围内。解析器选择影响隐私、策略一致性和业务连续性,它不应成为某个库里无人知晓的默认值。

Oblivious DoH 可以让中继看不到查询内容、目标看不到客户端地址,改善另一种隐私属性。它仍然不会自动告诉控制器,设备下一次连接究竟依据了哪个应答。保密性设计与执行证据解决的是不同问题。

稳定功能名称是协调工具,不是安全证明

制造商应控制 MUD 中使用的名称,并按功能分开。更新、遥测与授时若都藏在一个宽泛托管名称后,操作方就无法单独批准、撤销或调查一种能力。制造商控制的别名可以继续指向 CDN,让后端迁移不必重写每份 MUD 文件。

然而,下游服务的应答行为必须能被策略跟上。极短 TTL、应用协议里临时返回的任意名称、跨越未披露提供商的重定向,以及比控制器刷新更快的地址变化,都会把表面精确的规则变成概率游戏。

相反,过于宽泛的名称会以牺牲含义换取稳定。允许整个共享托管域,也许不再频繁阻断合法流量,却无法证明到达的是制造商对象。IP 字面量也不是捷径:它把变更成本推入固件和 MUD 修订,增加双栈、NAT64、证书命名与应急恢复的困难。

反向解析无法重建丢失的意图。PTR 记录可能不存在,可能属于共享平台,也无法证明设备最初查询的是哪个正向名称。它可以帮助调查,不能在事后把一个流量授权为合规。要保留意图,必须在查询发生时记录正向名称、应答链和投影归属。

误报会吞掉控制本身

RFC 9726 最重要的风险并不在 DNS 数据包里,而在人和组织的注意力里。一个不准确的 MUD 文件或过期投影会不断产生假异常。每次误报都要求有人解释;重复之后,操作人员开始批量放行、永久扩宽规则,最终关闭告警通道。真正的异常随后到来时,制度已经失去相信它的能力。

这不是主张模糊策略,而是要求在正确层面精确。一个从错误解析视角生成的狭窄地址允许表,只是假精确。制造商提供“足够好、略宽但可执行”的描述,有时比理想化却频繁破坏正常运行的策略更安全。目标是一个可信的例外流程,而不是不计运维代价地最大化拒绝。

处理告警时,先分类而不是立即扩权:MUD 是否过期?控制器是否使用不同解析器?应答是否在 TTL 内改变?CDN 是否引入未披露名称?设备是否绕过指定解析器?最新 ACL 是否真的安装?还是设备确实访问了未声明目的地?这些原因分别属于制造商、解析服务、控制器厂商、本地网络或设备,不能全部压成“终端违规”。

允许更新路径不等于获得安全更新

固件把这条边界表现得最清楚。MUD 可以允许设备连接制造商更新服务,DNS 可以正确解析,防火墙可以放行下载。到此为止,证据只说明网络可达。它没有证明端点身份、清单适用于该设备、签名或哈希正确、安装被授权、启动成功,或者失败后仍可回滚。

固件更新架构拥有自己的角色与回执:清单、授权、下载、验证、安装、健康状态和恢复能力。将网络“allowed”视为安全完成,会让控制器替它从未观察的设备状态作证;将一次阻断视为攻击,也可能促使操作方无条件放开所有新地址。

成熟系统至少保存六个时钟:制造商签发 MUD 的时刻、控制器取得并验证它的时刻、控制器查询 DNS 的时刻、应答 TTL 的起止、ACL 编译与激活的时刻,以及设备解析并发包的时刻。固件和应用事件再增加后续时间线。

这样的记录可以得出有限但有用的结论:九点零五分,设备连接了其指定解析器返回的新地址,而防火墙仍执行九点由另一个集合生成的投影。它不能在没有额外证据时宣称制造商遭入侵、CDN 故障、设备被攻破或更新成功。

Lu Heng 的最小初始规范原则为这种分工提供了尺度:MUD 可以标准化可携带的网络行为声明,不必把解析器政策、例外处置与本地风险一并中央化。现实层纪律要求签名策略、DNS 应答、ACL、数据包动作与正常工作的设备各自只承担自己能证明的部分。运行代码优先,则要求运营者把活动解析轨迹、规则哈希与真实设备结果置于漂亮文档之上。

RFC 9726 因此不是一份普通 DNS 卫生建议。它警告的是投影被误当成现实:名称足够持久,可以协调变化;地址集合足够短暂,随时可能失效。良好的治理必须同时保存这两个事实。

资料来源