rsync over ssh over socks

之所以要這麼折騰,首先需要強烈譴責那些爲某牆作出過貢獻的程序員,解放後你們是一定會被清算的。

需求

這事的需求是這樣的,我有幾個國外的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的瑞士軍刀。

之後就是在~/.ssh/下創建一個config文件,內容爲:

Host your-prox
    Hostname yourserver.com
    ProxyCommand /usr/bin/nc -x localhost:1080 %h %p

其中 your-prox 這個名字可以自己隨便取一個,yourserver.com是實際的遠程服務器,localhost:1080是指運行於本地的socks代理(如果是內網其它機器也可以,改成相應的內網地址和端口即可),注意,這個socks代理的出口必須在牆外(廢話),而且是可以直接訪問yourserver.com的地方。

順便說一句,在Linux下還可以用另一個簡單的工具來代替nc,那就是connect-proxy,在這裏的用法跟nc差不多,只是要把ProxyCommand改爲:

/usr/bin/connect -S localhost:1080 %h %p

這個操作的作用就是創建一個虛擬的SSH服務器配置,之後就可以通過這樣的方式走socks代理連接遠程服務器yourserver.com:

ssh username@your-prox

就是簡單地把yourserver.com換成your-prox即可。

然後rsync也一樣:

rsync -az -e ssh username@your-prox:~/yourdir .

最後,在.ssh/config裏可以配置多個Host針對不同的remote server,當然 *-prox 名字不能一樣。

原理

爲什麼這樣可以防止被封?

原來的rsync over ssh是這樣的:

local rsync <=> SSH <=> (某牆) <=> remote server

但是現在變成了這樣:

local rsync <=> SSH <=> local socks proxy <=> (某牆) <=> remote socks proxy <=> remote server

在socks proxy之間你可以用無數種方法去規避某牆的審查和封殺。

最後讓我們一起來唾棄那些用民脂民膏建某牆坑害人民的豬狗不如的傢伙們吧,詛咒它們終生喪失性能力。

發佈了266 篇原創文章 · 獲贊 19 · 訪問量 187萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章