搭建ngrok服务器

Posted    on 2017, Mar29, Wednesday 21:00:21
Modified on 2017, Mar29, Wednesday 21:00:21

Tags: 内网穿透

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

1. 准备

  1. 一个有固定公网ip的服务器
  2. 一个域名
  3. 把某个子域名以及其泛解析解析到服务器
    例: 将ngrok.plusls.com解析为1.2.3.4
    并将*.ngrok.plusls.com解析为1.2.3.4

2. 生成可执行文件

1. 下载源码

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

2. 生成自签名证书

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

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下分别存放着客户端和服务器的默认证书文件,接下来把它们替换为刚才生成的
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key

3. 编译

在ngrok目录执行

make release-server release-client

3. 配置

1.服务端

ngrokd -domain="ngrok.plusls.com"

若出现
[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则访问时需要加上端口号

2.客户端

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

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必须与前面相同!否则无法连接服务器
之后执行
./ngrok start-all

若是看到
ngrok                                                                                       (Ctrl+C to quit)

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

则说明成功
 其它指令可以自行查看帮助