Wong's Cafe
2023-01-11 (Updated 2023-01-22)
最近折腾openwrt,给子设备开启了公网ipv6地址,同时自己的hi-res影音库也开始积攒空间,不能简单地再用syncthing同步到所有设备上了。于是开始想办法用网络串流自己的文件。写篇blog简单记录下我的方法,说不定能帮到和我有一样想法的你。
以下是在开工前我想到的部分替代方式和为什么不使用他们的原因:
首先找了个移动硬盘, 用btrfs格式化, 开启lzo压缩, 顺便用luks加密, 然后把文件都丢进去. (当然用ext4 / vfat也行)
然后就是把文件托管在局域网里的服务器上, 这里我用的是运行archlinux arm的树莓派,因为可以24小时在线,而且节能.
托管的这一步很简单, 主要考虑的是协议:
最后选择的是SAMBA, 服务端和客户端的兼容性都好, 有用户认证权限管理和加密.
pacman -Syu samba
按照样例文件和wiki更改配置, 用testparm
测试配置文件, 最后去systemd开启smb
systemctl enable --now smb
如果安了ufw防火墙还要允许smb的端口
ufw enable 139
ufw enable 445
ufw reload
也是按照wiki,安一个avahi
,然后运行.
安了zeroconf的好处是不用手动输地址
pacman -Syu avahi
systemctl enable --now avahi
现在已经可以用vlc在局域网上找到smb服务器了.
现在局域网上的设备都能访问我的这些文件, 但是出门用流量联网之后就不行了. 这个问题的解决方法也很简单, 开启samba的ipv6监听, 配置路由器的防火墙(如果有的话).
首先看下自己有没有公网ipv6:
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
找一家动态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
,此处不赘述.
在写本文章的时候(2023-1-11, VLC android 3.5.3), vlc有两个相关的bug:
Settings -> Advanced -> Prefer SMB 1, 把这个关掉, 然后点Clear media database就可以了. 其他的都不用动.
目前VLC还在开发这项功能, 暂时无法实现.
更新:参见我的下一篇文章