Tailscale 是如何接管 DNS 的?

💡 Tailscale 是如何接管 DNS 的?

Tailscale 通过一个叫做 MagicDNS 的核心功能来管理 DNS,默认情况下处于启用状态。当满足以下条件时,Tailscale 就会接管:

  1. Tailnet(你的私有网络)中启用了 MagicDNS:这通常在 Tailscale 管理后台配置,是全局性的。
  2. 本机接受了 Tailscale 的 DNS 设置:通过 --accept-dns 参数控制,默认值为 true,即接受 Tailscale 下发的 DNS。
  3. 系统没有其他活跃的 DNS 管理程序:比如 systemd-resolvedNetworkManager。Tailscale 会检查这些程序,如果都没有,它就会直接接管 /etc/resolv.conf

🛡️ 如何防止 Tailscale 接管 DNS?

如果你想继续使用手动指定的 DNS,可以按以下优先级选择方法:

方案一:配置 systemd-resolved(⭐ 强烈推荐)

这是 Tailscale 官方建议的方案,也是现代 Linux 发行版的默认 DNS 管理方式。它能实现最佳兼容性,让 Tailscale 和你的本地 DNS 设置和谐共存。

  1. 确保 systemd-resolved 正在运行
    sudo systemctl enable --now systemd-resolved
    sudo systemctl restart systemd-resolved
    
  2. 调整 systemd-resolved 配置
    sudo nano /etc/systemd/resolved.conf
    
    取消注释并填写你希望系统使用的 DNS 服务器,例如:
    [Resolve]
    DNS=8.8.8.8 223.5.5.5
    
  3. 创建正确的符号链接:这是关键步骤,确保 /etc/resolv.conf 指向 systemd-resolved 管理的存根文件。
    sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
    
  4. 重启相关服务
    sudo systemctl restart systemd-resolved
    sudo systemctl restart tailscaled
    

配置完成后,你可以通过 resolvectl status 命令来查看 DNS 设置是否生效。

方案二:禁用 Tailscale 的 DNS 管理(✅ 直接有效)

如果你不希望依赖 systemd-resolved,可以直接在本机禁用 Tailscale 对 DNS 的修改。

  1. 执行以下命令(重启失效):

    sudo tailscale set --accept-dns=false
    

    这条命令会立即生效,Tailscale 将停止接管你的 DNS 设置,/etc/resolv.conf 也会恢复为你之前手动指定的值。

    或者永久生效(写入配置)

    sudo tailscale set --accept-dns=false
    sudo systemctl restart tailscaled
    
  2. 配置结果说明

    • 执行命令后,Tailscale 不会再覆盖你的 /etc/resolv.conf 文件。
    • Tailscale 的 MagicDNS 服务器 (100.100.100.100) 仍然会在后台运行。
    • 如果仍需解析 Tailscale 网络内的主机名,可以手动添加一条静态 DNS 记录,将 *.ts.net 域名指向 100.100.100.100

查看是否成功: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 的便利性。方案三则风险较高,通常不建议使用。

posted @ 2026-04-03 17:52  悠哉大斌  阅读(33)  评论(0)    收藏  举报