把你正在開發的本地服務分享給網際網路上其它人訪問體驗;
在任何地方通過網際網路控制你家中在區域網裡的電腦;
把執行在本地開發機上的 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,這篇文章應對的就...