如何将VPS设置为Tailscale出口节点
按步骤将VPS配置为Tailscale出口节点:安装并通告节点、启用IP转发、在管理控制台批准路由,再处理DNS和IPv6问题。
Tailscale exit node 的作用
Tailscale exit node 是 tailnet 中的一台机器,它承载其他设备的全部互联网流量。VPS(虚拟专用服务器)适合作为 exit node,因为它具有固定的公网地址,并且会持续在线。设置过程分为 5 步:在服务器上安装 Tailscale、通告 exit node、启用 IP 转发、在管理控制台中批准路由,然后在笔记本电脑上选择该节点。第 4 步是在网页中切换一个选项,而不是执行命令,这也是大多数人卡住的地方。
启用后,笔记本电脑会加密每个数据包,并将其发送到 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 exit node
这一步没有对应的命令。打开管理控制台中的 Machines 页面,找到该 VPS,打开其所在行末尾的三点菜单,选择 Edit route settings,然后启用 Use as exit node。
启用此开关前,控制平面会保留该请求,但不会将其提供给任何设备。笔记本电脑上的 tailscale exit-node list 不会显示任何内容,网络流量也会继续使用常规路由。两台设备上都不会显示错误消息。该 exit node 只会一直不出现。
您可以在 tailnet policy 文件中添加条目,自动批准 exit node:
"autoApprovers": {
"exitNode": ["tag:exit"],
}使用 --advertise-tags=tag:exit 启动的设备会自动获得批准,前提是同一 policy 文件的 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 是否也应通告子网路由?
出口节点承载所有互联网流量。子网路由承载一个位于通告该路由的计算机后方的专用地址范围。两者是相互独立的功能,需要分别审批,但同一台计算机可以同时提供这两种功能。它们都不会暴露 VPS 本身运行的服务。因此,如果您实际需要的是访问该服务器上应用的 HTTPS URL,应使用serve 和 funnel 功能。
sudo tailscale set --advertise-routes=10.0.0.0/24如果 VPS 与其他服务器共享一个专用网络,并且您希望通过这些服务器的专用地址访问它们,请通告子网。在同一个 Edit route settings 面板中审批该路由,并启用单独的开关。Linux 客户端随后仍会忽略通告的路由,直到您传递 --accept-routes;这是子网路由器操作指南完整介绍的差异之一。
请谨慎选择地址范围。通告的路由比笔记本电脑的默认路由更具体。因此,从 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。GRO 只能改善本身正常的链路,因此如果出口节点之后仍然较慢,应像测量 底层链路速度正常但运行较慢的普通 WireGuard 隧道一样,直接测量该链路。
此设置会在重启后丢失。在运行 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,有些流媒体服务则会直接拒绝它们。配置无法改变这一点,因为这是提供商所拥有的 IP 地址段的属性。
为什么流量仍通过本地连接发出
出口节点已发布,但未获批准。 客户端执行 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,以及每台设备可以访问哪些目标。价格通常不是迁移的主要原因,因为免费套餐支持 6 个用户,每个用户可拥有不限数量的设备,所以应评估这项依赖本身,而不是只看费用。第 7 个用户会改变这一点。由于 Tailscale 按用户而不是按设备收费,请在以成本为依据做决定前,先计算家庭用户或 5 人团队实际需要支付的费用。要客观评估,就必须了解协调服务器遭入侵或身份账户被盗后实际可以访问哪些资源,这正是Tailscale 信任模型所说明的内容。如果您希望移除这项依赖,可以将 Headscale 作为自己的 Tailscale 控制服务器运行,并让两个客户端都指向它。之后配置 exit node 的步骤不变,只需通过 Headscale 命令行批准路由,而不是使用托管控制台。Headscale 会替换控制平面,但仍可继续使用 Tailscale 客户端。如果您希望自行运行完整技术栈,NetBird 提供自有的协调服务器和客户端,您可以将它们托管在一台 VPS 上。
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 服务器。使用出口节点的设备会将所有 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 提供商看到这些浏览活动以及关联的账户名称。