最新消息:

自编译搭建ngrok服务实现内网穿透

工具 admin 8466浏览 0评论

我们经常会有「把本机开发中的 web 项目给朋友看一下」这种临时需求,为此专门在 VPS 上部署一遍就有点太浪费了。之前我通常是在 ADSL 路由器上配个端口映射让本机服务在外网可以访问,但现在大部分运营商不会轻易让你这么干了。一般小运营商也没有公网 IP,自己的路由器出口还是在局域网内,端口映射这种做法就不管用了。曾经的做法是在公网一台VPS上架设OpenVPN,将笔记本和VPS连到一个虚拟局域网,再用iptables做端口转发来达到目的,虽然可行,但速度比较慢,由于线路不稳定造成掉线几率较高。

之前我就想过能否借助拥有公网 IP 的主机中转来实现这种需求,后来发现已经有这样的软件了:ngrok。而且 ngrok 官网本身还提供了公共服务,只需要注册一个帐号,运行它的客户端,就可以快速把内网映射出去。不过这么好的服务,没多久就被墙了~好在 ngrok 是开源的,可以自己进行搭建(注意:ngrok.com 提供的服务是基于 ngrok 2.0,github 上目前只有 1.0 的源码,二者功能和命令有一些区别,用的时候别搞混了,ngrok 2.0的使用可以参考:http://dorole.com/1233/)。

ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。

网络架构如下图所示:

201429_lLUH

ngrok不但提供了一个在外网能够安全的访问内网Web主机,还能捕获所有请求的http内容,方便调试,甚至还支持tcp层端口映射,不局限于某一特定的服务。支持Mac OS X,Linux,Windows平台。

 

下面详细介绍vps(阿里云Centos 6.5)上搭建ngrok服务的过程。

一、域名配置

要使用ngrok,需要对域名进行设置,需要设置的有@和*,即直接解析主域名和泛解析,将直接主域名解析和泛解析的A记录都指向将要安装ngrok服务的vps。

QQ截图20150427173709

ps:泛域名解析参考:http://baike.baidu.com/view/552925.htm.所谓“泛域名解析”是指:利用通配符* (星号)来做次级域名以实现所有的次级域名均指向同一IP地址.
二、golang环境搭建
golang环境安装可以通过源码安装或安装EPEL扩展源后使用yum安装,详细安装过程可以参考:http://www.haiyun.me/archives/1009.html。由于使用yum安装的golang不能进行交叉编译,不能够编译生成windows客户端,所以推荐使用通过源码安装。
源码安装golang的详细过程如下:
(1)下载源码,可以在http://www.golangtc.com/download上找到自己系统对应的源码。由于我的vps系统是centos的,所以下载的是:go1.4.2.linux-386.tar.gz。
(2)将其解压到/usr/local目录下:tar   -C   /usr/local  -xzf    go1.4.2.linux-386.tar.gz
(3)在root环境下执行如下命令:
mkdir $HOME/go
echo 'export GOROOT=/usr/local/go'>> ~/.bashrc
echo 'export GOPATH=$HOME/go'>> ~/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc
source  $HOME/.bashrc
(4)安装go get工具
yum install mercurial git bzr subversion
三、获取源码
ngrok项目使用了一些其他的一些github、google code上的开源代码,使用git clone获取源代码时如果git的版本太低有很多源码无法自动下载,因此需要将git版本升级。将git升级到 1.7.9.5以上才可以。centos系统的git版本是1.7.1,因此需要升级。
1、升级git的详细步骤:
(1)安装证书

使用rpm的强大功能,从以下的地址中,导入安装所需要的证书,命令如下:

rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
(2)安装RPMForge源
RPMForge源是什么呢?RPMForge是CentOS系统下的软件仓库,拥有4000多种的软件包,被CentOS社区认为是最安全也是最稳定的一个软件仓库。而CentOS默认自带CentOS-Base.repo源,但官方源中去除了很多有版权争议的软件,而且安装的软件也不是最新的稳定版。所以在这里,我们使用这个rpm软件仓库。其地址如下:http://rpmfusion.org。因为不同的CentOS版本的Git所对应的rpm包不同,所以在下载安装RPMForge时可先到该网站找到适合自己系统安装的RPMForge的rpm包。其地址如下:http://pkgs.repoforge.org/rpmforge-release/。因为我的CentOS是CentOS-6.5 32 位,所以我对应的rpm安装包就是:rpmforge-release-0.5.3-1.el6.rf.i686.rpm,所以可用以下命令来安装:

# rpm -i http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm

(3)使用rpmforge-extra源更新
因为yum命令下载的软件依赖于其所使用的软件仓库,所以我们只要更改其指定的软件仓库,就能使用yum来方便地下载安装RPMForge源中的软件来更新本机的软件,从而简化安装操作。其命令如下:

# yum --enablerepo=rpmforge-extras update

你会看到由于软件仓库的切换,导致会有大量的软件可更新,你可以选择安装或不安装。若选择安装,则输入‘y’,那么当安装完成时,Git也就变为最新的版本了,我就是用这种方式的。但由于要更新的软件实在太多,所以,也可以选择只安装Git,输入了‘n’。

(4)安装升级git

yum --enablerepo=rpmforge-extras install git

2、升级git后,使用git clone命令获取ngrok的源代码。

git clone <a href="https://github.com/inconshreveable/ngrok.git">https://github.com/inconshreveable/ngrok.git</a>

四、编译

(1)配置环境变量
export NGROK_DOMAIN="jinglingshu.org"
(2)生成自签名ssl证书
cd 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 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
clipboard
(3)编译生成可执行文件
GOOS=linux GOARCH=386
make release-server release-client
ps:上述编译的过程会需要去github、google code下载其余依赖项目的源码,因此需要挂VPN。当然
,如果VPS不能挂vpn可以在本地进行上面介绍的操作过程,然后将编译后的源码复制到vps上重新编译即可。
编译之后,就会在ngrok源码的bin目录下生成两个可执行文件:ngrokd、ngrok。其中ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序。由于现在生成的客户端ngrok只能在linux下运行,因此如果想要生成windows下的客户端程序,需要继续进行交叉编译。
五、交叉编译生成windows客户端
上述编译过程生成的服务端和客户端都是linux下的,不能在windows下用。如果想编译生成windows客户端,需要重新配置环境并编译。交叉编译windows客户端,需要使用源码来安装Golang,使用yum安装的Golang是不能顺利进行交叉编译的。
交叉编译过程如下:
(1)进入golang目录,进行环境配置
cd  /usr/local/go/src/
GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash
(2)进入ngrok目录重新编译
cd  /usr/local/src/ngrok/
GOOS=windows GOARCH=386 make release-server release-client
编译后,就会在bin目录下生成window_386目录,其中就包含着windows下运行的服务器和客户端程序。
clipboard
clipboard
将ngrok.exe拷出来即可在windows上运行。
五、ngrokd服务启动与使用
1、启动ngrokd服务端
bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000"
2、启动ngrok客户端
客户端使用,需要首先创建配置文件,可以根据自己的实际情况进行配置,如创建http和ssh隧道的配置文件如下:
server_addr: "jinglingshu.org:4443"
trust_host_root_certs: false
tunnels:
  http:
    subdomain: "example"
    auth: "user:12345"
    proto:
      http: "80"
 
  ssh:
    remote_port: 2222
    proto:
      tcp: "22"
配置完成后,如下启动客户端:
linux:
bin/ngrok -config ngrok.conf start http
windows:
ngrok.exe  -config ngrok.conf start http
ps:服务端程序运行后会开启后,除了要启动指定的端口httpAddr外,还默认启动443用于https通信和4443端口用于和客户端通信。
客户端运行后会启动4040端口,访问后可以查看通信情况。
QQ截图20150427190235
QQ截图20150427190244
QQ截图20150427190349
ps:以上是完整的搭建过程,如果不想搭建可以去ngrok官网注册个账号直接使用。完整的ngrok源码我分享到网盘中,地址是http://pan.baidu.com/s/1ntn7HB7,可以直接使用该源码,省去升级git和挂vpn下源码的过程。如果vps是ubuntu,则详细的搭建过程可以参考:搭建 ngrok 服务实现内网穿透

ngrok的原理可以参考:ngrok原理浅析

参考资料:

1、搭建 ngrok 服务实现内网穿透

2、自编译ngrok服务器

3、ngrok 内网穿透利器

4、Windows/Centos安装GO语言环境

5、ngrok原理浅析

转载请注明:jinglingshu的博客 » 自编译搭建ngrok服务实现内网穿透


Warning: Use of undefined constant PRC - assumed 'PRC' (this will throw an Error in a future version of PHP) in /usr/share/nginx/html/wp-content/themes/d8/comments.php on line 17
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 我怎么样吧127.0.0.1:4040端口去掉?
    陈松灿1年前 (2017-12-06)回复