實現此功能,主要是為了充分壓榨和利用家里的PT下載機,讓家里的其他網絡設備能夠通過共享出來的socket5代理平滑的上網,你懂的 我們都知道,SSH支持端口轉發,能夠把當前連接狀態的SSH,共享為socket5代理,主要就是使用到ssh命令的-D參數。另外,在Linux/U
實現此功能,主要是為了充分壓榨和利用家里的PT下載機,讓家里的其他網絡設備能夠通過共享出來的socket5代理“平滑的”上網,你懂的……
我們都知道,SSH支持端口轉發,能夠把當前連接狀態的SSH,共享為socket5代理,主要就是使用到ssh命令的-D參數。另外,在Linux/Unix平臺下,一般運行SSH命令,是需要輸入密碼的,我們需要做一些設置,讓SSH能夠通過public key來驗證,從而省去輸入密碼的繁瑣步驟。如果你用的是windows平臺,那就方便多了,推薦使用Tunnelier這個軟件,不但可以保存SSH用戶名和密碼,還可以自動斷線重連。使用此工具,你可以忽略掉此文了……
下面介紹一下Linux/Unix下通過public key驗證SSH登錄的步驟:
1. 需要在你的客戶端機器生成public key,通過如下命令來實現:
ssh-keygen -t rsa
跟著提示,一步一步按回車,就可以生成一對key,包含private key和public key,然后,通過scp/SFTP/rsync/FTP 等等方式,把這個含有public key的文件: id_rsa.pub上傳到你的SSH連接的服務端上去。
2. SSH連接到服務端,設置SSH驗證的方式,把SSH配置文件中的下面兩項的注釋去掉,使其生效:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
開啟public key驗證,并且指定了key存放的路徑,比如,你如果用用戶名user1登錄SSH,就得把上面提到的public key file: idrsa.pub 上傳到服務器上的 /home/user1/.ssh/ 并改名叫做authorizedkeys
步驟操作完成之后,重啟一下sshd服務,然后客戶端就可以通過public key來連接SSH了。
搞定上面的兩步,我們可以編輯一個shell文件,比如叫做AutoSSH.sh,內容如下:
/usr/bin/ssh -p 24 -N -D 0.0.0.0:7070 user1@YourDomain.com &
賦予腳本可執行權限,然后執行,你會發現SSH自動連接成功,并且會在本機監聽7070端口,這就是一個socket5代理了,然后充分發揮你的智慧,該干嘛干嘛去,比如Firefox+AutoProxy,或者Chrome+Proxy SwitchySharp,等等…… 哥就不細說了……
這里需要注意的是,-D后的IP,必須是0.0.0.0,這樣,這個socket5代理才能被家里局域網中的其他機器訪問到,不然,默認只監聽本機的127.0.0.0:7070,其他機器是訪問不了的!
本文貌似要接近尾聲了,不過,你用了一段時間后,會發現一個比較嚴肅的問題,這個SSH貌似一段時間連上能用,過了一段時間就自動斷開了,你不得不一次又一次的手動運行這個腳本。
這是咋回事呢? 原來,SSH是默認有一個空閑時間的,當客戶端沒有操作處于一定的空閑時間,服務端就會主動斷開SSH連接。
在SSH服務端的配置文件中,有兩個參數,分別叫做:ClientAliveInterval 和 ClientAliveCountMax,這個就是用來控制最大閑置時間的。
ClientAliveInterval 數值是秒,比如你設置為300,就是5分鐘.
ClientAliveCountMax 指如果發現客戶端沒有相應,則判斷一次超時,這個參數設置允許超時的次數。比如:
ClientAliveInterval 300
ClientAliveCountMax 5;
則代表允許超時 1500秒 =25分鐘
通過更改數值大小,能保證SSH連接最大閑置時間。不過感覺這樣的方式還是不太靠譜,一旦網絡遇到問題,或者其他原因導致SSH連接端口,你還是得手動去運行那個連接SSH的腳本。
既然這樣,我們還是自己動手,豐衣足食一下,俺順帶用ruby寫了個檢測SSH連接是否斷開,并且自從運行SSH連接腳本的簡單程序:
#!/usr/local/rvm/bin/ruby #AutoSSH.rb #Written by Timothy 2012.11.19 #Run it with: ruby AutoSSH.rb & lambda{ PORT_NUM = "0.0.0.0:7070" GREP_STR = "netstat -anp|grep #{PORT_NUM}" SHELL_PATH = "/root/AutoSSH/AutoSSH.sh &" pipe = IO.popen(GREP_STR) result = pipe.gets if((result != nil) && (result.include? PORT_NUM)) return else p 'SSH is disconnected! Will reconnect it!' system SHELL_PATH end }.call
這個程序的功能,就是檢測0.0.0.0:7070 是否還在監聽。你或許需要根據你的需求,配置一下AutoSSH.sh文件的路徑,然后,把這個腳本加到系統的定時任務里面去,讓它每一分鐘執行并檢測一次,若是遇到SSH連接端口,會立馬重新連接SSH的。如果你機器沒有配置ruby環境,可以google一下如何安裝ruby。
大功告成,到此,你就有了一個7*24小時不斷網的SSH代理,供家里其他的機器同時使用。
聲明: 此Blog中的文章和隨筆僅代表作者在某一特定時間內的觀點和結論,對其完全的正確不做任何擔保或假設
本站文章均采用 知識共享署名-相同方式共享3.0 協議進行授權,除非注明,本站文章均為原創,轉載請注明轉自 Timothy's Space 并應以鏈接形式標明本文地址!
原文地址:打造家里7*24小時在線的SSH代理, 感謝原作者分享。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com