SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-10-03

Tailscale替代端口转发:NAS、树莓派和游戏服务器

无需开放路由器端口,Tailscale即可访问家用NAS、树莓派或Minecraft服务器。了解NAT穿透、UDP打洞、CGNAT下的DERP中继,以及它无法向陌生人公开服务的限制。

Tailscale 是否需要端口转发?

Tailscale 不需要端口转发。对于访问自己的设备,它可以完全替代端口转发。tailnet 中的每台设备(Tailscale 在设备之间建立的专用网络)都会主动建立出站连接。您的家用路由器无需进行任何更改:不需要转发端口,不需要设置 DMZ(非军事区)主机,也不需要动态 DNS 记录或公网 IP。位于 ipTIME 或 Fritz!Box 路由器之后的 NAS(网络附加存储设备)、Raspberry Pi 或游戏服务器,都可以从任意位置通过笔记本电脑访问,并使用自己的专用地址;路由器的入站侧仍保持关闭。

Tailscale 不能做的事情也很明确。它只能连接已登录到您的 tailnet,或已共享到该 tailnet 的设备。互联网上的陌生人,或尚未加入的朋友,无法通过 Tailscale 访问任何内容。将服务暴露给整个公网是另一项工作,本文末尾附近会介绍相关内容。

Tailscale 如何在不配置端口转发的情况下穿透 NAT

之所以需要端口转发,是因为存在 NAT(网络地址转换)。路由器拥有唯一的公网 IPv4 地址,而其后的每台设备都使用私有地址。到达路由器的入站数据包没有说明应发送给哪台私有设备,因此路由器会丢弃它。端口转发是一条手动规则,例如“端口 25565 属于 192.168.0.20”。Tailscale 分 4 步实现相同的效果,无需配置这条规则。

第一步,每个节点都主动发起出站连接。启动时,tailscaled通过 TCP 443 与协调服务器建立 HTTPS 连接。它会发送自己的 WireGuard 公钥,并获取 tailnet 中其他所有节点的公钥和地址。协调服务器不会承载您的流量,只负责提供密钥和地址信息。

第二步,每个节点发现自身从外部看起来是什么样。它通过 UDP 向 Tailscale 中继服务器的 3478 端口发送 STUN(用于 NAT 穿透的会话工具)请求。响应包含路由器为该出站数据包分配的公网 IP 和端口。这就是端口转发手动创建的映射,不同之处在于,该映射由路由器针对出站流自动创建。如果路由器支持 UPnP 或 NAT-PMP,Tailscale 还会自动请求路由器创建映射。这样可以提高连接成功率,但连接不依赖这些功能。

第三步,双方同时打洞。节点 A 和节点 B 通过协调服务器获知对方的公网端点。双方同时从各自的监听端口(默认是 41641)向对方的公网端点发送 UDP 数据包。每台路由器都已为自己的节点保留出站映射,因此从对方到达的数据包会匹配该映射并获准进入。从此刻起,两个节点通过 WireGuard 直接通信,路由器仍然不需要配置任何规则。

第四步,打洞失败时,流量通过中继转发。CGNAT(运营商级 NAT,即 ISP 将您置于其控制的第二层 NAT 之后)和对称 NAT(路由器为每个目标选择新端口,因此 STUN 响应无法使用)都会导致第三步失败。阻止 UDP 的企业防火墙也会导致该步骤失败。此时,Tailscale 会通过 TCP 443 将加密的 WireGuard 数据包发送到 DERP(用于数据包的指定加密中继)服务器。中继只能看到密文。这也会增加延迟并降低吞吐量;为什么通过中继的 Tailscale 连接速度慢,以及如何改为直连介绍了如何判断当前使用的路径,以及需要修改哪些设置。

以上 4 步都不会向您的路由器发起入站连接。这就是不需要端口转发的根本原因。

安装客户端并检查路径

安装过程只需在每台设备上运行一个脚本并登录一次。

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4

tailscale up 会输出登录 URL。打开该 URL,登录后设备就会加入 tailnet。tailscale ip -4 会输出设备在 100.64.0.0/10 地址范围内的 tailnet 地址。该地址在重启和切换网络后都保持不变,因此应将它写入 SSH 配置和游戏客户端。

从 tailnet 中的另一台设备检查到第一台设备的路径:

tailscale ping nas

使用主机名或 tailnet 地址。第一次回复通常会显示 via DERP,因为直连路径仍在协商。几秒内,回复应切换为公网 IP 和端口,这表示打洞成功。如果 1 分钟后回复仍显示 via DERP,则表示一端位于打洞无法穿透的 NAT 后方,当前连接通过中继建立。

值得添加的一条防火墙规则

Tailscale 在大多数网络中无需修改防火墙即可工作,因为出站 UDP 通常处于允许状态。添加一条可选规则可以提高建立直连的概率:允许 UDP 41641 通过。

在家用路由器或办公网络防火墙上,这表示允许出站 UDP 访问端口 41641;如果网络限制了出站 UDP,还需要允许出站 UDP 访问端口 3478,用于 STUN。大多数家用路由器已经允许这些流量,因此无需进行任何操作。

在 VPS 上,有用的方向是入站。VPS 具有公网 IP,前面没有 NAT,因此为 UDP 41641 添加入站规则后,VPS 就能让每个对等节点更容易连接:即使对等节点自身的 NAT 较难穿透,其打洞数据包也始终可以到达 VPS。使用 ufw:

sudo ufw allow 41641/udp
sudo ufw status

ufw status 应将 41641/udp 列为来自 Anywhere 的 ALLOW。在控制面板中单独运行网络防火墙的服务商,也需要在那里添加相同规则,因为在服务商边缘被阻止的数据包永远无法到达 ufw。这条规则只是为了提高便利性,并非必需。即使关闭该端口,VPS 仍会加入 tailnet,对等节点仍可访问它,只是其中一些连接会通过中继而不是直接建立。

从外部访问家庭 NAS 或 Raspberry Pi

第一种情况最简单,也是大多数人所说的“Tailscale 端口转发”:从不在家中的笔记本电脑或手机访问家中的设备。

在家庭设备和笔记本电脑上安装客户端即可。整个配置就这么简单。此时,NAS 或 Pi 运行的每项服务都可通过其 tailnet 地址访问,无需转发任何端口:

ssh pi@100.101.102.103
curl -I http://100.101.102.103:8080/

将该地址替换为家庭设备上运行 tailscale ip -4 的输出结果。SSH 登录行为应与连接家庭 Wi-Fi 时完全相同;curl -I 应输出该设备所运行 Web 应用的 HTTP 状态行。由于连接通过与已登录设备关联的 WireGuard 密钥进行身份验证,因此在端口转发场景下可能存在风险的服务,例如 SMB(服务器消息块)共享或 Web 管理面板,在这里通常可以安全使用:只有你自己的设备能够向它发送数据包。中间的 ipTIME 或 Fritz!Box 不会收到入站连接,也无需进行任何更改。如果 ISP 将你置于 CGNAT 后,这种方式仍然有效,因为家庭设备始终只发起出站连接;在最坏情况下,流量会通过中继转发。

新建的 tailnet 默认启用 MagicDNS,它还会为每个节点提供名称。因此,只要笔记本电脑已加入 tailnet,ssh pi@nas 就可以正常工作。

设备无法运行 Tailscale 时:子网路由器

某些设备无法运行客户端,例如打印机、IP 摄像头、操作系统受限的旧 NAS 或智能电视。子网路由器可以解决这个问题。家庭网络中的一台能够运行 Tailscale 的设备(Pi 即可)会通告整个家庭子网,tailnet 中的其他设备则通过它访问该子网。

echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-tailscale.conf
sudo sysctl --system
sudo tailscale up --advertise-routes=192.168.0.0/24

请使用实际的家庭子网。随后,需要在管理控制台中该设备的路由设置下批准此路由;Linux 客户端还必须使用 sudo tailscale set --accept-routes 主动启用该路由。完成后,笔记本电脑上的 ping 192.168.0.50 即可访问家中的摄像头。转发 sysctl 设置很重要:未启用时,Pi 会丢弃所有目标不是自身的报文。此时路由虽然显示为已批准,但其后方的设备不会响应。关于批准步骤、客户端启用方式,以及路由已批准但无法访问的其他原因,请参阅运行 Tailscale 子网路由器。该教程使用 VPS 作为路由器,但同样适用于客厅中的 Pi。

让朋友加入 Minecraft 服务器,而无需开放路由器端口

第二种情况:Minecraft 服务器运行在家中的 PC 上,朋友需要加入。传统做法是在路由器上转发 TCP 25565 端口,并把公网 IP 发给朋友。这样也会把该地址暴露给互联网上的所有扫描器。Tailscale 则通过共享来替代端口转发。

有两种方式。第一种是将朋友作为用户邀请加入您的 tailnet。这种方式可行,但免费套餐的用户席位数量有限,而且会为他们提供整个网络的登录权限,超出了游戏所需的范围。第二种,也是更好的方式,是共享节点。在管理控制台中打开 Machines 页面,找到运行游戏的 PC,打开其菜单并选择 Share。Tailscale 会创建一个邀请链接。每位朋友都需要拥有自己的免费 Tailscale 帐户。该帐户会成为其个人小型 tailnet 的所有者。朋友使用该帐户接受邀请链接后,共享的计算机就会出现在其机器列表中,并且只显示这台计算机。共享只会让接收者访问共享的计算机,无法访问您 tailnet 中的其他内容。共享的计算机默认处于隔离状态:它可以响应来自朋友 tailnet 的连接,但不能主动发起任何连接。

朋友在 Minecraft 中使用该计算机的 tailnet 地址 100.101.102.103:25565 添加服务器。如果端口使用默认值,也可以只填写地址。运行游戏服务器的 PC 无需转发任何端口,路由器配置也无需修改。共享计算机不会发布子网路由,因此共享适用于运行在共享计算机本身上的服务,这正是游戏服务器的场景。

限制是每位玩家都必须运行 Tailscale 并接受共享。对于一群朋友来说,这没有问题。但对于任何人都可以加入的公共服务器,这种方式并不适用。接下来的两个小节将介绍相应的解决方案。

在 VPS 上运行游戏服务器,并让 RCON 仅通过 tailnet 访问

避免端口转发的另一种方法是不再在家中托管游戏。VPS 具有公网 IP,且不经过 NAT,因此无需配置路由器,游戏端口即可对公网开放。在 VPS 上运行 Minecraft 服务器介绍了规格选择、Java 参数、备份和 systemd 单元。这里需要关注的是哪些端口面向互联网。

Minecraft 服务器会开放两个端口。TCP 25565 用于游戏,玩家需要访问该端口。TCP 25575 用于 RCON(远程控制台)。RCON 接受密码,然后执行任意服务器命令,包括 op 和 stop。对互联网开放的 RCON 端口容易成为密码猜测攻击的目标。将 VPS 加入 tailnet,并为这两个端口配置不同的规则:

sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw allow in on tailscale0 to any port 25575 proto tcp
sudo ufw enable
sudo ufw status

第二条规则允许所有人访问游戏端口。第三条规则仅允许从 tailscale0 接口到达的数据包访问 RCON,也就是说,只有 tailnet 中的设备可以访问。公网 IP 仍会在 25565 端口响应,而从公网侧连接 25575 端口的数据包会被 ufw 的默认拒绝策略丢弃。在同一台位于 tailnet 中的笔记本电脑上分别检查这两个端口:

nc -zv 100.101.102.103 25575
nc -zv <vps-public-ip> 25575

第一条命令应输出 succeeded。第二条命令应先一直等待,随后超时,因为数据包从公网接口到达,且没有匹配任何允许规则。同样的模式也适用于 SSH、Web 地图、数据库或指标面板:在公网 IP 上开放公共端口,仅在 tailscale0 上开放管理端口。

向整个互联网公开服务:Funnel 或 VPS 反向隧道

第三种情况是 Tailscale 本身无法解决的情况。博客、公共 API、公共游戏服务器和状态页的访问者不在您的 tailnet 中,也不会加入其中。这两种工具可以处理此类需求,且分别对应独立的文章。

Tailscale Funnel 通过 Tailscale 的中继,将节点上的 HTTPS 服务发布到公共互联网。它仅支持 TLS(传输层安全),且只能使用 443、8443 和 10000 端口。因此,它适合 Web 应用,但不适合使用 25565 端口的原始游戏协议。Tailscale Serve 与 Funnel 的区别说明了两者分别公开什么内容,以及向哪些用户公开。

VPS 反向隧道可以处理其他情况。家庭服务器向具有公网 IP 的 VPS 建立出站隧道,VPS 再通过该隧道将公共端口转发回家庭服务器。它支持 TCP 或 UDP,并可使用任意端口号。对于托管在家庭网络中、位于 CGNAT 后的公共 Minecraft 服务器,应使用此工具;使用 VPS 反向隧道让位于 CGNAT 后的家庭服务器提供服务将介绍具体步骤。请在这两种方案中选择一种,不要继续寻找能够向整个互联网开放端口的 Tailscale 设置。不存在这样的设置。

Tailscale 不会做什么

  • 它不会为任意公网客户端转发端口。来自 tailnet 外部的用户的数据包永远不会到达您的节点,因为系统中没有对应的 WireGuard 密钥;没有有效密钥的 WireGuard 数据包会被直接丢弃,且不会返回响应。
  • 它不会为公众提供进入网络的方式。用户必须是您 tailnet 的成员,或已接受共享节点。
  • 它不保证使用直连路径。在复杂的 NAT 环境中,连接会通过中继转发,因此速度更慢。
  • 它不会打开路由器端口。路由器仍保持关闭,这正是其设计目的。

FAQ

Tailscale 需要端口转发吗?

不需要。每个 Tailscale 节点只建立出站连接。节点通过 TCP 443 上的 HTTPS 访问协调服务器,并使用 UDP 3478 上的 STUN 获取公网地址。直接对等连接通过端口 41641 上的 UDP 打洞建立;打洞失败时,流量会通过 TCP 443 上的 DERP 中继传输,仍然是出站连接。家用路由器无需配置端口转发或 DMZ 主机,位于 CGNAT 后的设备也可以按相同方式加入。

Tailscale 能替代 Minecraft 服务器的端口转发吗?

可以,但仅适用于供朋友加入的服务器。在游戏电脑上安装 Tailscale,然后在管理控制台的 Machines 页面中将该设备共享给每位朋友。朋友无需进行端口转发,即可通过该设备的 tailnet 地址和端口 25565 连接。它不能替代公网服务器的端口转发,因为 tailnet 外部的玩家无法访问该节点。对于公网服务器,应将游戏托管在具有公网 IP 的 VPS 上,并让 RCON 保持在 tailnet 中;也可以从家用设备建立到 VPS 的反向隧道。

Tailscale 使用哪些端口?

3 个。TCP 443 出站连接用于访问协调服务器和传输 DERP 中继流量。UDP 3478 出站连接用于 STUN,以发现公网地址。UDP 41641 是直接连接使用的默认 WireGuard 监听端口;如果该端口已被占用,可以修改此端口。这些端口都不需要允许入站连接。在 VPS 上允许入站 UDP 41641 是可选的,并且通常可以让对等节点更频繁地建立直接连接。

为什么我的 Tailscale 连接使用了中继,而不是直接连接?

tailscale ping 在 UDP 打洞无法完成时会继续响应 via DERP。常见原因包括打洞无法穿过的 NAT(例如 CGNAT,或为每个目标分配新端口的对称 NAT),以及阻止出站 UDP 的防火墙。请修复可控的问题:允许出站 UDP 41641 和 3478;或者将一个对等节点放在允许入站 UDP 41641 的 VPS 上,使另一端的打洞始终有固定目标。