内网穿透、反向代理(ngrok服务器搭建)

时间:2022-09-17 15:55:53

内网穿透的目的是:让外网能访问你本地的应用,例如在外网打开你本地http://127.0.0.1指向的Web站点。


一、ngrok

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

开源免费

官网:https://ngrok.com/

源码:https://github.com/inconshreveable/ngrok

内网穿透、反向代理(ngrok服务器搭建)

ngrok1.x开源,ngrok2.x不开源

ngrok使用go语言开发,源代码分为客户端服务器端

国内免费服务器:http://ngrok.ciqiuwl.cn/


下面以上面的免费服务器为示例完成内网穿透

现在假定我的本地已成功部署了一个网站,访问地址为127.0.0.1,想内网穿透后被公网上的用户访问,一般步骤如下:

步骤1、下载windows版本的客户端,解压。一般在为你提供代理服务器的网站上找你要下载的客户端:

内网穿透、反向代理(ngrok服务器搭建)

步骤2、在命令(cmd)行下进入到ngrok客户端目录下

内网穿透、反向代理(ngrok服务器搭建)

步骤3、执行 ngrok -config=ngrok.cfg -subdomain xxx 80 //(xxx 是你自定义的域名前缀),建议批处理

内网穿透、反向代理(ngrok服务器搭建)

如果连接成功,会提示如下信息:

内网穿透、反向代理(ngrok服务器搭建)

这一步如果你认为太麻烦,可以直接运行目录下的start.bat批处理文件就不用进DOS环境了。运行start.bat直接跳过2,3步

步骤4、如果开启成功 你就可以使用 xxx.ngrok.xiaomiqiu.cn 来访问你本机的 127.0.0.1:80 的服务了,当然你必须确定的是你本机的Web是可以正常访问的。

内网穿透、反向代理(ngrok服务器搭建)

注意:

如果你自己有*域名,想通过自己的域名来访问本机的项目,那么先将自己的*域名解析到120.25.161.137(域名需要已备案哦,80端口必须备案),然后执行 ngrok -config=ngrok.cfg -hostname xxx.xxx.xxx 80 //(xxx.xxx.xxx是你自定义的*域名)


二、ubuntu下生成ngrok服务器与客户端应用程序

使用Putty远程登陆到服务器,如下所示:

内网穿透、反向代理(ngrok服务器搭建)

1、安装GIT、获取ngrok:

mkdir ngrok #创建名称为ngrok的目录
apt
-get update #更新包管理器

apt
-get install git #安装git

git clone https
://github.com/inconshreveable/ngrok.git ngrok2 #将ngrok源代码克隆回本地

成功执行后如下所示:

内网穿透、反向代理(ngrok服务器搭建)

PS. 直接在服务器上下载的话实在太慢,可以先在本地下载好,然后用ftp放到服务器上去直接用

2、安装Go语言:

apt-get install golang #安装go语言

执行结果如下:

内网穿透、反向代理(ngrok服务器搭建)

3、设置环境变量

export GOPATH=/usr/local/ngrok/  #设置环境变量,Go语言的安装位置export NGROK_DOMAIN="xxxx.cn"  #设置环境变量,xxx.cn为你的域名

内网穿透、反向代理(ngrok服务器搭建)

4、切换到ngrok目录下执行以下命令为域名生成证书

cd ngrokopenssl genrsa -out rootCA.key 2048openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pemopenssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csropenssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

生成后的结果如下:

内网穿透、反向代理(ngrok服务器搭建)

证书如下:

内网穿透、反向代理(ngrok服务器搭建)

5、拷贝证书到指定位置

cp rootCA.pem assets/client/tls/ngrokroot.crt  #复制rootCA.pem到assets/client/tls/并更名为ngrokroot.crtcp server.crt assets/server/tls/snakeoil.crt #复制server.crt到assets/server/tls/并更名为snakeoil.crtcp server.key assets/server/tls/snakeoil.key #复制server.key到assets/server/tls/并更名为snakeoil.key

6、 编译

 由于go语言的特性,在编译时直接生成机器码,所以在运行过程中并不需要go的环境(非托管应用)。在ngrok目录下,运行一下命令分别生成对应的客户端与服务端。

#win服务端GOOS=windows GOARCH=386 make release-server #win客户端GOOS=windows GOARCH=386 make release-client#linux服务端GOOS=linux GOARCH=386 make release-server#linux客户端GOOS=linux GOARCH=386 make release-client

生成完成后,在工作目录的bin文件夹下,产生对应的文件。以编译windows平台为例,会产生“ngrok.exe”与“ngrokd.exe”这两个文件,前者客户端,后者需要运行在公网服务器上。

因为项目中引用了一些外部资源,生成会耗费一些时间,对网络也有一定的要求,太慢会中短,命令执行下如:

内网穿透、反向代理(ngrok服务器搭建)

生成结果:

内网穿透、反向代理(ngrok服务器搭建)

这里我还生成了两个运行在windows服务器与客户端的应用:

内网穿透、反向代理(ngrok服务器搭建)

ngrok 是客户端,ngrokd 是服务端。

7、启动ngrok服务端

切换到ngrokd 服务端程序所在的目录并执行如下命令:

./ngrokd -domain xxxx.cn

xxx.cn代表你的域名

执行效果如下:

内网穿透、反向代理(ngrok服务器搭建)


8、配置客户端

拷贝生成的ngrok.exe到本地计算机,并新建配置文件ngrok.cfg,内容为:

server_addr: "xxxx.cn:4443"trust_host_root_certs: false

xxx.cn代表你的域名

再新建文件start.bat批处理文件,内容为:

ngrok.exe -subdomain hello -config=ngrok.cfg 8080
hello为子域名前缀,访问时格式为hello.xxx.cn

8080为本地tomcat服务器使用的端口号。

双击start.bat启动效果如下所示:

内网穿透、反向代理(ngrok服务器搭建)

到此,就可以通过域名hello.xxx.cn访问本地的服务器了。例如我的tomcat服务器:
内网穿透、反向代理(ngrok服务器搭建)

在编译生成的时候执行
GOOS=windows GOARCH=386 make release-server 
生成服务器端一切正常,可是生成客户端的时候一直报错,说找不到 sync.Pool。后来发现是GO语言软件版本太低了,使用1.3以上版本就不会有问题。