0%

基于 Docker 的 ngrok 内网穿透部署

ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。反向代理在计算机网络中是代理服务器的一种。

资料

Ngrok 官网 目前已经切换为 ngrok2 。免费 8 小时
Ngrok Github 升级为 ngrok2 后已闭源。

写在前面

最近痛下决心,把服务器重装系统了。一些软件,工具能用 docker 就用 docker。管理起来方便多了。所以 ngrok 也是用 docker 方式。17 年第一次装ngrok 时,就是直接在服务器上装的,装的过程很痛苦,各种包编译的问题,或者缺胳膊少腿的,折腾了 2-3 天,7,8 篇教程的综合才安装好。所以不建议在服务器上直接安装。 特别是一些没什么基础的小白。避免安装失败或者其他原因造成的服务器各类包安装冗余,甚至冲突。使用 docker 安装,不好用删了即可。

为什么要搭建自己的 ngrok

  • 管理内网服务器,内网web进行演示
  • 快速开发微信程序和第三方支付平台调试
  • 本地WEB外网访问、本地开发微信、TCP端口转发

国内内网穿透

至于搭建自己的 ngrok 服务的目的。 因为没有免费的……

选 ngrok 还是 frp

首先你自己要清楚你的使用范围。 因为他的速度跟你服务器以及供应商息息相关。比如我买的搬瓦工VPS,倒数第二便宜那种。 那内网穿透也就仅限个人项目测试,小范围人群测试这种。 所以在这种情况下无需考虑 ngrok 或 frp 那个更优。 都慢的抓脑壳。

如果是公司使用,那还是建议在阿里云等服务器上搭建一个,速度也快,性能也好。

至于 ngrok,frp 我都试过。 最后选了 ngrok,方便点

准备工作

  • 公网 IP 的服务器
    • 国内: 腾讯云,阿里云……
    • 国外: 搬瓦工,Vultr, 亚马逊……
  • 域名
    • 可以找别人借你一个二级域名
    • 可以买一个域名 便宜的首年 10 来块。 注意:推荐 GoDaddy 或者国外买域名
  • Linux 系统。 本文不支持 windows

DNS 解析

全文使用 example.com 代替你购买的域名。 二级域名同理

添加 2 条 A 记录。

1
2
3
4
#  host     Type        TTL     value

ngrok A 900 xxx.xxx.xxx.xxx
*.ngrok A 900 xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx 为你服务器的 IP 地址

  • 把 ngrok.example.com 解析到 xxx.xxx.xxx.xxx
  • 把 *.ngrok.example.com 解析到 xxx.xxx.xxx.xxx
    • ngrok 部署后,会反向代理到对应的子域名中

国内的服务器服务商,DNS 解析基本都支持泛域名(*.xxx.com)添加 。这里比国外强。
如果你的提供商不支持,要么你每增加一个子域名,在 DNS 中增加一个,要么切换到 DNSPod 去

docker 部署 ngrok

本文使用 hteen/ngrok 镜像。
或者你自己选一个 docker 中 ngrok 镜像搜索

docker 的安装不在本文讨论范围。 可以参考 CentOS-7 安装 Docker

拉镜像

1
2
3
4
5
6
7
# 拉镜像
docker pull hteen/ngrok

# 完成后检查
[root@104 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hteen/ngrok latest 9f29e9d374e9 4 years ago 260MB

初始化

1
2
# 注意替换域名
docker run --rm -it -e DOMAIN="ngrok.example.com" -v /data/ngrok:/myfiles hteen/ngrok /bin/sh /build.sh

如果国内服务器,这一步时间很长。耐心等待!!!

ngrok 初始化后,会生成 /data/ngrok 目录

查看客户端

目录 /data/ngrok/bin

1
2
3
4
bin/ngrokd                      # 服务端。 不管。  注意不要和客户端 ngrok 看混了
bin/ngrok # linux 客户端 在本地的 centos7 上验证失败
bin/darwin_amd64/ngrok # osx 客户端 在本地的 macbook 上验证成功
bin/windows_amd64/ngrok.exe # windows 客户端 在本地的 windows 上验证成功

使用 ftp 或者 scp 等方式拷贝对应客户端到你本地

启动 ngrok 服务

1
2
3
4
5
6
7
8
# 注意修改域名

docker run -idt --name ngrok-server \
-v /data/ngrok:/myfiles \
-p 8081:80 \
-p 8082:443 \
-p 4443:4443 \
-e DOMAIN='ngrok.example.com' hteen/ngrok /bin/sh /server.sh
  • 本地 8081 转发到 image 的 80 端口
  • 本地 8082 转发到 image 的 443 端口
  • 本地 4443 转发到 image 的 4443 端口

配置 nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name ngrok.example.com *.ngrok.example.com; # 监听域名

underscores_in_headers on; # 允许传递带_ 的参数 默认 off。 比如你研发 header 中带 access_token 。不开启将无法传递

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8081; # 这里的端口号是开启容器时 ngrok 监听的端口号
}
}

配置完后,重启 nginx

配置防火墙

1
2
firewall-cmd --zone=public --add-port=4443/tcp --permanent       # 开放4443端口
firewall-cmd --reload

配置客户端

下载客户端到本地。并新建 ngrok.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

server_addr: "ngrok.example.com:4443" # 服务器域名 + 端口
trust_host_root_certs: false # True 支持TLS加密协议的证书信任
tunnels: # 通道,可以配置多个
hello: # 名称
proto: # 属性。固定
http: 5000 # http 监听本地端口
https: 5000 # https 监听本地端口
subdomain: test1 # 子域名 自定义,不能重复. 例子中访问域名为 http://test1.ngrok.example.com

world:
proto:
http: 5000
https: 5000
subdomain: test2

启动客户端

1
2
3
# 在 ngrok 客户端目录
./ngrok -config=ngrok.yml start all # 启动所有监听
./ngrok -config=ngrok.yml start world # 仅启动 名称为 world 的监听

本地监控

http://127.0.0.1:4040