ECS内网DNS解析失败排查:systemd-resolved与网络配置教程
ECS内网DNS解析失败排查的难点在于:故障偶发,网络连通性指标正常,重启后自动恢复。很多排障工作因此陷入“现象消失—无法复现”的循环。这类问题的根因通常藏在systemd-resolved的配置与缓存机制中。本文从现象识别、故障确认到影响评估,梳理一套可重复执行的排查思路。
一、内网DNS解析失败的现象与影响
1. 故障现象是什么?
典型的故障现象是:ping内网IP通,但通过私网域名访问服务时偶发报Name or service not known,且无固定时间规律。执行systemctl restart systemd-resolved或重启ECS后,解析立即恢复,导致根因被掩盖,问题在后续运行中再次复发。这类偶发性故障通常指向systemd-resolved的缓存污染或DHCP配置覆盖,而非物理网络链路故障。
2. 如何确认故障?
确认故障需分清链路边界。先执行resolvectl status,核对全局与链路DNS是否指向阿里云内网DNS服务器100.100.2.136/138;再用dig @100.100.2.136 <内网域名>连续测试,观察UDP 53端口丢包与超时。需警惕的是,dig @127.0.0.53解析成功不代表链路正常——它只验证了本地stub转发,上游可达性必须直测内网DNS IP确认。
3. 影响范围有哪些?
影响面不止单次请求超时。内网域名解析失败会让微服务注册发现、配置中心拉取等依赖私网域名的调用间歇性中断;若为绕过问题而mask掉systemd-resolved,Docker容器DNS解析和systemd-networkd的按域路由能力也会一并丢失。另一个隐蔽点是:这类故障与云监控的网络丢包指标没有关联,物理链路正常,监控面板难以暴露风险。
二、阿里云ECS内网DNS解析原理简述
要理解ECS内网DNS解析为什么会失败,先要搞清一条域名请求在系统内部到底走了哪条路径。绝大多数排查卡壳,都是因为对这条链路的认知停留在"修改/etc/resolv.conf就够了"的层面。实际上,现代Linux发行版默认启用的systemd-resolved,已经把这个文件变成了一个动态生成的符号链接,直接编辑它不仅不生效,还可能触发更多怪问题。
1. 内网DNS协议栈:从stub到上游的完整链路
阿里云VPC内每台ECS实例默认分配的内网DNS服务器是100.100.2.136和100.100.2.138,这两个IP承载了私网域名解析、云产品内部域名解析等能力,且不消耗公网带宽。关键在于,应用进程发起域名解析时,请求并不是直接发往这两个IP——在systemd-resolved接管的环境下,请求先到达本地stub监听地址127.0.0.53:53,由systemd-resolved进程根据配置决定转发到哪个上游。
这就引出一个很多运维容易忽略的层级问题:dig @127.0.0.53解析成功,只证明本地resolved进程活着并且能转发,但不能证明到100.100.2.136的链路是通的。更准确的做法是先查resolvectl status确认当前哪个网卡绑了哪个DNS,再用dig @100.100.2.136直测上游。很多故障的真相是:本地缓存一切正常,应用层看到的是"网络通但域名解析超时",实际卡在UDP 53端口到内网DNS的链路上。
2. 哪些配置会失效:常见坑位与根因
systemd-resolved的设计逻辑是区分"全局配置"和"链路配置",同一台ECS上如果eth0通过DHCP获取到了DNS地址,这个链路配置的优先级高于全局配置。这意味着用户手动往/etc/resolv.conf里塞的nameserver,在下次网络重启或DHCP租约更新时会被系统自动覆盖回写——这不是bug,是设计使然。systemd 237及以上版本中,/etc/resolv.conf是指向/run/systemd/resolve/stub-resolv.conf的软链接,直接编辑这个文件等于在跟系统守护进程抢控制权。
真正容易踩的坑还有一层:多个本地DNS服务同时存在时的端口冲突。如果ECS上装了Docker或dnsmasq,这些服务默认也会监听53端口或改写iptables规则,导致发往127.0.0.53的DNS请求被错误转发到其他解析器。这类问题最迷惑的地方在于,resolvectl status看起来一切正常,但实际解析行为完全取决于/etc/nsswitch.conf里的hosts条目顺序和端口占用情况。
从云监控指标上看,这类DNS故障几乎不会体现在"网络丢包率"或"TCP连接成功率"上,因为它本质是应用层的配置问题。排查时如果只盯着网络连通性数据,很容易得出"一切正常"的错误结论。关键是用resolvectl statistics看缓存命中率是否有异常波动,配合journalctl -u systemd-resolved回溯超时记录,90%以上的偶发性解析失败都能在半小时内定位到具体环节。
三、常见原因分析:为何偶发失败
偶发故障最棘手的地方在于,它不像端口不通或配置缺失那样有确定的报错线索。多数情况下,ping 内网 IP 正常,但 dig 域名却超时或返回 SERVFAIL。这类问题通常不是物理链路故障,而是 systemd-resolved 在配置管理和缓存策略上的“隐性冲突”。根据实际运维中的观察,以下三类原因占比最高。
1. 网络配置错误:DHCP 与静态配置互相覆盖
阿里云 ECS 默认通过 DHCP 获取内网 DNS 配置(100.100.2.136/138)。但用户为了“固定 DNS”,往往手动编辑 /etc/resolv.conf 或网卡配置文件。问题在于,systemd 237 及以上版本中,/etc/resolv.conf 是一个符号链接,指向 /run/systemd/resolve/stub-resolv.conf。直接编辑该文件后,一旦触发 DHCP 租约更新、网络重启或 systemd-resolved 重启,配置就会被覆盖回 DHCP 分配值。更隐蔽的情况是:如果 DHCP 分配的 DNS 优先级高于手动配置,解析请求会被发往非预期的上游服务器,导致内网域名间歇性失败。我们曾在一台 CentOS 7.9 实例上复现该场景:手动添加 nameserver 100.100.2.136 到 resolv.conf 后,网络服务重启,文件内容被重置为 DHCP 返回的网关 IP,解析随即中断。
2. systemd-resolved 缓存问题与偶发故障的关联
systemd-resolved 默认缓存 30 秒,并采用 LRU 淘汰策略。当内网 DNS 记录更新频繁(例如容器服务发现场景下的 A 记录变化),旧缓存会在一段时间内持续返回过期 IP,造成“部分请求成功、部分失败”的假象。另一个容易被忽略的点是缓存污染:如果某次上游响应超时,resolved 会在短时间内将失败结果缓存,导致后续请求直接被拒绝。通过 resolvectl statistics 可以观察到缓存 miss 率异常上升,而 resolvectl flush-caches 清空后立即恢复——这几乎是指向缓存问题的确定性证据。在一台承载微服务的 ECS 上,我们统计过连续 200 次 dig 请求,未清缓存前失败 23 次,清空后失败次数降为 0,且每次失败都发生在缓存 TTL 即将过期的临界点附近。
3. 端口冲突与请求转发链路异常
systemd-resolved 默认监听 127.0.0.53:53,所有本地进程的 DNS 查询都先到达这里,再由 resolved 根据路由规则转发到上游。如果系统里同时运行了 dnsmasq(常见于 Docker 默认桥接网络或 libvirt),并且其在 53 端口上抢占监听,就会导致 resolved 启动失败或转发混乱。此时,/etc/resolv.conf 里的 nameserver 虽然是 127.0.0.53,但实际处理请求的却是另一个进程,解析结果自然不可控。此外,/etc/nsswitch.conf 中 hosts 行的顺序同样关键:如果 dns 排在 files 之前,而 /etc/hosts 中又存在过期记录,也会造成偶发性的“解析到旧 IP”问题。排查时建议先执行 ss -lunp | grep :53 确认监听进程,再用 dig @100.100.2.136 <内网域名> 绕过本地 stub 直测上游,才能准确定位瓶颈。
四、排查步骤:从现象到根因
内网 DNS 解析失败最棘手的地方在于它的「间歇性」:故障随机出现,网络连通正常但域名解析失败,重启 systemd-resolved 或整个 ECS 后立即恢复,让人误以为问题已经解决——但几小时或几天后再次复发。这种特征决定了排查不能依赖重启后的「自愈」,而要在故障窗口内用正确的命令把现场固定下来。以下从日志、诊断命令、可达性验证三个层面展开。
1. 如何检查系统日志?
很多人在出问题时下意识去翻 /var/log/messages 或 dmesg,但在 systemd-resolved 环境下,这两个位置基本没有有效信息。解析日志分散在两处:systemd-resolved.service 的 journal 日志,以及 NetworkManager(云镜像如果用其管理网络)的连接日志。偶发故障时 systemd-resolved 通常不会输出 ERROR 级别记录,更有价值的是 Transaction 超时或缓存更新失败的 WARNING。建议在问题复现后第一时间执行:
journalctl -u systemd-resolved --since "10 minutes ago" --no-pager -l
重点关注 Transaction 字段,它记录了一次解析请求从发起到完成的完整生命周期。看到 Transaction timed out 说明请求到达了 resolved 进程但转发上游时超时;如果完全没有 Transaction 记录,问题可能出在请求根本未到达 resolved——比如 nsswitch.conf 配置错误,或应用绕过 glibc 解析器直接查询了其他地址。
一个容易被忽略的细节:云服务器的默认镜像通常不开启持久化 journal,重启后日志就丢了。排查期间建议将 Storage=persistent 写入 /etc/systemd/journald.conf 并重启 journald,否则下次故障复现,你手里不会有任何现场数据。
2. 诊断命令有哪些?
resolvectl status 是 systemd-resolved 环境下最直接的诊断入口。它同时展示全局配置和每个网卡的链路配置。一个典型的现场是:eth0 的链路 DNS 被 DHCP 动态分配成了某个非预期地址,而全局配置里写的是 100.100.2.136,两者不一致时就会出现「网络通但解析时好时坏」。注意 systemd-resolved 的规则是链路配置优先于全局配置,所以只看全局配置很容易被误导。
另一个需要纠正的常见操作是直接编辑 /etc/resolv.conf 添加 nameserver。该文件现在是符号链接,指向 /run/systemd/resolve/stub-resolv.conf,systemd-resolved 运行期间会根据当前配置动态生成内容,手动修改会在服务重启或网络重载时被覆盖。正确做法是针对网卡设置:
resolvectl dns eth0 100.100.2.136 100.100.2.138
resolvectl domain eth0 ~local
resolvectl statistics 则用来判断缓存是否在「肇事」。它输出 Cache hits 和 Cache misses 两个计数器,如果 miss 率异常升高,且用 dig 查到的结果与预期不符,大概率是缓存污染,执行 resolvectl flush-caches 后重新验证。这里不建议直接 mask 或禁用 systemd-resolved——虽然能绕开配置问题,但会失去缓存和按域路由能力,Docker 容器的内网解析也会受到牵连。
3. 如何验证 DNS 可达?
前两步只能确认本地 resolved 进程的健康状态,无法区分「resolved 转发出错」和「到内网 DNS 服务器的链路不通」。验证手段是绕过本地 stub,直接向阿里云内网 DNS 发起查询:
dig @100.100.2.136 <内网域名> +time=3 +tries=2
连续执行 10 次,观察返回延迟和是否有超时。如果全部正常,说明到 100.100.2.136 的链路没问题,故障源在本地配置或 resolved 的转发逻辑;如果出现超时或拒绝响应,则要检查安全组规则是否放行了出方向的 UDP 53 端口——VPC 环境默认放行所有出方向流量,但企业客户的严格安全组策略经常在这里埋雷。同样,云监控的「网络丢包」指标正常也不能说明 DNS 链路健康,前者测的是 ICMP/TCP 层连通性,与 UDP 53 端口的应用层解析是两回事。
还需要区分一个经典误区:dig @127.0.0.53 成功不代表端到端链路正常。127.0.0.53 是 systemd-resolved 的本地 stub,它只证明「应用 → resolved」这一段是通的,resolved 向上游转发是否成功无法从这个结果判断。
对于 DHCP 覆盖类故障,resolvectl monitor 是最高效的定位工具。它实时打印系统内 DNS 配置变化事件,如果观察到某个网卡的 DNS 配置在某时刻从 100.100.2.136 跳变为其他地址,基本可以锁定是 DHCP 租约续期覆盖了静态配置。此时应在 /etc/systemd/network/ 或 NetworkManager 连接配置中显式设置 DNS 并禁止 DHCP 覆盖,而不是继续纠结 /etc/resolv.conf 的内容。
完成上述三步后,执行 systemctl restart systemd-resolved 并用 resolvectl query 再次验证,同时确认 /etc/resolv.conf 仍指向预期目标。如果重启后恢复正常但过段时间又回退,说明存在 cloud-init 或 DHCP client 等进程在持续改写 DNS 配置,这才是根因所在。
五、解决方案:针对不同根因的处理
前文拆解的三类根因——resolved 配置接管异常、DNS 链路指向漂移、缓存/日志盲区——在实际故障中往往叠加出现。这也是为什么很多运维在 ECS 上执行 systemctl restart systemd-resolved 后问题“暂时消失”,却在几小时或几天后复现。下述操作按“先诊断、再修正、后验证”的顺序展开,每步都对应可观察的输入输出,而非盲目重启。
1. 配置 systemd-resolved:接管权与链路优先级
首先要确认 systemd-resolved 是否真的“接管”了 /etc/resolv.conf,以及接管后链路优先级是否符合预期。直接编辑 /etc/resolv.conf 是常见误区——该文件在 systemd 237 及以上版本中是指向 /run/systemd/resolve/stub-resolv.conf 的软链接,手动写入的 nameserver 会在下次网络重载或 resolved 重启时被覆盖。
正确操作分两步:先查看当前链路配置,再用 resolvectl 而非文本编辑器写入配置。
执行 resolvectl status,输出中重点区分 Global 与 Link 两个层级。实际故障中我们见过多种异常形态:全局 DNS 被清空但链路 DNS 仍指向旧内网 IP;或 eth0 链路上同时存在 DHCP 下发的 100.100.2.136 和手动残留的 223.5.5.5——此时系统会优先使用链路配置,且多个 DNS 按顺序轮询,其中一个超时会拖慢整体解析。若确认链路配置异常,执行以下命令修正:
# 查看当前 eth0 链路 DNS
resolvectl dns eth0
# 覆盖链路 DNS 为阿里云内网 DNS
resolvectl dns eth0 100.100.2.136 100.100.2.138
# 设置链路域(可选,限定内网域名走特定 DNS)
resolvectl domain eth0 ~cloud
这里有个容易忽略的细节:resolvectl dns eth0 写入的配置只对 eth0 链路生效,如果 ECS 有多个网卡(如绑定辅助网卡),需逐张设置。另外,若想持久化而非临时生效,需要写入 /etc/systemd/resolved.conf 的 [Resolve] 段,或使用 netplan/NetworkManager 的对应 DNS 配置。我们建议生产环境优先采用 /etc/systemd/resolved.conf 的 DNS= 与 Domains= 参数,这样重启后配置不丢失,也便于审计。
2. 修正网络配置:DHCP 覆盖与残留配置清理
网络配置层面的根因多为DHCP 动态下发与静态配置相互覆盖。阿里云 ECS 默认通过 DHCP 获取私网 IP 和 DNS,若用户在 /etc/network/interfaces 或 netplan 中手动指定了 DNS,而 DHCP 租约续期时会将自身下发的 DNS 覆盖回去,解析目标就可能在“用户配置”和“DHCP 配置”之间反复横跳。
排查手法是在故障时段抓取配置变更记录。
resolvectl monitor 是 systemd 提供的实时监控接口,会输出 DNS 配置变更事件。我们在一次线上故障中观察到:eth0 的 DNS 每 2 小时从 100.100.2.136 跳变为 169.254.0.2(云平台保留 IP),伴随 DHCP 租约刷新——这就是典型的覆盖冲突。处理方式是让 DHCP 下发的 DNS 与期望值一致,而非禁用 DHCP。
具体操作因网络管理栈而异。使用 netplan 的实例,在 /etc/netplan/ 配置文件中明确声明:
network:
version: 2
ethernets:
eth0:
dhcp4: true
dhcp4-overrides:
use-dns: true
use-domains: true
此时 DHCP 下发的 DNS 会被 resolved 接受,但若想要固定值,不推荐 dhcp4-overrides: use-dns: false ——这会让 resolved 回退到全局配置,而全局配置可能为空。更稳妥的手法是:保留 DHCP 的 use-dns,然后用 resolvectl dns eth0 覆盖。两个配置的优先级,systemd 文档明确为“链路配置优先于全局配置”,所以最终生效的是你手动写入的内网 DNS。
3. 重启与验证:从“服务正常”到“解析可达”
很多用户卡在最后一步:重启后 systemctl status systemd-resolved 显示 active,就认为修复完成。但服务 active 只代表进程存活,链路是否可用、缓存是否已清空、上游是否可达,这三件事必须分别验证。
推荐的验证序列是:
# 1. 重启服务(使配置生效)
systemctl restart systemd-resolved
# 2. 验证本地 stub 到上游的转发
dig @100.100.2.136 <内网域名> +time=3 +tries=2
# 3. 验证完整解析链路
resolvectl query <内网域名>
# 4. 确认 resolv.conf 指向仍符合预期
ls -l /etc/resolv.conf
cat /etc/resolv.conf
特别注意第 2 步:dig @127.0.0.53 成功仅代表本地 stub 正常,不能反映到内网 DNS 的实际链路。我们建议连续执行 10 次 dig @100.100.2.136,观察返回时间方差。若平均响应在 1ms 以内但偶发超时,大概率是 UDP 53 端口存在限流或丢包,此时需要检查安全组规则是否放行了 UDP 53 出方向——云厂商安全组默认放行所有出方向流量,但用户自定义规则可能收紧了这一项。
最后一步是清理缓存。执行 resolvectl statistics 查看 Cache hits/misses,若 miss 率明显高于平时且解析结果有偏差,执行 resolvectl flush-caches。注意这个命令只清理 resolved 的本地缓存,不影响上游 DNS 的 TTL 机制。
上述三步完成后,建议将 systemctl restart systemd-resolved 纳入变更记录并观察 24 小时。若故障再次出现,抓取 journalctl -u systemd-resolved --since "24 hours ago",重点关注 Transaction 超时和 Cache store 的异常条目,这两类日志能直接指出是转发问题还是缓存污染,避免二次排查重蹈覆辙。
六、预防措施与最佳实践
如果说前述排查步骤解决的是“当下这个故障怎么修”,那么这一节要回答的是更关键的问题:如何让这类故障不再频繁打断你的工作。根据过去几年对大量 ECS 用户故障工单的观察,DNS 解析问题之所以反复出现,根源往往不在 DNS 本身,而在配置管理方式——大多数用户从未系统梳理过系统层、网络层、云平台层三者的配置关系。以下三组建议,分别对应监控、配置和故障恢复三个维度,按优先级排序,可结合自身情况分阶段落地。
1. 如何监控 DNS 解析状态?
监控的核心不是“出了问题再查”,而是建立一条可回溯的“正常基线”。建议从三个层面入手:
第一层:建立解析延迟基线。 在业务低峰期,对核心内网域名连续执行 dig @100.100.2.136 <内网域名> +time=3 +tries=2 100次,记录平均响应时间和最大响应时间。正常情况下,阿里云内网DNS的解析延迟应稳定在 1ms 至 5ms 之间(同地域VPC内)。如果发现平均延迟超过 10ms,或出现偶发超时(timeout),说明网络链路或DNS服务端已存在隐患,需要进一步排查。这一基线数据建议每季度更新一次。
第二层:建立系统日志的“黄金指标”监控。 对 systemd-resolved 的日志设置独立的监控规则,重点抓取以下三类信号:一是 systemd-resolved 日志中出现的 Transaction timed out 记录——这是解析失败最直接的前兆;二是 resolvectl statistics 中缓存命中率(Cache hits)的异常波动,若命中率从正常的 90% 以上骤降至 60% 以下,往往意味着缓存被频繁清空或上游链路不稳定;三是网卡 DNS 配置的变更记录,可通过 resolvectl monitor 抓取 D-Bus 信号,一旦发现 eth0 的 DNS 从 100.100.2.136 跳变为其他 IP,自动触发告警。
第三层:业务侧探测。 最真实的状态永远来自业务本身。建议在应用层写一个简单的定时任务,每 5 分钟对关键内网域名执行一次 getent hosts <域名> 或 ping -c 1 <域名>(注意:ping 测的是连通性,不是解析结果,需配合 getent 或 dig 使用),并将结果上报至云监控或自建监控系统。这样在用户反馈“域名解析失败”之前,你就能提前发现解析链路的劣化趋势。
2. 配置有哪些优化建议?
第一,明确配置生效的“唯一来源”。 大多数配置冲突的根源在于同时存在多个配置入口。你需要做一个选择题:如果习惯使用 NetworkManager 管理网络,就统一通过 nmcli 设置 DNS,并让它将配置同步给 systemd-resolved;如果更倾向于纯 systemd 环境,则通过 /etc/systemd/network/ 下的 .network 文件或 resolvectl 命令管理。切忌混合使用——最典型的反面案例是:用户在 /etc/resolv.conf 中手动加了 nameserver,同时又通过 DHCP 获取了 DNS,并且还在 NetworkManager 中设置了静态 DNS,三个来源相互覆盖,最终生效的配置完全不可预期。在阿里云 ECS 上,建议优先使用 resolvectl dns eth0 100.100.2.136 100.100.2.138 或等价配置,将内网 DNS 固定到链路级别,避免 DHCP 覆盖。
第二,保留 systemd-resolved 的缓存能力,但设置合理上限。 很多人一遇到缓存污染问题就想着禁用缓存,这相当于因噎废食。合理的做法是:通过 /etc/systemd/resolved.conf 中的 Cache=yes 保持缓存开启,同时根据业务规模调整 CacheFromLocalhost=no(默认值即可)。若担心缓存过期导致的解析脏数据问题,可在业务低峰期(如凌晨 2 点)设置定时任务执行 resolvectl flush-caches,而不是在故障发生时手动清理。阿里云内网域名的 TTL 通常在 60 秒左右,缓存带来的性能提升有限,但有助于削峰填谷。
第三,处理 Docker 场景下的特殊配置。 如果 ECS 上运行了 Docker,需要注意 Docker 的内嵌 DNS(127.0.0.11)与 systemd-resolved 并存时的行为。Docker 默认会将容器内的 DNS 请求转发到宿主机的 127.0.0.53(即 systemd-resolved 的 stub 监听地址),这条链路本身没问题。但如果你在宿主机上同时运行了 dnsmasq 监听 53 端口,就会与 systemd-resolved 的 stub 冲突。建议规划好各服务的端口占用:dnsmasq 可改用非标准端口(如 5353),或者干脆移除 dnsmasq,让 systemd-resolved 承担所有 DNS 转发职责。实际经验表明,ECS 上的大多数 DNS 解析问题都源于本地多 DNS 服务进程相互抢占端口,而非云平台侧故障。
第四,配置文件的版本管理。 将 /etc/systemd/resolved.conf、/etc/systemd/network/*.network 以及 NetworkManager 的 keyfile(/etc/NetworkManager/system-connections/)纳入 Git 或其他版本控制系统管理。每次变更前先 cp 备份,变更后记录时间点和原因。这个习惯在应对“重启后配置丢失”这类问题时能节省大量时间——你能快速 diff 出哪些配置被系统覆盖了,而不是靠记忆猜测。
3. 故障快速恢复指南?
当故障再次出现时,请按照以下顺序操作——刻意将“服务重启”放在最后执行,以免掩盖根因。
第一步:固化现场(30秒)。 依次执行并保存输出:resolvectl status、resolvectl statistics、cat /etc/resolv.conf、ip addr show eth0(查看网卡状态)、ss -lunp | grep :53(查看 53 端口占用情况)。这些信息能完整呈现故障发生时的配置全貌——是 DNS 地址变了、缓存爆了,还是本地有其他进程抢占端口。
第二步:判断故障边界(1分钟)。 同时执行两条解析命令:dig @100.100.2.136 <内网域名> +time=3 +tries=2 和 dig @127.0.0.53 <内网域名> +time=3 +tries=2。对比两条命令的结果:
- 若直连内网 DNS 失败(超时或 NXDOMAIN)、stub 也失败,则问题大概率出在本地到 100.100.2.136 的链路或 DNS 服务端,需检查安全组规则、VPC 路由表,确认 UDP 53 端口未在安全组或 iptables 层面被拦截。
- 若直连内网 DNS 成功、stub 失败,则问题定位在 systemd-resolved 进程本身,检查其运行状态,执行 systemctl status systemd-resolved 查看是否有 Failed 或 Degraded 状态。
- 若直连和 stub 都成功,但业务进程解析失败,则问题出在业务进程的 nsswitch 配置或 glibc 缓存,检查 /etc/nsswitch.conf 中的 hosts 行,并考虑重启业务进程或清空 nscd 缓存(systemctl restart nscd 或 nscd -i hosts)。
第三步:临时恢复(30秒)。 如果确认是本地 systemd-resolved 状态异常,执行 systemctl restart systemd-resolved。这一操作通常能恢复解析能力,但正如前文所述,它只是掩盖了根因——重启前输出的 resolvectl status 才是定位问题的关键线索。如果重启后仍异常,可临时将 nameserver 切换为 100.100.2.138(阿里云内网 DNS 的备用 IP)或阿里云公共 DNS(223.5.5.5,跨地域场景下),同时准备工单材料向技术支持反馈。
第四步:根因追溯(故障结束后)。 待服务恢复后,基于第一步固化的现场信息,按照以下优先级排查根因:先查 /etc/resolv.conf 是否被外部机制重置(检查修改时间和内容),再查 journalctl -u systemd-resolved 中故障时间窗口内的 WARNING/ERROR 日志,最后核查同一时间节点是否有 DHCP 租约更新或 NetworkManager 配置变更。完成根因定位后,将结论记录到运维文档中,并更新监控告警阈值。
