ngrok的作用就是实现内网穿透,内网穿透就是允许内网的主机能够被外网的其他主机访问。内网穿透是反向代理技术中的一个中间环节技术。对于反向代理的更多理解可见另外一文《关于代理技术的理解》。
- ngrok支持的协议:
http
https
tcp
¶一、域名解析
解析ngrok
和 *.ngrok
两条A记录到dns服务器上:
比如域名为qcmoke.site
而ip为198.23.188.200
,那么做以下域名解析:
A记录
ngrok
--> 198.23.188.200A记录
*.ngrok
--> 198.23.188.200
¶二、服务端
这个代理服务端一般是提供外网(公网)ip的服务器。用其作为反向代理服务器。
¶1. 安装
(1)安装依赖
1 | yum install epel-release -y |
(2)下载ngrok
1 | git clone https://github.com/inconshreveable/ngrok.git ~/ngrok |
(3)配置证书
这里为了方便直接在服务器生成自签名证书了,为了安全传输的话可以通过购买或者用Let’s Encrypt免费生成的CA证书。
1 | cd ~/ngrok |
(4)编译服务端和客户端
1 | 切换回ngrok目录 |
如果编译其他平台客户端可参照以下:
Linux 平台 32 位系统:GOOS=linux GOARCH=386
Linux 平台 64 位系统:GOOS=linux GOARCH=amd64
Windows 平台 32 位系统:GOOS=windows GOARCH=386
Windows 平台 64 位系统:GOOS=windows GOARCH=amd64
MAC 平台 32 位系统:GOOS=darwin GOARCH=386
MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64
ARM 平台:GOOS=linux GOARCH=arm
¶2. 运行服务端程序
1 | 为了方便直接关闭防火墙 |
¶三、客户端
¶1. 代理web服务
在本地客户端的windows_amd64
目录里新建文件ngrok.cfg
并编辑,在文件里加入以下内容:
1 | server_addr: "ngrok.qcmoke.site:4443" |
启动客户端程序
1 | http://demo.ngrok.qcmoke.site:80 |
准确的说这个客户端是资源服务器,而真正的客户端因该属于其他终端,故可以在其他终端上访问http://demo.ngrok.qcmoke.site:80
请求过程:其他终端—>代理服务器—>资源服务器
在代理服务端中通过以下命令查看客户端映射到服务端的端口(可以通过打开另一个终端页操作)
1 | netstat -tunlp|grep ngrokd |
¶2. 代理tcp服务
ngrok是可以代理tcp协议请求的,比如代理mysql,让内网中的mysql暴露到外网,提供给外网的用户使用。此外不仅可以代理到内网中运行ngrok客户端的主机,还可以代理到同一个内网的其他主机,简直暴力得不像话。
- 编辑客户端配置文件
windows_amd64/ngrok.cfg
1 | server_addr: "ngrok.qcmoke.site:4443" |
注意remote_port是远程的代理端口(可以修改为其他值来防止服务器端口冲突),tcp是本地端口。ngrok会将端口为remote_port请求代理到本地端口。
- 启动客户端程序
1 | ngrok -config ngrok.cfg start 隧道名称 |
¶3. 更多详细代理配置
🎁🎁🎁最后献上我个的常用客户端代理配置:
1 | server_addr: "ngrok.qcmoke.site:4443" |