我們實驗室有兩臺服務器,其中一臺無法從外網訪問,另一臺設置瞭內網穿透。我平常在無法從外網訪問的那臺服務器上做實驗,所以如果在實驗室外要連接那臺服務器就需要將設置瞭內網穿透的服務器作為跳板,通過兩次ssh登進實驗服務器。
最近我的實驗需要聯網下載包,但是服務器要聯網需通過登錄認證服務網頁進行認證,而服務器又沒有安裝遠程桌面,直接通過命令行訪問認證網頁實在是力不從心。所以我需要想辦法設置代理,使得我可以通過自己電腦上的瀏覽器通過實驗服務器訪問認證網頁,從而登錄上網。
總結一下需求,就是網絡中有A、B、C、D四個節點,其中A和B互聯,B和C互聯,C和D互聯,如何設置使得A能訪問D。
考慮簡單情況,如果B和D是互聯的,那麼就可以直接通過ssh的Socks代理實現功能,具體步驟如下:
ssh -N -D 127.0.0.1:Aport Busername@Bhostname
。其中Aport可以是A上任意閑置的端口。socks5://127.0.0.1:Aport
,然後輸入D的網址,即可訪問認證網頁。實際上,相當於A對D的請求被ssh代理轉發到B上,由B的sshd進程訪問D。所以如果B服務器要上網,通過這種方法在D上認證後能夠上網的就是B。那麼如何將A對D的請求轉發到C上,由C訪問D呢?
我一開始考慮的方法是利用ssh的端口轉發功能,端口轉發實現的是將遠程服務器的端口映射到本地端口。這麼說是不是很抽象,然而大部分博客就是這樣說的,能看懂就見鬼瞭。以我的需求做例子,在B上運行命令:ssh -L Bport:Dhostname:Dport Cusername@Chostname
,其中Bport可以是B上任意閑置的端口,實現的功能就是可以通過訪問Bport端口透過C訪問D瞭。那麼理論上我就可以通過前面所說的Socks代理方法用A訪問D:
ssh -N -D 127.0.0.1:Aport Busername@Bhostname
。其中Aport可以是A上任意閑置的端口。socks5://127.0.0.1:Aport
,然後輸入http://127.0.0.1:Bport
,通過B代理透過C訪問D。為瞭測試,我在B上運行curl -I http://127.0.0.1:Bport
,連是能連,但返回瞭證書錯誤,說明如果驗證網頁是http,方法應該是可行的。可惜認證網頁是https,讓我不得不去尋找其他方法。
順帶一提,ssh的端口轉發功能分為兩種,一種是本地端口轉發,一種是遠程端口轉發,前面使用參數-L
的方法是本地端口映射,如果要使用遠程端口映射,則在C上運行命令ssh -R Bport:Dhostname:Dport Busername@Bhostname
,其中Bport可以是B上任意閑置的端口,實現的功能和本地端口映射完全等價,不過本地端口轉發是B上的ssh負責監聽,轉發給C上的sshd負責請求;遠程端口轉發是B上的sshd負責監聽,轉發給C上的ssh負責請求,ssh和sshd互換瞭身份,當然對於我的需求,兩種方法都不滿足。
我在網上搜相關資料的時候,意外搜到一個給ssh本身添加代理的方法,頓時有瞭靈感。如果我能通過某種方法,使A能夠直連到C,這樣我就可以將C作為Socks5代理連到D瞭。那麼如何使A直連到C呢?給ssh本身添加代理就是解決方案!具體步驟如下:
ssh -p Bport -N -D 127.0.0.1:Aport1 Busername@Bhostname
,其中Aport1可以是A上任意閑置的端口。ssh -o ProxyCommand='C:Program FilesGitmingw64binconnect.exe -S 127.0.0.1:Aport1 %h %p' -p Cport -N -D 127.0.0.1:Aport2 Cusername@Chostname
,其中Aport2可以是A上任意和Aport1不一樣的閑置端口。socks5://127.0.0.1:Aport2
,然後輸入D的網址,即可訪問認證網頁。註意A是Windows系統,所以給ssh添加代理的方法是使用connect.exe
,Linux下使用的是Netcat,網上有很多相關資料。另外就是這個connect.exe
似乎是Git自帶的一個程序,我剛好電腦裡有Git就用上瞭,不知道有沒有別的辦法。Bport
和Cport
分別是服務器B和服務器C開放SSH的端口,如果是默認的22端口則可以不加此參數。
這個方法的意思是先建立一個B服務器的代理,然後建立一個通過B代理連接C服務器的代理,再通過C代理連接D。從A出發的對D的請求,先通過第二條ssh指令轉變為往C發送,而往C發送的請求通過第一條ssh指令轉變為往B發送,B的sshd收到以後往C發送,C的sshd收到以後往D發送,就實現瞭功能。
基於該方法,不難將其擴展到任意跳服務器的代理。比如將我需求中的兩跳服務器改為三跳,即有A、B、C、D、E五個節點,A和B互聯,B和C互聯,C和D互聯,D和E互聯,怎麼從A連到E。參考前面方法,隻需要在A執行三個ssh代理命令即可:
ssh -p Bport -N -D 127.0.0.1:Aport1 Busername@Bhostname
ssh -o ProxyCommand='C:Program FilesGitmingw64binconnect.exe -S 127.0.0.1:Aport1 %h %p' -p Cport -N -D 127.0.0.1:Aport2 Cusername@Chostname
ssh -o ProxyCommand='C:Program FilesGitmingw64binconnect.exe -S 127.0.0.1:Aport2 %h %p' -p Dport -N -D 127.0.0.1:Aport3 Dusername@Dhostname
上一篇
下一篇
这次文章的内容主要是对比一下几支不同年代146,看看他们之间有什么不同,年代从远到近分别是14C、14k、T舌、现产(P146), ...
工欲善其事,必先利其器。 周末趁著闲暇,给大家整理了一份股票、基投资找工具网站。 看行情、找资讯、逛论坛,看财报、看研 ...