部署自己的Ngrok內網穿透服務

2021-09-11 05:27:41 字數 4434 閱讀 7236

### 說明

其實這就是讓外網使用者訪問內網的服務,要求就是自己需要乙個公網服務端。優點是方便,缺點就是有點脫了褲子(都有公網伺服器了,還需要在內網做什麼?不過確實還是有提供服務的,方便網友。你說懶得上傳伺服器,那好吧,這算是個優點。)

我已完成搭建,網域名稱http://?.n.scwy.net,有需要的網友可以申請,做一些小量的測試使用還是可以的。比如我就用在raspberry pi上,安裝一些服務之類的。

### 編譯安裝ngrok

#### 安裝go環境

ngrok是使用go進行開發的,所以首先需要安裝go環境,在centos中非常方便,直接使用 yum install golang -y 進行安裝,安裝完成之後在命令列中執行 go version 命令,如果出現版本號即表示安裝成功。可以通過 go env 命令檢視go的環境資訊。

wget -o /usr/local/ngrok.zip

unzip /usr/local/ngrok.zip -d /usr/local/

mv /usr/local/ngrok-master/ /usr/local/ngrok/

export gopath=/usr/local/ngrok/

### 生成自簽名證書

因為單獨安裝自己的ngrok,所以需要使用openssl生成自簽名的ssl證書,使用下面的命令(需要將ngrok_domain替換成自己的網域名稱):

cd /usr/local/ngrok

ngrok_domain="ngrok.example.com"

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 device.key 2048

openssl req -new -key device.key -subj "/cn=$ngrok_domain" -out device.csr

openssl x509 -req -in device.csr -ca rootca.pem -cakey rootca.key -cacreateserial -out device.crt -days 5000

cp rootca.pem assets/client/tls/ngrokroot.crt

cp device.crt assets/server/tls/snakeoil.crt

cp device.key assets/server/tls/snakeoil.key

最後的複製命令是將生成的證書分別替換到 assets/client/tls和assets/server/tls 目錄中,這兩個目錄分別存放著ngrok和ngrokd的預設證書。

最後的複製命令是將生成的證書分別替換到 assets/client/tls和assets/server/tls 目錄中,這兩個目錄分別存放著ngrok和ngrokd的預設證書。

### 編譯並啟動服務端

ngrokd 為服務端的執行檔案,ngrok為客戶端的執行檔案,我們先來編譯ngrok的服務端程式,在ngrok目錄下面執行下面的命令:

make release-server

編譯成功之後會在專案目錄的bin目錄下面生成乙個 ngrokd 的檔案,使用下面的命令啟動服務:

上面的引數中,domain表示服務的網域名稱,httpaddr和httpsaddr分別表示http和https的埠,tunneladdr用來設定通道的埠,在客戶端和服務端建立連線的埠,需要在防火牆中開放次埠(預設為4443)。

可以將命令加入到 /etc/rc.local 中使其開機啟動,命令如下:

其中 /usr/local/ngrok 是ngrok的安裝目錄,最後不顯示執行的日誌,並且在後台執行。

### 使用客戶端呼叫

編譯客戶端

接下來要編譯專用的客戶端,首先進入專案的根目錄,使用下面的命令編譯專用的客戶端檔案:

goos=windows goarch=386 make release-client

其中goos用亂設定作業系統,goarch用來設定對應的架構(386,amd64或arm),其含義如下:

linux 平台 32 位系統:goos=linux goarch=386

linux 平台 64 位系統:goos=linux goarch=amd64

windows 平台 32 位系統:goos=windows goarch=386

windows 平台 64 位系統:goos=windows goarch=amd64

mac 平台 32 位系統:goos=darwin goarch=386

mac 平台 64 位系統:goos=darwin goarch=amd64

arm 平台:goos=linux goarch=arm

上面的命令表示編譯windows下使用的32位的客戶端程式,編譯好的檔案在bin目錄下對應平台的目錄下面。

### 啟動客戶端

接下來就可以使用客戶端了,首先建立乙個ngrok的配置檔案ngrok.cfg:

server_addr: "ngrok.example.com:4000"

trust_host_root_certs: false

網域名稱後面的埠是設定的通道埠。

接下來使用下面的命令執行客戶端:

./ngrok -subdomain jet -config=ngrok.cfg 8080

其中jet是自定義的網域名稱字首,ngrok.cfg是上面的配置檔案,8080是對映的本地到外網的埠,這樣就可以使用 訪問本地8080的埠了。

另外,還可以使用 -proto 來指定協議的型別(預設是http協議),支援http、tcp等多種協議:

./ngrok -subdomain jet -config=ngrok.cfg -proto=tcp 8080

### 使用nginx反向**到80埠

上面通過子網域名稱訪問的時候不是預設的80埠,可以使用nginx進行反向**,配置資訊如下:

```upstream tdt_99tone_ngrok_server

server

access_log off;

log_not_found off;

}外網訪問內網ssh

ngrok -config=./ngrok.cfg -proto=tcp 22

這裡還介紹了為自己的伺服器新增乙個簡單認證,免得隨便誰都來使用。-->

實際是修改了 ngrok/src/ngrok/server/control.go檔案

```func newcontrol(ctlconn conn.conn, authmsg *msg.auth)

f, err := os.open(filename)

if err != nil

buf := bufio.newreader(f)

for

if err != nil

return false, err}}

return false, nil

}//省略

//呼叫驗證

authd, err := readline(authmsg.user, "authtokens.txt")

if authd != true

//省略

}```

當然你隨意新增還是會有點錯誤提示,比如庫沒有引入,failauth沒定義之類的。會golang的自會處理。

重新編譯服務端 , 在執行檔案同目錄建立乙個 使用者檔案,"authtokens.txt"

在客戶端使用的時候-authtoken "******x" 對應txt中的其中一行即可:

ngrok -subdomain=b -config=./ngrok.cfg -authtoken=abcdefg 8181

或者修改配置檔案,例如:

```然後啟動.\ngrok.exe -log ngrok.log -config ngrok.cfg start b

內網穿透Ngrok安裝

參考資料 domain表示使用的父網域名稱 後面在ngrok客戶端配置的 網域名稱是該網域名稱的子網域名稱 docker做埠對映時,為了支援tcp 如ssh登入,需要除了ngrok和ngrokd連線的埠 http https埠外,還需要額外的埠修改 etc hosts檔案 增加如下配置 以便通過ss...

ngrok內網穿透教程

由於開發web專案,經常需要將本地部署的 讓外網能直接訪問到,最便捷的做法當然是在adsl路由器上直接做埠對映,很不幸大部分運營商都遮蔽了80等常用埠,曾經的做法是在公網一台vps上架設openvpn,將筆記本和vps連到乙個虛擬區域網,再用iptables做埠 來達到目的,雖然可行,但速度比較慢,...

Ngrok搭建內網穿透

什麼是ngrok ngrok是一款用go語言開發的開源軟體,它是乙個反向 它可以通過乙個公共的斷點和本地執行的web伺服器建立乙個安全通道,實現內網穿透功能。情況一 無外網網域名稱,使用二級網域名稱 mac os linux amd64 windows x64 linux arm 解壓 在linux...