前言

上一篇我们介绍了一下树莓派上的全局代理,很多场合中,我们只需要一个公网 ip 地址做反向代理,便于访问到部署应用的生产服务器。这时候用 ngrok 做内网穿透就很便利。

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

安装 ngrok

官网列出了一些主要的应用场景:

Public URLs for

  • SSH access to your Raspberry Pi.
  • building webhook integrations.
  • exposing your local web server.
  • testing on mobile devices.
  • sending previews to clients.
  • testing your chatbot.

1. 注册账号

首先在官网上注册一个账号,也可以用google账号或是github账号授权登录。登录后,就能看见数据面板了。

2. 下载对应的安装包

在树莓派上,我们之前选择的是官方32位版本的系统,所以下载 Linux (ARM) 版本。这里下载的是客户端程序,所以需要下载待发布的 APP 所在平台对应的安装包。

这里下载到树莓派上,解压程序

mkdir ngrok
cd ngrok
unzip ngrok-stable-linux-arm.zip

3. 获取认证授权码

在右侧菜单中,选择 Authentication --> Your Authtoken,复制自己的认证码。

4. 连接账号

运行以下命令添加刚才复制的认证码到默认配置文件 ngrok.yml 中

./ngrok authtoken 替换成复制的Authentication

配置文件生成完毕。

远程登录 ssh

1. 转发 SSH 服务

./ngrok tcp 22

开启了服务,绑定到远端的 tcp://2.tcp.ngrok.io:14324 上。

Tip:

注意,现在 ngrok 官网需要开启 VPN 或 Polipo 才能访问了。

2. 远程登录 ssh

在 ngrok 的数据面板中,可以找到连接的状态信息,复制 URL 准备远程访问。

在主电脑上(win10),开一个shell窗口登录一下

ssh pi@2.tcp.ngrok.io -p 14324

看到了之前在树莓派上配置的 openvino 初始化信息,已经登录成功了。

发布 web 服务

1. 转发 web 服务

./ngrok http 80

一句话就把本地的 web 服务放到公网上去了。

2. 远程访问 jupyter notebook

有时候需要临时测试后端服务的功能,但前端必须采用 https 才能访问,比如微信小程序之类,就可以用 ngrok 来转发在封装一下。我们用 notebook 来测试一下。

先启动 notebook

jupyter notebook

jupyter2

notebook 默认端口运行在 8888,记得复制 token 后面需要用到。

Tip:

需要修改用户主目录下~/.jupyter/jupyter_notebook_config.py文件,配置项 c.NotebookApp.allow_remote_access = True ,启用远程访问功能。

3. 转发 jupyter notebook 服务

./ngrok http 8888

ngrok 服务器将随机域名绑定到 notebook 的 8888 端口上,同时提供了 http 和 https 服务。这省去了一堆配置 ssl 证书等等一系列操作,对于移动端的APP调试和演示来说,极大的提高了效率。

4. 远程登录

在主电脑(win10)上开浏览器,登录 https://c1a80df740ac.ngrok.io。提示需要输入登录验证,也可以改为密码方式登录,具体操作可以点击文档链接查看详情。

5. 验证身份

填入之前复制的 token 信息,点击登录,验证成功后,就能正常使用了。

完美!

自建 ngrok 服务端

前面的操作都需要依赖官网的 ngrok 服务,考虑到现在被和谐的状态,我们可以在自己的云服务器上建一个 server 端,提供反向代理服务。

1. 下载源码

现在官网的 ngrok 是2.0版本,而开源版本是1.0的,注意客户端版本差异。

git clone https://github.com/tutumcloud/ngrok.git myngrok
cd myngrok

2. 生成 ssl 证书

国内云服务厂商一般都提供免费的 SSL 证书服务,绑定你所在云服务的域名,这里也可以自己生成自签名证书文件。

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 server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

然后把证书拷贝到本目录的assets下:

cp rootCA.pem assets/client/tls
cp server.crt assets/server/tls
cp server.key assets/server/tls

3. 配置环境

编译需要用到 GO 语言,先安装依赖

sudo apt-get install golang-1.9
mkdir ~/gocode

修改配置文件

sudo nano /etc/profile

添加环境变量如下:

export GOROOT=/usr/lib/go-1.9
export GOPATH=/home/pi/gocode
export PATH=$PATH:$GOROOT/bin

然后source /etc/profile生效后,安装完后使用命令 go version 验证安装结果。

4. 编译程序

make release-all

5. 运行服务器

bin 目录下 ngrokd 是服务器端程序,ngrok 是客户端程序

./ngrokd -tlsKey="/home/pi/ngrok/server.key" 
    -tlsCrt="/home/pi/ngrok/server.crt" 
    -domain="$NGROK_DOMAIN" 
    -httpAddr=:19091 
    -httpsAddr=:19092 
    -tunnelAddr=:19094 

tunnelAddr 表示和客户端链接的通道端口,默认是4443。这里指定了端口号,要保证防火墙开启这些端口。

服务器开启成功,等待连接中,然后就可以用 ngrok 客户端,配置 ngrok.cfg 文件,如前文所述,正常进行端口绑定操作了。

Tip:

类似功能的还有 frp,功能更为强大,数据面板也很漂亮,配置起来大同小异。这里就不过多赘述了,待用到之时查一下官网就行了。

软件下载

本期相关文件资料,可在公众号后台回复:“rpi11”,获取下载链接。


下一篇预告

环境问题基本解决了
我们将继续在树莓派上,
开启 AI 项目实战开发之旅,
敬请期待...

欢迎扫码关注,更多分享



bluishfish
13 声望25 粉丝