ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OneUptime DNS Monitor 实战指南:从 DNS 解析探测到 DNSSEC 校验的完整实现解析

OneUptime DNS Monitor 实战指南:从 DNS 解析探测到 DNSSEC 校验的完整实现解析 OneUptime DNS Monitor 实战指南从 DNS 解析探测到 DNSSEC 校验的完整实现解析【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime本篇基于 OneUptime 官方文档de/monitor/dns-monitor.md展开系统讲解 DNS 监控器的创建流程、全部配置项与监控标准Criteria体系并结合仓库中 Probe 探针服务与公共类型层的真实源码深入剖析 DNS 查询、重试、超时、记录值提取与 DNSSEC 校验的底层实现原理帮助你在理解文档上怎么配的同时掌握代码里怎么跑。一、DNS Monitor 能做什么DNS MonitorDNS 监控器用于持续监测你域名的 DNS 解析健康度与正确性。OneUptime 会定期发起 DNS 查询并将返回结果与你配置好的校验标准逐一比对。官方文档将其定位的适用场景概括为监测 DNS 服务的可用性服务是否在线、能否响应查询校验 DNS 记录是否返回预期的值例如 A 记录是否仍指向正确的 IP追踪 DNS 解析的响应时间趋势验证 DNSSEC 配置是否有效发现 DNS 传播异常或被劫持Hijacking的迹象。从源码结构看这套能力分布在三层前端表单负责收集配置DnsMonitorStepForm.tsx共享类型层定义数据结构与默认值MonitorStepDnsMonitor.tsProbe 探针服务执行真实的网络探测DnsMonitor.ts监控判定则由服务端标准评估器完成DnsMonitorCriteria.ts。二、创建一个 DNS Monitor按官方文档创建流程为进入 OneUptime 控制台的Monitors监控器页面点击Create Monitor创建监控器在监控器类型中选择DNS填入要查询的域名Domain Name和要查询的记录类型Record Type按需配置监控标准Monitoring Criteria决定在线 / 降级 / 离线的判定条件。对应到前端实现DnsMonitorStepForm.tsx 提供了三个基础输入项Domain Name、Record Type、DNS Server并通过一个 Advanced: Port, Timeout and Retries 折叠按钮展开高级选项Port、Timeout (ms)、Retries与文档中的基本设置 高级设置两层结构完全对应。三、配置项详解3.1 基本设置字段说明是否必填Domain Name域名要查询的域名例如example.com映射到配置中的queryName是Record Type记录类型要查询的 DNS 记录类型例如A、MX是DNS ServerDNS 服务器自定义 DNS 服务器例如8.8.8.8留空则使用系统默认映射到配置中的hostname否这些字段在 MonitorStepDnsMonitor.ts 中被定义为MonitorStepDnsMonitor接口并附带一套默认值getDefault()见该文件 L14-L23{ queryName: , // 域名 recordType: DnsRecordType.A, // 默认记录类型 A hostname: , // 默认使用系统 DNS port: 53, // 默认端口 53 timeout: 5000, // 默认 5000 ms retries: 3 // 默认重试 3 次 }3.2 支持的记录类型文档声明支持 10 种记录类型与源码枚举 DnsRecordType.ts 一一对应记录类型说明AIPv4 地址记录AAAAIPv6 地址记录CNAME规范名别名记录MX邮件交换记录NS权威名称服务器记录TXT文本记录SPF、DKIM 等SOAStart of Authority 记录PTR反向解析记录SRV服务定位记录CAA证书颁发机构授权记录值得注意的细节是不同记录类型在探针中被归一化为统一的{type, value, ttl?}结构DnsMonitorResponse.ts但复合记录会被压平成字符串例如MX→优先级 交换主机如10 mail.example.com源码 DnsMonitor.ts L249-L259SRV→优先级 权重 端口 主机名L300-L310SOA→ 七字段空格拼接nsname hostmaster serial refresh retry expire minttlL281-L289TTL 取minttlCAA→critical issueL311-L323。且由于dns.promises.Resolver类型上未暴露resolveCaa源码直接调用独立的dns.promises.resolveCaa(queryName)见 L312 注释。如果你要用DNS 记录值标准做精确匹配需要按上述压平格式书写期望值。3.3 高级设置字段说明默认值Port端口DNS 查询使用的端口号53Timeout (ms)超时等待响应的时间5000Retries重试次数失败后的重试次数3这三个参数在探针查询逻辑中的作用DnsMonitor.tsTimeoutoptions.timeout || config.timeout || 5000L53。代码注释明确指出调用方显式传入的超时优先于配置默认值——这是为了避免步骤级设置被配置默认值静默覆盖的 bug。超时会直接作用于dns.promises.Resolver的构造参数。Port仅当配置了自定义 DNS 服务器且端口非 53 时才会以hostname:port的形式调用resolver.setServers([server])L59-L65未配置自定义服务器时Resolver 使用系统默认解析器。Retries失败后按options.retry ?? config.retries ?? 3递归重试每轮之间固定Sleep.sleep(1000)间隔 1 秒L154-L158。注释特别说明这里用??而非||——调用方显式要求 0 次重试就是 0 次不会被配置默认值救活。每次尝试无论成功或失败都会被记入probeAttempts数组记录尝试序号、发起时间、响应时间与失败原因最终随totalAttempts一起返回给上层为面板上的探测明细提供数据。3.4 超时与其他失败如何区分探针捕获异常后会做二次分类L170-L199若错误信息包含timeout、timed out、etimeout响应中标记isTimeout: truefailureCause为 Request was tried N times and it timed out.否则isTimeout: falsefailureCause记录原始错误信息。这种区分让上层监控面板能够把网络不可达和响应慢两种故障呈现为不同的语义。四、监控标准Criteria在线、降级与离线的判定文档定义的 5 类检查项全部由服务端 DnsMonitorCriteria.ts 中的isMonitorInstanceCriteriaFilterMet方法实现检查项常量定义在 CriteriaFilter.ts 的CheckOn枚举中L97-L102检查项CheckOn说明源码判定逻辑DNS Is OnlineDNS 在线DNS 服务器是否响应查询读取dataToProcess.isOnline做布尔比较L62-L71DNS Response Time (in ms)响应时间单次查询耗时读取dnsResponse.responseTimeInMs做数值比较L74-L95DNS Record Exists记录存在查询是否返回了记录records.length 0L98-L117DNS Record Value记录值记录返回值的字符串/数值匹配遍历所有记录逐条比较数值阈值优先尝试数值比较L142-L184DNSSEC Is ValidDNSSEC 有效DNSSEC 校验是否通过isDnssecValid undefined时返回 null无法判定L120-L139各检查项可用的过滤类型FilterType枚举CriteriaFilter.ts L297-L326布尔型DNS Is Online、DNS Record Exists、DNSSEC Is ValidTrue/False数值型DNS Response TimeGreaterThan、LessThan、GreaterThanOrEqualTo、LessThanOrEqualTo记录值Contains、NotContains、StartsWith、EndsWith、EqualTo、NotEqualTo。其中数值型阈值还会先尝试按数字比较例如把端口号类的记录值与数字阈值对比失败再回退到字符串比较DnsMonitorCriteria.ts L151-L171。两个容易踩坑的实现细节记录存在性检查不依赖记录值匹配。DNS Record Exists只看records数组是否为空。也就是说查询返回了记录但值不符合预期时存在标准仍会判定为真要约束具体值必须使用DNS Record Value。DNSSEC 的三态处理。响应字段isDnssecValid可以是true、false或undefined见 3.6 节探针环境没有dig时即为 undefined。标准评估器对undefined一律返回 null不触发标准避免把无法检测误判为校验失败。4.1 文档给出的示例标准检查 DNS 是否可解析检查项 DNS Is Online过滤类型 True检查 A 记录是否指向正确 IP检查项 DNS Record Value过滤类型 EqualTo值 93.184.216.34DNS 响应缓慢时告警检查项 DNS Response Time (in ms)过滤类型 GreaterThan值 500检查 DNSSEC 是否有效检查项 DNSSEC Is Valid过滤类型 True。五、DNSSEC 校验的底层实现探针端checkDnssec方法DnsMonitor.ts L350-L404的完整链路值得细看入参安全校验先经isValidHostnameOrIP校验queryName与dnsServerIPv4/IPv6/主机名正则长度 ≤ 253防止参数注入——因为这两个值最终会被拼进命令行参数。调用 dig 命令行execFile(dig, [dnssec, queryName, recordType, (dnsServer || 8.8.8.8)])。代码注释解释了为什么这样做Docker 内置 DNS 和许多默认解析器不做 DNSSEC 验证ADAuthenticated Data标志永远不会被置位因此校验固定走一个会验证 DNSSEC 的解析器——用户指定了自定义 DNS 就用它否则回落到 Google Public DNS8.8.8.8。解析 AD 标志用正则/flags:.*\bad\b/i在 dig 输出中匹配AD标志匹配到即认为签名链验证成功。降级策略如果环境里没有dig回调收到 error 后返回undefined而不是抛异常主查询流程捕获后把isDnssecValid置为undefinedL80-L93即未知状态。超时约束DNSSEC 检查复用主查询的timeoutInMs注释说明这是刻意设计——避免慢解析之上再叠加一段更长的等待。六、一次查询的完整数据流把上述片段串起来一次 DNS 监控的完整生命周期是配置落库前端表单提交后配置序列化为MonitorStepDnsMonitorfromJSON/toJSONMonitorStepDnsMonitor.ts L25-L45Probe 执行查询DnsMonitorUtil.query(config, options)创建dns.promises.Resolver、按记录类型分派到resolve4 / resolve6 / resolveCname / resolveMx / resolveNs / resolveTxt / resolveSoa / resolvePtr / resolveSrv / resolveCaaDnsMonitor.ts L203-L327用process.hrtime高精度计时L44、L74-L77随后执行 DNSSEC 检查返回统一响应DnsMonitorResponseDnsMonitorResponse.ts包含isOnline、responseTimeInMs、failureCause、records[]、isDnssecValid?、isTimeout?、probeAttempts[]、totalAttempts服务端评估标准DnsMonitorCriteria将上述响应与每条CriteriaFilter比对输出满足/不满足的判定再交由监控系统聚合为在线/降级/离线状态并触发通知。七、实践建议DNS 服务器选择默认留空走系统解析器适合大多数场景要排查特定区域解析异常时可显式指定某区域公共 DNS但注意此时 DNSSEC 检查也改用该服务器——只有会做验证的解析器才能给出可靠的 AD 标志。记录值匹配格式对 MX/SRV/SOA 使用EqualTo前先按 3.2 节的压平格式确认期望值用Contains通常更稳健例如 MX 记录只校验mail.example.com而不关心优先级。超时与重试的组合效应单次查询超时 5000ms、重试 3 次、间隔 1 秒时最坏情况单次探测会耗时约 5s×4 3s ≈ 23 秒设置监控间隔时应把这一上界考虑在内。环境依赖DNSSEC 校验依赖探测节点安装digbind-utils/dnsutils。无dig时该检查静默降级为未知不会让监控器本身报错。八、相关源码与文档索引官方文档德语App/FeatureSet/Docs/Content/de/monitor/dns-monitor.md同目录结构下另有 en、zh-CN 等 16 个语言版本探针查询实现Probe/Utils/Monitors/MonitorTypes/DnsMonitor.ts监控器配置类型与默认值Common/Types/Monitor/MonitorStepDnsMonitor.ts记录类型枚举Common/Types/Monitor/DnsMonitor/DnsRecordType.ts响应数据结构Common/Types/Monitor/DnsMonitor/DnsMonitorResponse.ts标准评估器Common/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.ts检查项与过滤类型枚举Common/Types/Monitor/CriteriaFilter.ts前端配置表单App/FeatureSet/Dashboard/src/Components/Form/Monitor/DnsMonitor/DnsMonitorStepForm.tsx单元测试Common/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts、Common/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表