之所以要这么折腾,首先需要强烈谴责那些为某墙作出过贡献的程序员,解放后你们是一定会被清算的。
需求
这事的需求是这样的,我有几个国外的VPS用来跑自己和朋友的BLOG,为了保险起见,我搞了一套备份系统:
在家里的服务器上开了一个ZFS做远程VPS的备份,备份方法是每天晚上通过rsync over ssh进行同步,然后本地服务器生成快照做版本控制。
实现起来很简单,也可以满足需求:
如果远端VPS数据丢失(故障,意外删除,被黑等),我都可以立即重新开一个VPS,再把本地备份的数据恢复回去。即使是远程数据被错误修改,我也可以 通过本地ZFS的快照克隆出之前几天的备份来恢复。总体上说还是相当靠谱的——虽然目前也只恢复过一次,去年有一次DO的母鸡出了故障,VPS恢复后无法 SSH接入,它们那个破CONSOLE在国内根本连不上,只好重装。
但是现在问题来了。
因为rsync走的是SSH通道,而SSH协议是被监视的,流量一大就会被封,我因为这个备份功能被封了好几次,真是TMD想砍人。反革命都是这样被逼出来的。
然而在解放前,只能自己想办法解决了……
现在就来说说新的方案吧。
方案选择
本来是想参照前文说的那个方案用GPG加密后通过HTTP明文传输——因为某墙不会直接封杀明文的HTTP,只是会对其中传输的内容进行审查,但是因为经过了GPG加密,它也审查不出啥来,只是速度会慢而已,但至少不会断。
但是问题来了:因为GPG解密过程必须要有私钥密码,这个又必须是人工输入,不能自动输入(可以用GPG-agent在内存中保存一段时间不用重输,类似sudo输入一次密码可以用一段时间一样),所以无法做成自动任务。
于是只能继续在rsync上作文章。最后想到一个办法:
ssh over socks
方法如下:
首先你需要一个叫nc(netcat)的工具,这个FreeBSD是自带的,Linux需要另外安装。nc的全名叫做netcat,正如其名,就是一个网络版的cat,在Linux上它甚至被称为TCP/IP的瑞士军刀。
之后就是在~/.