ngrok实现内网穿透

ngrok的作用就是实现内网穿透,内网穿透就是允许内网的主机能够被外网的其他主机访问。内网穿透是反向代理技术中的一个中间环节技术。对于反向代理的更多理解可见另外一文《关于代理技术的理解》

  • ngrok支持的协议:

http
https
tcp

一、域名解析

解析ngrok*.ngrok两条A记录到dns服务器上:

比如域名为qcmoke.site而ip为198.23.188.200,那么做以下域名解析:

A记录 ngrok --> 198.23.188.200

A记录 *.ngrok --> 198.23.188.200

二、服务端

这个代理服务端一般是提供外网(公网)ip的服务器。用其作为反向代理服务器。

1. 安装

(1)安装依赖

1
2
$ yum install epel-release -y
$ yum install git gcc make golang -y

(2)下载ngrok

1
$ git clone https://github.com/inconshreveable/ngrok.git ~/ngrok

(3)配置证书

这里为了方便直接在服务器生成自签名证书了,为了安全传输的话可以通过购买或者用Let’s Encrypt免费生成的CA证书。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cd ~/ngrok  
$ mkdir cert
$ cd cert

$ export NGROK_DOMAIN="ngrok.qcmoke.site"

$ 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


#配置证书。其实就是替换掉原来的证书(提示overwrite输入y)
$ cp rootCA.pem ../assets/client/tls/ngrokroot.crt
$ cp device.crt ../assets/server/tls/snakeoil.crt
$ cp device.key ../assets/server/tls/snakeoil.key

(4)编译服务端和客户端

1
2
3
4
5
6
#切换回ngrok目录
$ cd ~/ngrok
#编译服务端程序,生成路径在~/ngrok/bin/ngrokd
$ make release-server
#编译客户端程序,会生成~/ngrok/bin/windows_amd64/ngrok.exe,编译好后记得将windows_amd64目录copy到本地客户端
$ GOOS=windows GOARCH=amd64 make release-client

如果编译其他平台客户端可参照以下:

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
2
3
4
#为了方便直接关闭防火墙
$ service firewalld stop
#运行服务端程序
$ ~/ngrok/bin/ngrokd -domain="ngrok.qcmoke.site"

三、客户端

1. 代理web服务

在本地客户端的windows_amd64目录里新建文件ngrok.cfg并编辑,在文件里加入以下内容:

1
2
server_addr: "ngrok.qcmoke.site:4443"  
trust_host_root_certs: false

启动客户端程序

1
2
#http://demo.ngrok.qcmoke.site:80
$ ngrok -config=ngrok.cfg -subdomain demo 80

准确的说这个客户端是资源服务器,而真正的客户端因该属于其他终端,故可以在其他终端上访问http://demo.ngrok.qcmoke.site:80

请求过程:其他终端—>代理服务器—>资源服务器

在代理服务端中通过以下命令查看客户端映射到服务端的端口(可以通过打开另一个终端页操作)

1
$ netstat -tunlp|grep ngrokd

2. 代理tcp服务

ngrok是可以代理tcp协议请求的,比如代理mysql,让内网中的mysql暴露到外网,提供给外网的用户使用。此外不仅可以代理到内网中运行ngrok客户端的主机,还可以代理到同一个内网的其他主机,简直暴力得不像话。

  • 编辑客户端配置文件windows_amd64/ngrok.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server_addr: "ngrok.qcmoke.site:4443"  
trust_host_root_certs: false
#隧道列表
tunnels:
mysql-localhost:
remote_port: 3306
proto:
#代理到本地的mysql,相当于localhost:3306
tcp: 3306

mysql-other:
remote_port: 3306
proto:
#代理到内网中的其他主机的mysql
tcp: 192.168.222.131:3306

注意remote_port是远程的代理端口(可以修改为其他值来防止服务器端口冲突),tcp是本地端口。ngrok会将端口为remote_port请求代理到本地端口。

  • 启动客户端程序
1
2
3
4
5
6
7
#ngrok -config ngrok.cfg start 隧道名称

#代理到本地的mysql
$ ./ngrok.exe -config ngrok.cfg start mysql-localhost

#代理到内网中的其他主机的mysql
$ ./ngrok.exe -config ngrok.cfg start mysql-other

3. 更多详细代理配置

🎁🎁🎁最后献上我个的常用客户端代理配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
server_addr: "ngrok.qcmoke.site:4443"
trust_host_root_certs: false

#隧道列表
tunnels:

##http代理服务配置
#通过subdomain配置子域名,测试:http://www.ngrok.qcmoke.site
http:
subdomain: www
proto:
http: 80


##https代理服务配置
#通过subdomain配置子域名,测试:https://www.ngrok.qcmoke.site
https:
subdomain: www
proto:
https: 443


##ssh远程登录代理配置
#防止和代理服务器的ssh端口冲突,所以改用2222
#测试:ssh -p 2222 root@ngrok.qcmoke.site
ssh:
remote_port: 2222
proto:
tcp: 192.168.222.131:22


##mysql代理服务配置
#测试:mysql -h ngrok.qcmoke.site -u root -p
#(1)代理到本地的mysql
mysql-localhost:
remote_port: 3306
proto:
#相当于localhost:3306
tcp: 3306

#(2)代理到内网中的其他主机的mysql
mysql-other:
remote_port: 3306
proto:
tcp: 192.168.222.131:3306

##oracle代理服务配置
oracle:
remote_port: 1522
proto:
tcp: 127.0.0.1:1521

##gitlib代理服务配置
gitlib:
remote_port: 2222
proto:
tcp: gitlab.qcmoke.site:2222


----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%