如果你自建了私有 Jellyfin 服务并想把它开放给朋友访问,那你来对地方了!最近我正好抽空处理了这个需求,这里分享下我的做法。
背景
我有一台装了 TrueNAS 的 NAS,利用系统自带的 K3S 部署了不少私有服务,Jellyfin 就是其中之一。因为没有公网 IP,需要靠端口转发把服务暴露出去。在暴露 Jellyfin 之前,我已经把 OpenVPN 配好了,并把端口映射到 VPS。后来有朋友想用我的 Jellyfin,但直接把 ovpn 文件给朋友风险太大,于是决定把 Jellyfin 以更安全的方式开放到公网。
方案原理
整体思路与 OpenVPN 类似,依旧是端口转发;但 Jellyfin 是 HTTP 服务,为优化体验,我叠加了 CDN(谢谢 Cloudflare!)。下图展示了整体架构:
端口转发
推荐一个用 Rust 写的高性能、轻量端口转发工具: rathole。它的原理类似另一款知名转发工具 frp,但性能更好。我的对比中,两者峰值速度接近,但 rathole 更能长时间稳定在峰值。另外,rathole 支持无需证书的非对称加密。我的 Jellyfin 在内网并未启用 HTTPS,因此一旦穿越公网,链路加密就很有必要。
下面的步骤,官方文档讲得很清楚:README
- 使用 rathole 可执行文件生成一对公私钥
- 在服务端配置
noise
协议并启动 rathole server - 在客户端配置
noise
协议并启动 rathole client 4.(可选)在防火墙上仅放行来自 NAS 的访问
每天跑一次下面的小脚本,可以汇总你近期的网段,辅助做防火墙白名单:
|
|
反向代理
Jellyfin 的官方文档相当完善,针对不同 Web 服务器给出了反代配置与优化建议,基本可以复制粘贴直接用。
如果不打算上 CDN,到这一步就结束了。
CDN
我使用 Cloudflare(再次感谢)。它的 UI 干净强大,上手很容易。需要注意两点:
- 开启 WebSocket。Jellyfin 用到了 WS(看你的 Web 服务器配置就能发现)。
- 调整缓存策略。媒体系统里你看到的大多是静态资源,包括视频。按默认策略,看视频时 CDN 可能尝试把整段视频拉到边缘节点缓存,以期下次更快。但视频数量多、体积大、私有服务用户少,你也很可能一个月内不会重复看同一部片。首次播放时为缓存而拉全量既耗时又不划算。因此,应配置规则让视频资源不被缓存(或仅缓存元数据/小静态资源)。
写在最后
把私有服务暴露到公网有很多做法,这只是其中一种。如果你有更好的思路,欢迎交流!