使用 Tailscale Serve 提供服务

Tailscale Serve

Tailscale客户端1.52版本调整了Tailscale Funnel和Tailscale Serve的CLI命令。如果曾在旧版本中使用Funnel或Serve,建议重新阅读CLI文档。

Tailscale Serve可以把Tailscale网络(称为tailnet)中其他设备的流量路由到当前设备上运行的本地服务。可以把它理解为与tailnet中的其他设备共享服务,例如共享一个网站。本页介绍Serve的工作方式,以及如何在tailnet中开始使用它。具体场景参见Tailscale Serve示例。

如果希望通过互联网向公众共享本地服务,应改用Tailscale Funnel。

The following related video provides additional context and examples.

开始使用 Serve

使用Tailscale Serve需要在tailnet中启用HTTPS证书。

访问控制规则对Serve同样有效,与其他服务没有区别。如果规则限制了某些设备或用户的访问,这些规则也会应用于通过Serve共享的服务。

如果tailnet尚未启用HTTPS,运行tailscale serve时,CLI会提供交互式Web界面,请你允许Tailscale代为启用HTTPS。

serve命令会在需要时显示提示,并把你引导到Web授权页面,以启用尚未满足的前置条件。

The 'Start using serve' web consent page

Tailscale Funnel默认启用。如果不打算在此设备上使用Funnel,可以将其关闭。

运行 Tailscale Serve

运行tailscale serve时,如果tailnet尚未正确配置以使用Tailscale Serve,命令会显示登录服务器URL;打开该URL即可启用所需功能。

Tailscale Serve可以向tailnet中的其他设备提供本地目录、文件、纯文本或本地端口。例如,使用以下命令,将请求代理到运行在http://127.0.0.1:3000的Web服务器:

tailscale serve 3000

运行tailscale serve --help可查看更多示例。

CLI会启动前台会话,显示当前提供服务的状态,以及用于访问服务器的URL:

tailscale serve 3000
Available within your tailnet:
https://amelie-workstation.pango-lin.ts.net

|-- / proxy http://127.0.0.1:3000

Press Ctrl+C to exit.

身份请求头

通过Tailscale Serve提供tailnet流量时,请求中包含身份请求头。面向公众的Funnel流量不包含这些请求头。

当Serve把流量代理到当前设备运行的本地服务时,它会在发送给后端的请求中添加几个Tailscale身份请求头。目标服务器可以据此识别与请求关联的Tailscale用户。如果传入请求已包含以下请求头,Serve会出于安全原因删除它们,以防止请求头伪造。

  • Tailscale-User-Login:请求者的登录名,例如alice@example.com。
  • Tailscale-User-Name:请求者的显示名称,例如Alice Architect。
  • Tailscale-User-Profile-Pic:请求者的头像URL(前提是身份提供商提供了头像),例如https://example.com/photo.jpg。

如果值中包含非ASCII字符,Tailscale可能使用RFC2047的“Q”编码,例如=?utf-8?q?Ferris_B=C3=BCller?=。

来自带标签设备的流量不会填充这些身份请求头。

身份请求头既可以供自定义后端使用,也可以供支持身份验证代理的第三方服务使用,例如Grafana。

虽然只为tailnet流量填充身份请求头,但这也包括已接受设备共享邀请的外部用户。例如,把设备共享给朋友,并在设备上配置Serve代理后,朋友访问Serve URL时,Tailscale也会填充这些身份请求头。

如果使用身份请求头向后端服务进行身份验证,最佳实践是让服务只监听localhost。否则,能够直接访问服务(而不经过Serve URL)的用户,很容易自行填写这些HTTP请求头。仅监听localhost,可以把篡改范围限制在Serve设备上运行的其他服务,避免局域网或tailnet中的任意用户直接伪造。

应用能力请求头

可以配置Serve,为连接的用户或带标签设备转发包含指定应用能力的请求头。与身份请求头类似,这一功能不适用于面向公众的Funnel流量。

此功能需要Tailscale v1.92或更高版本。

当Serve把流量代理到本地服务时,可以通过--accept-app-caps命令行参数,指定需要转发用户或带标签节点的哪些应用能力。如果发起请求的用户或带标签节点被授予了任意指定能力,Serve会把它们序列化为JSON,并通过Tailscale-App-Capabilities请求头转发。示例参见Tailscale Serve示例。

包含非ASCII字符的值使用RFC2047的“Q”编码,例如=?utf-8?q?{"example.com/cap/monitoring":[{"role":"=F0=9F=90=BF=EF=B8=8F"}]}?=。

如果传入请求已有Tailscale-App-Capabilities请求头,Serve会像处理其他Tailscale身份请求头一样,出于安全原因将其删除,以防伪造。

如果在后端服务中使用能力请求头来授权用户或带标签节点,最佳实践同样是让服务只监听localhost。否则,能够直接访问服务(不经过Serve URL)的用户,很容易自行填写这些HTTP请求头。只监听localhost,可以把篡改范围限制在Serve主机上运行的其他服务,而不是整个局域网或tailnet。

相关资源

  • 浏览Serve使用场景示例集,获取思路与灵感。
  • 使用PROXY协议。
  • 使用TCP转发器。
  • 重置Serve配置。
  • 禁用Serve。

限制

  • DNS名称只能使用tailnet的域名:device-name.tailnet-name.ts.net。
  • 受macOS应用沙盒限制,只有Tailscale macOS客户端的开源变体支持提供文件和目录。
  • 同一个端口不能同时用于Serve(仅tailnet内可访问)和Funnel(tailnet内与公众均可访问)。
    • 如果最后一次配置该端口的命令是serve,端口将完全私有。
    • 如果最后一次配置该端口的命令是funnel,端口将完全公开。

故障排查

Tailscale Serve需要在tailnet中启用HTTPS,才能自动为唯一的tailnet DNS名称签发TLS证书。如果使用“开始使用Serve”一节所述的交互式CLI流程,而HTTPS尚未启用,Tailscale会自动启用它。

正文相关链接

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容