如何将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 只承载你自己设备之间的流量,每个网站仍会看到你的真实地址。这也是判断 Tailscale 是否算 VPN 的关键区别。
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 出口节点
这是不需要执行命令的一步。打开管理控制台中的 Machines 页面,找到该 VPS。此时它应显示 Exit Node 徽标。打开该设备的菜单,选择 Edit exit node,勾选 Use as exit node,然后选择 Save。
在勾选并保存该选项之前,控制平面会保留此请求,不会将其分配给任何设备。您的笔记本电脑上的 tailscale exit-node list 不会显示任何内容,网络流量也会继续使用正常路由。两台设备都不会显示错误消息。出口节点只是不出现。
您也可以在 tailnet policy 文件中添加条目,自动批准出口节点:
"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 是否也应公布子网路由?
出口节点承载所有 Internet 流量。子网路由承载一段位于公布该路由的计算机后方的私有地址范围。这是两个彼此独立、审批流程也不同的功能,但同一台计算机可以同时启用这两个功能。它们都不会暴露 VPS 本身运行的服务。因此,如果您实际需要的是访问该服务器上应用的 HTTPS URL,应使用 serve 和 funnel 功能。
sudo tailscale set --advertise-routes=10.0.0.0/24如果 VPS 与其他服务器处于同一私有网络,并且您希望通过这些服务器的私有地址访问它们,请公布子网路由。请在单独的对话框中审批该路由,不要使用出口节点的审批对话框:在 Machines 页面中选择 VPS,进入其 Subnets 部分,选择 Edit 以打开 Edit subnet routes,选择路由,然后选择 Save。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 页面,在 VPS 的菜单中选择 Edit exit node,勾选 Use as exit node,然后选择 Save。
客户端从未选择该节点。 批准后,该节点才会对 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 接收入站 UDP 端口 41641 的流量,即可恢复直连路径。
何时不再使用 Tailscale 的协调服务器
上述所有操作都依赖 Tailscale 托管的协调服务器来交换密钥,以及处理您点击的批准操作。您的流量会直接从笔记本电脑传到 VPS;如果无法建立直连路径,则会经过 Tailscale 的 DERP 中继。协调服务器不会承载这些流量,但它会决定谁可以加入 tailnet,以及每台设备可以访问哪些目标。价格通常不是迁移原因,因为免费套餐支持 6 个用户,且每个用户可使用不限数量的自有设备,所以应评估这项依赖本身,而不是只考虑费用。达到第 7 个人时,情况会发生变化。由于 Tailscale 按用户而不是按设备计费,请先计算家庭用户或 5 人团队实际需要支付的费用,再决定是否基于成本采取行动。要客观评估,您需要了解协调服务器遭到入侵,或身份账户被盗后,攻击者实际可以访问哪些内容;这正是Tailscale 信任模型所说明的内容。如果您希望移除这项依赖,可以将 Headscale 作为自有的 Tailscale 控制服务器运行,并让两个客户端都指向它。之后配置出口节点的步骤不变,只是通过 Headscale 命令行而不是托管控制台批准路由。Headscale 会替换控制平面,但仍可继续使用 Tailscale 客户端。如果您希望自行运行整个技术栈,NetBird 提供自有的协调服务器,并支持将客户端部署在一台 VPS 上。
FAQ
为什么选择出口节点后,流量仍然使用本地连接?
通常有两个原因。出口节点已发布,但从未获批:打开管理控制台中的 Machines 页面,找到 VPS,在其菜单中选择 Edit exit node,勾选 Use as exit node,然后选择 Save。批准操作在控制台中完成,服务器上的任何命令都无法执行该操作。第二个原因不同:IP 转发未启用,因此隧道已建立,tailscale ping 可以连接 VPS,但所有外部地址都超时。使用 sysctl net.ipv4.ip_forward 检查,其输出必须为 1。
每次都必须手动批准出口节点吗?
每台设备只需批准一次。如果您经常重建 VPS,请将包含 "exitNode": ["tag:exit"] 的 autoApprovers 块添加到 tailnet 策略文件中,在 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 相互独立,并且分别在各自的对话框中批准:出口节点通过 Machines 页面设备菜单中的 Edit exit node 批准;子网则在设备的 Subnets 部分选择 Edit,打开 Edit subnet routes 后批准。VPS 必须启用 IP 转发。不要发布与笔记本电脑家庭网络匹配的地址范围,因为批准该路由且笔记本电脑接受它后,该路由可能会接管这些地址,导致本地网络无法访问本地设备。
出口节点能否向 VPS 提供商隐藏我的流量?
不能。隧道在 VPS 上终止,因此流量会以目标所需的形式离开服务器;如果网站本身未加密,您的提供商就能以明文传输这些流量。出口节点会将流量接入互联网的位置,从您所在的网络移到您租用的服务器。它可以隐藏您对咖啡馆 Wi-Fi 和家庭 ISP 的浏览活动,但同样会让 VPS 提供商看到这些浏览活动,并关联到您的帐户名称。