演示版中还有一个极其重要的环节没有交代:服务端(frps)的架构设计

如果说 Mole 客户端是用户看到的“门脸”,那么服务端就是支撑多用户安全、有序运行的“大脑”。即便在未来的纯工具版中不再强制使用我的服务器,但这套多用户鉴权动态域名的方案,依然值得每一位开发者备忘。

一、 fp-multiuser:实现多用户隔离的关键

在服务型工具中,不可能让所有用户共享一个 Token,否则无法追踪流量,也无法实现精准的权限控制。我选择了 frp 官方推荐的插件方案:fp-multiuser

1. 核心逻辑:基于 OpLogin 事件的鉴权

fp-multiuser 实际上是一个基于 HTTP 协议的外部插件。它的精妙之处在于:当 frpc 尝试连接 frps 时,插件会拦截相关事件。

在我的实现中,我重点使用了 OpLogin 事件:

  • 分配 Token:当用户通过 Mole 客户端(或小程序激励后)请求连接时,后端 API 会动态生成一个唯一的 Token 并下发给客户端。
  • 校验映射:当 frpc 发起登录,fp-multiuser 插件会接收到这个 Token。插件通过查表或调用我的管理接口,确认该 Token 是否合法、对应哪个子域名。
  • 唯一映射:这样就确保了 A 用户只能使用 A 子域名,彻底解决了多用户环境下域名冲突和越权访问的问题。

二、 泛域名证书:让每个子域名都拥有 HTTPS

演示版支持用户通过 HTTPS 访问本地服务。面对随时可能生成的成百上千个二级域名(如 user1.example.com, user2.example.com),手动配置证书显然是不现实的。

1. 泛域名证书(Wildcard Certificate)

我使用了 Let’s Encrypt 的泛域名证书。

  • 申请方式:通过 DNS-01 验证方式(利用 Certbot 或 acme.sh)申请 *.example.com 的证书。
  • 优势:一个 .pem 文件即可覆盖所有二级域名,无需为每个新用户重新申请。

2. Nginx 反向代理配置

在服务端,我并没有让 frps 直接监听 443 端口,而是将其置于 Nginx 之后。

  • Nginx 逻辑:Nginx 监听 443 端口,配置泛域名证书。
  • 动态转发:利用 Nginx 的变量特性,将所有子域名的流量统一转发给 frps 的 vhost 端口。
server {
    listen 443 ssl;
    server_name *.example.com;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080; # frps 的 vhost_http_port
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

通过这种方式,客户端只需配置简单的 HTTP 映射,而在公网访问时,用户看到的是受保护的 HTTPS 链接。

三、 总结与备忘

这两点设计解决了两个核心矛盾:

  1. 安全矛盾:通过 fp-multiuser 解决了“谁能连接”和“能用哪个域名”的问题。
  2. 体验矛盾:通过泛域名证书解决了“无需配置即可享受 HTTPS”的体验问题。

虽然在接下来的公版开发中,我将弱化这种“中心化”的控制,但这段服务端实战经验,是我在独立开发之路上关于“服务化思维”的一次重要沉淀。
至此,演示版的所有技术细节已全部收尾。下一篇,我们将正式开启公版(纯工具版)的 UI 重构与多协议适配!