Ngrok搭建

配置域名(需支持泛域名功能)

子域名 记录类型 线路类型 记录值
ngrok A 记录 通用 170.10.10.100
*.ngrok A 记录 通用 170.10.10.100

安装 git

安装并配置好 go

1
2
3
4
5
6
7
sudo add-apt-repository ppa:gophers/archive
sudo apt-get update
sudo apt-get install golang-1.10-go -y

mkdir -p $HOME/c
mkdir -p $HOME/w
ln -sf /usr/lib/go-1.10 $HOME/c/go
1
2
3
export GOROOT=$HOME/c/go
export GOPATH=$HOME/w/go
export PATH=$GOROOT/bin:${GOPATH}/bin:$PATH

编译生成目标文件

创建并进入临时目录:mkdir $HOME/t && cd $_
创建文件build_ngrok.sh加入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/sh
read -p "Input your domain name:" DOMAIN
if [ "$DOMAIN" = "" ];then
echo Please input your domain name.
exit 0
fi

resultFileName=ngrok_`echo ${DOMAIN} | sed 's/\./_/g'`

currentPwd=$(pwd)
echo current path: $currentPwd
go get github.com/inconshreveable/ngrok
cd $GOPATH/src/github.com/inconshreveable/ngrok
git clean -df
git checkout -- .

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

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

make release-server
GOOS=linux GOARCH=amd64 make release-client
GOOS=windows GOARCH=amd64 make release-client
GOOS=linux GOARCH=arm make release-client
GOOS=darwin GOARCH=amd64 make release-client

mkdir -p bin/tls
mkdir -p bin/out

cp device.crt bin/tls/snakeoil.crt
cp device.key bin/tls/snakeoil.key
echo 'nohup ./ngrokd -tlsKey="tls/snakeoil.key" -tlsCrt="tls/snakeoil.crt" -domain='"$DOMAIN"' -httpAddr=":80" -httpsAddr=":443" > out/nohupd.out 2>&1 &' > ./bin/start.sh
chmod +x ./bin/start.sh
echo "server_addr: $DOMAIN:4443" > ./bin/ngrok.cfg
echo "trust_host_root_certs: false" >> ./bin/ngrok.cfg
echo 'nohup ./ngrok -config=./ngrok.cfg -subdomain=blog -proto=http 8078 > /dev/null 2>&1 &' > ./bin/blog.sh
chmod +x ./bin/ngrok_blog.sh

mv bin ${resultFileName}
tar -zcvf ${resultFileName}.tar.gz ${resultFileName}
mv ${resultFileName}.tar.gz $currentPwd/${resultFileName}.tar.gz
git clean -df
git checkout -- .
echo ok! result: ${resultFileName}.tar.gz
  • 运行 sh build_ngrok.sh
  • 根据提示输入已经配置好的域名,例如:ngrok.lyloou.com
  • 在域名对应的服务器上运行:./start.sh (这样,服务器端就完成了)

打包和解压

1
2
tar -zcvf ngrok_lyloou_com.tar.gz bin
tar -zxvf ngrok_lyloou_com.tar.gz

下载

realpath ngrok_lyloou_com.tar.gz # 获取文件路径
scp root@170.10.0.100:/root/t/ngrok_lyloou_com.tar.gz ngrok_lyloou_com.tar.gz # 从服务器拉取文件

运行服务器(已经在上面的build_ngrok.sh中配置过了)

1
2
3
4
5
6
7
#!/bin/sh
./ngrokd -domain="ngrok.lyloou.com" -httpAddr=":80" -httpsAddr=":443"

## 或者后台运行
mkdir out
chmod +x ngrokd
nohup ./ngrokd -domain="ngrok.lyloou.com" -httpAddr=":80" -httpsAddr=":443" > out/nohup_log.out 2>&1 &

运行客户端(在上面的build_ngrok.sh中配置并生成了一个案例ngrok_blog.sh

添加配置 ngrok.cfg:

1
2
server_addr: "ngrok.lyloou.com:4443"
trust_host_root_certs: false
1
2
#!/bin/sh
nohup ./ngrok -config=./ngrok.cfg -subdomain=lou -proto=http 80 > /dev/null 2>&1 &

其他

如果在云平台中运行 ngrok 服务, 需要将4443端口80端口添加到安全组中,如下表:

授权策略 协议类型 端口范围 授权类型(全部) 授权对象
允许 自定义 TCP 4443/4443 IPv4 地址段访问 0.0.0.0/0
允许 自定义 TCP 80/80 IPv4 地址段访问 0.0.0.0/0

参考资料

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#一、系统说明

- Windows 使用`windows_amd64`版本
- Mac 使用`darwin_amd64`版本
- Linux 使用`linux`版本

#二、配置说明
.\ngrok.exe -config=.\ngrok.cfg -subdomain=lou -proto=http 80

- subdomain 指向自定义的子域名
- proto 指向使用的协议
- 随后的数字表示:准备映射出去的端口号

# 三、使用方法

- Windows 系统执行 ngrok.bat
- Mac 和 Linux 系统执行 ngrok.sh

# 四、访问方式

浏览器中打开链接:
[http://lou.ngrok.lyloou.com](http://lou.ngrok.lyloou.com)

源码

https://github.com/lyloou/build_ngrok