构建并托管自己的Ngrok服务器

Ngrok 是一个内网穿透的工具 如果你有外网IP的服务器 可以自建一个 方便随时映射域名

使用指南

博主自建了一个 Ngrok 服务器 用于简单的测试

  • 下载客户端
  • 命令行参数
    • -subdomain wechat 自定义子域名
    • -hostname wechat.yourdomain.com 自定义域名 请自行配置 CNAME 到 n.yumc.pw
    • -httpauth user:pass 添加HttpBasic效验
  • 在命令行执行

    • 最简单的方式 直接转发 自动生成域名 ./ngrok 8080

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      > ./ngrok 8080
      ngrok by MiaoWoo hosted on n.yumc.pw (Ctrl+C to quit)

      通 道 状 态 online
      服 务 版 本 1.7/1.7
      端 口 转 发 http://3d426895.n.yumc.pw -> 127.0.0.1:8080
      端 口 转 发 https://3d426895.n.yumc.pw -> 127.0.0.1:8080
      网 页 调 试 127.0.0.1:4040
      连 接 数 0
      平 均 时 间 0.00毫 秒
    • 自定义子域名 ./ngrok -subdomain test 8080

      1
      2
      3
      4
      5
      6
      7
      8
      9
      ngrok by MiaoWoo hosted on n.yumc.pw                      (Ctrl+C to quit)

      通 道 状 态 online
      服 务 版 本 1.7/1.7
      端 口 转 发 http://test.n.yumc.pw -> 127.0.0.1:8080
      端 口 转 发 https://test.n.yumc.pw -> 127.0.0.1:8080
      网 页 调 试 127.0.0.1:4040
      连 接 数 0
      平 均 时 间 0.00毫 秒
    • 自定义域名 ./ngrok -hostname ngrok.sixi.com 8080 需要 CNAME 到 n.yumc.pw

      1
      2
      3
      4
      5
      6
      7
      8
      9
      ngrok by MiaoWoo hosted on n.yumc.pw                      (Ctrl+C to quit)

      通 道 状 态 online
      服 务 版 本 1.7/1.7
      端 口 转 发 http://ngrok.sixi.com -> 127.0.0.1:8080
      端 口 转 发 https://ngrok.sixi.com -> 127.0.0.1:8080
      网 页 调 试 127.0.0.1:4040
      连 接 数 0
      平 均 时 间 0.00毫 秒

自建服务器指南(等待填坑)

脚本 还没写完 只是记录了一下

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
# 构建的主站域名
NGROK_BASE_DOMAIN="n.yumc.pw"

BASE_DIR=${GOPATH}/src/ngrok

# 生成证书
mkdir -p ${BASE_DIR}/cert
cd ${BASE_DIR}/cert
openssl genrsa -out client.key 2048
openssl req -new -x509 -nodes -key client.key -days 10000 -subj "/CN=${NGROK_BASE_DOMAIN}" -out client.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=${NGROK_BASE_DOMAIN}" -out server.csr
openssl x509 -req -in server.csr -CA client.pem -CAkey client.key -CAcreateserial -days 10000 -out server.crt

# 填充证书
\cp client.pem ${BASE_DIR}/assets/client/tls/ngrokroot.crt
\cp client.pem ${BASE_DIR}/assets/client/tls/snakeoilca.crt
\cp server.crt ${BASE_DIR}/assets/server/tls/snakeoil.crt
\cp server.key ${BASE_DIR}/assets/server/tls/snakeoil.key

# 构建服务器
cd ${BASE_DIR}
CGO_ENABLED=0 GO111MODULE=off make release-server

# 构建Linux客户端
CGO_ENABLED=0 GOOS="linux" GOARCH="amd64" GO111MODULE=off make release-client
# 构建Windows客户端
CGO_ENABLED=0 GOOS="windows" GOARCH="amd64" GO111MODULE=off make release-client

# 默认启动命令
./ngrokd -domain="n.yumc.pw" -httpAddr=:80 -httpsAddr=:443 -tunnelAddr=:4443

# 启动服务器 如果用了 Nginx 代理了80 就指定一下 VHOST 如果提示证书错误 就指定一下刚才的证书 要复制到ngrokd同级目录
VHOST=n.yumc.pw ./ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="n.yumc.pw" -httpAddr=:30080 -httpsAddr=:30443 -tunnelAddr=:34443
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
emm 后来发现 只要指定一下 VHOST 就好了
单独修改显示的地方
src\ngrok\src\ngrok\client\views\term\view.go: 108
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok by MiaoWoo hosted on n.yumc.pw")
statusStr, statusColor := connStatusRepr(state.GetConnStatus())
v.APrintf(statusColor, 0, 2, "%-26s%s", "通道状态", statusStr)

v.Printf(0, 3, "%-26s%s/%s", "服务版本", state.GetClientVersion(), state.GetServerVersion())
var i int = 4
for _, t := range state.GetTunnels() {
v.Printf(0, i, "%-26s%s -> %s", "端口转发", t.PublicUrl, t.LocalAddr)
i++
}
v.Printf(0, i+0, "%-26s%s", "网页调试", v.ctl.GetWebInspectAddr())

connMeter, connTimer := state.GetConnectionMetrics()
v.Printf(0, i+1, "%-28s%d", "连接数", connMeter.Count())

msec := float64(time.Millisecond)
v.Printf(0, i+2, "%-26s%.2f毫秒", "平均时间", connTimer.Mean()/msec)