一次 DNS 事故
2026.1.14
事故描述:
本地 flask 服务运行在 5000 端口,由 nginx 代理接受外部服务, 因此 ufw 无需开启 5000 端口。
本地端口测试 200 无异常
curl -I http://127.0.0.1:5000/同时 cloudflare 中已经开启 DNS,A记录
auth.oridinis.dev→3.132.25.89但是服务器端测试:
curl -I https://focus.ordinis.dev/报错
curl: (6) Could not resolve host: focus.ordinis.dev
我们的解决流程如下:
很显然问题为:域名根本没解析(DNS 解析失败),所以浏览器/curl 都找不到 focus.ordinis.dev。
报错原因显示的意思为 DNS 查询不到记录(或你本机 DNS 环境阻断了)。
验证 Nginx 是否在 443 起服务
sudo ss -lntp | grep -E ':80|:443'
LISTEN 0 4096 127.0.0.1:8081 0.0.0.0:* users:(("docker-proxy",pid=150303,fd=7)) LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=176268,fd=5),("nginx",pid=176267,fd=5),("nginx",pid=89866,fd=5)) LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=176268,fd=13),("nginx",pid=176267,fd=13),("nginx",pid=89866,fd=13))
Nginx 服务没有问题
在服务器上验证 DNS 是否解析
getent hosts focus.ordinis.dev
能输出 IP 才算解析成功。结果发现没有输出。那么说明要么是
- Cloudflare 记录 没加/没生效
- 你服务器 DNS resolver 有问题(最常见:
/etc/resolv.conf指向了坏的 DNS,或 systemd-resolved 异常) - 你在服务器上用的是“只查本机 hosts/本地 DNS”的路径,没有真正去公网 DNS 查询(比如 NSS 配置不正常,但更少见)
第一种情况:Cloudflare 侧的问题
在你的 本地电脑(不是服务器)跑:
nslookup focus.ordinis.dev
Server: 66.253.214.16 Address: 66.253.214.16#53 Non-authoritative answer: Name: focus.ordinis.dev Address: 104.21.13.162 Name: focus.ordinis.dev Address: 172.67.156.201
能解析,说明 Cloudflare 没有问题。
第 二种情况:DNS resolver 有问题
在服务器上快速定位 DNS 到底卡在哪
看 resolv.conf 指向谁
cat /etc/resolv.conf
nameserver 127.0.0.53
options edns0 trust-ad
search us-east-2.compute.internal
理想情况(systemd-resolved)通常会看到类似:
nameserver 127.0.0.53- 或者直接是公网 DNS(1.1.1.1/8.8.8.8)
如果你看到的是奇怪内网 IP、空的、或根本不可达的地址,就是问题。
目前输出表示:所有 DNS 查询 → 交给 systemd-resolved 的本地 stub,
⚠️ 这是没有问题的,但前提是:systemd-resolved 必须知道要把请求转发给谁
直接绕过系统 resolver,测试 DNS 本身是否可用
sudo apt update
sudo apt install -y dnsutils
dig @1.1.1.1 focus.ordinis.dev +short
dig @8.8.8.8 focus.ordinis.dev +short
172.67.156.201
104.21.13.162
104.21.13.162
172.67.156.201
这两个 IP 是 Cloudflare Anycast IP, 所以不是 Cloudflare,不是 DNS 传播,不是网络的问题
由此可以判断,服务器“能访问公网 DNS(1.1.1.1 / 8.8.8.8)”,但“不能用本机 resolver 解析”
因此问题为 systemd-resolved :
- 没有 uplink DNS
- 或 uplink DNS 是某个 AWS 内网 DNS / 已失效地址
- 或 DHCP 没正确下发 DNS
这是 Ubuntu + systemd-resolved 的经典坑:
/etc/resolv.conf→ 指向 127.0.0.53(stub)- 但:
- netplan / DHCP 没有给 DNS
- 或云厂商 metadata DNS 不可达
- 于是:
- stub 存在
- 但 没有真正的递归 DNS
所以结果就是:
dig @1.1.1.1 可以
dig focus.ordinis.dev 不行
解决方案
Step 1:明确告诉 systemd-resolved 用哪些 DNS
sudo mkdir -p /etc/systemd/resolved.conf.d
sudo tee /etc/systemd/resolved.conf.d/dns.conf >/dev/null <<'EOF'
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
Domains=~.
EOF
解释:
DNS=:主 DNSFallbackDNS=:兜底Domains=~.:所有域名都走这些 DNS(非常关键)
Step 2:重启 resolved
sudo systemctl restart systemd-resolved
Step 3:确认状态(这一步很重要)
resolvectl status
你应该看到类似:
Global
DNS Servers: 1.1.1.1 8.8.8.8
Fallback DNS Servers: 9.9.9.9
Step 4:立刻验证
getent hosts focus.ordinis.dev
curl -I https://focus.ordinis.dev/
这两条现在一定会成功。