摘要
最近在 CentOS 7 虚拟机上进行大数据环境搭建时,遇到了一个棘手的网络问题:无法解析公共域名(例如 github.com 或 baidu.com),导致 curl 等工具无法下载外部资源。通过排查,最终发现问题源于 Tailscale 对系统 DNS 配置的接管。本文将详细分析该问题,并提供多种解决方法,包括临时绕过和永久配置方案。
问题现象
在 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 –:–:– 0curl: (6) Could not resolve host: github.com; 未知的错误
AI生成项目
bash
问题排查
检查 Docker 服务状态 (非直接原因,但为了后续安装 Docker Compose 而检查):
sudo systemctl status docker
AI生成项目
bash
输出显示 Docker 引擎正常运行。这排除了 Docker 本身的问题。
检查网络连通性 (初步判断):
Ping IP 地址: 尝试 ping 8.8.8.8 (Google 公共 DNS)。 如果 ping 成功,说明虚拟机到互联网的网络路由是通的,问题不在于基本的网络连接,而很可能在 DNS 解析层面。 如果 ping 失败,则需要检查虚拟机的网络配置(如桥接模式是否正确配置,宿主机网络是否正常)。
Ping 域名: 尝试 ping baidu.com。 由于最初的报错就是域名解析失败,这一步自然也失败了。
检查 /etc/resolv.conf 文件内容 (关键线索):
cat /etc/resolv.conf
AI生成项目
bash
得到的输出如下:
# 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
AI生成项目
bash
这揭示了问题的核心:resolv.conf 文件被 tailscale 接管,并且 DNS 服务器被设置为 100.100.100.100。
确认 Tailscale 运行状态:
sudo systemctl status tailscaled
sudo tailscale status
AI生成项目
bash
结论:
虚拟机本身的网络连接(桥接模式)是正常的。问题在于 Tailscale 的 MagicDNS 接管了系统的 DNS 解析。100.100.100.100 是 Tailscale 内部的 DNS 服务器地址,它默认只解析 Tailscale 网络内部的设备名称。如果没有在 Tailscale 管理界面中明确配置,它不会将公共互联网域名的解析请求转发到外部公共 DNS 服务器,因此导致 baidu.com 和 github.com 等公共域名无法解析。
解决方案
方案一:临时绕过 Tailscale DNS (推荐用于快速下载)
这种方法无需修改 Tailscale 的全局配置,适用于临时解决 DNS 问题以完成特定任务(如下载)。
停止 Tailscale 服务: 这是最关键的一步,因为 Tailscale 运行时会不断覆盖 /etc/resolv.conf。
sudo systemctl stop tailscaled
AI生成项目
bash
备份 /etc/resolv.conf:
sudo cp /etc/resolv.conf /etc/resolv.conf.bak
AI生成项目
bash
编辑 /etc/resolv.conf,手动配置公共 DNS 服务器: 使用 vim 或其他编辑器打开文件:
sudo vim /etc/resolv.conf
AI生成项目
bash
按下键盘上的“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
AI生成项目
bash
按下键盘上的ESC键后,依次输入:wq,最后按下回车键(保存并退出)。
验证 DNS 解析是否生效:
ping baidu.com
AI生成项目
bash
成功 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
AI生成项目
bash
(可选)恢复 Tailscale 服务: 完成下载后,如果您需要继续使用 Tailscale,可以重新启动它。注意,重新启动后 /etc/resolv.conf 可能会被 Tailscale 再次覆盖。
sudo systemctl start tailscaled
AI生成项目
bash
方案二:在 Tailscale 管理界面配置公共 DNS 服务器 (永久解决方案)
这是更推荐的长期解决方案,允许你在 Tailscale 启用时也能解析公共域名。
登录 Tailscale 管理界面: 访问 Tailscale 并使用您的 Tailscale 账号登录。
配置 DNS 服务器:
在 “DNS Servers” (DNS 服务器) 部分,点击 “Add nameserver” (添加 DNS 服务器)。
输入公共 DNS 服务器地址,例如 8.8.8.8 或 114.114.114.114。
重要: 确保勾选了 “Override local DNS” (覆盖本地 DNS) 选项(或者 “Use Tailscale DNS settings exclusively” 等类似选项,具体措辞可能随版本变化)。这将告诉 Tailscale 将所有 DNS 查询都通过其服务进行处理,包括转发公共域名。
保存更改。
在虚拟机上同步配置: 回到 CentOS 虚拟机,运行以下命令强制同步 Tailscale 配置:
sudo tailscale up
AI生成项目
bash
或者等待一段时间,Tailscale 会自动同步新配置。
验证 DNS 解析:
ping baidu.com
AI生成项目
bash
此时,即使 tailscaled 正在运行且 /etc/resolv.conf 仍指向 100.100.100.100,公共域名也应该能够正常解析了。
总结
当你在安装了 Tailscale 的虚拟机上遇到公共域名解析失败的问题时,请首先检查 /etc/resolv.conf 文件,确认其是否已被 Tailscale 接管。解决此类问题的核心在于:
理解 Tailscale MagicDNS 的工作原理。
根据需求选择解决方案: 临时下载可以暂停 Tailscale 并手动修改 DNS;长期使用则应在 Tailscale 管理界面中配置公共 DNS 服务器。
————————————————
版权声明:本文为CSDN博主「2301_80318532」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2301_80318532/article/details/148953016