搭建 ngrok 服务实现内网穿透

搭建 ngrok 服务实现内网穿透

文章目录html

咱们常常会有「把本机开发中的 web 项目给朋友看一下」这种临时需求,为此专门在 VPS 上部署一遍就有点太浪费了。以前我一般是在 ADSL 路由器上配个端口映射让本机服务在外网能够访问,但如今大部分运营商不会轻易让你这么干了。通常小运营商也没有公网 IP,本身的路由器出口仍是在局域网内,端口映射这种作法就无论用了。golang

以前我就想过可否借助拥有公网 IP 的主机中转来实现这种需求,后来发现已经有这样的软件了:ngrok。并且 ngrok 官网自己还提供了公共服务,只须要注册一个账号,运行它的客户端,就能够快速把内网映射出去。不过这么好的服务,没多久就被墙了~web

好在 ngrok 是开源的,我在 VPS 上搭了一套服务本身用,一劳永逸地解决了内网穿透这个难题,这里记录一下过程。(注意:ngrok.com 提供的服务是基于 ngrok 2.0,github 上目前只有 1.0 的源码,两者功能和命令有一些区别,用的时候别搞混了)安全

编译 ngrok

个人 VPS 系统是 Ubuntu 14.04.2 LTS,首先装必要的工具:app

sudo apt-get install build-essential golang mercurial git

获取 ngrok 源码:dom

BASHgit clone https://github.com/inconshreveable/ngrok.git ngrok### 请使用下面的地址,修复了没法访问的包地址git clone https://github.com/tutumcloud/ngrok.git ngrokcd ngrok

生成并替换源码里默认的证书,注意域名修改成你本身的。(以后编译出来的服务端客户端会基于这个证书来加密通信,保证了安全性)

BASHNGROK_DOMAIN="imququ.com"openssl genrsa -out base.key 2048openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
openssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

cp base.pem assets/client/tls/ngrokroot.crt

开始编译:

sudo make release-server release-client

若是一切正常,ngrok/bin 目录下应该有 ngrok、ngrokd 两个可执行文件。

服务端

前面生成的 ngrokd 就是服务端程序了,指定证书、域名和端口启动它(证书就是前面生成的,注意修改域名):

sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="imququ.com" -httpAddr=":8081" -httpsAddr=":8082"

到这一步,ngrok 服务已经跑起来了,能够经过屏幕上显示的日志查看更多信息。httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,能够随意指定。ngrokd 还会开一个 4443 端口用来跟客户端通信(可经过 -tunnelAddr=":xxx" 指定),若是你配置了 iptables 规则,须要放行这三个端口上的 TCP 协议。

如今,经过 https://imququ.com:8081 和 https://imququ.com:8082 就能够访问到 ngrok 提供的转发服务。为了使用方便,建议把域名泛解析到 VPS 上,这样能方便地使用不一样子域转发不一样的本地服务。我给 imququ.com 作了泛解析,随便访问一个子域,如:http://pub.imququ.com:8081,能够看到这样一行提示:

Tunnel pub.imququ.com:8081 not found

这说明万事俱备,只差客户端来连了。

客户端

若是要把 linux 上的服务映射出去,客户端就是前面生成的 ngrok 文件。但我用的是 Mac,须要指定环境变量再编一次:

sudo GOOS=darwin GOARCH=amd64 make release-server release-client

这样在 ngrok/bin 目录下会多出来一个 darwin_amd64 目录,这里的 ngrok 文件就能够拷到 Mac 系统用了。

写一个简单的配置文件,随意命名如 ngrok.cfg:

server_addr: imququ.com:4443trust_host_root_certs: false

指定子域、要转发的协议和端口,以及配置文件,运行客户端:

./ngrok -subdomain pub -proto=http -config=ngrok.cfg 80

不出意外能够看到这样的界面,这说明已经成功连上远端服务了:

ngrok_client

如今再访问 http://pub.imququ.com:8081,访问到的已是我本机 80 端口上的服务了。

管理界面

上面那张 ngrok 客户端运行界面截图中,有一个 Web Interface 地址,这是 ngrok 提供的监控界面。经过这个界面能够看到远端转发过来的 http 详情,包括完整的 request/response 信息,很是方便。

ngrok_manager

实际上,因为 ngrok 能够转发 TCP,因此还有不少玩法,原理都同样,这里就很少写了。

本文连接:https://imququ.com/post/self-hosted-ngrokd.html参与评论

--EOF--

相关文章
相关标签/搜索