在云主机上搭建ngrok实现内网穿透

阅读  ·  发布日期 2018-11-14 09:48  ·  admin

ngrok可以支持http,https,tcp各种协议的转发,可以将自己本地的电脑映射到公网上,其安装配置也十分的简单,但是前提条件是需要你有一个域名。


这里安装的ngrok是1.x版本,ngrok的作者在自己的开源库里说明了这个版本存在内存泄露等严重问题,而他的ngrok2.x则是解决了这些问题,但是是收费的,并没有开源。
鉴于博主使用至今并没有出现什么严重的问题,我觉得这个还是可以继续在自己的主机搭建来玩一玩的。


博主是在CentOS系统的云主机上搭建ngrok的,域名和证书都是免费获取的,具体方法可以参照这篇教程
当然嫌麻烦也可以不申请证书,但是域名一定要有,而且域名申请也十分简单,。,


域名和证书都有了之后就是ngrok的安装了,这里提供一下CentOS的安装教程
1.首先安装GO语言,因为ngrok是GO语言编写的

yum install golang

2.接下来需要从github上将ngrok拉取下来,如果没有git,执行yum install git安装,然后选个地方直接拉取git clone https://github.com/tutumcloud/ngrok.git ngrok
拉下来的目录结构如下

[[email protected]_16_11_centos temp]# ll ngrok/
total 40
drwxr-xr-x 4 root root 4096 Sep  2 10:16 assets
drwxr-xr-x 4 root root 4096 Sep  2 13:53 bin
drwxr-xr-x 2 root root 4096 Sep  2 10:16 contrib
-rw-r--r-- 1 root root  199 Sep  2 10:16 CONTRIBUTORS
drwxr-xr-x 2 root root 4096 Sep  2 10:16 docs
-rw-r--r-- 1 root root  551 Sep  2 10:16 LICENSE
-rw-r--r-- 1 root root 1433 Sep  2 10:16 Makefile
drwxr-xr-x 5 root root 4096 Sep  2 10:23 pkg
-rw-r--r-- 1 root root 1904 Sep  2 10:16 README.md
drwxr-xr-x 5 root root 4096 Sep  2 10:18 src

3.进入拉下来的ngrok文件夹,如果你已经配置了letsencrypt的免费证书,那么就将生成的证书文件复制到asseert文件夹,下面是博主自己的证书存放的位置和ngrok的存放位置,请自行更改

 cp /etc/letsencrypt/live/madongyu.ml/chain.pem temp/ngrok/assets/client/tls/ngrokroot.crt 
 cp /etc/letsencrypt/live/madongyu.ml/cert.pem temp/ngrok/assets/server/tls/snakeoil.crt 
 cp /etc/letsencrypt/live/madongyu.ml/privkey.pem temp/ngrok/assets/server/tls/snakeoil.key

没有证书的话就只能自己签名一个了,$NGROK_DOMAIN是自己的域名

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 server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

得到证书之后操作如上,不过如果你用的是letsencrypt的证书,那么运行ngrok的时候最好指定证书地址,而不是放在assert打包到程序。。。不然就要三个月换一次。。。
4.证书也配置好之后就是程序的打包了,可以选择打包对应平台的客户端和服务端

#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

直接在ngrok目录下运行命令就可以了,生成的程序在bin文件夹里面
5.最后就是运行了,如果客户端一直连接不上,请关掉防火墙,或者检查证书是否有误。
服务端运行
ngrokd -domain="madongyu.ml" -httpAddr=":1111" -httpsAddr=":2222 -tlsKey=xxx.key -tlsCrt=xxx.crt"
如果配置了assert就不需要后面两个参数,这两个就是指定证书的位置,domian参数代表域名,httpAddr和htppsAddr代表监听的http和https对应的端口
客户端运行,需要写一个配置文件ngrok.cfg,当然也可以不写
A)监听http和https,这里监听客户端主机的8987端口
ngrok.exe -subdomain test kyt -config=ngrok.cfg 8987
这里监听成功后会在你的域名前面添加前缀,即subdomain的值test,变成test.xxxx.xxxx,这个时候你需要配置自己域名的子域名,具体操作可以在自己云主机的管理界面操作,下面是我自己的配置成功的图,使用‘*’是为了偷懒。。。记住配置成功后需要时间生效,10分钟以内生效
这里写图片描述
B)监听TCP(可用于远程主机联机),这里使用start参数可以直接在配置文件里面调用参数,这样就不用写很多了,而且这里也不用配置子域名了,不需要。
.\ngrok.exe -config=.\config.cfg start transmission
配置文件ngrok.cfg,必须遵循YML文件格式,否则会报错,直接复制过去可能运行的时候会报错,可以使用线上的YAML检测工具校验

server_addr: "madongyu.ml:4443"
trust_host_root_certs: false
tunnels:
  transmission:
    remote_port: 3389
    proto:
      tcp: 3389

server_addr就是自己服务器的域名以及默认的监听端口4443,可以在启动的时候自定义。
tunnels是隧道的意思,我们可以自定义多条隧道,名字也可以自定义,transmission就是我自定义的tcp隧道(名字随意),监听客户端的3389端口,绑定到主机的3389端口。