ubuntu搭建內網穿透服務Ngrok
說些閒話:
最近一直在亂折騰,看看C,看看Python,又打算去看一下PHP,然後又是前端的Vue.Js,最後發現——嗯?我都在幹些什麼?
當然不論是在做什麼,看什麼,基本上還是在學習,這個狀態還是比較滿意的。值得一提的是,當我發現bash的好用之處後,毫不猶豫的就把我的開發環境遷移到了還算是比較熟悉的Linux發行版本——Ubuntu上。然後就開始了在Ubuntu上的折騰之旅。
因為是用虛擬機器搭建的Ubuntu,所以絕大多數情況下,開著VM使用虛擬機器的感覺和真機體驗差別並不大,雖然有考慮收購一臺二手筆記本或組裝一臺二手桌上型電腦用來區分開發環境和日常使用(遊戲)環境,但是目前還是沒有這個資金的預算的。因此為了方便日常開發除錯,就遇到了一個尷尬的問題,外網環境下無法訪問內網(本地虛擬機器)的Ubuntu系統。
之前在開發參賽專案的時候有遇到過Ngrok,於是在網上搜索了幾個Ngrok的服務,然而用起來都不盡如人意,趁著Qcloud上的Ubuntu伺服器還沒到期,試著自己搭建一個Ngrok的伺服器,用於內網穿透。
先介紹一下Ngrok
Ngrok on github
Ngrok is a tunneling, reverse proxy that establishes secure tunnels from a public endpoint to a locally running network service while capturing all traffic for inspection and replay.
翻譯一下:
Ngrok是一個隧道,即建立安全通道從公共端點到本地執行的網路服務,同時捕捉檢查和重播所有流量的反向代理。
簡單來說,他可以代理你本地的資料,並將其轉發到外網。
具體操作走起!
Step1:安裝git 和Golang
Git是啥,是幹什麼用的,在此我就不過多闡述了!
# sudo apt-get install build-essential golang mercurial git
Golang,Go語言支援,因為Ngrok是基於Go語言編寫的
![](https://img.796t.com/res/2022/04-29/11/5b29db140286879c8a50018fdca72379.png)
這裡我都已經安裝了,沒有安裝的按照提示安裝即可
Step2:獲取 Ngrok 原始碼
此處使用非官方地址,修復了部分包無法獲取
# git clone https://github.com/tutumcloud/ngrok.git ngrok
# cd ngrok
![](https://img.796t.com/res/2022/04-29/11/08be9a1c07576f039a646ea9066e9305.png)
Step3:生成自簽名證書
使用ngrok.com官方服務時,我們使用的是官方的SSL證書。自建ngrokd服務,如果不想買SSL證書,我們需要生成自己的自簽名證書,並編譯一個攜帶該證書的ngrok客戶端。
證書生成過程需要一個NGROK_BASE_DOMAIN
。 以ngrok官方隨機生成的地址693c358d.ngrok.com
為例,其NGROK_BASE_DOMAIN
就是“ngrok.com”
,如果你要 提供服務的地址為 “example.ngrok.xxx.com”
,那NGROK_BASE_DOMAIN
就應該 是“ngrok.xxx.com”
。這裡呢,我替換成自己的域名 “ngrok.mdzz2333.cn”
$ cd ngrok
# NGROK_DOMAIN="ngrok.mdzz2333.cn"
# openssl genrsa -out base.key 2048
# openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
# openssl genrsa -out server.key 2048
# openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
# openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt
執行完後
![](https://img.796t.com/res/2022/04-29/11/d9e5faeee40b385edeb431bb20549ad8.png)
替換:
# cp base.pem assets/client/tls/ngrokroot.crt
Step4:編譯
# sudo make release-server release-client
這一步驟等待時間較長,成功編譯後,會在bin目錄下找到ngrokd和ngrok這兩個檔案。
![](https://img.796t.com/res/2022/04-29/11/c7677d95879207765062baea159507a8.png)
Step5:啟動服務端
前面生成的 ngrokd 就是服務端程式了,指定證書、域名和埠啟動它(證書就是前面生成的,注意修改域名):
# sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.mdzz2333.cn" -httpAddr=":8081" -httpsAddr=":8082"
到這一步,ngrok 服務已經跑起來了,可以通過螢幕上顯示的日誌檢視更多資訊。httpAddr、httpsAddr 分別是 ngrok 用來轉發 http、https 服務的埠,可以隨意指定。ngrokd 還會開一個 4443 埠用來跟客戶端通訊(可通過 -tunnelAddr=”:xxx” 指定),如果你配置了 iptables 規則,需要放行這三個埠上的 TCP 協議。
現在,通過 http://ngrok.mdzz2333.cn:8081
和 http://ngrok.mdzz2333.cn:8082
就可以訪問到 ngrok 提供的轉發服務。為了使用方便,建議把域名泛解析到 VPS 上,這樣能方便地使用不同子域轉發不同的本地服務。
訪問後看到提示:
Tunnel pub.imququ.com:8081 not found
這說明萬事俱備,只差客戶端來連了。
在服務端為了保證服務的一直啟動,可以使用screen,此處略過.
注意:上述程式碼示例和域名示例請更改成自己的域名!!!
Step6:客戶端 單有服務端,你轉發什麼捏?肯定要在你需要釋出內容(web,服務)的裝置上安裝匹配的客戶端啊。在這裡,我使用的伺服器是ubuntu,而需要轉發的伺服器,也是ubuntu,就省去了重新編譯這一環節。
將/ngrok/bin目錄下的 ngrok 通過ssh的scp指令下載到當前客戶端所在的系統中。
# scp username@serverIp:/ngrok/bin/ngrok /home/ubunutu/ngrok
上述指令根據伺服器資訊和本地路徑替換
建立一個ngrok配置檔案:ngrok.cfg
寫入以下內容:
server_addr: “ngrok.mdzz2333.cn:4443"
trust_host_root_certs: false
注意:這裡的server_addr換成前面配置的自簽名證書中的域名 另外,這個域名請提前解析到伺服器IP,參考如下:
![](https://img.796t.com/res/2022/04-29/11/b49d39a94450365ebbdcaad01297cbd4.png)
接下來只需要指定子域、要轉發的協議和埠,以及配置檔案,執行客戶端:
#./ngrok -subdomain pub -proto=http -config=ngrok.cfg 80
如果沒有錯誤,就會出現下面的介面
![](https://img.796t.com/res/2022/04-29/11/dcf889ca9bc228a387c51ed4356f9ae7.png)
這表示轉發成功,轉發後的埠號,是在服務端中設定的埠號,轉發為你填寫的本地埠號。
在本地環境訪問Web Interface也可以檢視該埠轉發下的請求
![](https://img.796t.com/res/2022/04-29/11/cb75bc7fb015a8350c6cf22c5e911148.png)
一個簡單的ngrok轉發就配置好了,只需要一個外網伺服器和域名,就可以輕鬆的將你所有的內網伺服器/虛擬主機/SSH轉發到外網。