搭建ngrok服務器實現內網穿透,實現http和tcp映射


搭建ngrok服務器實現內網穿透

我需要遠程用服務器去跑深度學習,所以想用內網穿透去遠程登錄我們的服務器(不在一個局域網內),特此記錄一下過程。本人不是專門搞網絡方面的,下面的內容僅就自己在實現過程中查找的資料和自己的理解寫的,可能不是很專業,望專業的同學可以指出不足,我加以改正。


官方網站及源碼


簡介

  • ngrok是一個反向代理,通過在公共的端點和本地運行的Web服務器之間建立一個安全的通道。

  • ngrok是一個內網穿透的解決方案,它使得你本地的服務器可以被局域網外的公網訪問到。

  • ngrok服務端會建立http和https服務,以及供客戶端連接的服務,默認端口4443

  • ngrok的1.X版本是開源的

  • ngrok使用go語言開發,源代碼分爲客戶端與服務器端。

  • ngrok的工作流程:
    訪問端輸入域名->DNS->ngrok服務端->請求映射到ngrok客戶端->客戶端返回響應到ngrok服務端->ngrok服務端返回響應到訪問端

  • 涉及到三個終端:訪問端,客戶端,服務端

  1. 客戶端:需要遠程訪問的服務器(在我的需求裏就是能跑深度學習的主機)
  2. 服務端:一個提供端口轉發的公網服務器
  3. 訪問段:這個就是我們自己的電腦了,在這臺機子上遠程登錄客戶端。

準備工作

環境

ubuntu18.04(用來編譯源碼)

必要資源

  1. 一臺公網服務器
  2. 一個域名(我的做了備案,我不知道需不需要一定備案)

安全組

在自己的公網服務器中添加安全組
在這裏插入圖片描述

域名解析

在自己的域名管理中添加解析A記錄,如下所示:
解析記錄
將*.ngrok與ngrok都指向您的主機IP(公網服務器ip)。


編譯

爲了方便書寫,這裏規定我用的域名是 "abc.top"

  1. 安裝git

    sudo apt install git
    
  2. 安裝go語言

    sudo apt install golang
    
  3. 下載源碼

    git clone https://github.com/inconshreveable/ngrok.git
    
  4. 生成證書

    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
    
  5. 拷貝證書到對應位置

    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
    
  6. 編譯生成服務端和客戶端程序
    由於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需要拷貝到客戶端上

  1. 服務端

    #在服務端上的包含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

    以上端口,如若與系統其他服務有衝突,開啓服務時請自行配置其他端口

  2. 客戶端
    在客戶端中包含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服務器搭建)”的博主@張果 ,學到了很多東西,非常感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章