Ubuntu 22.04 无法连接外部网络的故障排查与解决(解决 DNS 配置问题)

我在一次例行巡检中遇到了这样一个棘手的问题:一台 Ubuntu 22.04 服务器无法访问外部网络,但本地网络与内网服务正常,ping 外网 IP OK,却无法解析域名。通过本篇文章,我将结合真实现场数据、命令示例、配置细节以及评测表格,分享"DNS 配置导致无法访问外网"的完整排查思路和解决方案。


一、问题现象描述

在香港数据中心机房www.a5idc.com内,我们监控到一台 Ubuntu 22.04 服务器网络异常:

  • ping 8.8.8.8 成功,丢包率 <1%
  • ping www.google.com 失败,提示 Temporary failure in name resolution
  • curl http://example.com 报 DNS 解析错误
  • 内网 DNS 服务器(如 10.0.0.53)可达

初步判断是 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

三、故障排查流程

3.1 网络连通性确认

bash 复制代码
# 验证外网 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

确认 外网链路正常


3.2 DNS 解析测试

bash 复制代码
# 使用 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 无响应


3.3 检查 systemd-resolved 与 Netplan

Ubuntu 22.04 默认使用 systemd-resolvednetplan 管理网络和 DNS:

bash 复制代码
# 查看 systemd-resolved 状态
systemctl status systemd-resolved

# 查看当前 Netplan 配置
cat /etc/netplan/00-installer-config.yaml

错误的 Netplan 配置示例:

yaml 复制代码
network:
  ethernets:
    ens160:
      dhcp4: no
      addresses: [10.0.0.10/24]
      gateway4: 10.0.0.1
      nameservers:
        addresses: []   # ❌ 空 DNS
  version: 2

nameservers 会导致解析请求丢失。


四、DNS 原理与解决方案详解

4.1 Ubuntu 22.04 的 DNS 架构

在 Ubuntu 22.04 中:

  • Netplan 负责解析 YAML 配置 → 生成 systemd-networkd 配置
  • systemd-resolved 负责 DNS 解析服务
  • /etc/resolv.conf 通常为指向 /run/systemd/resolve/stub-resolv.conf

4.2 正确的 Netplan 配置示例

编辑 /etc/netplan/00-installer-config.yaml

yaml 复制代码
network:
  version: 2
  ethernets:
    ens160:
      dhcp4: no
      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]

保存后应用:

bash 复制代码
netplan generate
netplan apply

4.3 验证 DNS 配置是否生效

bash 复制代码
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%

评测命令示例:

bash 复制代码
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。


六、常见误区与进阶设置

6.1 遗漏 systemd-resolved 启动

若服务未启动:

bash 复制代码
systemctl enable --now systemd-resolved

6.2 /etc/resolv.conf 非指向 stub

有时存在错误的软链接:

bash 复制代码
# 重新建立正确的软链
rm /etc/resolv.conf
ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

6.3 DNS over TLS

若需要启用 DNS over TLS 以增强安全性:

修改 Netplan:

yaml 复制代码
nameservers:
  addresses: [1.1.1.1]
  options:
    edns0: true
    rotate: true

并启用:

bash 复制代码
resolvectl dns ens160 1.1.1.1
resolvectl edns ens160 yes

七、总结

在 Ubuntu 22.04 中常见"无法访问外网"的问题,很大一部分情况是DNS 配置错误或丢失导致。本文通过现场故障复现,从现象定位、底层原理、具体配置、工具验证到性能评测,一步一步教你排查与解决:

  1. 确认连通性(IP 可达)
  2. 检查 DNS 解析结果(dig / resolvectl)
  3. 修正 Netplan 配置并重新应用
  4. 确保 systemd-resolved 正常运行
  5. 验证 /etc/resolv.conf 是否正确链接

如果你在现场遇到类似问题,按照本文步骤逐项检查,一般能在 30 分钟内定位并解决问题。

相关推荐
还不秃顶的计科生3 小时前
LeetCode 热题 100第二题:字母易位词分组python版本
linux·python·leetcode
咯哦哦哦哦3 小时前
WSL + ubantu22.04 + 远程桌面闪退+黑屏闪退解决
linux·开发语言
fantasy5_53 小时前
Linux 动态进度条实战:从零掌握开发工具与核心原理
linux·运维·服务器
weixin_462446233 小时前
exo + tinygrad:Linux 节点设备能力自动探测(NVIDIA / AMD / CPU 安全兜底)
linux·运维·python·安全
..过云雨3 小时前
17-2.【Linux系统编程】线程同步详解 - 条件变量的理解及应用
linux·c++·人工智能·后端
oMcLin4 小时前
CentOS 7 频繁出现 “Connection Refused” 错误的原因分析与解决
linux·运维·centos
小李独爱秋4 小时前
计算机网络经典问题透视:常规密钥体制与公钥体制最主要的区别是什么?—— 一文带你从“钥匙”看懂现代密码学核心
服务器·网络·tcp/ip·计算机网络·密码学
饭九钦vlog4 小时前
银河麒麟修复openssh升级脚本
linux·运维
千百元5 小时前
限制网段访问服务器端口63790
java·网络·mybatis