搭建ngrok服务器实现内网穿透及映射

本教程将以图文并茂的形式,(附带视频服务端搭建教程)教您如何使用以及配置ngrok。

ngrok 是一个开源的软件。它能够帮助你将内网的机器映射到公网上。在以下的应用场景中。我们就可以通过ngrok来帮助我们很容易的实现。

场景1:

您在自己的电脑上搭建了一个网站,想要分享给别人看,这个时候您就需要考虑到您的网络环境是否有公网IP。如果很幸运您的ISP给你分配的IP是公网的。又很幸运的没有屏蔽掉80端口,那么在路由器做了80端口映射之后。这一切才显得可行。然而即使您只是内网IP。ngrok仍然会帮您解决这个问题。

场景2:

一般情况下,我们都会在自己的电脑上进行微信后端的调试。可是微信开发者模式的接口需要有公网IP。并且还必须是80端口。处于内网的你是否略微难过?然而ngrok还是会帮助我们巧妙的解决这个问题。

噢,对了,这一切都是免费的,不过需要您具有以下两种资源。

  • 具有公网IP的VPS一台(例:Crissic 512M ovz)
  • 域名一个 (例:tunnel.pw)

下面通过一个实例来开始本教程:

我在本地虚拟机Windows XP 中搭建了一个 网站。需要网络上的你访问此网站的页面,然而我却是长城宽带的网络,并没有分配给我公网IP。大家可能会想到花生壳。的确花生壳也是很好的服务。但是今天我们通过ngrok来实现此目的。

1. 将您域名解析到您VPS的公网IP。

需要解析2条记录:

  • @.tunnel.pw —>  167.160.162.53 (顶级域名解析)
  • *.tunnel.pw —> 167.160.162.53  (泛解析)

2.  在Linux服务器上搭建ngrok服务端

简介及原理。

我的虚拟机 Windows XP(运行ngrok客户端For windows系统) 通过4443端口与 我的VPS(运行ngrok服务端)通讯。并将本地80端口,映射到服务器的8081端口。这样就实现了绕过各种防火墙以及内网的目的。

ngrok的访问是通过域名来实现的。在ngrok客户端运行的同时需要我们指定一个二级域名和转发的端口。如果我指定test.tunnel.pw为二级域名。并且80 为客户端的端口。那么在客户端成功连接服务端之后。通过服务端的 test.tunnel.pw:8081 即可访问。(服务端需要提前指定转发的端口为8081)

ngrok11

以下是在Ubuntu14.04 系统中安装的全部代码。


教程:利用ngrok实现内网穿透       Copyright:  热闹网 www.izcv.com
-------------------------------------------------------------------
1.公网IP Linux VPS (系统: Ubuntu 14.04 *64)   
2.域名 示例:tunnel.pw (A记录 *.tunnel.pw 以及 tunnel.pw 指向VPS的IP)
-------------------------------------------------------------------

//运行环境部署
apt-get update
apt-get install build-essential mercurial git

//下载go以及ngrok源码
cd /usr/local
wget http://dl.gov.com.ru/sources/go1.4.2.linux-amd64.tar.gz
tar -zxvf go1.4.2.linux-amd64.tar.gz
cp /usr/local/go/bin/* /usr/bin/


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


export GOPATH=/usr/local/src/ngrok/
export NGROK_DOMAIN="tunnel.pw"

cd ngrok


//证书制作
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 5000 -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 5000 -out server.crt

//替换自签名证书到相关目录
cp base.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key

//指定环境变量位64位linux版本
GOOS=linux GOARCH=amd64

//生成服务端及linux客户端
make release-server release-client

//试运行(运行之后利用Ctrl+C结束)
./bin/ngrokd -domain="tunnel.pw" -httpAddr=":8081" -httpsAddr=":8082"


//设置ngrok开机自启动
cp /usr/local/src/ngrok/bin/ngrokd /usr/bin/ngrokd
chmod +x /usr/bin/ngrokd
vi /etc/rc.local
ngrokd -domain="tunnel.pw" -httpAddr=":8081" -httpsAddr=":8082"

-----------------------------------------------------------------------

//生成windows客户端

cd /usr/local/go/src/
GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash
cd /usr/local/src/ngrok
GOOS=windows GOARCH=386 make release-client

//生成Linux客户端

cd /usr/local/go/src/
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ./make.bash
cd /usr/local/src/ngrok
GOOS=linux GOARCH=amd64 make release-client

//生成树莓派客户端

cd /usr/local/go/src/
GOOS=linux GOARCH=arm CGO_ENABLED=0 ./make.bash
cd /usr/local/src/ngrok
GOOS=linux GOARCH=arm make release-client


//客户端运行语句
ngrok -config=./ngrok.cfg -subdomain=www 80

 

注意事项:

各平台客户端需要通过go交叉编译生成,并且自建ngrok服务器之后,通过我们VPS生成的客户端才能够成功连接。

生成客户端之后,即可在/usr/local/src/ngrok/bin 目录中看到相关文件夹。Windwos客户端根据我们刚才交叉编译之后生成的命令是存在于 /usr/local/src/ngrok/bin/windows_386/ngrok.exe 这个文件的。我们将他下载到本地需要运行的机器上。

Windows客户端连接示例

客户端需要两个文件:

1. ngrok客户端

(/usr/local/src/ngrok/bin/windows_386/ngrok.exe  下载到本地)

2.配置文件(新建ngrok.cfg 文件,注意标点和空格)


server_addr: "tunnel.pw:4443"
trust_host_root_certs: false

 

将这两个文件放在Windows系统的C盘根目录中,打开cmd(命令提示符)通过cd \ 命令进入根目录,并且运行  ngrok -config=./ngrok.cfg -subdomain=www 80  即可将www子域的80端口映射到VPS的8081端口了。

20151102-0

 

如图,本地虚拟机Windows XP中的PHP探针已经成功可以在公网访问了。

20151102-1

 

ngrok内网穿透服务端视频教程

(右键在新窗口打开可以放大观看)

3 条评论

  1. 稻草人

    在contos也是这样安装的嘛?

  2. NyKO

    @。@ 这个好 haha 刚好家里就是这么个情况..

    1. Lop

      @_@