systemd-resolved DNS 缓存导致的随机连接超时
DNSsystemd-resolved
一次奇怪的线上问题:服务偶发性无法连接上游 API,但 ping 和 dig 都正常。
排查过程
通过 tcpdump 抓包发现,DNS 查询偶尔返回旧的 A 记录(指向已下线的节点),TTL 尚未过期。
根因是 systemd-resolved 缓存了上游 DNS 的 TTL,但上游 DNS 在节点切换时没有正确发出 DNS flush。
解决方案
短期:resolvectl flush-caches 手动清除缓存。
长期:在节点切换脚本中加入 DNS 缓存刷新步骤,并适当降低 TTL:
# 在 DNS 切换后执行
resolvectl flush-caches
# Cloudflare API 设置较短 TTL
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"content":"NEW_IP","ttl":60,"proxied":false}'