除錯利器 SSH隧道

2021-10-01 20:30:42 字數 3826 閱讀 5553

把你正在開發的本地服務分享給網際網路上其它人訪問體驗;

在任何地方通過網際網路控制你家中在區域網裡的電腦;

把執行在本地開發機上的 http 服務對映到外網,讓全世界都能通過外網 ip 服務到你本地開發機上的 http 服務。例如你本地的 http 服務監聽在127.0.0.1:8080,你有一台公網 ip 為12.34.56.78的伺服器,通過本文介紹的方法,可以讓全世界的使用者通過訪問到你本地開發機上的 http 服務。

總結成一句話就是:把內網埠對映到外網。

為了把內網服務對映到外網,以下資源為必須的:

1、 一台有外網 ip 的伺服器;

2、 能在本地開發機上通過 ssh 登入到外網伺服器。

要滿足以上條件很簡單:

對於條件2:對於 mac、linux 開發機是內建了 ssh 客戶端的,對於 windows 可以安裝 cygwin。

要實現把內網埠對映到外網,最簡單的方式就是通過 ssh 隧道。

ssh 隧道就像一根管道,能把任何2臺機器連線在一起,把傳送到其中一台機器的資料通過管道傳輸到另一台機器。假如已經通過 ssh 隧道把本地開發機和外網伺服器連線在了一起,外網伺服器端監聽在12.34.56.78:8080,那麼所有發給12.34.56.78:8080的資料都會通過 ssh 隧道原封不動地傳輸給本地開發機的127.0.0.1:8080,如圖所示:

也就是說,去訪問12.34.56.78:8080就像是訪問本地開發機的127.0.0.1:8080,本地開發機上的8080埠被對映到了外網伺服器上的8080埠。

如果你的外網伺服器 ip 配置了網域名稱解析,例如yourdomin.com會通過 dns 解析為12.34.56.78,那麼也可以通過yourdomin.com:8080去訪問本地開發機上的服務。

這樣就做到了訪問外網位址時其實是本地服務返回的結果。

通過 ssh 隧道傳輸資料時,資料會被加密,就算中間被劫持,黑客也無法得到資料的原內容。 所以 ssh 隧道還有乙個功能就是保證資料傳輸的安全性。

把本地開機和外網伺服器通過 ssh 隧道連線起來就和在本地開發機 ssh 登入遠端登入到外網伺服器一樣簡單。

先來回顧以下 ssh 遠端登入命令,假如想在本地遠端登入到12.34.56.78,可以在本地開發機上執行以下命令:

ssh [email protected]
而實現 ssh 隧道只需在本地開發機上執行:

ssh -r 8080:127.0.0.1:8080 [email protected]
可以看出實現 ssh 隧道的命令相對於 ssh 登入多出來-r 8080:127.0.0.1:8080,多出的這部分的含義是:

在遠端機器(12.34.56.78)上啟動 tcp8080埠監聽著,再把遠端機器(12.34.56.78)8080埠對映到本地的127.0.0.1:8080

執行完以上命令後,就可以通過12.34.56.78:8080去訪問本地的127.0.0.1:8080了。

通常把這種技術叫做 ssh 遠端埠**(remote forwarding)。

其實不限於只能把本地開發機上執行的服務對映到外網伺服器上去,還可以把任何本地開發機可以訪問的服務對映到外網伺服器上去。例如在本地開發機上能訪問github.com:80,在本地開發機上執行:

ssh -r 8080:github.com:80 [email protected]
就能通過12.34.56.78:8080去訪問github.com:80了。

在執行完上面介紹的 ssh 隧道命令後,你會發現登入到了外網伺服器上去了,如果你登出外網伺服器,就會發現12.34.56.78:8080無法訪問了。導致這個問題的原因是你登出外網伺服器時,在外網伺服器上本次操作對應的 ssh 程序也跟著退出了,而這個退出的程序曾負責監聽在8080埠進行**操作。

為了讓 ssh 隧道一直保持在後台執行,有以下方法。

通過ssh自帶的引數

ssh 還支援這些引數:

ssh -ntf -r 8080:127.0.0.1:8080 [email protected]
通過autossh

ssh 隧道是不穩定的,在網路惡劣的情況下可能隨時斷開。如果斷開就需要手動去本地開發機再次向外網伺服器發起連線。

autossh 能讓 ssh 隧道一直保持執行,他會啟動乙個 ssh 程序,並監控該程序的健康狀況;當 ssh 程序崩潰或停止通訊時,autossh 將重啟動 ssh 程序。

使用autossh 只需在本地開發機上安裝 autossh ,方法如下:

mac 系統:brew install autossh

linux 系統:apt-get install autossh

安裝成功後,在本地開發機上執行:

autossh -n -r 8080:127.0.0.1:8080 [email protected]
就能完成和上面一樣的效果,但本方法能保持 ssh 隧道一直執行。 可以看出這行命令和上面的區別在於把 ssh 換成了 autossh,並且少了 -f 引數,原因是 autossh 缺省會轉入後台執行。

如果你遇到通過以上方法成功啟動 ssh 隧道後,還是無法訪問12.34.56.78:8080,那麼很有可能是外網伺服器上的 ssh 沒有配置對。為此你需要去外網伺服器上修改/etc/ssh/sshd_config檔案如下:

gatewayports yes
這個選項的意思是,ssh 隧道監聽的服務的 ip 是對外開放的0.0.0.0,而不是只對本機的127.0.0.1。不開 gatewayports 的後果是不能通過12.34.56.78:8080訪問,只能在外網伺服器上通過127.0.0.1:8080服務到本地開發機的服務。

修改好配置檔案後,你還需要重啟 sshd 服務來載入新的配置,命令如下:

service sshd restart
如果使用以上方法還是無法訪問12.34.56.78:8080,請檢查你外網伺服器的防火牆配置,確保8080埠是對外開放的。

除了 ssh 隧道能實現內網穿透外,還有以下常用方法。

frp

frp 是乙個可用於內網穿透的高效能的反向**應用,支援 tcp, udp, http, https 協議。

frp 有以下特性:

ngrok

ngrok 是乙個商用的內網穿透工具,它有以下特點:

ngrok 是乙個商用的內網穿透工具,它有以下特點:

不需要有外網伺服器,因為 ngrok 會為你提供;

只需要在本地開發機安裝 ngrok 客戶端,和註冊 ngrok 賬戶;

按照服務收費;

SSH 隧道技術

ssh 隧道 下面的命令告訴 ssh 1 ssh 2 n f l 5023 localhost 23 user foo.example.com 上述 ssh 命令使用了下面這些選項 2強制 ssh 使用第2版的協議 如果需要和較老的 ssh 一同工作請不要使用這個選項 n表示不使用命令列,或者說只使...

ssh隧道建立

問題 目標伺服器 a 在nat之後,中介伺服器 m 在公網上,客戶端 c 在nat後,需要從c發起ssh連線到a。解決辦法 1.從a發起ssh連線到m,繫結m的遠端埠,假設a和m的ssh服務都在22埠監聽。在a上執行 ssh nfr 19022 localhost 22 user host m ip...

SSH 反向隧道

這篇文章主要介紹了如何利用ssh 反向隧道穿透nat,並演示了如何維持一條穩定的ssh 隧道。假設有機器a 和b,a 有公網ip,b 位於nat 之後並無可用的埠 現在想由a 主動向b 發起ssh 連線。由於b 在nat 後端,無可用公網ip 埠這樣乙個組合,所以a 無法穿透nat,這篇文章應對的就...