Ngrok: 使用 Ngrok 实现内网穿透
Jan 10,2017?in?教程?read (14235)?| 百度已收錄 | Author:?Leonn
目錄
背景
-
很多時(shí)候,我們都有這樣的需求:需要將本地正在開發(fā)的服務(wù)暴露在公網(wǎng)上,也就是從外網(wǎng)直接訪問我們本機(jī)上的服務(wù)。
-
正常情況下,這是辦不到的,因?yàn)槲覀兊谋緳C(jī)并沒有公網(wǎng) IP,我們的本機(jī)處在內(nèi)網(wǎng)當(dāng)中。
NAT 穿透原理
這里需要順手提及一個(gè)知識(shí):NAT 穿透。
一個(gè)栗子
我們的機(jī)器一般都在路由器的內(nèi)網(wǎng)當(dāng)中,IP 地址基本上都是192.168.x.x系列,我們并沒有公網(wǎng) IP,那么如何訪問外網(wǎng)呢?
-
我們打開瀏覽器訪問 Google,Google 與我們主機(jī)之間如何通信?
假設(shè)我們主機(jī) IP 為192.168.0.100,路由器 LAN IP 為192.168.0.1,WAN IP 為211.22.145.234(這是一個(gè)公網(wǎng) IP),Google 服務(wù)器 IP 為74.125.204.101。 -
詳細(xì)通信流程如下:
- 主機(jī)構(gòu)建 HTTP 請(qǐng)求數(shù)據(jù)包,目標(biāo) IP 為74.125.204.101,目標(biāo)端口80/443,源 IP 為192.168.0.100,源端口隨機(jī)生成,假定為5000。
- 主機(jī)檢查目標(biāo) IP 地址,發(fā)現(xiàn)不在一個(gè)網(wǎng)段,數(shù)據(jù)包丟給默認(rèn)網(wǎng)關(guān)192.168.0.1。
- 路由器 LAN 口收到數(shù)據(jù)包,構(gòu)建 NAT 映射,隨機(jī)生成端口,假定為5500,這樣映射就是 :5500 -> 192.168.0.100:5000。WAN 口收到的數(shù)據(jù)包,如果目標(biāo)端口是5500,則轉(zhuǎn)發(fā)給內(nèi)網(wǎng) IP 為192.168.0.100的機(jī)器的5000端口。
- 路由器修改數(shù)據(jù)包的源端口為5500,源 IP 地址為211.22.145.234,使用 WAN 口將數(shù)據(jù)包發(fā)送出去。
- Google 服務(wù)器收到請(qǐng)求,構(gòu)建響應(yīng) HTTP 數(shù)據(jù)包,目標(biāo) IP 地址211.22.145.234,目標(biāo)端口為5500。
- 路由器 WAN 口收到數(shù)據(jù)包,目標(biāo)端口為5500,查詢 NAT 表,發(fā)現(xiàn)對(duì)應(yīng)的機(jī)器是192.168.0.100:5000,所以修改目標(biāo) IP 為192.168.0.100,目標(biāo)端口為5000。并通過 LAN 口發(fā)送給主機(jī)。
- 主機(jī)接收到數(shù)據(jù)包,完成這一次通信。
從上面可以看出,內(nèi)網(wǎng)機(jī)器能夠和外網(wǎng)通信,全靠擁有公網(wǎng) IP 的路由器做交通樞紐。
路由器通過查詢 NAT 表,來確定數(shù)據(jù)包該發(fā)送給內(nèi)網(wǎng)哪臺(tái)機(jī)器。
所以內(nèi)網(wǎng)多臺(tái)機(jī)器都可以通過這一臺(tái)路由器和外網(wǎng)進(jìn)行通信。這極大的節(jié)省了寶貴的公網(wǎng) IP 資源。
Ngrok
- 而 ngrok 就是利用以上原理實(shí)現(xiàn)了內(nèi)網(wǎng)穿透的工具,只是稍有不同,交換的工具從路由器變成了我們具有固定 IP 的 VPS。
當(dāng)然原理沒有大變,都是找一個(gè)公網(wǎng)服務(wù)器做中介。此處成為服務(wù)器 A。流程如下。
- 那么幫助我們實(shí)現(xiàn)這個(gè)功能的程序就是 Ngrok 。通過在服務(wù)器上安裝 Ngrok ,我們就可以和本地主機(jī)構(gòu)建一條隧道。來讓外網(wǎng)用戶訪問本地主機(jī)的內(nèi)容。
準(zhǔn)備工作
安裝依賴
- 注意 golang 需要 1.6 以上,否則不能編譯客戶端
- 下面是 1.7.3,其他的自己去官網(wǎng)下載,我使用的 Ubuntu 16,自帶的即可
獲取 ngrok 源碼
git clone https://github.com/inconshreveable/ngrok.git ngrok ## 建議請(qǐng)使用下面的地址,修復(fù)了無法訪問的包地址 git clone https://github.com/tutumcloud/ngrok.git ngrok cd ngrok生成證書
- 生成并替換源碼里默認(rèn)的證書,注意域名修改為你自己的。
(之后編譯出來的服務(wù)端客戶端會(huì)基于這個(gè)證書來加密通訊,保證了安全性)
編譯服務(wù)端
sudo make release-server- 如果一切正常,ngrok/bin 目錄下應(yīng)該有 ngrok、ngrokd 兩個(gè)可執(zhí)行文件。
ngrokd 為服務(wù)器端使用的,ngrok 是 linux 客戶端使用的
服務(wù)端
- 前面生成的 ngrokd 就是服務(wù)端程序了,指定證書、域名和端口啟動(dòng)它(證書就是前面生成的,注意修改域名):
- 到這一步,ngrok 服務(wù)已經(jīng)跑起來了,可以通過屏幕上顯示的日志查看更多信息。
- httpAddr、httpsAddr 分別是 ngrok 用來轉(zhuǎn)發(fā) http、https 服務(wù)的端口,可以隨意指定。
- ngrokd 還會(huì)開一個(gè) 4443 端口用來跟客戶端通訊(可通過 -tunnelAddr=":xxx" 指定),如果你配置了 iptables 規(guī)則,需要放行這三個(gè)端口上的 TCP 協(xié)議。
測(cè)試連接
-
現(xiàn)在,通過?http://liyuans.com:8081?和?https://blog.liyuans.com:8082?就可以訪問到 ngrok 提供的轉(zhuǎn)發(fā)服務(wù)。
為了使用方便,建議把域名泛解析到 VPS 上,這樣能方便地使用不同子域轉(zhuǎn)發(fā)不同的本地服務(wù)。 -
可以看到這樣一行提示:Tunnel liyuans.com:8081 not found,這說明萬事俱備,只差客戶端來連了。
編譯客戶端
#windows GOOS=windows GOARCH=amd64 make release-client #mac GOOS=darwin GOARCH=amd64 make release-client客戶端
-
如果要把 linux 上的服務(wù)映射出去,客戶端就是前面生成的 ngrok 文件。(在 bin 文件夾內(nèi))
-
寫一個(gè)簡(jiǎn)單的配置文件,隨意命名如 ngrok.cfg:
- 指定子域、要轉(zhuǎn)發(fā)的協(xié)議和端口,以及配置文件,運(yùn)行客戶端:
- 不出意外可以看到這樣的界面,這說明已經(jīng)成功連上遠(yuǎn)端服務(wù)了
未完待續(xù)
?
參考資料
- 搭建 ngrok 服務(wù)實(shí)現(xiàn)內(nèi)網(wǎng)穿透
- 使用 Ngrok 實(shí)現(xiàn)內(nèi)網(wǎng)穿透
- CentOS6 搭建自己的 ngrok 服務(wù)
總結(jié)
以上是生活随笔為你收集整理的Ngrok: 使用 Ngrok 实现内网穿透的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IO 模拟 1/2 Bias、1/4 D
- 下一篇: 关于LCD的duty与bias