自建高解析度影音串流平台
最近折腾openwrt,给子设备开启了公网ipv6地址,同时自己的hi-res影音库也开始积攒空间,不能简单地再用syncthing同步到所有设备上了。于是开始想办法用网络串流自己的文件。写篇blog简单记录下我的方法,说不定能帮到和我有一样想法的你。
#FOSS #Software #Networking #linux
Part 0: 替代方式
以下是在开工前我想到的部分替代方式和为什么不使用他们的原因:
- Spotify / Netflix: 要充钱, 有地区限制, Spotify音质不好, netflix封锁vpn
- Syncthing: 没有文件压缩, 而且需要在所有设备上占用存储空间
- Nextcloud: 慢, 过于臃肿, 用不到这么多功能
Part 1: 把文件放到局域网上
软件
首先找了个移动硬盘, 用btrfs格式化, 开启lzo压缩, 顺便用luks加密, 然后把文件都丢进去. (当然用ext4 / vfat也行)
然后就是把文件托管在局域网里的服务器上, 这里我用的是运行archlinux arm的树莓派,因为可以24小时在线,而且节能.
托管的这一步很简单, 主要考虑的是协议:
- NFS: 只支持linux-based,不支持windows(不过我也不用windows), 客户端软件的兼容性有限
- FTP: 协议不安全, 不支持写入
- SFTP: 底层传输用的是ssh的端口传发, 有overhead, 不支持写入和更精细的权限控制
最后选择的是SAMBA, 服务端和客户端的兼容性都好, 有用户认证权限管理和加密.
pacman -Syu samba
按照样例文件和wiki更改配置, 用testparm
测试配置文件, 最后去systemd开启smb
systemctl enable --now smb
防火墙
如果安了ufw防火墙还要允许smb的端口
ufw enable 139
ufw enable 445
ufw reload
Extra: 开启局域网公告(avahi zeroconf)
也是按照wiki,安一个avahi
,然后运行.
安了zeroconf的好处是不用手动输地址
pacman -Syu avahi
systemctl enable --now avahi
现在已经可以用vlc在局域网上找到smb服务器了.
Part 2: 用ipv6开启外网访问
现在局域网上的设备都能访问我的这些文件, 但是出门用流量联网之后就不行了. 这个问题的解决方法也很简单, 开启samba的ipv6监听, 配置路由器的防火墙(如果有的话).
前提条件: 有公网ipv6
首先看下自己有没有公网ipv6:
- linux-based: 找一个设备去终端输
ip -6 addr
, 看有没有2开头, 后面跟了global的地址. 有就代表本设备和(绝大多数情况下)局域网的其他设备有公网ipv6, 如果只有f开头, 后面跟了link的地址, 就代表没有公网ipv6, 此文章不再适用(当然,有其他方法能开启外网访问,但是会更麻烦). 以下是有公网ipv6的示例:
user@host ~ $ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2****:****:****:****::****/128 scope global dynamic noprefixroute
valid_lft *****sec preferred_lft *****sec
inet6 2***:****:****:****:****:****:****:****/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft *****sec preferred_lft *****sec
inet6 fe80::****:****:****:****/64 scope link
valid_lft forever preferred_lft forever
- 所有系统: 去 https://test-ipv6.com/ 检测, 绿色勾勾就代表本设备和(绝大多数情况下的)其他局域网设备有公网ipv6
动态dns
找一家动态dns服务商. 我用的duckdns, 因为可以不注册帐号直接用github登录, 配置简单且免费.
在samba服务器上安装ddns脚本, 修改配置并启动(也可以自己写), wiki上有教程, 此处不赘述.
等10分钟左右去解析一下自己的域名, 能解析到自己的ipv6地址就成功了, 成功示例:
user@host ~ $ nslookup your-domain.duckdns.org
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
Name: your-domain.duckdns.org
Address: 2***:****:****:****:****:****:****:****
修改配置
首先去改samba的设置, 然后重启系统服务.
# /etc/samba/smb.conf
# 仅展示核心配置, 根据情况修改, 不要直接复制粘贴
[global]
interfaces = ::/0 192.168.1.0/24
hosts allow = 192.168.1. ::/0
systemctl restart smb
现在已经可以在公网访问smb了, linux可以用cifs挂载:
doas mount -t cifs //your.domain.com/share /your/mountpoint -o username=*****,password='*****',uid=*****,gid=*****
也可以用smbclient
,此处不赘述.
Extra: 安卓端软件配置
在写本文章的时候(2023-1-11, VLC android 3.5.3), vlc有两个相关的bug:
- 不能直接连接ipv6的samba网盘, 要改一个设置才可以.
- 不能为外网的samba网盘建立索引.
解决ipv6 samba连接问题
Settings –> Advanced –> Prefer SMB 1, 把这个关掉, 然后点Clear media database就可以了. 其他的都不用动.
为公网samba网盘建立索引
目前VLC还在开发这项功能, 暂时无法实现.
更新:参见我的下一篇文章
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
Arguing that you don't care about the right to privacy because you have nothing to hide is no different from saying you don't care about free speech because you have nothing to say. – Edward Snowden