搭建ngrok服務器實現內網穿透
我需要遠程用服務器去跑深度學習,所以想用內網穿透去遠程登錄我們的服務器(不在一個局域網內),特此記錄一下過程。本人不是專門搞網絡方面的,下面的內容僅就自己在實現過程中查找的資料和自己的理解寫的,可能不是很專業,望專業的同學可以指出不足,我加以改正。
官方網站及源碼
簡介
-
ngrok是一個反向代理,通過在公共的端點和本地運行的Web服務器之間建立一個安全的通道。
-
ngrok是一個內網穿透的解決方案,它使得你本地的服務器可以被局域網外的公網訪問到。
-
ngrok服務端會建立http和https服務,以及供客戶端連接的服務,默認端口4443
-
ngrok的1.X版本是開源的
-
ngrok使用go語言開發,源代碼分爲客戶端與服務器端。
-
ngrok的工作流程:
訪問端輸入域名->DNS->ngrok服務端->請求映射到ngrok客戶端->客戶端返回響應到ngrok服務端->ngrok服務端返回響應到訪問端 -
涉及到三個終端:訪問端,客戶端,服務端
- 客戶端:需要遠程訪問的服務器(在我的需求裏就是能跑深度學習的主機)
- 服務端:一個提供端口轉發的公網服務器
- 訪問段:這個就是我們自己的電腦了,在這臺機子上遠程登錄客戶端。
準備工作
環境
ubuntu18.04(用來編譯源碼)
必要資源
- 一臺公網服務器
- 一個域名(我的做了備案,我不知道需不需要一定備案)
安全組
在自己的公網服務器中添加安全組
域名解析
在自己的域名管理中添加解析A記錄,如下所示:
將*.ngrok與ngrok都指向您的主機IP(公網服務器ip)。
編譯
爲了方便書寫,這裏規定我用的域名是 "abc.top"
-
安裝git
sudo apt install git
-
安裝go語言
sudo apt install golang
-
下載源碼
git clone https://github.com/inconshreveable/ngrok.git
-
生成證書
cd ngrok mkdir build cd build export NGROK_DOMAIN="abc.top" #這裏是自己的域名 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 openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
-
拷貝證書到對應位置
cp rootCA.pem ../assets/client/tls/ngrokroot.crt #複製rootCA.pem到assets/client/tls/並更名爲ngrokroot.crt cp server.crt ../assets/server/tls/snakeoil.crt #複製server.crt到assets/server/tls/並更名爲snakeoil.crt cp server.key ../assets/server/tls/snakeoil.key #複製server.key到assets/server/tls/並更名爲snakeoil.key
-
編譯生成服務端和客戶端程序
由於go語言的特性,在編譯時直接生成機器碼,所以在運行過程中並不需要go的環境。
在ngrok目錄下,運行命令分別生成對應的客戶端與服務端。
下面的命令不需要都運行,找你自己需要的運行即可# 如果還在build文件目錄下,需要切回到ngrok源碼的根目錄下 # GOARCH=386 是32位程序 GOARCH=amd64 是64位程序 #win服務端 GOOS=windows GOARCH=amd64 make release-server #win客戶端 GOOS=windows GOARCH=amd64 make release-client #linux服務端 GOOS=linux GOARCH=amd64 make release-server #linux客戶端 GOOS=linux GOARCH=amd64 make release-client #Mac服務端 GOOS=darwin GOARCH=amd64 make release-server #Mac客戶端 GOOS=darwin GOARCH=amd64 make release-client
至此,編譯就成功了,以linux爲例說明一下:
ngrokd 是服務端程序 ngrok 是客戶端程序
部署
ngrokd和assets文件夾需要拷貝到公網服務器上,ngrok需要拷貝到客戶端上
-
服務端
#在服務端上的包含ngrokd和assets文件夾的文件夾下 ./ngrokd -tlsKey=".snakeoil.key" -tlsCrt="snakeoil.crt" -domain="ngrok.abc.top" -httpAddr=":801" -httpsAddr=":802"
說明:
-
domain=“ngrok.yourdomain” 這裏需要填寫自己的域名
-
httpAddr=801 此配置用來指定映射域名http訪問的端口 默認80
-
httpsAddr=802 https的訪問端口 默認443
-
tunnelAddr=4443 客戶端連接的端口 默認4443
以上端口,如若與系統其他服務有衝突,開啓服務時請自行配置其他端口
-
-
客戶端
在客戶端中包含ngrok程序的文件夾下,新建一個ngrok.cfg的文件,內容如下:server_addr: "ngrok.abc.top:4443" # 自己的域名 配置服務器地址,端口需要和服務器上面的4443端口一致,否則無法連接 trust_host_root_certs: false tunnels: ssh: #配置ssh端口 remote_port: 803 #這個是服務端上的端口 proto: tcp: 22 #這個是客戶端上的端口 http: #配置網站端口 subdomain: www #這是配置網站的域名,配置了www,那麼通過www.ngrok.abc.top就可以訪問本地的服務 proto: #www也可以改成其他的。 http: 80 #局域網本地的的web服務端口 https: 443
運行客戶端:
./ngrok -config=ngrok.cfg start ssh
如果出現下面的內容,則證明我們成功了。
遠程連接
在訪問端,也就是自己的電腦上運行:
ssh -p 803 ngrok.abc.top
即可遠程訪問深度學習服務器了。
總結
這個過程中學到了很多東西,也終於能夠在家也能夠使用實驗室的服務器了,真是開心,接下來愉快去學習了!
參考
再次感謝“一分鐘實現內網穿透(ngrok服務器搭建)”的博主@張果 ,學到了很多東西,非常感謝!