ngrok

ngrok可以让本地的web服务或tcp服务和外部建立一个安全的通道,使得外网可以访问本地的计算机服务。不仅可以用来暴露内网的http给外网使用,还可以从外网来ssh到本机开发环境。ngrok可以通过官方的服务来连接,也可以自己来。下面介绍下私有的ngrok服务的搭建工作。

准备工作

搭建ngrok服务需要一个外网服务器以及一个已经解析到了该机器的域名(假定为test.site),国内可以在阿里云购买相关服务:阿里云。注意:下文中用到的所有端口,如果启用了iptables规则,都需要放行,如果在阿里云中,需要设置安全组规则

依赖项

ngrok使用go语言开发,所以首先要 安装go语言:https://golang.org/doc/install

安装

下载代码:

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

生成ssl证书:

cd ngrok

NGROK_DOMAIN=“test.site”

openssl genrsa -out base.key 2048

openssl req -new -x509 -nodes -key base.key -days 10000 -subj “/CN=$NGROK_DOMAIN” -out base.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 base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

cp base.pem assets/client/tls/ngrokroot.crt

编译:

sudo make release-server release-client

此时在bin目录下应该有ngrok和ngrokd两个可执行文件。

如果需要交叉编译:先设置好GOOS与GOARCH变量

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

如需要编译window 64位版本: GOOS=windows GOARCH=amd64 make release-client

服务端启动:

nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain=“test.site” -httpAddr=":8081" -httpsAddr=":8082" &

示例中8081用来连接http请求,8082用来连接https请求

客户端启动:

将编译好的client版本下载到指定的机器上之后,配置启动文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
server_addr: test.site:4443			//4443为ngrok控制tunnel
trust_host_root_certs: false		//如果不需要使用TLS,可以将此变量设置为你false
tunnels:
  client:
    subdomain: pub
    proto:
      http: 8080
  ssh:
    remote_port: 2022
    proto:
      tcp: 22

./ngrok -log=stdout -config=ngrok.yml start ssh client& 启动客户端

此时,会把本机的8080端口的服务映射到服务端pub.test.site:8081端口,便可以用来访问客户端的8080端口的服务了。

tcp tunnel将22端口映射到服务端的2022端口,便可以ssh user@test.site -p2022 来访问客户端的ssh服务了。

开机启动ngrok client:

首先编写启动脚本 ngrok.sh:

1
2
cd /path/to/ngrok-client
./ngrok -log=stdout -config=ngrok.yml start ssh&

再配置systemd ngrok service文件 /usr/lib/systemd/system/ngrok.service;

[Unit]
Description=ngrok service

[Service]
Type=forking
ExecStart=/bin/bash /path/to/ngrok.sh

[Install]
WantedBy=multi-user.target

最后,

systemctl enable ngrok.service
systemctl start ngrok.service

服务就可以开机启动了