ngrok內(nèi)網(wǎng)穿透服務(wù)器搭建及配置

前言

ngrok是一款基于go的開源的內(nèi)網(wǎng)穿透工具,通過在公共的端點(diǎn)和本地運(yùn)行的Web服務(wù)器之間建立一個(gè)安全的通道,是目前開發(fā)微信公眾號(hào)、小程序時(shí),可在內(nèi)網(wǎng)調(diào)試微信服務(wù)的最佳利器之一。
官網(wǎng):https://ngrok.com/
源碼:https://github.com/inconshreveable/ngrok

先決條件及總體步驟

  • 先決條件

1)有1臺(tái)公網(wǎng)服務(wù)器,如阿里云或騰訊云ECS;
2)有1個(gè)域名,且有備案;

  • 總體步驟

1)基礎(chǔ)設(shè)施環(huán)境準(zhǔn)備;
2)生成ngrok服務(wù)端與客戶端應(yīng)用程序;
3)部署ngrok到外網(wǎng)服務(wù)器;
4)啟動(dòng)ngrok客戶端;
5)測(cè)試運(yùn)行;

具體步驟

一、基礎(chǔ)設(shè)施環(huán)境準(zhǔn)備

(1)域名解析設(shè)置

1)假設(shè)你的域名:i668.top;
2)假設(shè)你的ngrok服務(wù)二級(jí)訪問域名為:ngrok.i668.top;
3)添加如下解析(位置:阿里云=>域名管理=>解析)
ngrok.i668.top ==> A記錄 your IP;
*.ngrok.i668.top ==> A記錄 your IP;

(2)安裝VMware虛擬機(jī)

VMware Workstation是一款功能強(qiáng)大的虛擬機(jī)軟件,在不影響本機(jī)操作系統(tǒng)的情況下,用戶可以在虛擬機(jī)中同時(shí)運(yùn)行不同版本的操作系統(tǒng),用于開發(fā)、測(cè)試以及部署工作。
下載:VMware Workstation 12
序列號(hào):5A02H-AU243-TZJ49-GTC7K-3C61N(商業(yè)應(yīng)用請(qǐng)購買正式版權(quán),這里僅為學(xué)習(xí)使用)

(3)安裝配置ubuntu系統(tǒng)

1)下載ubuntu操作系統(tǒng)桌面版鏡像,ubuntu-16.04.6-desktop-amd64
2)在VMware虛擬機(jī)中安裝ubuntu系統(tǒng)
20G硬盤,1.5G內(nèi)存,虛擬磁盤存儲(chǔ)為單個(gè)文件;
3)設(shè)置網(wǎng)絡(luò)連接(NAT模式,用于共享主機(jī)的IP地址)
4)設(shè)置以root超級(jí)管理員的身份登錄
在文件50-unity-greeter.conf(位置:usr=>share=>lightdm=>lightdm.conf.d=>50-unity-greeter.conf)中添加如下信息:

[Seat:*]
greeter-session=unity-greeter
user-session=ubuntu
greeter-show-manual-login=true
all-guest=false
(4)安裝VMware Tools工具(位置:虛擬機(jī)=>安裝VMware Tools)

在VMware虛擬機(jī)中安裝好了VMware Tools,才能實(shí)現(xiàn)主機(jī)與虛擬機(jī)之間的文件共享,同時(shí)可支持自由拖拽的功能,鼠標(biāo)也可在虛擬機(jī)與主機(jī)之間自由移動(dòng)(不用再按ctrl+alt),且虛擬機(jī)屏幕也可實(shí)現(xiàn)全屏化。

二、生成ngrok服務(wù)端與客戶端應(yīng)用程序

以下所有命令均以root身份執(zhí)行

(1)安裝git
apt-get update #更新包管理器
apt-get install git  #安裝git
(2)安裝go
apt-get remove golang-go
mkdir /soft
cd /soft
wget https://dl.google.com/go/go1.12.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.12.2.linux-amd64.tar.gz 
#添加環(huán)境變量
echo 'export GOROOT=/usr/local/go #Go安裝路徑根路徑
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=$HOME/goproj  #Go工程路徑(工作區(qū)),多個(gè)工程中間用分號(hào)分割
export NGROK_DOMAIN="ngrok.i668.top"' | sudo tee -a /etc/profile
source /etc/profile #保存環(huán)境變量
go version #查看版本
(3)安裝ngrok
git clone https://github.com/inconshreveable/ngrok.git ngrok
cd ngrok
(4)根據(jù)域名生成證書(自簽)
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
penssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
(5)證書替換
cp rootCA.pem assets/client/tls/ngrokroot.crt  #復(fù)制rootCA.pem到assets/client/tls/并更名為ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt #復(fù)制server.crt到assets/server/tls/并更名為snakeoil.crt
cp server.key assets/server/tls/snakeoil.key #復(fù)制server.key到assets/server/tls/并更名為snakeoil.key
(5)編譯server和client端
#win服務(wù)端
GOOS=windows GOARCH=amd64 make release-server 
#win客戶端
GOOS=windows GOARCH=amd64 make release-client

如果編譯報(bào)以下錯(cuò),安裝最新的go和配置GOPATH

package context: unrecognized import path "context" (import path does not begin with hostname)
package net/http/httptrace: unrecognized import path "net/http/httptrace" (import path does not begin with hostname)
Makefile:8: recipe for target 'deps' failed
make: *** [deps] Error 1

編譯成功后在ngrok目錄下的bin目錄。
以編譯windows平臺(tái)為例,會(huì)產(chǎn)生“ngrok.exe”與“ngrokd.exe”這兩個(gè)文件,前者客戶端,后者需要運(yùn)行在公網(wǎng)服務(wù)器上。

客戶端版本說明

  • Linux 平臺(tái) 32 位系統(tǒng):GOOS=linux GOARCH=386
  • Linux 平臺(tái) 64 位系統(tǒng):GOOS=linux GOARCH=amd64
  • Windows 平臺(tái) 32 位系統(tǒng):GOOS=windows GOARCH=386
  • Windows 平臺(tái) 64 位系統(tǒng):GOOS=windows GOARCH=amd64
  • MAC 平臺(tái) 32 位系統(tǒng):GOOS=darwin GOARCH=386
  • MAC 平臺(tái) 64 位系統(tǒng):GOOS=darwin GOARCH=amd64

三、部署ngrok到外網(wǎng)服務(wù)器

將生成的ngrokd.exe文件復(fù)制到windows服務(wù)器中,如將ngrokd.exe放在c:\ngrokeServer目錄下:


ngrok服務(wù)端目錄.jpg

為方便,編寫批處理文件

  • 帶自簽證書,ngrokserver_selfcert.bat
ngrokd.exe -tlsKey="snakeoil.key" -tlsCrt="snakeoil.crt" -domain="ngrok.i668.top" -httpAddr=":801" -httpsAddr=":802"
  • 帶CA簽發(fā)證書,ngrokserver_outcert.bat
ngrokd.exe -tlsKey="2_ngrok.i668.top.key" -tlsCrt="1_ngrok.i668.top_bundle.crt" -domain="ngrok.i668.top" -httpAddr=":801" -httpsAddr=":802"

參數(shù)說明

-domain 訪問ngrok是所設(shè)置的服務(wù)地址生成證書時(shí)那個(gè)
-httpAddr http協(xié)議端口 默認(rèn)為80
-httpsAddr https協(xié)議端口 默認(rèn)為443 (可配置https證書)
-tunnelAddr 通道端口 默認(rèn)4443

為了安全許多服務(wù)器會(huì)將端口屏蔽,如阿里云的ECS服務(wù)器,默認(rèn)801,802都是關(guān)閉的,需要手動(dòng)開啟,在阿里云的后臺(tái)添加開放的端口就可以了。

四、啟動(dòng)ngrok客戶端

客戶端就是您的web應(yīng)用程序所運(yùn)行的主機(jī),將ubuntu生成的ngrok.exe客戶端應(yīng)用復(fù)制到您的系統(tǒng)中。
添加配置文件ngrok.cfg

server_addr: "ngrok.i668.top:4443"
trust_host_root_certs: false

添加批處理start.bat

ngrok.exe  -subdomain pcd -proto=https -config=ngrok.cfg 8999

參數(shù)說明

trust_host_root_certs #是否信任系統(tǒng)根證書,如果是帶自簽名證書編譯的 ngrok 客戶端,這個(gè)值應(yīng)該設(shè)置為 false;如果使用 CA 證書,或者用戶添加了根證書,這個(gè)值應(yīng)該設(shè)置為 true
-proto     #轉(zhuǎn)發(fā)協(xié)議 不指定默認(rèn)是 http+https
-subdomain #訪問本地時(shí)的三級(jí)域名 不指定就會(huì)隨機(jī)生成 tcp不支持此參數(shù)
8999       #本地服務(wù)的端口號(hào)
-config    #指定配置位置

如果想一次性轉(zhuǎn)發(fā)多個(gè)端口或者想指定遠(yuǎn)程的對(duì)應(yīng)端口,需要完善ngrok.cfg

server_addr: "ngrok.i668.top:4443"
trust_host_root_certs: true
tunnels:
  pcd:
    proto:
      http: "8999"
    remote_port: 801
  pcd2:
    proto:
      https: "8999"
    remote_port: 802
  tcp:
    proto:
      tcp: "3022"
    remote_port: 4444
  tcp2:
    proto:
      tcp: "22"
    remote_port: 4445

啟動(dòng)單個(gè)服務(wù)

ngrok.exe -config=ngrok.cfg start pcd #啟動(dòng)pcd服務(wù) 使用的前綴域名為pcd

啟動(dòng)多個(gè)服務(wù)

ngrok.exe -config=ngrok.cfg start pcd pcd2  #同時(shí)啟動(dòng)兩個(gè)服務(wù)
ngrok.exe -config=ngrok.cfg start -all  #啟動(dòng)所有服務(wù)
ngrok客戶端啟動(dòng)界面.jpg

五、測(cè)試運(yùn)行

打開瀏覽器,輸入http://pcd.ngrok.i668.top:801就可以穿透內(nèi)網(wǎng)訪問您的web服務(wù)器了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容