【腾讯云的1001种玩法】轻松搭建内网穿透服务Ngrok

在最近的开发过程中,遇到了一个尴尬的问题,外网环境下无法访问内网(本地虚拟机)的Ubuntu系统中的WEB服务,很难将自己做好的网站和页面展示给别人看,并接受对方的意见实时进行修改.

之前在开发参赛项目的时候有用到过Ngrok转发进行团队内部的交流,于是在网上搜索了几个Ngrok的服务,然而用起来都不尽如人意,就打算用Qcloud上的Ubuntu服务器,试着自己搭建一个Ngrok的服务器,用于内网穿透。

先介绍一下Ngrok

Ngrok on github

Ngrok is a tunneling, reverse proxy that establishes secure tunnels from a public endpoint to a locally running network service while capturing all traffic for inspection and replay.

翻译一下:

Ngrok是一个隧道,即建立安全通道从公共端点到本地运行的网络服务,同时捕捉检查和重播所有流量的反向代理。

简单来说,他可以代理你本地的数据,并将其转发到外网。

闲话少许,习大大教导我们,撸起袖子加油干

Step1:安装git 和Golang

Git是啥,是干什么用的,在此我就不过多阐述了!

# sudo apt-get install build-essential golang mercurial git

Golang,Go语言支持,因为Ngrok是基于Go语言编写的

这里我都已经安装了,没有安装的按照提示安装即可

Step2:获取 ngrok 源码

此处使用非官方地址,修复了部分包无法获取

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

# cd ngrok

Step3:生成自签名证书

使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,如果不想买SSL证书,我们需要生成自己的自签名证书,并编译一个携带该证书的ngrok客户端。

证书生成过程需要一个NGROK_BASE_DOMAIN。 以ngrok官方随机生成的地址693c358d.ngrok.com为例,其NGROK_BASE_DOMAIN就是“ngrok.com”,如果你要 提供服务的地址为“example.ngrok.xxx.com”,那NGROK_BASE_DOMAIN就应该 是“ngrok.xxx.com”。这里呢,我替换成自己的域名 “ngrok.mdzz2333.cn” 这个地方大家也要提前准备好自己的域名,没有多余域名的同学呢,就可以给自己的域名添加一个二级域名来解决.

*注意:下述指令中的域名要换成大家自己的哦,不然就绑定到我的域名上去了~

$ cd ngrok

# NGROK_DOMAIN="ngrok.mdzz2333.cn"

# openssl genrsa -out base.key 2048

# openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem

# openssl genrsa -out server.key 2048

# openssl 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

Step4:编译

# sudo make release-server release-client

这一步骤等待时间较长,成功编译后,会在bin目录下找到ngrokd和ngrok这两个文件。

Step5:启动服务端

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

# sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.mdzz2333.cn" -httpAddr=":8081" -httpsAddr=":8082"

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

现在,通过 http://ngrok.mdzz2333.cn:8081http://ngrok.mdzz2333.cn:8082 (大家要访问自己的域名哦) 就可以访问到 ngrok 提供的转发服务。为了使用方便,建议把域名泛解析到 VPS 上,这样能方便地使用不同子域转发不同的本地服务。

访问后看到提示:

Tunnel pub.imququ.com:8081 not found

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

在服务端为了保证服务的一直启动,可以使用screen,此处略过

Step6:客户端

单有服务端,你转发什么捏?肯定要在你需要发布内容(web,服务)的设备上安装匹配的客户端啊。在这里,我使用的服务器是ubuntu,而需要转发的服务器,也是ubuntu,就省去了重新编译这一环节。

将/ngrok/bin目录下的 ngrok 通过ssh的scp指令下载到当前客户端所在的系统中。

# scp username@serverIp:/ngrok/bin/ngrok /home/ubunutu/ngrok

上述指令根据服务器信息和本地路径替换

创建一个ngrok配置文件:ngrok.cfg

写入以下内容:

server_addr: “ngrok.mdzz2333.cn:4443" trust_host_root_certs: false

注意:这里的server_addr换成前面配置的自签名证书中的域名

另外,这个域名请提前解析到服务器IP,参考如下:

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

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

如果没有错误,就会出现下面的界面

这表示转发成功,转发后的端口号,是在服务端中设置的端口号,转发为你填写的本地端口号。

在本地环境访问Web Interface也可以查看该端口转发下的请求

一个简单的ngrok转发就配置好了,只需要一个外网服务器和域名,就可以轻松的将你所有的内网服务器/虚拟主机/SSH转发到外网。

如果想要了解如何在win下使用Ngrok服务,可以参考这篇文章Ngrok编译Win下客户端和相关配置https://www.derwer.com/tesh/ngrokconfig.html

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏智能算法

Python学习(十)---- python中的进程与协程

原文地址: https://blog.csdn.net/fgf00/article/details/52790360 编辑:智能算法,欢迎关注! 上期我们一起学...

9120
来自专栏北京马哥教育

linux实用技巧:你该使用ctags查找源码了

linux实用技巧:你该使用ctags查找源码了 ---- 1.ctags简介: “哦,这个多的文件,我该如何去查看XX函数的实现!”相信...

33360
来自专栏程序员同行者

django基础之二

14040
来自专栏nummy

Tornado入门(二)【异步和阻塞IO】

实时Web应用通常针对每个用户创建持久连接,对于传统的同步服务器,这意味着需要给每个用户单独创建一个线程,这样做的代价非常高。

8720
来自专栏程序员同行者

python3模块: os

11230
来自专栏社区的朋友们

django 初始化默认数据的一个方法

经常可能会有的一个需求就是,一个表中会有一些默认数据,这些数据未来是可以通过管理端来配置的。所以数据库在被建立之后,会有一些默认数据被插入表中。

2.8K30
来自专栏黑泽君的专栏

c语言基础学习02_helloworld

============================================================================= 涉及...

18810
来自专栏三木的博客

Linux shell 程序设计2——bash的内置命令

常用的内置命令忽略,来看看shell编程中其他一些重要的内置命令: 1、help:显示所有内置命令列表,或显示一个具体命令的用法。 -s: 表示列出命令的语法...

22260
来自专栏电光石火

运行jar包找不到主类

在正确编译好java程序之后,打包,然后在命令行输入java -jar ,却弹出找不到或无法加载主类。 一检查,我的path环境变量都是对的呀?jav...

56890
来自专栏JavaQ

高并发编程-happens-before

happens-before是Java内存模型中定义的两个操作之间的偏序关系,即如果操作A在操作B之前先发生,那么操作A产生的操作结果,操作B可以观察到,或者说...

8820

扫码关注云+社区

领取腾讯云代金券