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 分钟内定位并解决问题。

相关推荐
maosheng11461 小时前
RHCSA的第一次作业
linux·运维·服务器
wifi chicken2 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.2912 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C2 小时前
CPU Cache
linux·cache
Hoshino.413 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
播播资源5 小时前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos
源远流长jerry5 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
lay_liu5 小时前
Linux安装redis
linux·运维·redis
虾..6 小时前
UDP协议
网络·网络协议·udp
w-w0w-w7 小时前
Unix网络编程
服务器·网络·unix