前排提醒:
本文是个人的服务器配置记录兼小白教程,仅实践于个人/家庭 Jellyfin 服务器实现远程访问功能。
所记录的过程同样适用于大多数的私人网络服务搭建,但公网暴露私人设备存在安全风险,可提前了解服务器部署及网络安全相关知识后斟酌采用;
切记不要公开自己的 IP/域名和端口!!!
先确定一下个人动机:
为什么搞:老妈有需求为什么不用视频app:因为不想给某腾某艺爆米为什么不用内网穿透:速度感人为什么不用云服务器:贵,而且有闲置树莓派为什么用阿里:碰巧撞见,碰巧有号,全流程免费,无利益相关
硬件:树莓派4B: Ubuntu Server(无桌面)系统
软件:Jellyfin(docker 部署)
1. 向运营商申请公网IP
直接使用运营商app客服,人工服务申请公网IP(免费),一般 3~5 天左右完成,申请难度因地区而异
注意:
申请完公网IP之后客服可能会告知也可能不会告知,可以打电话或客服问一下;这时自己的路由IP和光猫IP也不会发生变化,且与公网IP不一致,因为光猫没有重新拨号,还是使用路由模式 DHCP 分配你的路由器IP,需要改桥接。
申请完成后网页搜索“我的ip”,随便进一个网站查看自己的公网IP与路由器IP地址是否一致,若一致则说明成功拥有公网IP,不一致则说明仍然处于大内网下(注:不要使用代理,否则看到的是代理服务器的IP)。
2. 修改光猫为桥接模式
提前记下自己的宽带账号与密码,不知道的问运营商客服
直接打电话给维修小哥,说光猫改桥接拨号,几分钟搞定(免费),路由器的 WAN 设置会变成 PPPoE 拨号模式:

虽然网上有很多破解光猫的方法,但是不建议小白操作,很容易光猫变砖,且大多数方法早已失效;
可以使用超级管理员操作,不过较新的光猫的超级管理员账户密码每次重启光猫都会变化,需要安装小哥现场查询,破解成本极高也不一定有效,因此建议一个电话解决。
搞机佬可忽略
3. 注册域名并绑定IP
在域名提供商处购买域名,网上也有很多免费版域名获取途径,我使用的是阿里云免费版域名,因此后续步骤都以阿里云为例子,其他平台也都大同小异(如 Clouldflare),购买后可以进入云解析DNS控制台进行后续配置
页面上可以看到自己已有的域名,点击后面的解析:

添加记录,主机记录中输入二级域名(自定义,如 media ,如果服务器只用于单一服务可以直接用 www
或 code>@</code 指向主站),记录值中输入公网IP(ipv4地址选择记录类型 A,ipv6选择记录类型 AAAA):

其他选项不变,保存即可,可以使用平台检测 DNS 解析是否正确。
4. 申请SSL证书
网上有很多SSL证书的申请办法,因为个人是从阿里云买的域名,因此证书也顺便在阿里云搞定了,其他平台申请的证书同样适用于后续流程,可以考虑 Let's Encrypt 或者 Clouldflare。
在阿里云申请个人免费ssl证书,阿里云的个人测试证书(免费证书)每个账号一年可以领20个,但是每个证书有效期只有3个月(🐶ali)失效后需要手动更新,领取后在SSL证书管理页面创建证书:

填写刚添加的域名:

后面需要填写一些实名信息之类的,不做展示,几分钟后邮箱或短信会收到证书签发成功的通知
申请完证书可以在控制台看到证书,选中后点击下载,需要的证书格式是 pem 和 pfx/key 两种:

下载后备用。
5. 启用 jellyfin https 访问
为了安全考虑,公网访问 jellyfin 一定要使用 https 访问,推荐的实现 https 方案有两种:
- 直接在 jellyfin 中启用 https 访问,并配置证书通过 Ngnix 反向代理并配置 ssl 证书
建议两种方法中仅使用其中一种即可
如果服务器仅用于 jellyfin 服务且没有额外的开放端口,则推荐方法1
如果服务器上运行多个服务,或以后有开放其他端口的打算,希望通过 Nginx 统一管理,则推荐方法2。
浏览器https默认请求443端口,因此在有些浏览器中需要添加https://
前缀才能访问 jellyfin https
5.1 jellyfin启用https
解压 pfx 格式证书压缩包,解压后可以获得一个 pfx 格式的证书文件和一个 txt 格式密码文件,将 pfx 文件放到 jellyfin 可访问的某个路径下(建议放在.../config/ssl
,我是使用 docker 部署的,所以放在了挂载路径下;
进入 jellyfin 控制台,选择网络,启用https,端口号改不改都可以,但自己一定要记住

在下面的HTTPS设置中填写证书路径与证书密码(密码在密码文件中):

ps: 不建议开启强制 https,否则所有的 http 访问都会重定向到 https,当 ssl 证书过期或发生其他访问问题时就无法通过浏览器访问 jellyfin (把钥匙锁屋里了);发生这种情况时需要手动修改 jellyfin 的 config 文件或重新部署
上述配置完成后点击保持,重启 jellyfin,在浏览器输入https://<your_jellyfin_host>:8920
检查是否可以正常通过 https 访问。
5.2 Nginx反向代理(可选)
使用 Nginx 反向代理可以将所监听的端口请求转发到本地的其他服务端口,如果已经开启了 jellyfin 的 https 访问则不需要再通过 Nginx 配置 ssl。
安装Nginx的方法可以在Installing nginx中找到,在添加了软件源且满足依赖条件的 Ubuntu/Debian 系统中可以直接用 apt 安装:
sudo apt updatesudo apt install nginx
Linux系统中,Nginx 的配置文件位于/etc/nginx/conf.d
文件夹下,在Nginx的默认配置文件中,已设置自动加载conf.d
文件夹下所有的.conf
文件,因此新配置文件可以在conf.d
下创建,如default.conf
;
将之前下载的 pem/key 格式的证书解压缩到/etc/nginx/ssl/
,可以获得 pem 和 key 两个文件;
在配置文件中添加配置项:
server { listen <要监听的端口号> ssl; server_name <你的域名>; ssl_certificate <pem 证书路径>; ssl_certificate_key <对应的 key 文件路径>; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:8096/; # 后端服务端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}
端口号理论上可以随便设置,但实际上尽量不要在公网暴露敏感端口(如80、8080,443等)以及系统与其他程序占用的端口和低位端口,也不要暴露 jellyfin 的原始端口(8096、8920),选择不常用的高位端口进行监听不容易被他人扫描
后端的转发端口设置为8096是因为 ssl 已经由 Ngnix 处理,不需要再走一遍 jellyfin 的 https,jellyfin 中也无需开启 https;
将所有端口、域名和路径补完,保存配置文件,检查配置文件是否可用:
sudo nginx -t
加载新配置:
sudo nginx -s reload
配置完成后,在浏览器输入https://<your_jellyfin_host>:<port>
检查是否可以正常 https 访问
6. 设置路由器端口转发
获得公网IP后,实际上公网IP指向的是路由器地址,内网设备并不直接暴露于公网;
通过设置端口转发可以将路由器收到的对应端口请求转发到内外设备,不同路由器端口转发设置方法大同小异,
以 H3C NX54 为例,在专业版 > 高级设置 > 地址转换 > 虚拟服务器列表
中添加条目:

外部端口填写要在公网暴露的端口(不要暴露敏感端口),要暴露单一端口则起始端口和结束端口相同,内部端口填写 jellyfin 的 https 服务端口 或 Nginx 监听的 https 端口,内部服务器IP填写 jellyfin 部署设备的内网IP(可通过ifconfig
查看)
设置完成后即可通过域名+端口号远程访问 jellyfin 服务器:
https://<your_domain_name>:<port># <your_domain_name>:IP绑定的域名# <port>: 路由器外部端口
默认情况下路由器收到未定义的端口请求时会直接将数据包抛弃,不要开启重定向 DMZ 主机选项(相当于服务器直接暴露公网);如果是刷过机的路由器建议开启防火墙或者添加IP白名单,可以将Ngnix配置放到路由器上完成。
7. 配置DDNS
非专线公网IP每次拨号都可能会动态改变,需要配置 DDNS 解析来动态更新域名指向;
通常来说更新域名绑定IP的原理是:通过路由器或服务器软件每隔一段时间检查服务器公网IP与域名绑定IP是否一致,当IP发生改变时,通过使用域名提供商的 API 向域名管理平台提交IP变更,从而实现动态IP绑定。
现在大部分路由器支持 DDNS 解析,但很不巧我的路由器(H3C NX54)不支持,新华三可以从我的下一个路由器备选中滚蛋了,因此 DDNS 软件选择 DDNS-GO,支持了很多常见的域名管理平台。
通过 Docker 部署 DDNS-GO:
拉取镜像:
sudo docker pull jeessy/ddns-go
docker-compose 文件:
services: ddns-go: image: jeessy/ddns-go:latest container_name: ddns-go restart: always network_mode: host volumes: - ~/ddns-go/opt:/root
启动 docker 容器:
sudo docker compose up -d
浏览器访问 DDNS-GO 页面,默认端口号 9876。
以阿里云为例,通过 AccessKey 授权 DDNS-GO 修改域名绑定IP,在网页右上角的个人权限与安全中可以创建 AccessKey 与密码,

建议使用 RAM 角色创建 AccessKey ,只授权有限的管理权限避免风险,若拥有主用户的 AccessKey 则可以控制此账号下的绝大多数配置,这是一件很危险的事情
进入 AccessKey 页面,创建用于程序访问的超级用户:

登录名称可根据应用程序自定义设置(如 ddns-go-user),创建后会生成此用户的 AccessKey ID 和 AccessKey Secret(只显示一次,之后无法再次获取,所以需要立刻保存),将它们复制到 DDNS-GO 配置栏中

保存设置,DDNS-GO 可自动检查IP并更新域名绑定。
到此公网访问的设置已经全部完成,可以通过 https://<your_domain_name>:<port>
远程访问家里的 jellyfin 服务器,可以将网址与端口分享给家人或朋友,组建家用的远程媒体服务器。
切记不要公开自己的域名与端口!!!
本人小白,还在慢慢学习,搭建过程如有缺漏或更优方案也欢迎评论区大佬指点。