沪ICP备2021032517号-1

Ngrok

  |   0 评论   |   0 浏览

ngrok简介

ngrok是一个反向代理,它能够让你本地的网络服务或TCP服务通过公共的端口和外部建立一个安全的通道,使得外网可以访问本地的计算机服务 可以来访问内部网络的web、可以映射 ssh 22 、mstsc的3389等端口

grok的主要用途有以下几种:

  • 内网穿透,可代替VPN
  • 将无外网IP的桌面映射到公网
  • 临时搭建网络并分配二级域名
  • 微信二次开发的本地调试

前期准备 需要一台有公网IP的Linux-Server、一个可以使用的域名 并将域名指向Linux-Server的IP。

ngrok开发调试环境搭建

yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ git go
cd /root/

$> git clone https://github.com/inconshreveable/ngrok
$> cd ngrok
mkdir cert
cd cert
NGROK_DOMAIN="zifuy.cn"
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

覆盖原本证书

yes|cp rootCA.pem /root/ngrok/assets/client/tls/ngrokroot.crt
yes|cp device.crt /root/ngrok/assets/server/tls/snakeoil.crt
yes|cp device.key /root/ngrok/assets/server/tls/snakeoil.key

编译服务端。及不同系统客户端编译方法如下:

#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

编译生成 Linux 服务端

cd /root/ngrok
make release-server

执行完会在ngrok/bin目录下生成 go-bindata 和 ngrokd 这两个文件 gronkd为服务端启动程序

make release-client  

执行完会在ngrok/bin目录下生成ngrokd 这个文件 是客户端启动文件

编译生成 window 64位客户端

cd /usr/local/ngrok
GOOS=windows GOARCH=amd64 make release-client

执行完会在ngrok/bin目录下生成windows_adm64 这个文件 里面是widows客户端启动程序

编译生成 linux64位客户端

GOOS=linux GOARCH=amd64 make release-client

在Linux启动服务端程序

cd /root/ngrok
nohup /root/ngrok/bin/ngrokd -tlsKey="/root/ngrok/assets/server/tls/snakeoil.key" -tlsCrt="/root/ngrok/assets/server/tls/snakeoil.crt" -domain="zifuy.cn" -httpAddr=":80" -httpsAddr=":8090" -tunnelAddr=":8082" >/dev/null &

需要指定 snakeoil.key snakeoil.crt 否则客户端可能连接失败。

参数说明:

-domain 访问ngrok是所设置的服务地址生成证书时那个
-httpAddr http协议端口 默认为80
-httpsAddr https协议端口 默认为443 (可配置https证书)
-tunnelAddr 通道端口 默认4443

Linux客户端

[root@nfs ngrok]# cat ngrok.cfg

server_addr: "zifuy.cn:8082"
trust_host_root_certs: false
tunnels:
  www:
   proto:
    http: 10.10.0.29:80
   subdomain: www
  zbx:
    remote_port: 91
    proto:
      tcp: "10.10.0.33:80"

Windows客户端

windows 客户端配置

ngrok.cfg:
server_addr: "zifuy.cn:4443"
trust_host_root_certs: false
tunnels:
  mstsc:
    remote_port: 50123
    proto:
    tcp: "127.0.0.1:3389"

启动windows 客户端命令

ngrok.exe -config=ngrok.cfg start mstsc

关闭窗口后进程会退出

cmd窗口后台运行方法

1、start.vbs

set ws=WScript.CreateObject("WScript.Shell")
ws.Run "E:\Ngrok-47\ngrok.bat",0

2、ngrok.bat

@echo off
  if "%1" == "h" goto begin
  mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
  
ngrok.exe -config=ngrok.cfg start mstsc vnc

start.vbsngrok.bat 放到 ngrok 目录 先后管理员方式运行即可。

Supervisor守护ngrokd服务端进程

在日常使用中经常发生ngrok服务端不明原因自己退出的现象,所以使用Supervisor进行守护,检查到程序退出后,去重启他。

yum install epel-release

yum install -y supervisor

systemctl enable supervisord

vim /etc/supervisord.d/ngrok.ini

[program:ngrok]
directory = /data/ngrok/
command = /data/ngrok/bin/ngrokd -tlsKey="/data/ngrok/assets/server/tls/snakeoil.key" -tlsCrt="/data/ngrok/assets/server/tls/snakeoil.crt" -domain="rem.zifuy.cn" -httpAddr=":81" -httpsAddr=":8090" -tunnelAddr=":8082" 
autostart = true     ; 在 supervisord 启动的时候也自动启动
startsecs = 5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true   ; 程序异常退出后自动重启
startretries = 3     ; 启动失败自动重试次数,默认是 3
user = root          ; 用哪个用户启动
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20     ; stdout 日志文件备份数
 
stdout_logfile = /var/log/supervisor/ngrok.log
kill -9 ngrok_pid

systemctl start supervisord

验证守护是否生效,多次 kill ngrok 进程后查看 ngrok是否被启动.