摘要

Tailscale Funnel(公网 HTTPS 暴露)和 SSH(ts ssh Tailscale 托管 SSH)是两种核心公网暴露机制。Funnel 通过 --funnel CLI 实现公网反代,自动 Let’s Encrypt 证书;SSH 利用 Node Key 绕过传统公钥认证,依赖 ACL/Grants 细粒度控制。零信任原则:默认拒绝,ACL/Grants 显式授权。

1. Tailscale Funnel:公网 HTTPS 暴露核心

Funnel (tailscale funnel <target>) 将本地服务/文件暴露至公网 HTTPS,TLS 终止于 Tailscale Daemon。关键约束:

  • 端口限制:仅 443/8443/10000。
  • Target 类型
类型 示例 行为
HTTP 反代 tailscale funnel localhost:3000 公网 → ts.net → 127.0.0.1:3000 (HTTP)
文件/目录 tailscale funnel /path/to/dir 目录列表 + 文件服务
静态文本 tailscale funnel 'text:Hello World' 纯文本响应
TLS 终止 TCP --tls-terminated-tcp=443 localhost:8443 TCP 转发 + TLS 卸载
  • CLI 示例(持久化 --bg):
    s # # u d o : : t a t t i a a l i i s l l c s s a c c l a a e l l e e f u f f n u u n n n e n n l e e l l - s 4 b t 4 g a 3 t u o - s f h f t t - p j s s = o 4 n 4 3 l o c a l h o s t : 8 0 8 0
  • DNS:稳定 node.ts.net 子域,自动 CNAME 管理。
  • PROXY Protocol--proxy-protocol=2 保留客户端真实 IP(后端可见原 IP/端口)。

2. Tailscale Serve vs Funnel:内部 vs 公网对比

维度 Serve (tailscale serve) Funnel (tailscale funnel)
范围 Tailnet 内(MagicDNS/100.x IP) 公网(ts.net HTTPS)
TLS 可选 Let’s Encrypt 强制,Daemon 自动颁发/续期
端口 任意本地端口转发 限 443/8443/10000
用例 内网调试/协作 临时公网 Demo/Webhook 测试
风险 Tailnet ACL 隔离 公网暴露,强制 ACL + Lock

3. Tailscale SSH:托管 SSH 机制

tailscale ssh [user@]host 利用 WireGuard Node Key 双层加密,绕过传统 ~/.ssh/authorized_keys

  • 流程

    1. Tailscale 拦截 Tailnet IP:22 流量 → Daemon SSH Server。
    2. Node Key 认证(Control Plane 分发公钥)。
    3. ACL ssh 规则授权(accept/check)。
    4. SSH “none” 认证(已知身份,无需密码/钥)。
  • Check Mode(高危绕过防护):

    " ] s s { h " " : a c [ t i o n " : " c h e c k " , " s r c " : [ " u s e r @ e x a m p l e . c o m " ] , " d s t " : [ " t a g : p r o d " ] , " u s e r s " : [ " r o o t " ] , " c h e c k P e r i o d " : " 1 h " }

    强制浏览器 SSO 再认证(默认 12h,MFA 支持)。

4. ACL/Grants + Tags:授权与节点隔离

Funnel 授权nodeattrs):

" } n o " d f e u a n t n t e r l s " " : : [ { " t a g : f u n n e l - o k " ]

SSH 规则(默认保守):

" ] s s { h " " : a c [ t i o n " : " a c c e p t " , " s r c " : [ " g r o u p : d e v " ] , " d s t " : [ " a u t o g r o u p : s e l f " ] , " u s e r s " : [ " a u t o g r o u p : n o n r o o t " ] }

Tags(服务节点身份):

  • 非用户设备专用(--advertise-tags=tag:prod)。
  • Ownership:tagOwners: { "tag:funnel": ["[email protected]"] }

5. 证书管理

  • 自动:Funnel/Serve/Cert CLI 使用 Let’s Encrypt(90 天,Daemon 续期)。
    t a i l s c a l e c e r t m y h o s t . t a i l n e t . t s . n e t
  • Funnel 特有:稳定 ts.net CN,ACME Challenge via DERP Relay(无公网 IP 需求)。

6. 安全加固实践

核心:默认拒绝 + 多层验证。

  1. ACL Hardening:Grants 优先;Policy tests 验证。
  2. Tailnet Lock:Node Key 签名(tailscale lock),防私钥泄露/重放。
    t a i l s c a l e l o c k i n i t ; t a i l s c a l e l o c k s i g n
  3. Shields Up--shields-up 阻入站(个人设备)。
  4. Stateful Filtering--stateful-filtering(Subnet/Exit Node,反向包丢弃)。

风险矩阵

暴露类型 威胁 缓解
Funnel DDoS/扫描 ACL Tag + 端口限 + PROXY IP
SSH BruteForce Check Mode + Node Key
通用 Key 泄 Tailnet Lock + 即时吊销

参考:FunnelTailscale SSHACL