摘要
最近在 CentOS 7 虚拟机上进行大数据环境搭建时,遇到了一个棘手的网络问题:无法解析公共域名(例如 或 ),导致 等工具无法下载外部资源。通过排查,最终发现问题源于 。本文将详细分析该问题,并提供多种解决方法,包括临时绕过和永久配置方案。
对 CentOS 7 虚拟机安装 Tailscale 后无法解析公共域名(如 github.com)的问题进行分析。排查发现 resolv.conf 被 Tailscale 接管,指向内部 DNS 服务器 100.100.100.100,导致公网域名解析失败。提供两种解决方案:一是临时停止 Tailscale 服务并手动配置公共 DNS;二是在 Tailscale 管理界面配置公共 DNS 服务器并同步配置。核心在于理解 MagicDNS 原理并根据需求选择方案。

最近在 CentOS 7 虚拟机上进行大数据环境搭建时,遇到了一个棘手的网络问题:无法解析公共域名(例如 或 ),导致 等工具无法下载外部资源。通过排查,最终发现问题源于 。本文将详细分析该问题,并提供多种解决方法,包括临时绕过和永久配置方案。
github.combaidu.comcurl在 CentOS 7 虚拟机上,当尝试执行 curl 命令下载外部文件,或 ping 公共域名时,收到类似以下错误:
[root@localhost ~]# ping baidu.com
ping: baidu.com: 未知的名称或服务
[root@localhost ~]# curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0
curl: (6) Could not resolve host: github.com; 未知的错误
sudo systemctl status docker
输出显示 Docker 引擎正常运行。这排除了 Docker 本身的问题。
ping 8.8.8.8 (Google 公共 DNS)。如果 ping 成功,说明虚拟机到互联网的网络路由是通的,问题不在于基本的网络连接,而很可能在 DNS 解析层面。如果 ping 失败,则需要检查虚拟机的网络配置(如桥接模式是否正确配置,宿主机网络是否正常)。ping baidu.com。由于最初的报错就是域名解析失败,这一步自然也失败了。/etc/resolv.conf 文件内容 (关键线索):cat /etc/resolv.conf
得到的输出如下:
# resolv.conf(5) file generated by tailscale
# For more info, see https://tailscale.com/s/resolvconf-overwrite
# DO NOT EDIT THIS FILE BY HAND -- CHANGES WILL BE OVERWRITTEN
nameserver 100.100.100.100
search taild4789b.ts.net
这揭示了问题的核心:resolv.conf 文件被 tailscale 接管,并且 DNS 服务器被设置为 100.100.100.100。
sudo systemctl status tailscaled
sudo tailscale status
虚拟机本身的网络连接(桥接模式)是正常的。问题在于 Tailscale 的 MagicDNS 接管了系统的 DNS 解析。100.100.100.100 是 Tailscale 内部的 DNS 服务器地址,它默认只解析 Tailscale 网络内部的设备名称。如果没有在 Tailscale 管理界面中明确配置,它不会将公共互联网域名的解析请求转发到外部公共 DNS 服务器,因此导致 baidu.com 和 github.com 等公共域名无法解析。
这种方法无需修改 Tailscale 的全局配置,适用于临时解决 DNS 问题以完成特定任务(如下载)。
停止 Tailscale 服务: 这是最关键的一步,因为 Tailscale 运行时会不断覆盖 /etc/resolv.conf。
sudo systemctl stop tailscaled
备份 /etc/resolv.conf:
sudo cp /etc/resolv.conf /etc/resolv.conf.bak
编辑 /etc/resolv.conf,手动配置公共 DNS 服务器: 使用 vim 或其他编辑器打开文件:
sudo vim /etc/resolv.conf
按下键盘上的'i'键,进入 insert 模式,清空原有内容(或注释掉),然后添加以下公共 DNS 服务器:
nameserver 8.8.8.8 # Google Public DNS
nameserver 8.8.4.4 # Google Public DNS
# 或者国内常用 DNS:
# nameserver 114.114.114.114
# nameserver 223.5.5.5
按下键盘上的 ESC 键后,依次输入 :wq,最后按下回车键 (保存并退出)。
验证 DNS 解析是否生效:
ping baidu.com
成功 ping 通。
执行需要网络的操作(例如下载 Docker Compose):
sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
(可选)恢复 Tailscale 服务: 完成下载后,如果您需要继续使用 Tailscale,可以重新启动它。注意,重新启动后 /etc/resolv.conf 可能会被 Tailscale 再次覆盖。
sudo systemctl start tailscaled
这是更推荐的长期解决方案,允许你在 Tailscale 启用时也能解析公共域名。
8.8.8.8 或 114.114.114.114。验证 DNS 解析:
ping baidu.com
此时,即使 tailscaled 正在运行且 /etc/resolv.conf 仍指向 100.100.100.100,公共域名也应该能够正常解析了。
在虚拟机上同步配置: 回到 CentOS 虚拟机,运行以下命令强制同步 Tailscale 配置:
sudo tailscale up
或者等待一段时间,Tailscale 会自动同步新配置。
在 "DNS Servers" (DNS 服务器) 部分,点击 "Add nameserver" (添加 DNS 服务器)。
当你在安装了 Tailscale 的虚拟机上遇到公共域名解析失败的问题时,请首先检查 /etc/resolv.conf 文件,确认其是否已被 Tailscale 接管。解决此类问题的核心在于:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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