Featured image of post 把你的 Jellyfin 安全地暴露到公网

把你的 Jellyfin 安全地暴露到公网

一种将 Jellyfin 暴露到互联网的可行方案。

如果你自建了私有 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

  1. 使用 rathole 可执行文件生成一对公私钥
  2. 在服务端配置 noise 协议并启动 rathole server
  3. 在客户端配置 noise 协议并启动 rathole client 4.(可选)在防火墙上仅放行来自 NAS 的访问

每天跑一次下面的小脚本,可以汇总你近期的网段,辅助做防火墙白名单:

1
2
3
directory=/path # 输出路径,改成你自己的
curl https://ip.useragentinfo.com/myip -w '\n' >> $directory/ip.txt
sort $directory/ip.txt | awk -F. '{print $1"."$2"."$3}' | uniq > $directory/unip.txt

反向代理

Jellyfin 的官方文档相当完善,针对不同 Web 服务器给出了反代配置与优化建议,基本可以复制粘贴直接用。

如果不打算上 CDN,到这一步就结束了。

CDN

我使用 Cloudflare(再次感谢)。它的 UI 干净强大,上手很容易。需要注意两点:

  • 开启 WebSocket。Jellyfin 用到了 WS(看你的 Web 服务器配置就能发现)。
  • 调整缓存策略。媒体系统里你看到的大多是静态资源,包括视频。按默认策略,看视频时 CDN 可能尝试把整段视频拉到边缘节点缓存,以期下次更快。但视频数量多、体积大、私有服务用户少,你也很可能一个月内不会重复看同一部片。首次播放时为缓存而拉全量既耗时又不划算。因此,应配置规则让视频资源不被缓存(或仅缓存元数据/小静态资源)。

写在最后

把私有服务暴露到公网有很多做法,这只是其中一种。如果你有更好的思路,欢迎交流!

comments powered by Disqus
Hosted by Cloudflare
使用 Hugo 构建
主题 StackJimmy 设计