利用ngrok實現(xiàn)內(nèi)網(wǎng)穿透

原文地址:https://blog.qjm253.cn/?p=395

包含依賴包的項目(可直接編譯):https://github.com/SunnyQjm/ngrok

實現(xiàn)內(nèi)網(wǎng)穿透紫ngrok無法通過天墻之后,國內(nèi)也出現(xiàn)了一批成熟的商業(yè)化實現(xiàn)方案,諸如花生殼檐束、net123、Sunny-ngrok等仇参。不過免費的極不穩(wěn)定還有流量帶寬限制,最后還是決定自己搭一個。本文利用ngrok搭建一個用于內(nèi)網(wǎng)穿透的環(huán)境。需求是通過一層反向代理颂龙,實現(xiàn)通過一個外網(wǎng)域名訪問一個部署在局域網(wǎng)上的服務(wù)。

準(zhǔn)備

  • 一個公網(wǎng)服務(wù)器(Linux系統(tǒng)) ==> 阿里云纽什,騰訊云之類的都行
    • 這個公網(wǎng)服務(wù)器主要用作反向代理措嵌,我們在本文中稱之為VPS服務(wù)器
  • 一個獨立的域名
  • 一個用于提供服務(wù)的本地PC

步驟

  • GO語言環(huán)境搭建

    ngrok項目是用GO語言實現(xiàn)的,需要先安裝GOLANG開發(fā)環(huán)境芦缰,系統(tǒng)不限企巢,因為GO語言是跨平臺的!安裝過程很簡單让蕾,參考官網(wǎng)的教程即可浪规!

  • 獲取ngrok源碼

    # 下面是直接去ngrok的github地址下載(待會兒make的時候還會需要裝幾個其它的依賴,可能會出現(xiàn)很多問題)
    git clone https://github.com/inconshreveable/ngrok.git
    
    # 下面是筆者將代碼clone下來涕俗,并添加了相應(yīng)依賴之后的地址罗丰,如果用上面的方式出現(xiàn)錯誤,可以clone下面的地址
    git clone https://github.com/SunnyQjm/ngrok.git
    
  • 解析域名

    因為我們自己搭建再姑,需要使用自己的域名(以 test.j.cn )為例萌抵,我們需要做以下解析:

    test.j.cn    ------------> A記錄到你的VPS服務(wù)器的IP
    
    # ngrok可以指定子域名,下面的解析方式可以讓任意子域名都能得到正確的解析
    *.test.j.cn  ------------> CNAME記錄到 test.j.cn
    
  • 生成簽名證書

    • 因為我們是自己搭建,就不能用ngrok官方的SSL證書绍填,需要自己生成
    • 下面生成證書在編譯項目的時候要用到霎桅,所以務(wù)必要在編譯之前生成
    • 需要注意的是,客戶端和服務(wù)器的證書必須是同一份讨永,這樣在程序在認(rèn)證的時候才能正確解析
    # 首先導(dǎo)出環(huán)境變量滔驶,將下面的值替換成你的域名
    export NGROK_DOMAIN="test.j.cn"
    
    #先進(jìn)入到ngrok的根目錄,生成證書的操作需要在根目錄下進(jìn)行
    cd ngrok
    
    # 下面的命令用于生成證書
    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
    
    # 下面的命令用于將我們生成的證書替換ngrok默認(rèn)的證書
    cp rootCA.pem assets/client/tls/ngrokroot.crt
    cp device.crt assets/server/tls/snakeoil.crt
    cp device.key assets/server/tls/snakeoil.key
    
  • 編譯運行

    • 服務(wù)端(VPS服務(wù)器一端)

      • 首先指定一下環(huán)境變量卿闹,在不同的操作系統(tǒng)下需要指定不同的環(huán)境變量揭糕,才能正確編譯(默認(rèn)是Linux 64位的配置,如果你的服務(wù)器是64位的Linux系統(tǒng)锻霎,也可以不指定著角,直接用默認(rèn)的就行)

          GOOS=linux GOARCH=amd64
          #如果是32位系統(tǒng),這里 GOARCH=386
          #如果是windows系統(tǒng)旋恼,GOOS=windows
        
      • 然后make出服務(wù)端程序

        make release-server
        
      • 如果編譯成功吏口,你會在bin目錄下看到ngrokd程序

        cd bin
        
        # 查看使用幫助
        ./ngrokd -h
        
      • 查看使用幫助

        # 查看使用幫助
        ./ngrokd -h
        -domain string
            Domain where the tunnels are hosted (default "ngrok.com")
        -httpAddr string
            Public address for HTTP connections, empty string to disable (default ":80")
        -httpsAddr string
            Public address listening for HTTPS connections, emptry string to disable (default ":443")
        -log string
            Write log messages to this file. 'stdout' and 'none' have special meanings (default "stdout")
        -log-level string
            The level of messages to log. One of: DEBUG, INFO, WARNING, ERROR (default "DEBUG")
        -tlsCrt string
            Path to a TLS certificate file
        -tlsKey string
            Path to a TLS key file
        -tunnelAddr string
            Public address listening for ngrok client (default ":4443")
        
      • 啟動服務(wù)端

        # 如果不能執(zhí)行,你可能需要用 sudo chmod +x ngrokd 給它執(zhí)行權(quán)限
        # domain域輸入之前生成證書時指定的域名
        # httpAddr 指定轉(zhuǎn)發(fā)http協(xié)議的哪個端口
        # httpAddrs 指定轉(zhuǎn)發(fā)https協(xié)議的哪個端口(如果不需要可以省略)
        ./ngrokd  -domain="$NGROK_DOMAIN" -httpAddr=":8000" -httpsAddr=":4433"
        
      • 如果執(zhí)行成功冰更,你會看到類似以下界面:

        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:9748
        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
        
      • 自此产徊,服務(wù)端算是配置好了

    • 客戶端(部署了服務(wù),需要內(nèi)網(wǎng)穿透訪問的主機(jī))

      客戶端要做的事情就是指定把本機(jī)的那個端口暴露給VPS服務(wù)器蜀细,客戶端要在該端口上部署了服務(wù)(web服務(wù)或者tomcat服務(wù)等)舟铜,這樣VPS就能夠?qū)⒄埱筠D(zhuǎn)發(fā)到該端口對應(yīng)的服務(wù)上了

      # 因為前面說過,服務(wù)端和客戶端的證書要是同一份审葬,這樣認(rèn)證才能通過深滚,所以好的解決方案是在服務(wù)端上把客戶端程序也編譯出來,然后通過scp命令拷貝到客戶端
      # 假設(shè)我要在mac上運行客戶端涣觉,需要在編譯命令前加上一些參數(shù)(如果客戶端服務(wù)器也是Linux 64位痴荐,則不用指定環(huán)境變量)
      GOOS=darwin GOARCH=amd64 make release-client
      make release-client
      
      # 編譯好后scp到本地
      scp xxx xxx
      
      # 下面開始本地配置(下面的配置在客戶端進(jìn)行)
      
      # 新建一個配置文件(在ngrok/bin目錄下)
      vim ngrok.cfg
      
      # 添加一下兩行
      # 第一行是將要綁定的域名+4443端口(因為ngrok服務(wù)端默認(rèn)有一個服務(wù)是堅挺在4443端口的,客戶端會通過這個端口與之相連)==> 記得將域名換成自己在生成證書時指定的
      server_addr: "test.j.cn:4443"
      trust_host_root_certs: true
      
      # 幫助信息
      ./ngrok -h
      Examples:
          ngrok 80
          ngrok -subdomain=example 8080
          ngrok -proto=tcp 22
          ngrok -hostname="example.com" -httpauth="user:password" 10.0.0.1
      
      # 80就是我們要轉(zhuǎn)發(fā)的端口了
      ./ngrok -config=./ngrok.cfg 80
      
      # 指定協(xié)議和端口官册,不指定默認(rèn)是 http+https
      ./ngrok -config=./ngrok.cfg -proto=tcp 22
      
      # 指定子域名生兆,不指定就會隨機(jī)生成
      ./ngrok -config=./ngrok.cfg -subdomain=test 80
      
      • 連接成功會顯示如下狀態(tài):
        image
      • 在瀏覽器中輸入http://127.0.0.1:4040 就可以看到請求的具體信息了!是不是很神奇膝宁!

注意

上文中所有出現(xiàn)域名的地方都要統(tǒng)一鸦难,客戶端和服務(wù)端的證書要是同一份,否則在連接的時候會出現(xiàn)bad certification

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末员淫,一起剝皮案震驚了整個濱河市合蔽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌介返,老刑警劉巖拴事,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沃斤,死亡現(xiàn)場離奇詭異,居然都是意外死亡刃宵,警方通過查閱死者的電腦和手機(jī)衡瓶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牲证,“玉大人哮针,你說我怎么就攤上這事√古郏” “怎么了十厢?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捂齐。 經(jīng)常有香客問我寿烟,道長,這世上最難降的妖魔是什么辛燥? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮缝其,結(jié)果婚禮上挎塌,老公的妹妹穿的比我還像新娘。我一直安慰自己内边,他們只是感情好榴都,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漠其,像睡著了一般嘴高。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上和屎,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天拴驮,我揣著相機(jī)與錄音,去河邊找鬼柴信。 笑死套啤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的随常。 我是一名探鬼主播潜沦,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绪氛!你這毒婦竟也來了唆鸡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤枣察,失蹤者是張志新(化名)和其女友劉穎争占,沒想到半個月后燃逻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡燃乍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年唆樊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻蟹。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡逗旁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舆瘪,到底是詐尸還是另有隱情片效,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布英古,位于F島的核電站淀衣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏召调。R本人自食惡果不足惜膨桥,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唠叛。 院中可真熱鬧只嚣,春花似錦、人聲如沸艺沼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽障般。三九已至调鲸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挽荡,已是汗流浹背藐石。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留徐伐,地道東北人贯钩。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像办素,于是被迫代替她去往敵國和親角雷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理性穿,服務(wù)發(fā)現(xiàn)勺三,斷路器,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • 需要先安裝go環(huán)境設(shè)置環(huán)境變量12345 # 可以根據(jù)自己需要調(diào)整路徑 echo 'export GORO...
    加菲貓Jack閱讀 1,964評論 3 1
  • 你對我再好怎有我親媽帶我好需曾,為什么我們不感激媽媽對我們的點點滴滴的好呢吗坚,是因為媽媽總在為我們著想祈远,我們習(xí)慣了這份愛...
    鈺丹庭閱讀 151評論 0 1
  • 半繪山河半民生 文光熠熠射蒼穹, 矢志師摹唐宋韻商源, 弘揚文化唱大風(fēng)车份。
    湘水碧波閱讀 448評論 1 1
  • 真心的庄吼,別跟我說BIM缎除,我反應(yīng)大 老板說了,給我學(xué)習(xí)BIM去 聽著感覺不學(xué)就要失業(yè)的趕腳总寻,腫么辦器罐? 老板的話誰敢質(zhì)...
    圖驢閱讀 453評論 0 0