Plex 是个好东西,不仅界面美观、配置容易,上手还十分简单,是我个人媒体服务器首选。而且有公网的话,Plex 自带的远程访问服务(也就是中转)还可以直接让你在出门在外的时候,通过手机或是平板上的 Plex App 访问 Plex 媒体库,无需任何额外的设置。可美中不足的是,这玩意默认只映射 IPv4,不会自动映射到 IPv6。即使你已经在 Plex 的网络设置中勾选上 「启动支持 IPv6 的服务器」 ,它也视而不见,照样走它那 IPv4 的阳光大道。
没有公网 IPv4 的时候,Plex 的网络请求会像这样:
192-168-31-123.abcdefghjhfjkhasdafdsfecf.plex.direct
这都公网了,隔壁 Emby 直接域名解析上去就能用,就你 Plex 搞得这么娇气!
在现今 IPv4 资源枯竭的环境下,获取一个 IPv6 公网的难度绝对是要比 IPv4 小得多的多。因此,为了能充分利用手里的 IPv6 公网资源,我们需要简单地配置一下 Plex,好好治治它不老实走 IPv6 的坏毛病。
安装 DDNS-GO
使用 DDNS-GO 是为了解决动态公网的问题,毕竟 IPv6 一般不会是固定的。此外,使用 DDNS 还需要你拥有一个属于自己的域名。
这里使用 Docker Compose 进行安装,群晖用户不要忘了预创建 ddns-go
文件夹:
version: "3.9"
services:
ddns-go:
image: jeessy/ddns-go:latest
container_name: ddns-go
network_mode: host
volumes:
- ./ddns-go:/root
environment:
- TZ=Asia/Shanghai
restart: unless-stopped
安装完后在浏览器中打开 http://主机IP:9876
,配置 DDNS-GO。
选择你域名所在的 DNS 服务商。DDNS-GO 中不同的 DNS 服务商获取 Token 或是 API key 都会有相应的提示。这里以 Cloudflare 为例。
访问「创建令牌」页面,点击「创建令牌」;选择「编辑区域 DNS」,点击「使用模板」。在「区域资源」处选择「所有区域」,其余保持默认。
点击「继续以显示摘要」,完成创建后将秘钥粘贴至 DDNS GO 的 token
处即可。
token
在下面的 acme.sh 中也会用到,可以保存在某处备用。接着,启用 IPv6 配置,选择「通过网卡获取」IP 地址,在下方 Domains 里填入你想要使用的域名即可。
安装 ACME.SH
acme.sh 是一个用于签发证书的脚本,关于 ACME 协议 的相关知识,你可以自行查找资料。这里直接介绍 acme.sh 的使用方法。
你可以把 acme.sh 和 DDNS GO 安装在一个 compose.yaml
文件里,所以下面的配置我就省略掉一致的部分了。群晖用户不要忘了预创建 acme.sh
文件夹:
acme.sh:
image: neilpang/acme.sh
container_name: acme.sh
command: daemon
volumes:
- ./acme.sh:/acme.sh
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Asia/Shanghai
restart: unless-stopped
如果网络不行,连接不到 ZeroSSL 的话(具体表现为签发证书的时候卡在 API 连接上),在拥有代理的前提下可以为容器配置 HTTP_PROXY
。
在 environment
项中增加两行:
environment:
- TZ=Asia/Shanghai
- HTTP_PROXY=http://代理的IP:端口
- HTTPS_PROXY=http://代理的IP:端口
启动容器后,进入容器的终端 sh
:
docker exec -it acme.sh sh
在 acme.sh 容器内部的终端执行后续的操作。
创建账户,记得改成自己的邮箱:
acme.sh --register-account -m i@example.com
使用上面 DDNS-GO 获取到的 Cloudflare 的 token
,导入该 CF_Token
:
export CF_Token="Y_jpxxxxxxxxxx_qxxxxxxxxxxxxxxxxxxxxxxxxx"
申请证书,可以在 这里 查看更详细的 api 使用方法:
acme.sh --issue -d 'yourdomain.xx' -d '*.yourdomain.xx' --dns dns_cf
这是一个泛域名1的例子,个人建议直接签发泛域名,另外,第一个域名 -d
的域名使用根域名方便后续操作。
具体到某个域名的命令,比如本站 himiku.com
便是:
acme.sh --issue -d 'himiku.com' -d '*.himiku.com' --dns dns_cf
就可以申请到包含 himiku.com
和 *.himiku.com
的有效期为 90 天的 SSL 证书了。
-----END CERTIFICATE-----
[Sat Nov 17 20:50:29CST 2023] Your cert is in: /acme.sh/himiku.com_ecc/himiku.com.cer
[Sat Nov 17 20:50:29CST 2023] Your cert key is in: /acme.sh/himiku.com_ecc/himiku.com.key
[Sat Nov 17 20:50:29CST 2023] The intermediate CA cert is in: /acme.sh/himiku.com_ecc/ca.cer
[Sat Nov 17 20:50:29CST 2023] And the full chain certs is there: /acme.sh/himiku.com_ecc/fullchain.cer
更具体的使用方法,还请详细参考 acme.sh 官方使用文档。
如果你有在使用 oh-my-zsh 之类的命令行工具,那么可以添加一条别名:
alias acme.sh="docker exec acme.sh acme.sh"
后续就可以直接使用 acme.sh
,无需再 docker exec -it acme.sh sh
了。
如果没有,不进入容器内部终端的时候,后面的例子还请自行加上 docker exec acme.sh
,例如签发证书的时候:
docker exec acme.sh acme.sh --issue -d 'yourdomain.xx' -d '*.yourdomain.xx' --dns dns_cf
安装 Plex(可选)
如果你还没有安装 Plex,可以参考下方的 Compose 配置。唯一要注意的是要使用 host
的网络模式,bridge
模式在群晖中无法使用 IPv6 网络。
plex:
image: linuxserver/plex:latest
container_name: plex
network_mode: host #网络模式必须是host
environment:
- PUID=1026
- PGID=100
- VERSION=docker
# - PLEX_CLAIM=your-claim #在 https://www.plex.tv/claim/ 获取该验证码
volumes:
- ./plex:/config
- /volume1/media:/media
devices:
- /dev/dri:/dev/dri
restart: unless-stopped
生成 PKCS #12 证书
还是要用到 acme.sh,执行以下命令:
acme.sh --to-pkcs12 -d your.domain --password your-password
按上述申请证书的例子,应当是:
acme.sh --to-pkcs12 -d himiku.com --password my-plex-p12-password
应当有如下提示:
[Sat Nov 17 20:50:29CST 2023] The domain 'himiku.com' seems to have a ECC cert already, lets use ecc cert.
[Sat Nov 17 20:50:29CST 2023] Success, Pfx is exported to: /acme.sh/himiku.com_ecc/himiku.com.pfx
生成的 PKCS #12 证书就在 /acme.sh/himiku.com_ecc/himiku.com.pfx
文件夹内。
为 Plex 配置 PKCS #12 证书
将上一步中生成的 .pfx
格式的证书放在 Plex 能读取到的地方。我嫌麻烦,直接把 acme.sh
整个文件夹挂载到了 Plex 容器内,像这样:
volumes:
- ./plex:/config
- /volume1/media:/media
- /volume1/docker/acme.sh/himiku.com_ecc:/acme.sh/himiku.com_ecc
或者你也可以使用其他更方便的方法。
接着,在 Plex 的网络设置中,点击右侧「显示高级选项」,勾选「启动支持 IPv6 的服务器」,正确无误地填入「自定义证书位置」、「自定义证书加密密钥」以及「自定义证书域」。
往下滚动,关闭「启用中转」,填写「自定义服务器访问 URL」,链接需要完整到具体端口。
然后保存修改,再重启 Plex 容器,证书应该就生效了。Plex 的中转网络也应该变成了 IPv6 的地址,就像这样:
240e-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx.abcdefghjhfjkhasdafdsfecf.plex.direct
自动更新 PKCS #12 证书
手动更新肯定是不现实且麻烦的,所以我们可以在群晖的控制面板中,新增一个定时脚本。
在自定义脚本中填入以下内容:
#生成证书
acme.sh --to-pkcs12 -d your.domain --password your-password
#重启plex
docker restart plex
时间可以设置为每月或每 3 个月运行一次,不必太频繁。你可以在创建完脚本后立刻运行一次测试,看看 Plex 是否用成功上了这个证书。
如此一系列操作下来,就可以享受 Plex 上由 IPv6 带来的乐趣了,快来试试吧!!
参考
本文作者:mikusa
本文链接:https://www.himiku.com/archives/plex-with-ipv6.html
版权声明:所有文章除特别声明外均系本人自主创作,转载及引用请联系作者,并注明出处(作者、原文链接等)。
Plex 已经提供了 plex.direct 的域名,除非很需要使用 Web 端的话不需要自己绑定域名和签发证书吧
近期plex似乎被墙了,想问一下目前有没有什么解决方案
上个代理,docker跑的话配个 http_proxy、https_proxy 的环境变量就行了
看来得迁移到docker了。。。我现在用套件版跑 给nas挂代理的话 pt的做种很受影响。。。只能刮削的时候出去 弄完就停掉
请问一下安卓客户端打开后卡Logo有没有好的解决方法?目前用的是v2raya旁路,服务端刮削是没问题的,就是手机和电视安卓端似乎无效
卡 logo?重装app或者重新添加服务器试试
想问一下,可以设置成同一个域名和端口有ipv6的时候走直连,没ipv6的情况下走plex的中转吗
这……不行吧?plex的中转约等于没有,不要用ε=ε=ε=(#>д<)ノ
之前用ddns-go,部署完就忘了,导致域名解析天天被改,还以为是阿里云的锅 (´இ皿இ`)
感谢博主的教程,照着教程群晖虽然部署成功了,就是最后的自动更新的自定义脚本运行出错了。
下面两个脚本都试了
错误Log显示WARNING: Error loading config file: .dockercfg: $HOME is not defined
求博主指教 谢谢啦
p12证书有生成吗?群晖里只安了一个acme吧?
再次确认了一下 p12证书有生成的 就是会报这个错
WARNING: Error loading config file: .dockercfg: $HOME is not defined
群晖有2个acme
一个是自己照着下面项目的自动更新脚本运行的acme.sh
项目地址是 https://github.com/andyzhshg/syno-acme?tab=readme-ov-file
第二个是按着教程安装了您介绍的docker版的acme
不知道有没有影响
对了 顺便再咨询下博主大大 ddns-go里面的域名是填写主域名还是填写子域名还是泛域名
比如主域名是xxx.com 我想把plex的子域名设置成 plex.xxx.com 泛域名就是*.xxx.com
还有一个问题就是 最后填写「自定义服务器访问 URL」,链接需要完整到具体端口。
比如plex子域名已经用群晖反代到了32400端口了 还需要完整到具体端口吗
小白的问题有点多 请博主大大指教
当然有影响……所以你具体是用哪个命令成功生成p12证书的?
主域名就只会自动解析主域名,比如你填 himiku.com 那就只会解析到himiku.com ,泛域名直接就包含了子域名。
不对啊,我文中好像写了吧? 「泛域名即域名泛解析,指利用通配符 * (星号)作为子域名解析时,可以实现匹配所有的子域名。」
给plex上证书后,就不需要反代了。反代配置可以删掉,然后填到具体端口。
如果没记错的话用的是下面这个命令生成的P12证书的
docker exec acme.sh acme.sh --to-pkcs12 -d your.domain --password your-password
那你就把这个命令填进定时任务里
谢谢博主大大的指教 主要是小白水平有限 下面这句话没能吃透里面的意思 请博主大大见谅
「泛域名即域名泛解析,指利用通配符 * (星号)作为子域名解析时,可以实现匹配所有的子域名。」
小白的理解就是如果ddns-go里面填写了nas的主域名或者泛域名的话
就不需要反代了 直接填到具体端口就可以了哈
不知道理解的对不对 麻烦博主大大了!
意思是ddns里泛域名解析就等同于你手动挨个填abc.xxx.com asd.xxx.com,直接一个 *.xxx.com就匹配所有子域名了
但这跟你反代没关系啊,ddns只是域名解析,反代是反代啊
你反代不是用的群晖内置的反向代理吗,把 plex.xxx.com反代到内网的 192.168.1.1:32400 上吗?然后要给plex配https的话就会用到你发的那个acme脚本申请下来的证书
我这个是直接在plex里配置证书,所以省掉了反代那一步,改成直接在plex里填plex.xxx.com:32400
谢谢博主大大的各种教导,我尝试了反代关掉输入plex.xxx.com:32400,纯Ipv4环境下无法访问公网Ipv6的plex,然后又试了试反代输入plex.xxx.com,没加端口号是可以访问的。不知道是不是因为之前泛域名的证书的原因。再次谢谢大大的殷勤教导。感谢!
顺便再跟大大汇报一下 用的cloudfare的ddns 好像是ipv4跟ipv6免费双线的cdn
纯Ipv4环境下也可以访问纯Ipv6的内容
纯 Ipv4 环境下当然无法访问公网 Ipv6 的 plex啊……但你又套个 CF 是干啥,国内速度很慢的 (⌐■_■)
就是因为纯 Ipv4 环境下无法访问公网 Ipv6 的 plex 所以套了个cf
代理状态打开小黄云 就可以纯 Ipv4 环境下访问公网 Ipv6下的设备了
不管plex 还是路由啥的 都是可以的 博主大大可是测试一下的
其实也不一定需要host网络,更建议给docker单独分一个子网,让他跟你的host网络隔离,这样会更安全点。修改一下
/etc/docker/daemon.json
,增加下面的内容:这样就可以让容器获取v6地址了,就是这个前缀你需要根据ISP分配的v6前缀自己算一个子网。
比如我运营商给的是62长度的前缀:
2408:xxxx:xxxx:168::/62
,v6地址一共128位,前64位可以用来做网络段,62-64之间你有两个bit位可以用来划分子网.前面的部分不用管,保持一致就可以了,重点关注168那里可以划分几个子网。注意v6每段有16位,由于前导0可以省略,所以168其实是0168。
每个数字是一个16进制数,也就是4bit位一个数,两个数合起来就是一个8bit,一段16bit。
我们我们要划分的是62-64之间的数,也就是最后两bit,那前面3个数(016)其实也不用关注,保持相同就可以,只需要关注8这个数字,把它转化成二进制
0100
运营商将最后2个bit位给我们自由分配,那么我们可以有以下几种组合:
0100
,0101
,0110
,0111
,也就是168,169,170,171。所以你可以划分4个子网:
***:169::/64
~***:171::/64
然鹅,群晖 Docker 的 IPv6 很不好开。我 qb 是走的 macvlan,不然host卡死,不晓得为啥。
dsm7.2 docker桥接,网络显示ipv6禁用,实际能用ipv6,bug吗这是...
dsm要用host才能有v6,或者用macvlan
感谢博主的教程,我手机的plex连接播放很流畅,但是我发现Plexamp连接不上了,我不知道是我设置有错还是Plexamp软件有缺陷。
Plexamp 退出登录试试看?
我重新安装了Plexmp并重新登录也是不行,不知道是不是Plexamp不支持ipv6还是我的网络问题
是支持IPv6的,我这边使用一切正常。那你内网环境下能用吗?我还真没遇到过这种情况。
怪事了,我用手机连接只开启V6的热点,plex正常,就Plexamp连接不上。博主有时间麻烦发个您使用的Plexamp app给我,我看看是不是APP的问题,邮箱1297284054@qq.com。非常感谢!
打扰博主了,现在不需要app了。我现在在 “自定义服务器访问 URL” 里填入反代好的域名也能流畅的使用了。感谢!
传送门
原来你没填啊……我文中不是有写嘛
我填了的,我之前按您的教程填的是直连解析的域名加证书,外网plex正常很流畅,plexamp死活都连接不上,不知道那里出现问题了。 我现在连接的方式和您的教程有点不一样,填的是反向代理的域名,就是把ipv6反代成内网ipv4,域名端口也不是32400了,plex没按教程填入证书和域名,就只关闭「启用中转」,和填写「自定义服务器访问 URL」这两项,手机外网下plexamp正常可以连接上了,plex也没出现问题。
诶,那你这样还有用上IPv6吗?使用流量看视频听音乐都一切正常?
正常,我今天测试了几次都没出现问题,很流畅
plex自带的内网穿透好像只有1m的速度
这倒是没注意过,没有公网的时候它就没起作用过,就是个摆设
所以都是用nginx接管所有流量,转发到本地的http端口,不喜欢到个个服务之内配置外网访问
巧了,我也是这么玩的 。但是为了在出门的时候也能用上 Plex,只能给它开小灶了。