搭建ngrok服务器

ngrok已经不再维护了,建议使用frp

如今ipv4资源日渐匮乏,静态公网ip不容易获取,若是想从公网访问本机资源将会变得比较麻烦,ngrok可以通过流量转发来实现内网穿透,让外网更加容易访问本机资源。

准备

  1. 一个有固定公网ip的服务器
  2. 一个域名
  3. 把某个子域名以及其泛解析解析到服务器

例: 将ngrok.plusls.com解析为1.2.3.4

并将*.ngrok.plusls.com解析为1.2.3.4

生成可执行文件

下载源码

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

生成自签名证书

生成证书需要提供一个NGROK_BASE_DOMAIN,要求该地址指向服务器地址,在本次的例子中则是ngrok.plusls.com,若是NGROK_BASE_DOMAIN与连接时提供的域名不同,则无法连接

执行

1
2
3
4
5
6
NGROK_BASE_DOMAIN="ngrok.plusls.com"
openssl genrsa -out rootCA.key 2048
$ openssl req -x509 -new -nodes -key rootCA.key -subj "/CN="${NGROK_BASE_DOMAIN} -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN="${NGROK_BASE_DOMAIN} -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

执行完成后会生成device.crtdivice.csrdevice.keyrootCA.keyrootCA.pemrootCA.srl

ngrok会把ngrok源码下的assets目录编译到ngrokd和ngrok中,assets/client/tlsassets/server/tls下分别存放着客户端和服务器的默认证书文件,接下来把它们替换为刚才生成的

1
2
3
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key

编译

在ngrok目录执行

1
make release-server release-client

配置

服务端

1
ngrokd -domain="ngrok.plusls.com"

若出现

1
2
3
4
5
[03/29/17 20:51:30] [INFO] [registry] [tun] No affinity cache specified
[03/29/17 20:51:30] [INFO] [metrics] Reporting every 30 seconds
[03/29/17 20:51:30] [INFO] Listening for public http connections on [::]:80
[03/29/17 20:51:30] [INFO] Listening for public https connections on [::]:443
[03/29/17 20:51:30] [INFO] Listening for control and proxy connections on [::]:4443

则说明启动成功

注:

  1. domain不一定是刚刚的,可以是其它的,但是必须解析到服务器上
  2. 可以用-httpAddr=":80"指定web转发的端口,如果不为80则访问时需要加上端口号

客户端

将生成的ngrok下载到电脑后,在主目录创建.ngrok(默认配置文件位置,也可以用-config=xxxx指定配置文件)

输入

1
2
3
4
5
6
7
8
9
10
11
server_addr: "ngrok.plusls.com:4443"
trust_host_root_certs: false
tunnels:
ssh:
remote_port: 221
proto:
tcp: 22
web:
subdomain: hahahah
proto:
http: 80

子域名,端口,目标端口可自行配置

server_addr必须与前面相同!否则无法连接服务器

之后执行

1
./ngrok start-all

若是看到

1
2
3
4
5
ngrok                                                                                       (Ctrl+C to quit)

Tunnel Status online
Version 1.7/1.7
Forwarding xxxx:xxx -> xxxx:xxx

则说明成功

其它指令可以自行查看帮助