每次看到网盘限速或者隐私泄露的新闻,我就特别怀念自己掌控数据的感觉。去年我把淘汰的旧路由器刷了OpenWRT,挂上移动硬盘做成家庭文件中心,用SFTP协议远程访问,实测传输速度比某度网盘快了不止十倍。这种私有云方案特别适合经常需要在外调取文件的自媒体创作者、远程办公人群,或者像我这样对数据隐私比较在意的技术爱好者。
OpenWRT作为开源路由器系统,最大的优势就是灵活。普通路由器插上U盘只能实现基础的文件共享,而OpenWRT可以搭建企业级SFTP服务。SFTP相比常见的FTP有三个核心优势:全程SSH加密传输不怕被监听、支持密钥认证比密码更安全、传输过程有完整性校验。我有个做财务的朋友,现在都用这套系统传递敏感报表,再也不用担心文件被中间人篡改。
硬件选择上,建议用千兆网口的路由器,USB3.0接口的型号更好。我自己用的是GL-iNet MT1300,插了个2TB的固态移动硬盘,同时跑SFTP和内网穿透还能保持30MB/s的传输速度。如果只是存文档类小文件,几十块的二手路由器也够用,但要注意USB供电是否稳定,我之前用某米路由器就经常因为供电不足掉盘。
先确保你的OpenWRT系统版本在19.07以上。用SSH登录路由器后,建议先做个系统备份,避免后续操作失误导致需要重刷。输入以下命令更新软件源:
bash复制opkg update
opkg install openssh-sftp-server vsftpd
这里有个坑要注意:OpenWRT默认的SFTP服务是包含在openssh-sftp-server里的,但有些教程会误装成openssh-sftp-client。我第一次就装错了,导致客户端能连服务端却启动不了。安装完成后需要修改SSH配置:
bash复制vi /etc/ssh/sshd_config
找到Subsystem配置行,确认内容是:
code复制Subsystem sftp /usr/lib/sftp-server
然后重启SSH服务:
bash复制/etc/init.d/sshd restart
插入U盘或移动硬盘后,建议用ext4格式重新格式化,NTFS格式在Linux下读写性能会打折扣。用fdisk -l查看设备标识(比如/dev/sda1),然后修改/etc/config/fstab配置文件:
code复制config mount
option target '/mnt/sftp_storage'
option device '/dev/sda1'
option fstype 'ext4'
option options 'rw,sync'
option enabled '1'
执行mount -a挂载后,建议用chmod设置权限。我一般会新建专用用户组:
bash复制groupadd sftp_users
useradd -G sftp_users -d /mnt/sftp_storage/fileuser fileuser
chown -R fileuser:sftp_users /mnt/sftp_storage
默认的22端口一定要改,我在日志里看到过一天上千次的暴力破解尝试。编辑/etc/ssh/sshd_config增加这些配置:
code复制Port 65222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowGroups sftp_users
改成密钥认证后,先在电脑上生成密钥对:
bash复制ssh-keygen -t ed25519
然后把公钥传到路由器:
bash复制ssh-copy-id -p 65222 fileuser@路由器内网IP
实测密钥登录不仅更安全,连接速度也比密码登录快。记得备份私钥,我上次重装系统没备份,结果所有设备都要重新配置。
在/etc/ssh/sshd_config末尾加上这些参数能让大文件传输速度提升明显:
code复制Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com
KexAlgorithms curve25519-sha256
如果是千兆网络环境,还可以调整TCP窗口大小:
bash复制echo "net.core.rmem_max=4194304" >> /etc/sysctl.conf
echo "net.core.wmem_max=4194304" >> /etc/sysctl.conf
sysctl -p
我测试过三种主流方案:frp需要自备云服务器,zerotier依赖中央节点,最后发现cpolar的综合体验最好。它的免费版提供随机域名,付费专业版可以绑定自定义域名。安装命令如下:
bash复制wget -O cpolar-public.key http://openwrt.cpolar.com/releases/public.key
opkg-key add cpolar-public.key
echo "src/gz cpolar_packages http://openwrt.cpolar.com/releases/packages/$(. /etc/openwrt_release ; echo $DISTRIB_ARCH)" >> /etc/opkg/customfeeds.conf
opkg update
opkg install cpolar luci-app-cpolar
安装完成后在Luci界面配置Auth Token,建议开启访问密码保护。创建隧道时重点注意:
免费版域名每24小时会变化,有两个解决方案:一是用DDNS脚本定时获取新域名,二是在cpolar官网保留TCP地址(需要专业版)。我用的折中方案是在手机和电脑上配置了别名,每次连接前先执行:
bash复制curl http://localhost:4040/api/tunnels | grep -o "tcp://[^\"]*"
然后把输出结果复制到SFTP客户端。虽然麻烦点,但胜在零成本。如果经常需要在外访问,建议还是升级专业版,一年费用不到两百,能省去很多麻烦。
Windows推荐WinSCP,记得在高级设置里把协议版本强制设为SFTP-4。Mac系统自带的Terminal就很好用:
bash复制sftp -P 65222 fileuser@cpolar域名
安卓我用的是Solid Explorer+SFTP插件,iOS推荐使用FileExplorer。有个实用技巧是在客户端保存会话配置时,把私钥一起打包导出,换设备时直接导入就能用。
结合rsync可以实现增量备份,我在路由器上配置了每天凌晨3点自动备份手机照片:
bash复制rsync -avz -e 'ssh -p 65222' /sdcard/DCIM/ fileuser@cpolar域名:/mnt/sftp_storage/phone_backup
如果要备份Windows电脑,建议先用cygwin安装rsync,然后创建计划任务。我现在的所有重要文件都有三份备份:本地一份、路由器一份、加密后传云端一份。
遇到连接超时先检查cpolar隧道状态,常见错误有:
bash复制ifconfig eth0 mtu 1400
日志查看命令:
bash复制logread -e sshd
tail -f /var/log/cpolar.log
有次我遇到传输速度突然降到1MB/s以下,最后发现是USB接口接触不良。现在都用带指示灯的硬盘盒,一眼就能看出供电是否正常。