如何将VPS设置为Tailscale出口节点
按步骤将VPS配置为Tailscale出口节点:安装并通告节点、启用IP转发、在管理控制台批准路由,再处理DNS和IPv6问题。
Tailscale 出口节点的作用
Tailscale 出口节点是 tailnet 中的一台机器,负责承载其他设备的全部互联网流量。VPS(虚拟专用服务器)很适合用作出口节点,因为它具有固定的公网地址,并且会持续在线。设置过程分为 5 步:在服务器上安装 Tailscale、发布出口节点、启用 IP 转发、在管理控制台中批准路由,然后在笔记本电脑上选择该节点。第 4 步是在网页中切换一个选项,而不是执行命令。大多数人都会在这里停住。
启用后,笔记本电脑会加密每个数据包,并将其发送到 VPS。VPS 执行源 NAT(网络地址转换),再使用自己的公网 IP 地址转发数据包。网站看到的是 VPS。咖啡馆 Wi-Fi 只能看到一条发往 VPS 的加密 UDP 流,无法看到其他流量。
Tailscale 使用 WireGuard 传输数据,并通过协调服务器分发密钥,帮助两台机器通过 NAT 互相发现。正因为有这个协调服务器,下面的步骤不需要复制任何密钥。如需完整了解其中的权衡,请阅读Tailscale 与纯 WireGuard 的比较。如果您希望自行控制隧道的每个部分,也可以改为在 VPS 上自行部署纯 WireGuard VPN。
以下步骤假定 Tailscale 已在笔记本电脑上运行,并且两台机器登录到同一个 tailnet。tailnet 是您的私有 Tailscale 网络。除非管理员已为其关闭 IPv4,否则其中的每台设备都会在 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 出站路径。如果 curl 报告“Could not resolve host”,则问题出在名称解析,而不是 IPv6。请修复 VPS 上的 DNS,然后重新运行测试。双栈网站通常仍然可以加载,因为实现了 Happy Eyeballs 的客户端(包括 curl)会在 IPv6 尝试经过短暂等待仍未建立连接时,同时发起 IPv4 尝试,并保留最先建立连接的尝试。curl 默认等待 200 毫秒,因此这段等待会给新连接增加延迟,但不会导致错误。仅支持 IPv6 的目标仍然无法访问。
另一部分是转发。将 net.ipv4.ip_forward = 1 与保持为 0 的 net.ipv6.conf.all.forwarding 配合使用时,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;这也是子网路由配置教程完整介绍的差异之一。
请谨慎选择地址段。路由获批后,接受该路由的笔记本电脑(Windows、macOS、iOS 和 Android 默认接受,Linux 在 --accept-routes 后接受)可以将发往该地址段的流量发送到隧道中。如果在 VPS 上批准 192.168.1.0/24,而家庭网络中的笔记本电脑使用相同的地址段,那么这些地址可能会被该笔记本电脑发送到隧道中,你桌面上的设备也会失去连接。请使用你自行选择的地址段,不要使用家庭路由器替你选择的地址段。
使用 UDP GRO 转发提升出口节点速度
Tailscale 1.54 及更高版本在 Linux 6.2 或更高版本内核上可以使用接收卸载功能,提高转发流量的吞吐量。GRO(通用接收卸载)会在内核逐个处理数据包之前合并收到的数据包。截至 2026 年 10 月,出口节点仍需手动启用此功能。
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 套餐只统计离开方向的流量。截至 2026 年 10 月,SSD Nodes 将每个 KVM 套餐的额度列为出站传输量,每月从 4TB 到 48TB 不等;Vultr 的文档则说明入站流量不计费。下载时,计费方向是数据从 VPS 经隧道传输到您的笔记本电脑。上传时,计费方向是数据从 VPS 发送到互联网。无论哪种情况,经过出口节点转发的所有流量都会计入额度一次;通过出口节点观看视频产生的流量,通常比人们预期的占用更多。请检查您自己的套餐,因为同时统计两个方向的主机会将这类流量计费两次。
数据中心的地址段也会影响地址信誉。一些网站会对这些地址显示更多 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;如果无法建立直连路径,则会经过 Tailscale 的 DERP 中继。协调服务器不会承载这些流量,但它会决定谁可以加入 tailnet,以及每台设备可以访问哪些目标。价格通常不是迁移原因,因为免费套餐支持 6 个用户,且每个用户可使用不限数量的自有设备,所以应评估这项依赖本身,而不是只考虑费用。达到第 7 个人时,情况会发生变化。由于 Tailscale 按用户而不是按设备计费,请先计算家庭用户或 5 人团队实际需要支付的费用,再决定是否基于成本采取行动。要客观评估,您需要了解协调服务器遭到入侵,或身份账户被盗后,攻击者实际可以访问哪些内容;这正是Tailscale 信任模型所说明的内容。如果您希望移除这项依赖,可以将 Headscale 作为自有的 Tailscale 控制服务器运行,并让两个客户端都指向它。之后配置出口节点的步骤不变,只是通过 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 nameserver。这样,本地网络就无法看到您查询的域名。若要继续使用 tailnet 的某个 nameserver,请在管理控制台的 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 提供商看到这些浏览活动以及关联的账户名称。