如何将VPS设置为Tailscale出口节点
完整配置Tailscale VPS出口节点:安装并发布节点、启用IP转发、在管理控制台批准路由,并处理DNS与IPv6问题。
Tailscale 出口节点的作用
Tailscale 出口节点是 tailnet 中的一台机器,负责承载其他设备的所有互联网流量。VPS(虚拟专用服务器)很适合作为出口节点,因为它具有固定的公网地址,并且会持续在线。设置过程分为五步:在服务器上安装 Tailscale、发布出口节点、启用 IP 转发、在管理控制台中批准路由,然后在笔记本电脑上选择该节点。第四步是在网页中切换一个选项,而不是运行命令,这也是大多数人停滞的地方。
启用后,笔记本电脑会加密每个数据包并将其发送到 VPS。VPS 执行源 NAT(网络地址转换),再使用自身的公网 IP 地址转发数据包。网站看到的是 VPS。咖啡馆 Wi-Fi 只能看到一条连接到 VPS 的加密 UDP 流,看不到其他流量。
Tailscale 使用 WireGuard 传输数据,并通过协调服务器分发密钥,帮助两台机器穿过 NAT 发现彼此。正因为有这个协调服务器,下面的步骤不需要在任何位置复制密钥。要详细了解其中的取舍,请阅读 Tailscale 与原生 WireGuard 的比较。如果您希望自行管理隧道的所有部分,则可以改为在 VPS 上 自行搭建原生 WireGuard VPN。
以下步骤假定 Tailscale 已在笔记本电脑上运行,并且两台机器登录了同一个 tailnet。tailnet 是您的专用 Tailscale 网络,其中的每台设备都会在 100.64.0.0/10 内获得一个稳定地址。
在 VPS 上安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up安装脚本会根据您的发行版选择软件包仓库,并安装 tailscaled 守护进程。tailscale up 随后会输出一个身份验证 URL。在浏览器中打开该 URL,并使用与笔记本电脑相同的账户登录,因为登录到其他 tailnet 的 VPS 完全无法为您的笔记本电脑提供服务。
tailscale status
tailscale ip -4此时,tailscale status 应列出两台设备。tailscale ip -4 会输出 VPS 的 tailnet 地址,稍后需要将该地址提供给客户端。
Tailscale 需要 TUN 设备来建立隧道。在 KVM VPS 上,该设备通常已存在。对于使用容器虚拟化、共享宿主机内核的方案,/dev/net/tun 有时会缺失,导致 tailscaled 无法创建 tailscale0 接口。继续操作前,请运行 ls -l /dev/net/tun。
启用 IP 转发,否则 VPS 会丢弃所有数据包
Linux 机器会丢弃所有目标地址不是自身的数据包,因为 net.ipv4.ip_forward 默认值为 0。出口节点会接收并解密您的流量,然后将其丢弃。请将该设置写入文件,使其在重启后仍然生效。
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conftee -a 会追加内容,因此第二次运行这些命令时,两个设置都会被写入两次。结果仍然有效,但 cat /etc/sysctl.d/99-tailscale.conf 的输出会显得异常。请确认当前生效的值,不要只相信文件内容:
sysctl net.ipv4.ip_forward输出必须为 net.ipv4.ip_forward = 1。如果跳过此步骤并使用 tailscale up --advertise-exit-node,客户端会提示:
Warning: IP forwarding is disabled, subnet routing/exit nodes will not work.tailscale set --advertise-exit-node 不会执行该检查,因此 set 没有输出不能证明已启用转发。请自行读取 sysctl 值。
您不需要手动编写 masquerade 规则。tailscaled 会自动创建名为 ts-input、ts-forward 和 ts-postrouting 的防火墙链,出口节点流量使用的 NAT 规则位于 ts-postrouting 中。在使用 nftables 的系统上,可以使用 sudo iptables-save | grep ts- 查看这些规则,或使用 sudo nft list ruleset 查看。
将 VPS 宣告为出口节点
sudo tailscale set --advertise-exit-nodetailscale set 只修改一个偏好设置,其他设置保持不变。tailscale up --advertise-exit-node 也会宣告该节点,但会产生一个副作用:up 会将命令行中的标志视为完整的非默认设置集合,因此之后单独运行 sudo tailscale up 会拒绝执行,并输出
changing settings via 'tailscale up' requires mentioning all
non-default flags. To proceed, either re-run your command with --reset or
use the command below to explicitly mention the current value of
all non-default settings:持续修改时使用 set,即可避免看到该消息。
宣告只是提出愿意提供服务。此时 VPS 会向协调服务器表明它愿意充当出口节点,但任何客户端还不能使用它。
在管理控制台中批准 Tailscale 出口节点
这一步没有对应的命令。打开管理控制台中的 Machines 页面,找到 VPS,打开其所在行末尾的三点菜单,选择 Edit route settings,然后启用 Use as exit node。
启用该开关之前,控制平面会保留此请求,不会将其分配给任何设备。此时,笔记本电脑上的 tailscale exit-node list 不会显示任何内容,网络流量也会继续使用正常路由。两台设备都不会显示错误消息。出口节点只是不出现。
您可以在 tailnet 策略文件中添加条目,以自动批准出口节点:
"autoApprovers": {
"exitNode": ["tag:exit"],
}使用 --advertise-tags=tag:exit 启动的设备会自动获得批准,前提是同一策略文件中的 tagOwners 下定义了 tag:exit。添加标签会改变设备归属:带标签的设备属于 tailnet,而不再属于您的用户帐户;适用于该设备的访问规则也会随之改变。对于单个 VPS,使用开关更简单。
在笔记本电脑上选择出口节点
在 Linux 客户端上:
tailscale exit-node list
sudo tailscale set --exit-node=vps.your-tailnet.ts.netexit-node list 会列出 tailnet 中已批准的出口节点及其地址。列表为空表示尚未完成批准步骤。在 macOS、Windows、iOS 和 Android 上,可在 Tailscale 应用的 Exit Node 菜单项下进行相同选择。
请从客户端验证,不要从服务器验证:
curl -4 https://ifconfig.me在选择出口节点前运行一次,选择后再运行一次。地址必须从本地地址变为 VPS 的公网 IP。停止使用出口节点:
sudo tailscale set --exit-node=第一天还需要注意一个标志。选择出口节点后,客户端会将所有流量送入隧道,包括发往 192.168.1.50 的数据包,因此打印机和网络存储将不再响应。让本地网络继续使用本地路由:
sudo tailscale set --exit-node=<name> --exit-node-allow-lan-access=true启用出口节点后,DNS 为什么会立即改变
默认情况下,使用出口节点的设备也会将该出口节点用作所有域名的 DNS(域名系统)解析器。这会覆盖为 tailnet 配置的全局 DNS 和拆分 DNS 名称服务器。此行为是有意设计的。如果查询仍发送到本地网络的解析器,咖啡馆路由器仍能看到您访问的每个站点的域名,而网络流量本身是私密的。域名解析请求和网络数据包应从同一位置发出。
这会影响运行内部解析器的用户:启用出口节点后,依赖的 tailnet 名称服务器会停止使用。要恢复使用,请在管理控制台的 DNS 页面中为该名称服务器启用 Use with exit node。
MagicDNS 名称仍可正常工作,因为 Tailscale 客户端会在任何请求到达出口节点前,在 100.100.100.100 本地解析这些名称。使用 dig @100.100.100.100 your-vps.your-tailnet.ts.net 检查;如果客户端使用 systemd-resolved,则使用 resolvectl status 检查,此时 Tailscale 接口会将 100.100.100.100 列为其 DNS 服务器。
如果使用 --accept-dns=false 禁用 Tailscale 的 DNS 处理,客户端会继续使用从本地网络获取的解析器。网络流量会通过隧道传输,但 DNS 查询不会,这与 手动构建的 WireGuard 隧道所导致的 DNS 泄漏相同。除非有明确原因,否则不要修改 --accept-dns。
通过出口节点转发 IPv6
出口节点会发布两条默认路由:0.0.0.0/0 和 ::/0。如果 VPS 没有可用的 IPv6 互联网路径,IPv6 数据包会通过隧道到达 VPS,然后停在那里。在信任该配置前,先在 VPS 上测试:
ip -6 addr show
curl -6 https://ifconfig.me请求失败表示 VPS 没有 IPv6 上游连接。双栈网站通常仍可加载,因为客户端会放弃 IPv6,并通过 IPv4 重试。不过,在首次连接每个网站时,这次重试会增加延迟。仅支持 IPv6 的目标仍然无法访问。
另一部分是转发配置。将 net.ipv4.ip_forward = 1 与 net.ipv6.conf.all.forwarding 保持为 0,会得到可用的 IPv4 路径,但 IPv6 会进入黑洞。用户感受到的通常是“某些网站加载很慢”,而不是一个可以直接搜索的错误。两行都应写入 sysctl 文件。
VPS 是否也应发布子网路由?
出口节点承载所有互联网流量。子网路由承载一段位于发布该路由的计算机后方的私有地址范围。两者是彼此独立的功能,需要分别审批;同一台计算机可以同时启用两者。
sudo tailscale set --advertise-routes=10.0.0.0/24如果 VPS 与其他服务器共享私有网络,且您希望通过这些服务器的私有地址访问它们,请发布子网。在同一个 Edit route settings 面板中,通过独立的开关批准该路由。
请谨慎选择地址范围。已发布的路由比笔记本电脑的默认路由更具体。因此,如果 VPS 发布 192.168.1.0/24,它会接管使用相同地址范围的家庭网络中的地址,您桌面旁的设备将无法通信。请使用您自行选择的地址范围,不要使用家庭路由器自动为您选择的范围。
使用 UDP GRO 转发提升出口节点性能
Tailscale 1.54 及更高版本在 Linux 6.2 或更高版本的内核上,可以使用接收卸载功能提升转发流量的吞吐量。GRO(通用接收卸载)会在内核逐个处理数据包之前合并传入的数据包。截至 2026 年 8 月,出口节点仍需手动启用此功能。
sudo apt install -y ethtool
NETDEV=$(ip -o route get 8.8.8.8 | cut -f 5 -d " ")
sudo ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list offip -o route get 8.8.8.8 会报告实际连接到互联网的接口,因此无需在 eth0、ens3 和 enp1s0 之间猜测。使用 ethtool -k $NETDEV | grep udp-gro-forwarding 确认,结果现在应显示为 on。
此设置会在重启后丢失。在运行 networkd-dispatcher 的系统上,可将其设置为自动执行:
printf '#!/bin/sh\n\nethtool -K %s rx-udp-gro-forwarding on rx-gro-list off \n' "$(ip -o route get 8.8.8.8 | cut -f 5 -d " ")" | sudo tee /etc/networkd-dispatcher/routable.d/50-tailscale
sudo chmod 755 /etc/networkd-dispatcher/routable.d/50-tailscale先检查 /etc/networkd-dispatcher/routable.d/ 是否存在。如果不存在,说明该计算机未运行 networkd-dispatcher。此时,可以创建一个在启动时执行 ethtool 行的 systemd 单元,实现相同效果。
提供商的可接受使用政策对出口流量的含义
客户端通过出口节点发送的每个数据包,都会使用 VPS 的公网 IP 地址离开,因此相关流量会归因于您的账户。滥用报告会发送到您的收件箱,包括版权通知和端口扫描投诉。在让家庭或团队通过一台服务器访问网络之前,请先阅读提供商的 AUP(可接受使用政策)。不要向您无法担保其行为的人员开放出口节点。
带宽会计算两次。流量先通过隧道到达 VPS,然后再次离开 VPS 进入互联网;这两个方向通常都会计入套餐的流量额度。通过出口节点观看视频流,产生的流量通常比大多数人预期的更多。
数据中心 IP 地址段也有自身的信誉。部分网站会对这些地址显示更多 CAPTCHA,某些流媒体服务则会直接拒绝访问。配置无法改变这一点,因为这是提供商所拥有地址块的属性。
为什么流量仍通过本地连接发出
出口节点已发布,但尚未批准。 客户端执行 tailscale exit-node list 没有输出,两台机器的日志中也没有错误。打开 Machines 页面,并启用 Use as exit node。
客户端从未选择该节点。 批准后,节点才会对 tailnet 可用。每台设备仍需单独选择节点。重新运行 sudo tailscale set --exit-node=<name>,然后再次检查 curl -4 https://ifconfig.me。
转发已关闭。 该症状很明确:tailscale ping <vps> 成功,隧道也已正常建立,但所有外部地址都超时。sysctl net.ipv4.ip_forward 的值为 0。修复 sysctl 文件,然后运行 sudo sysctl -p /etc/sysctl.d/99-tailscale.conf。
防火墙丢弃了转发数据包。 tailscaled 会插入自己的 ts-forward 链,在全新配置的 VPS 上通常足够了。如果服务器已运行 ufw 或 Docker,FORWARD 策略可能变为 DROP,并且相关规则的顺序可能早于 Tailscale 的规则。不要猜测具体原因:客户端尝试加载页面时运行 sudo iptables -L FORWARD -n -v,观察哪些计数器发生变化。在使用 ufw 的服务器上,通常应在 /etc/default/ufw 中设置 DEFAULT_FORWARD_POLICY="ACCEPT",然后执行 sudo ufw reload。同时检查提供商控制面板中的网络防火墙,因为它与服务器上运行的任何防火墙都是独立的控制层。
可以工作,但速度很慢。 在两台机器上运行 tailscale netcheck。如果结果显示 UDP 被阻止,两个设备就无法建立直接路径,而会回退到 DERP 中继,这会增加每个连接的延迟。通常,在提供商的网络防火墙中允许 VPS 接收目标端口为 41641 的 UDP 流量,即可恢复直接路径。
何时不再使用 Tailscale 的协调服务器
以上所有步骤都依赖 Tailscale 托管的协调服务器来交换密钥,并处理您执行的批准操作。您的流量仍会直接从笔记本电脑传输到 VPS,协调服务器不会承载这些流量。不过,它会决定哪些设备可以加入 tailnet,以及每台设备可以访问哪些资源。如果您希望移除这一依赖,可以 将 Headscale 作为您自己的 Tailscale 控制服务器运行,并让两个客户端都指向它。之后,出口节点的配置步骤不变,只需通过 Headscale 命令行批准路由,而不是使用托管控制台。
FAQ
为什么选择出口节点后,流量仍使用本地连接?
常见原因有两个。出口节点已发布,但从未获批准:在管理控制台中打开 Machines 页面,找到 VPS,选择 Edit route settings,然后启用 Use as exit node。批准是控制台中的开关,服务器上的命令无法完成此操作。第二个原因不同:IP 转发未启用,因此隧道可以建立,tailscale ping 可以连接 VPS,但所有外部地址都会超时。使用 sysctl net.ipv4.ip_forward 检查,其值必须为 1。
每次都必须手动批准出口节点吗?
每台设备只需启用一次此开关。如果您经常重建 VPS,请在 tailnet 策略文件中添加包含 "exitNode": ["tag:exit"] 的 autoApprovers 块,在 tagOwners 下定义 tag:exit,然后使用 --advertise-tags=tag:exit 启动节点。标记设备归 tailnet 所有,而不是归您的用户帐户所有,因此适用于该设备的访问规则也会改变。
启用出口节点后,笔记本电脑使用哪个 DNS 服务器?
使用出口节点本身。使用出口节点的设备会将所有 DNS 查询发送到出口节点,这会覆盖为 tailnet 设置的全局 DNS 和拆分 DNS 名称服务器。这样,本地网络就无法看到您查询的名称。若要继续使用某个 tailnet 名称服务器,请在管理控制台的 DNS 页面中为它启用 Use with exit node。MagicDNS 名称仍可解析,因为 Tailscale 客户端会在本地的 100.100.100.100 处理这些查询。
同一台 VPS 可以同时作为出口节点和子网路由器吗?
可以。sudo tailscale set --advertise-exit-node 和 sudo tailscale set --advertise-routes=10.0.0.0/24 相互独立,各自在 Edit route settings 下拥有单独的批准开关。VPS 必须启用 IP 转发。请避免发布与笔记本电脑家庭网络匹配的网段,因为已发布的路由比默认路由更具体,这会导致本地设备无法访问。
出口节点能否向 VPS 提供商隐藏我的流量?
不能。隧道在 VPS 上终止,因此流量会以目标所需的形式离开服务器;如果目标网站本身未加密,VPS 提供商就能以明文承载这些流量。出口节点会将流量接入互联网的位置,从您所在的网络转移到您租用的服务器。它可以隐藏您在咖啡馆 Wi-Fi 和家庭 ISP 面前的浏览活动,但同样会让 VPS 提供商看到这些浏览活动,并关联到您的帐户名称。