使用ngrok实现内网穿透

来源:互联网 发布:全国所有中小学数据库 编辑:程序博客网 时间:2024/05/21 10:04

在很多时候我需要把内网的东西暴露给外网,但是又没有外网IP。这个时候我们可以借助一些内网穿透工具达到这个目的,例如花生壳之类。但是这些收费的。ngrok是一个开源的内网穿透服务,可以在他的官网注册账号实现内网穿透,但是现在应被墙了。不过我们可以用他的源码在自己的VPS上搭建这个服务。ngrok可以做TCP端口转发,对于Linux可以将其映射到22端口进行SSH连接。Windows的远程桌面可以将其映射到3389端口来实现。同理,如果要做MySQL的远程连接,只需映射3306端口即可。本文详细记录了整个搭建过程。

编译Ngrok

以Ubuntu 14.04 为例
1、安装必备工具

sudo apt-get install build-essential mercurial git

2、配置Go环境
下载Go源码

curl -O https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz

注意:同过apt-get 方式下载的Go可能会由于版本低而导致无法编译

解压源码

tar xvf go1.6.linux-amd64.tar.gz

Go目录的权限改为root,并把它移动到/usr/local目录

sudo chown -R root:root ./gosudo mv go /usr/local

配置环境变量,打开.profile 文件

sudo vi ~/.profile

在末尾加入下面两行

export GOPATH=$HOME/work export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin

编译使其生效

source ~/.profile

测试Go是否安装成功

go version

3、编译ngrok源码

git clone https://github.com/tutumcloud/ngrok.git ngrokcd ngrok

生成并替换源码里默认的证书,注意域名修改为你自己的

NGROK_DOMAIN="geekzph.com"openssl genrsa -out base.key 2048openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pemopenssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csropenssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crtcp base.pem assets/client/tls/ngrokroot.crt

编译

sudo make GOOS=linux release-server release-client

如果出现类似下面的错误

GOOS=”” GOARCH=”” go get github.com/jteeuwen/go-bindata/go-bindata
bin/go-bindata -nomemcopy -pkg=assets -tags=debug \
-debug=true \
-o=src/ngrok/client/assets/assets_debug.go \
assets/client/…
make: bin/go-bindata:command not found
make: * [client-assets] error 127

则可是
1、Go的环境变量没有设置好,需要重新检查环境变量
2、编译的时候GOOS没有设置为linux

如果编译成功的话,在ngrok/bin下应该有ngrok、ngrokd 两个可执行文件。

5、启动服务端

cd ngrok/sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="geekzph.com" -httpAddr=":9090" -httpsAddr=":9092"

现在服务端已经运行起来了,ngrokd 会开一个 4443 端口用来跟客户端通讯。

6、配置域名解析
我用的DNSPOD的域名解析服务
Snip20160918_3
把域名泛解析到 VPS 上,记录值为VPS的IP地址。这时候访问geekzph.com,会出现

Tunnel geekzph.com:9091 not found

说明一切已经就绪了。

7、客户端
由于我们刚才编译的是linux的客户端,如果需要在Windows上使用的话还需要编译一个Windows的客户端

#切到go的安装目录 cd /usr/local/go/src #给Go编译器加上交叉编译windows/amd64程序的功能 GOOS=windows GOARCH=amd64 ./make.bash

开始编译

#切回到ngrok目录 cd - #执行如下命令编译Windows 64位客户端 GOOS=windows GOARCH=amd64 make release-client #以上GOARCH=amd64指的是编译为64位版本,如需32位改成GOARCH=386即可

Windows客户端ngrok就编译成功了,我们可以在./bin/windows_amd64/目录下找到执行文件ngrok.exe。使用scp命令将其从vps上下载到Windows上。

然后在ngrok目录下新建一个配置文件,例如命名为grok.cfg:

server_addr: gekezph.com:4443trust_host_root_certs: false

打开命令提示符,切到ngrok.exe所在目录,并执行以下命令。

#启动ngrok客户端#注意:如果不加参数-subdomain=test,将会随机自动分配子域名。#ngrok -config=ngrok.cfg -subdomain=test 80

这样就配置成功了!访问。test.geekzph.com就可以看到网站内容了。以上是映射的http服务,还以映射tcp服务,这样就能ssh,远程桌面等功能。

我们以远程桌面为例:

#这里以远程桌面时的3389端口为例 ngrok -proto=tcp 3389

之后出现下面提示

#客户端ngrok正常执行显示的内容 ngrok (Ctrl+C to quit) Tunnel Status online Version 1.7/1.7 Forwarding tcp://geekzph.com:98805 -> 127.0.0.1:22 Web Interface 127.0.0.1:4040 # Conn 0 Avg Conn Time 0.00ms

这个时候在远程桌面客户端的地址输入:geekzph.com:98805,就可以连接到位于内网的电脑了。

0 0
原创粉丝点击