Tailscale 是如何接管 DNS 的?
💡 Tailscale 是如何接管 DNS 的?
Tailscale 通过一个叫做 MagicDNS 的核心功能来管理 DNS,默认情况下处于启用状态。当满足以下条件时,Tailscale 就会接管:
- Tailnet(你的私有网络)中启用了 MagicDNS:这通常在 Tailscale 管理后台配置,是全局性的。
- 本机接受了 Tailscale 的 DNS 设置:通过
--accept-dns参数控制,默认值为true,即接受 Tailscale 下发的 DNS。 - 系统没有其他活跃的 DNS 管理程序:比如
systemd-resolved或NetworkManager。Tailscale 会检查这些程序,如果都没有,它就会直接接管/etc/resolv.conf。
🛡️ 如何防止 Tailscale 接管 DNS?
如果你想继续使用手动指定的 DNS,可以按以下优先级选择方法:
方案一:配置 systemd-resolved(⭐ 强烈推荐)
这是 Tailscale 官方建议的方案,也是现代 Linux 发行版的默认 DNS 管理方式。它能实现最佳兼容性,让 Tailscale 和你的本地 DNS 设置和谐共存。
- 确保
systemd-resolved正在运行:sudo systemctl enable --now systemd-resolved sudo systemctl restart systemd-resolved - 调整
systemd-resolved配置:
取消注释并填写你希望系统使用的 DNS 服务器,例如:sudo nano /etc/systemd/resolved.conf[Resolve] DNS=8.8.8.8 223.5.5.5 - 创建正确的符号链接:这是关键步骤,确保
/etc/resolv.conf指向systemd-resolved管理的存根文件。sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf - 重启相关服务:
sudo systemctl restart systemd-resolved sudo systemctl restart tailscaled
配置完成后,你可以通过 resolvectl status 命令来查看 DNS 设置是否生效。
方案二:禁用 Tailscale 的 DNS 管理(✅ 直接有效)
如果你不希望依赖 systemd-resolved,可以直接在本机禁用 Tailscale 对 DNS 的修改。
-
执行以下命令(重启失效):
sudo tailscale set --accept-dns=false这条命令会立即生效,Tailscale 将停止接管你的 DNS 设置,
/etc/resolv.conf也会恢复为你之前手动指定的值。或者永久生效(写入配置)
sudo tailscale set --accept-dns=false sudo systemctl restart tailscaled -
配置结果说明:
- 执行命令后,Tailscale 不会再覆盖你的
/etc/resolv.conf文件。 - Tailscale 的 MagicDNS 服务器 (
100.100.100.100) 仍然会在后台运行。 - 如果仍需解析 Tailscale 网络内的主机名,可以手动添加一条静态 DNS 记录,将
*.ts.net域名指向100.100.100.100。
- 执行命令后,Tailscale 不会再覆盖你的
查看是否成功:tailscale dns status
运行后输出信息非常明确:
- Tailscale DNS: enabled: 说明--accept-dns已启用,Tailscale 正在接管 DNS。
- Tailscale DNS: disabled: 说明--accept-dns未启用,设备使用本地 DNS。
方案三:锁定 /etc/resolv.conf 文件(⚠️ 不推荐)
这是一种粗暴的方式,通过给文件添加“不可修改”的属性来阻止任何程序写入。这可能会在未来导致难以排查的问题,仅作为最后的备选方案。
# 1. 先完成你的手动配置
sudo nano /etc/resolv.conf
# 2. 锁定文件,阻止写入
sudo chattr +i /etc/resolv.conf
# 3. 如果需要修改,必须先解除锁定
sudo chattr -i /etc/resolv.conf
⚠️ 重要警告:Tailscale 官方不推荐这种做法,它可能会在检测到无法写入配置文件时,触发“Linux DNS configuration issue”之类的警告信息,并且可能导致你难以享受到 Tailscale 的高级 DNS 功能。
💎 总结
综合来看,方案一(使用 systemd-resolved) 是最符合 Linux 生态惯例、也最受 Tailscale 官方支持的做法,能确保系统长期稳定。方案二(--accept-dns=false)同样有效,但会牺牲 MagicDNS 的便利性。方案三则风险较高,通常不建议使用。
浙公网安备 33010602011771号