Koala

Tailscale Peer Relay 让内网穿透更加稳定!

在 Tailscale 网络中,当设备之间无法建立 P2P 直连时,一般需要依赖 DERP(Designated Encrypted Relay for Packets)服务器来中继流量。而 2025 年 10 月,Tailscale 推出了全新的 Peer Relay 功能,让内网穿透更加简单而稳定。

Peer Relay 允许你将 Tailnet 网络中的任意设备指定为中继节点,用于转发其他设备之间的加密流量。当两台设备无法直连时,Tailscale 会优先尝试使用 Peer Relay,只有在 Relay 不可用时才回退到官方 DERP 服务器。

省流:Peer Relay 就是把你自己网络中的某台机器变成专属中继站

Peer Relay vs DERP

DERP 的特点

DERP 服务器由官方维护,拥有全球节点覆盖,可以自动选择最近的节点,使用时无需额外配置。但自建 DERP 时需要域名和 SSL 证书,国内还需要备案,配置相对复杂。自建时还需要考虑万人骑问题。

因为特殊原因,Tailscale 官方没有国内的 DERP 服务器,所以使用体验也不佳。

Peer Relay 的特点

Peer Relay 无需域名、证书和备案,免费用户也可以配置 2 个中继节点。

前提条件

在开始配置之前,请确保:(1) 所有设备运行 Tailscale 1.86 或更高版本。(2)至少有一台服务器能够被其他节点访问。

配置教程

第一步:准备公网服务器

需要一台具有公网 IP 的服务器作为中继节点。这台服务器可以是:

  • 云服务商的 VPS(阿里云、腾讯云等)
  • 有公网 IP 的家庭宽带设备
  • Full Cone NAT 环境下的设备

第二步:在中继服务器上启用 Peer Relay

在作为中继的服务器上执行以下命令:

tailscale set --relay-server-port=40000

说明:

  • 端口号 40000 可以改为任意开放的 UDP 端口
  • 建议使用 20000 以上的高位端口,避免被封锁

防火墙配置:

确保服务器防火墙和云服务商安全组都放行了该 UDP 端口:

# 如果使用 UFW
sudo ufw allow 40000/udp

# 如果使用 firewalld
sudo firewall-cmd --permanent --add-port=40000/udp
sudo firewall-cmd --reload

# 如果使用 iptables
sudo iptables -A INPUT -p udp --dport 40000 -j ACCEPT

同时别忘了在云服务商控制台的安全组中放行该端口。

第三步:配置 ACL 规则

登录 Tailscale 管理后台:https://login.tailscale.com/admin/acls/file

方法一:使用设备 IP(推荐,无需标签)

grants 部分添加以下配置:

"grants": [
    {
        "src": ["*"],
        "dst": ["100.x.x.x"],  // 替换为中继服务器的 Tailscale IP
        "app": {"tailscale.com/cap/relay": []},
    },
    {
        "src": ["*"],
        "dst": ["*"],
        "ip":  ["*"],
    }
],

配置说明:

  • src: ["*"]:允许所有设备使用该中继
  • dst: ["100.x.x.x"]:指定中继服务器的 Tailscale IP
  • 第二条规则允许设备访问中继节点本身

方法二:使用标签管理(适合多节点)

如果你有多个中继节点或需要精细化管理,可以使用标签:

1. 在中继服务器上打标签:

tailscale up --advertise-tags=tag:relay

2. 在 ACL 中配置标签所有者:

"tagOwners": {
    "tag:relay": ["autogroup:member"],
    "tag:srv": ["autogroup:member"],
},

3. 配置 grants 规则:

"grants": [
    {
        "src": ["tag:srv"],
        "dst": ["tag:relay"],
        "app": {"tailscale.com/cap/relay": []},
    },
    {
        "src": ["tag:srv"],
        "dst": ["tag:relay"],
        "ip":  ["*"],
    }
],

注意: 使用标签后,设备将无法使用 Tailscale 的文件传输功能(Taildrop),这是已知限制。如果你经常使用 Taildrop,建议采用方法一。

第四步:验证配置

在任意客户端设备上执行:

tailscale ping <目标设备的 Tailscale IP 或主机名>

如果配置成功,你会看到类似的输出:

pong from device (100.x.x.x) via DERP(xxx) in 82ms
pong from device (100.x.x.x) via peer-relay(14.103.xx.xx:40000) in 12ms
pong from device (100.x.x.x) via peer-relay(14.103.xx.xx:40000) in 11ms

可以看到,第一次连接可能会走 DERP,但很快就会切换到 peer-relay,延迟也明显降低。

你也可以使用以下命令查看状态:

tailscale status

输出中如果看到 peer-relay 字样,说明中继已经生效。

常见问题

1. Peer Relay 能完全替代 DERP 吗?

不能。 Peer Relay 只负责中继流量,无法替代 DERP 的 NAT 打洞(STUN)功能。建议保留 DERP 作为最后的 fallback。

2. 没有公网 IP 可以做中继吗?

理论上,Full Cone NAT 环境下可以通过端口映射实现,但实际测试中发现入口 IP 与 Tailscale 后台显示不一致,可能无法正常工作。建议还是使用有公网 IP 的服务器。

3. 带宽瓶颈在哪里?

中继节点的带宽会成为瓶颈。建议选择带宽充足的服务器。

参考资料

  1. https://tailscale.com/kb/1591/peer-relays
  2. https://tailscale.com/blog/peer-relays-beta
  3. https://blog.sleepstars.net/archives/ti-dai-derp-zui-gao-xiao-de-guan-fang-tailscale-relay-lu-you
  4. https://ysicing.me/tailscale-peer-relays