用ngrok打开任督二脉(内网穿透)

网上的教程比较多。方法各不相同,这里根据我自己的系统测试出的步骤记录下:

google云,centos7X64的系统。

先贴上官方说明:https://github.com/inconshreveable/ngrok/blob/master/docs/DEVELOPMENT.md

git安装之前,需要安装依赖.确保安装gcc、g++以及编译git所需要的包
--安装gcc

yum install gcc

--安装g++

yum install gcc-c++

--安装编译所需的包

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install gcc perl-ExtUtils-MakeMaker

首先升级git,系统自带的git貌似1.8还是什么忘记了。这里我直接升级到2.7.3
卸载git

yum -y remove git

下载解压

cd /usr/src
wget https://www.kernel.org/pub/software/scm/git/git-2.7.3.tar.gz
tar xzf git-2.7.3.tar.gz

编译安装

cd git-2.7.3
make prefix=/usr/local/git all
make prefix=/usr/local/git install
echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc
source /etc/bashrc

这里执行make prefix=/usr/local/git all 出现报错make: * [git-credential-store] Error 1
解决如下:

./configure --without-iconv
make CFLAGS=-liconv prefix=/usr/local/git all
make CFLAGS=-liconv prefix=/usr/local/git install

代替上面的make命令
查看下git版本git --version

下载go
官网下载地址:https://golang.org/dl/
国内下载地址:https://www.golangtc.com/download
根据自己系统选择下载。我的是64位下载go1.9.linux-amd64.tar.gz

wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz

解压并指定位置

tar -zxvf go1.9.linux-amd64.tar.gz
mv go /usr/local/

go的命令需要做软连接到/usr/bin

ln -s /usr/local/go/bin/* /usr/bin/

下载ngrok

cd /usr/local/
git clone https://github.com/inconshreveable/ngrok.git
export GOPATH=/usr/local/ngrok/
export NGROK_DOMAIN="xfeng.xyz"
cd ngrok

这里定义了一个环境变量NGROK_DOMAIN是我自己准备用来做隧道的域名
为域名生成证书

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

ngrok通过bindata将ngrok源码目录下的assets目录(资源文件)打包到可执行文件(ngrokd和ngrok)中 去,assets/client/tls和assets/server/tls下分别存放着用于ngrok和ngrokd的默认证书文件,我们需要将它们替换成我们自己生成的(此操作要在编译之前)

cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key

编译ngrokd和ngrok

make release-server

这里网上有的说会报错,缺少依赖等等。我这里很顺利就编译好了。提示如下:

(·····省略·····)
gopkg.in/yaml.v1 (download) github.com/inconshreveable/go-vhost
(download) github.com/alecthomas/log4go (download)
github.com/nsf/termbox-go (download) github.com/mattn/go-runewidth
(download) github.com/gorilla/websocket (download) go install -tags
'release' ngrok/main/ngrokd

同样编译ngrok

make release-client

提示如下:

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

    -debug=false \
    -o=src/ngrok/client/assets/assets_release.go \
    assets/client/... bin/go-bindata -nomemcopy -pkg=assets -tags=release \
    -debug=false \
    -o=src/ngrok/server/assets/assets_release.go \
    assets/server/... go get -tags 'release' -d -v ngrok/... go install -tags 'release' ngrok/main/ngrok

启动服务端

/usr/local/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" //$NGROK_DOMAIN为设置的环境变量
/usr/local/ngrok/bin/ngrokd -domain="xfeng.xyz" -httpAddr=":80" 

提示

panic: listen tcp :80: bind: address already in use

我服务器上的80端口被占用。这里我设置为8080

/usr/local/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8080"

然后又提示443端口被占用。把https端口也改下:

/usr/local/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8080" -httpsAddr=":8081"

然后提示:

[23:52:00 CST 2017/09/08] [INFO] (ngrok/log.(*PrefixLogger).Info:83)
[registry] [tun] No affinity cache specified [23:52:00 CST 2017/09/08]
[INFO] (ngrok/log.Info:112) Listening for public http connections on

Listening for public https connections on [::]:8081 [23:52:00 CST
2017/09/08] [INFO] (ngrok/log.Info:112) Listening for control and
proxy connections on [::]:4443 [23:52:00 CST 2017/09/08] [INFO]
(ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30
seconds [23:52:30 CST 2017/09/08] [INFO]
(ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting:
{"bytesIn.count":0,"bytesOut.count":0,"connMeter.count":0,"connMeter.m1":0,"httpTunnelMeter.count":0,"linux":0,"osx":0,"other":0,"tcpTunnelMeter.count":0,"tunnelMeter.count":0,"tunnelMeter.m1":0,"windows":0}

说明:$NGROK_DOMAIN为设置的环境变量,如上的:export NGROK_DOMAIN="xfeng.xyz"
显示对应的环境变量命令如:echo $NGROK_DOMAIN 输出全部环境变量命令:env

设置开机启动ngrokd服务:
一. 首先在程序目录下新建一个后台启动脚本start.sh,内容如下:

path=/usr/local/ngrok/bin
nohup $path/ngrokd -domain="xfeng.xyz" -httpAddr=":80" -log=stdout &

二. 然后新建一个系统服务
在 /etc/rc.d/init.d目录下新建一个服务项目(ngrok),如下:

#!/bin/sh                           
#chkconfig:2345 70 30               
#description:ngrok                  
                                    
ngrok_path=/usr/local/ngrok/bin     
case "$1" in                        
    start)                          
        echo "start ngrok service.."
        sh ${ngrok_path}/start.sh   
        ;;                          
    *)                              
    exit 1                          
    ;;                              
esac

给该文件赋权限755

chmod 755 ngrok

三. 注册ngrok服务自启动

chkconfig --add  ngrok

测试服务是否能启动成功

service ngrok start

命令 ps aux|grep ngrok查看是否开启ngrok进程

检查自启动的服务

chkconfig

设置完成,然后重启服务器验证是否开启。

启动客户端
先将编译好的客户端下到自己的电脑上。这里我用了vagrant里的centos7下载

scp root@www.imxfeng.com:/usr/local/ngrok/bin/ngrok /usr/local

然后创建配置文件ngrok.cfg,内容如下:

server_addr: "xfeng.xyz:4443"
trust_host_root_certs: false

放入相同目录下,启动客户端:

./ngrok -config=./ngrok.cfg -subdomain=test 80

提示如下:

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://test.xfeng.xyz:8080 -> 127.0.0.1:80
Forwarding                    https://test.xfeng.xyz:8080 -> 127.0.0.1:80
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

OK.这里访问http://test.xfeng.xyz:8080 就可以正常访问我们的内网网站了。
参数说明:

trust_host_root_certs #是否信任系统根证书,如果是带自签名证书编译的 ngrok 客户端,这个值应该设置为
false;如果使用 CA 证书,或者用户添加了根证书,这个值应该设置为 true
-proto #转发协议 不指定默认是 http+https
-subdomain #访问本地时的三级域名 不指定就会随机生成 tcp不支持此参数 8080 #本地服务的端口号
-config #指定配置位置,默认为$HOME/.ngrok2/ngrok.yml

如果需要多个通道,建立配置文件ngrok.yml,内容如下:

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  #启动所有服务

如果想后台运行客户端:

setsid ./ngrok -config=./ngrok.cfg -subdomain=test 80
setsid ./ngrok -config=./ngrok.cfg -subdomain=blog 80

这样的话就可以映射上2个域名了。

标签: nrgok

添加新评论