Ubuntu 22.04 无法连接外部网络的故障排查与解决
在一次例行巡检中遇到一台 Ubuntu 22.04 服务器无法访问外部网络,但本地网络与内网服务正常。通过本文分享'DNS 配置导致无法访问外网'的完整排查思路和解决方案。
针对 Ubuntu 22.04 服务器无法访问外网但能 Ping 通 IP 的故障,分析原因为 DNS 配置缺失或错误。排查流程包括验证网络连通性、测试 DNS 解析状态、检查 systemd-resolved 及 Netplan 配置。解决方案为修正 Netplan YAML 中的 nameservers 地址列表,确保包含内网及公网 DNS 服务器,并重启相关服务。同时提供了 DNS over TLS 等进阶安全配置建议及性能对比数据。

在一次例行巡检中遇到一台 Ubuntu 22.04 服务器无法访问外部网络,但本地网络与内网服务正常。通过本文分享'DNS 配置导致无法访问外网'的完整排查思路和解决方案。
监控到一台 Ubuntu 22.04 服务器网络异常:
ping 8.8.8.8 成功,丢包率 <1%ping www.google.com 失败,提示 Temporary failure in name resolutioncurl http://example.com 报 DNS 解析错误初步判断是 DNS 解析问题。
| 项目 | 配置/参数 |
|---|---|
| 服务器型号 | Dell PowerEdge R650 |
| CPU | 2× Intel Xeon Gold 5318Y @ 2.10GHz |
| 内存 | 64GB DDR4 |
| 存储 | 2× 1TB NVMe SSD(RAID1) |
| 操作系统 | Ubuntu 22.04.3 LTS x86_64 |
| 核心网络 | 2×10Gbps CN2 高速链路 |
| 内网 DNS | 10.0.0.53(Bind9 + 转发) |
| 外网 DNS | 8.8.8.8 / 1.1.1.1 |
| 网络管理 | Netplan + systemd-resolved |
# 验证外网 IP 可以连通
ping -c 5 8.8.8.8
# 检查默认路由
ip route show
现场输出:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 5 packets transmitted, 5 received, 0% packet loss
确认 外网链路正常。
# 使用 dig 明确测试 DNS 服务器解析
dig @10.0.0.53 example.com
dig @8.8.8.8 example.com
# 测试 systemd-resolved 当前解析状态
resolvectl status
输出显示:
;; connection timed out; no servers could be reached
表明 DNS 无响应。
Ubuntu 22.04 默认使用 systemd-resolved 和 netplan 管理网络和 DNS:
# 查看 systemd-resolved 状态
systemctl status systemd-resolved
# 查看当前 Netplan 配置
cat /etc/netplan/00-installer-config.yaml
错误的 Netplan 配置示例:
network:
ethernets:
ens160:
dhcp4: false
addresses: [10.0.0.10/24]
gateway4: 10.0.0.1
nameservers:
addresses: []
# ❌ 空 DNS
version: 2
空 nameservers 会导致解析请求丢失。
在 Ubuntu 22.04 中:
/etc/resolv.conf 通常为指向 /run/systemd/resolve/stub-resolv.conf编辑 /etc/netplan/00-installer-config.yaml:
network:
version: 2
ethernets:
ens160:
dhcp4: false
addresses: [10.0.0.10/24]
gateway4: 10.0.0.1
nameservers:
search: [example.local]
addresses: [10.0.0.53, 1.1.1.1, 8.8.8.8]
保存后应用:
netplan generate
netplan apply
resolvectl status
示例输出:
Global Protocols: +LLMNR +mDNS +DNSOverTLS
DNSSEC=no/unsupported
resolv.conf mode: stub
Link 2(ens160)
Current Scopes: DNS
DefaultRoute setting: yes
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: opportunistic
DNS Servers: 10.0.0.53 1.1.1.1 8.8.8.8
DNS Domain: example.local
说明 DNS Server 配置已正确下发。
我们对不同 DNS 配置进行响应时间和成功率测试(使用 dig 并统计 100 次查询平均延迟):
| DNS 服务器 | 平均响应时间 (ms) | 成功率 |
|---|---|---|
| 10.0.0.53(内网) | 12.4 | 100% |
| 1.1.1.1(Cloudflare) | 15.2 | 100% |
| 8.8.8.8(Google DNS) | 18.7 | 100% |
评测命令示例:
for i in {1..100}; do
dig @10.0.0.53 example.com +time=1 +tries=1 +stats | grep "Query time" >> dns_local.txt
done
如上表所示,内网 DNS 性能优于公网 DNS。
systemd-resolved 启动若服务未启动:
systemctl enable --now systemd-resolved
/etc/resolv.conf 非指向 stub有时存在错误的软链接:
# 重新建立正确的软链
rm /etc/resolv.conf
ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
若需要启用 DNS over TLS 以增强安全性:
修改 Netplan:
nameservers:
addresses: [1.1.1.1]
options:
edns0: true
rotate: true
并启用:
resolvectl dns ens160 1.1.1.1
resolvectl edns ens160 yes
在 Ubuntu 22.04 中常见'无法访问外网'的问题,很大一部分情况是DNS 配置错误或丢失导致。本文通过现场故障复现,从现象定位、底层原理、具体配置、工具验证到性能评测,一步一步教你排查与解决:
/etc/resolv.conf 是否正确链接如果现场遇到类似问题,按照本文步骤逐项检查,一般能在 30 分钟内定位并解决问题。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online