我们经常会有「把本机开发中的 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 可捕获和分析所有通道上的流量,便于后期分析和重放。
网络架构如下图所示:
ngrok不但提供了一个在外网能够安全的访问内网Web主机,还能捕获所有请求的http内容,方便调试,甚至还支持tcp层端口映射,不局限于某一特定的服务。支持Mac OS X,Linux,Windows平台。
下面详细介绍vps(阿里云Centos 6.5)上搭建ngrok服务的过程。
一、域名配置
要使用ngrok,需要对域名进行设置,需要设置的有@和*,即直接解析主域名和泛解析,将直接主域名解析和泛解析的A记录都指向将要安装ngrok服务的vps。
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
yum install mercurial git bzr subversion
使用rpm的强大功能,从以下的地址中,导入安装所需要的证书,命令如下:
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
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>
四、编译
export NGROK_DOMAIN="jinglingshu.org"
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
GOOS=linux GOARCH=386 make release-server release-client
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-server release-client
bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000"
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"
bin/ngrok -config ngrok.conf start http
ngrok.exe -config ngrok.conf start http
ngrok的原理可以参考:ngrok原理浅析
参考资料:
转载请注明:jinglingshu的博客 » 自编译搭建ngrok服务实现内网穿透