內網穿透-搭建本身的花生殼服務

當你正在開發第三方異步推送通知相關功能時是否是由於你在公司內網而沒法測試呢? 因此ngrok的內網穿透就顯神威了! 固然國內也有一些相似服務提供, 好比花生殼;網上有ngrok的國內服務了,不過有時候不穩定。 下面跟我一塊兒來架設本身的ngrok服務吧node

分步指南

你須要的物料

  • 一臺有固定IP的服務器,物理服或者雲服均可以
  • 一個域名
  • 一個聰明人!別找了就是你!

服務器環境準備

centos爲例基礎環境安裝linux

編譯依賴安裝

yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ git
複製代碼

go語言環境

wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz
vim /etc/profile
//添加如下內容:
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export NGROK_DOMAIN="你的域名"
//保存退出
//使其生效
source /etc/profile
//檢測是否安裝成功go
go version
複製代碼

安裝ngrok服務器

下載源碼

cd /home
wget https://github.com/inconshreveable/ngrok/archive/master.zip
unzip master.zip
mv ngrok-master ngrok  
cd ngrok
複製代碼

修改證書

mkdir cert
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
cp rootCA.pem ../assets/client/tls/ngrokroot.crt
cp device.crt ../assets/server/tls/snakeoil.crt
cp device.key ../assets/server/tls/snakeoil.key
複製代碼

編譯服務端

cd ..
go env //查看環境
//編譯服務端
GOOS=linux GOARCH=amd64 make release-server
複製代碼

編譯客戶端

GOOS=windows GOARCH=amd64 make release-client
#編譯成功後會在ngrok/bin/下面生成一個windows_amd64目錄下面有ngrok.exe
#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
複製代碼

運行服務端

測試運行

/home/ngrok/bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="$NGROK_DOMAIN"  -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
  
#參數說明:
#-domain 訪問ngrok是所設置的服務地址生成證書時那個
#-httpAddr http協議端口 默認爲80
#-httpsAddr https協議端口 默認爲443 (可配置https證書)
#-tunnelAddr 通道端口 默認4443
複製代碼

後臺運行

nohup /home/ngrok/bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="$NGROK_DOMAIN"  -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" > /dev/null 2>&1 &
  
#參數說明:
#-domain 訪問ngrok是所設置的服務地址生成證書時那個
#-httpAddr http協議端口 默認爲80
#-httpsAddr https協議端口 默認爲443 (可配置https證書)
#-tunnelAddr 通道端口 默認4443
複製代碼

運行客戶端

  • 新建文本文件ngrok.cfg
  • 配置文件
server_addr: "你的域名:4443"
trust_host_root_certs: false
複製代碼

使用測試

  • 命令行操做
ngrok -config=ngrok.cfg -subdomain=test 80
//出現如下內容表示成功連接:
ngrok
 
Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://test.你的域名:80 -> 127.0.0.1:80
Forwarding                    https://test.你的域名:80 -> 127.0.0.1:80
Web Interface                 127.0.0.1:4040
# Conn 0
Avg Conn Time                 0.00ms
複製代碼

複雜配置ngrok.cfg

  • 配置文件
server_addr: "你的域名:4443"
trust_host_root_certs: false
tunnels:
  #服務器www子域名映射到本機80
  http:
    subdomain: "www"
    proto:
      http: "80"
  #服務器www子域名映射到本機443
  https:
    subdomain: "www"
    proto:
      https: "443"
  #服務器3889映射到本機3389
  tcp:
    proto:
      tcp: "3889"
    remote_port: 3389
 #服務器的2222映射到本機22
  ssh:
    remote_port: 2222
    proto:
      tcp: "22"
複製代碼
  • 啓動方法
ngrok -config=ngrok.cfg start http #啓動http服務
ngrok -config=ngrok.cfg start tcp  #啓動tcp服務
 
ngrok -config=ngrok.cfg start http tcp  #同時啓動兩個服務
ngrok -config=ngrok.cfg start-all  #啓動全部服務

複製代碼

配合nginx使用

假設ngrok的http端口爲4080, 則nginx配置以下nginx

#後臺啓動
nohup /home/soft/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":4080" > /dev/null 2>&1 &
複製代碼
location / {
            proxy_pass http://127.0.0.1:4080;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host  $http_host:4080;
            proxy_set_header X-Nginx-Proxy true;
            proxy_set_header Connection "";
        }
        
複製代碼
相關文章
相關標籤/搜索