ngrok內網穿透服務器搭建及配置(附 frp 配置)

12月18日更新 添加 frp 配置

前言

內網穿透,無需多言,用處多多。首先強力推薦一款Sunny大大搭建的ngrok服務好用的不行,並且有免費選項,感受平時夠用了。那麼,爲何本身還要搭建一個呢?可能剛剛看過兩眼的docker入門,想來嘗試一下吧。恩,也多是閒的吧┑( ̄Д  ̄)┍node


ps: ngrok 2版本已商業化,開源的只到1.7版本,據說會有些性能問題。還有一款基於go的開源的內網穿透工具frp 在末尾添加了frp 的配置linux

搭建過程

至於玩法,1)能夠將本地的server的端口代理到外網可訪問,便於微信開發或者暴露內網的服務器等。2)能夠代理ssh 鏈接,好比能夠鏈接家裏的樹莓派。nginx

ps:在使用docker-compose 集成Nginx反向代理時 發現暴露的端口有點多,何況nginx都是服務端的標配了,因此就去掉了。╮( ̄▽ ̄")╭ git

仍是直接上實在的吧(如下命令基於Ubuntu):github

準備

  • 域名golang

    • 域名可購買略
    • 域名解析設置
  • 服務器web

    • 所需軟件安裝
    • 克隆源碼
    • 生成證書
    • 編譯生成服務端軟件 和 客戶端軟件
  • 容器化docker

    • 生成鏡像
    • 利用docker-compose 集成Nginx反向代理

具體步驟

域名解析設置

  • 假設你的域名爲: yourset.com
  • 假設你的ngrok服務二級訪問域名爲:ngrok.yourset.com
  • 添加以下解析:ngrok.yourset.com --->A記錄 your ip
  • *.ngrok.yourset.com --->CNAME 到 ngrok.yourset.com(可自由配置)

服務環境設置

  • 基於 Ubuntu 16.04
  • 安裝git
    $ sudo apt-get update
    $ sudo apt-get install git
  • 安裝go lang
    $ 下載go1.9.2.linux-amd64.tar.gz(注意對應本身的系統下載,具體請參考上方鏈接)
    $ tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
    $ vi /root/.bashrc 或者 /home/user/.zsh #根據你的用戶選取
    $ export PATH=$PATH:/usr/local/go/bin #添加環境變量
    $ source /root/.bashrc #更新環境變量

克隆源碼

$ cd /usr/local
    $ git clone https://github.com/inconshreveable/ngrok.git

引入環境變量

$ export GOPATH=/usr/local/ngrok/    #目錄位置
    $ export NGROK_DOMAIN="ngrok.yourset.com"   #你的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 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
    cp server.crt assets/server/tls/snakeoil.crt
    cp server.key assets/server/tls/snakeoil.key

客戶端版本說明

  • 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

編譯服務端的 ngrokd(客戶端和服務端生成的文件均在/usr/local/ngrok/bin下)vim

$ GOOS=linux GOARCH=amd64 make release-server  #根據平臺選取

編譯客戶端 ngrok(可生成壓縮包下載到本地而後放到網盤存起來?方便之後使用)windows

$ GOOS=darwin GOARCH=amd64 make release-client  #mac 64
$ GOOS=windows GOARCH=amd64 make release-client  #win64
$ GOOS=linux GOARCH=amd64 make release-client  #linux64
$ GOOS=linux GOARCH=arm make release-client  #arm平臺如樹莓派

開啓服務端(設置端口是請注意端口是否打開,以及防火牆配置)

$ /usr/local/ngrok/bin/ngrokd -domain="ngrok.yourset.com" -httpAddr=":2443" -httpsAddr=":3443" -tunnelAddr=":4443"
    參數說明:
        -domain 訪問ngrok是所設置的服務地址生成證書時那個
        -httpAddr http協議端口 默認爲80
        -httpsAddr https協議端口 默認爲443 (可配置https證書)
        -tunnelAddr 通道端口 默認4443

啓動客戶端-使用命令行參數(以mac爲例)

將客戶端放到本身喜歡的位置並在當前目錄下建立配置文件

$ vi ngrok.yml

寫入以下內容

server_addr: "ngrok.yourset.com:4443"
trust_host_root_certs: false

啓動客戶端命令

$ ./ngrok -config=./ngrok.yml -proto=http -subdomain=test 8080 #啓動http轉發
$ ./ngrok -config=./ngrok.yml -proto=tpc 22  #啓動tcp轉發 本地22端口,遠程隨機暴露大端口

參數說明:

trust_host_root_certs #是否信任系統根證書,若是是帶自簽名證書編譯的 ngrok 客戶端,這個值應該設置爲 false;若是使用 CA 證書,或者用戶添加了根證書,這個值應該設置爲 true
-proto     #轉發協議 不指定默認是 http+https
-subdomain #訪問本地時的三級域名 不指定就會隨機生成 tcp不支持此參數
8080       #本地服務的端口號
-config    #指定配置位置,默認爲$HOME/.ngrok2/ngrok.yml

啓動客戶端-使用配置文件

在ngrok中寫入以下內容:

server_addr: "ngrok.yourset.com:4443"
trust_host_root_certs: false
tunnels:
  web:
    proto:
      http: "3000"
  web2:
    proto:
      http: "8080"
  tcp:
    proto:
      tcp: "3022"
    remote_port: 4444
  tcp2:
    proto:
      tcp: "22"
    remote_port: 4445

啓動單個服務如

$ ./ngrok -config=./ngrok.yml start web  #啓動web服務 使用的前綴域名爲web
$ ./ngrok -config=./ngrok.yml start tcp  #啓動tcp服務 使用遠程端口3022

啓動多個服務:

$ ./ngrok -config=./ngrok.yml start web tcp  #同時啓動兩個服務
$ ./ngrok -config=./ngrok.yml start-all  #啓動全部服務

圖片描述

### docker 配置 和 Nginx配置
基本搭建到上面基本就能用了,可是對於暴露80端口的問題這時就須要使用Nginx作一個端口的反向代理。
而加入使用的vps更換了話,就要從新再來搭建一遍,想一想用docker的話,那不就很方便嗎。

這次更新去掉了docker的配置,當初,剛學會點docker 便爲了docker而docker,並無考慮是否合適當前的場景。ngrok 做爲一個內網穿透的小工具,有時可能會時常更改配置等,因此做爲本地的一個開機啓動的小服務便可。

設置開機啓動

vim /usr/lib/systemd/system/ngrok.service

## 輸入:

[Unit]
Description=ngrok
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/usr/local/ngrok/bin/ngrokd -domain="ngrok.yourset.com" -httpAddr=":2443" -httpsAddr=":3443" -tunnelAddr=":4443"
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

## 命令

$ sudo systemctl enable ngrok  # 設置開機啓動
$ sudo systemctl start ngrok   # 開啓ngrok
$ sudo systemctl status ngrok  # 查看狀態
$ sudo systemctl stop ngrok    # 中止

frp 內網穿透配置

相對於 ngrok 另外一款國內大牛作的 frp要顯的更加輕量安全易配置些。

中文文檔講解的也是十分全面,如下是個人相關配置

服務器端:

將文件下載解壓後的 frps 和 frps.ini 放到當前目錄
編輯 frps.ini 文件

[common]
bind_addr = 0.0.0.0 (yourip)
bind_port = 7000 (frp通訊端口)

dashboard_port = 8020 (web端查看端口 可省略)

vhost_http_port = 8021 (http 端口)

# dashboard user and pwd for basic auth protect, if not set, both default value is admin
dashboard_user = yourusername
dashboard_pwd = yourpass
privilege_token = yourtoken

配置開機啓動:

[Unit]
Description=frps
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/home/user/tool/frps/frps -c /etc/frp/frps.ini
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

$ sudo systemctl enable frps  # 設置開機啓動
$ sudo systemctl start frps   # 開啓ngrok
$ sudo systemctl status frps  # 查看狀態
$ sudo systemctl stop frps    # 中止

同理設置客戶端 添加自動啓動便可經過域名或者ip 從外網訪問或連接內網 frp 正處於開發階段有不少實用的功能等你們去發現。

後記

對比frp ngrok 的搭建要繁瑣很多,但 ngrok 在的優點在於 方便本地調試,由於在開啓本地服務的同時,也會開啓一個本地的webserver 來監聽 請求的相應 如 get 和 post 的具體數據 以及服務端返回的數據。對於本地調試來講是十分方便的。而 frp 對於代理本地端的服務,ssh等仍是十分出色的,好比我調試的時候使用ngrok,而家裏用來折騰的樹莓派 就使用了frp。最後祝你們愉快的玩耍~

相關文章
相關標籤/搜索