基于安全隧道的设备远程访问本地代理

部分物联网设备基于安全的考虑或因部署于私有网络内部,是无法在外网直接访问设备上的服务的。物联网平台提供设备安全隧道产品功能,助您建立双向安全的通信链路,您可基于该通信链路实现对设备的远程访问、远程诊断和管理等功能。

背景信息

通过物联网平台的安全隧道功能,您可基于访问端代理对设备本地服务进行远程访问。例如SSH登录、RDP远程桌面控制,或设备已有的其他服务。

安全隧道的使用场景和使用说明的更多介绍,请参见安全隧道概述

本文以Linux系统设备为例,为您介绍基于访问端代理实现对设备本地服务访问的方案。

本文示例中的安全隧道通过控制台页面手动创建,您可以参考本文示例中访问端代理方式,自行开发并集成阿里云物联网平台的云端API,设计应用程序自动请求创建安全隧道。

原理说明

本文示例中展示了访问Linux系统设备的SSH服务。具体原理如下图所示:原理图

使用说明

原理图中步骤说明如下:

步骤

说明

1、2、3

请参见下文设备端开发创建安全隧道,配置并启动设备端,创建安全隧道。创建安全隧道后,设备端会收到隧道建连通知并自动连接至物联网平台的服务端。

4

请参见下文访问端代理服务开发(Java)访问端代理服务开发(Go),配置并启动访问端代理。启动访问端代理后,代理会以安全隧道访问端的身份连接至物联网平台的服务端。

5、6、7、8、9、10

请参见下文通过本地代理远程访问设备,通过执行SSH命令连接至访问端代理。此时代理内部会执行会话(Session)创建流程。

Session创建成功后,SSH客户端的数据和设备端SSHD的数据会在安全隧道的该Session中传递,您后续便可进行设备的远程访问。

设备端开发

准备工作

  • 获取设备认证信息

    本示例以一机一密认证方式为例,获取信息如下:

    {
      "ProductKey": "a1WvA***",
      "DeviceName": "device2",
      "DeviceSecret": "ff01e59d***ba2ca2b17"
    }
  • 获取C Link SDK

    定制SDK时,在SDK定制页面的高级能力区域,选中远程登录,集成包含安全隧道功能的设备端SDK。

  • 准备开发环境

    本文示例使用Linux系统开发环境,需在端口号22启动SSH服务进程SSHD。

    重要

    本示例中访问端远程访问设备进行数据通信需依赖SSHD服务,因此必须完成SSHD服务配置并启动。

启动设备端例程

  1. 解压获取的SDK压缩包,在C Link SDK中的Demo文件LinkSDK./demos/remote_access_basic_demo.c中完成以下配置并保存。设备端C Link SDK开发更多内容,请参见C Link SDK概述

    • 将设备证书信息替换为已获取的测试设备的证书信息。

    • 将设备接入的mqtt_host值替换为当前设备所属企业版实例的MQTT接入地址。

    • 在服务列表中增加CUSTOM_SSH服务的配置,原_SSH服务不可删除。

    配置信息如下图所示。

    设备SDK
  2. 登录Linux虚拟机,将上一步骤中已修改完成的LinkSDK文件,上传至Linux虚拟机的开发环境。

  3. 在SDK根目录/LinkSDK下,执行make命令,完成样例程序的编译,然后运行样例文件。

    ./output/remote-access-basic-demo
  4. 查看运行日志,显示如下信息,表示设备正常在线且安全隧道SDK正常启动。启动成功

  5. 登录物联网平台控制台,进入企业版实例页面,在左侧导航栏选择设备管理 > 设备,找到目标设备,确认设备状态为在线设备在线

创建安全隧道

按照以下操作,在物联网平台控制台添加目标设备的安全隧道。您也可调用物联网平台云端API CreateDeviceTunnel创建安全隧道,使用说明,请参见云端SDK

  1. 登录物联网平台控制台

  2. 实例概览页面,单击目标企业版实例,进入实例详情页面。

  3. 在左侧导航栏选择监控运维>安全隧道

  4. 安全隧道页面,单击创建安全隧道

  5. 在创建隧道对话框,设置以下参数,单击确认安全隧道

  6. 在弹出的对话框中,单击一键复制,保存安全隧道ID、访问端Token和URL信息。安全隧道信息

    安全隧道创建成功后,设备端会收到建连通知,安全隧道的SDK会使用该建连通知中的信息与物联网平台建立WebSocket连接。消息如下:设备连接安全隧道

    物联网平台控制台的监控运维>安全隧道页面,显示安全隧道已打开,设备端已连接设备连接成功

访问端代理服务开发(Java)

准备工作

  • 下载访问端代理服务的示例代码。详细内容,请参见alibabacloud-iot-java-demo

  • 准备开发环境。本文使用Java开发环境,具体如下:

启动访问端代理例程

  1. 解压已下载的示例代码包。

  2. 打开IntelliJ IDEA,导入解压后的示例工程。

  3. 在com.aliyun.iotx.lp.demo.secure.tunnel.source.proxy下SourceProxyStarter.java文件中,配置已保存的安全隧道ID、访问端Token和URL值。

    在访问端代理的SourceProxyStarter类中,默认配置的ServiceType为CUSTOM_SSH,对应本地代理默认的端口为6422。本示例使用默认配置,实际业务场景中,您也可根据需要在SourceProxyStarter类中进行修改。代理程序

  4. 运行SourceProxyStarter.java示例代码,启动访问端代理的主程序后,该程序会使用配置的访问端建连信息与物联网平台建立WebSocket连接,并等待服务访问端的建连请求。运行日志如下图。代理程序启动

访问端代理服务开发(Go)

准备工作

  • 下载访问端代理服务的示例代码。详细内容,请参见alibabacloud-iot-go-demo

  • 安装Go开发环境。请访问Go官网获取。

    说明

    Go语言示例代码的编译运行还需要软件GCC,请在本地系统安装GCC

启动访问端代理例程

  1. 解压已下载的示例代码包。

  2. 使用已安装的语言开发环境编译运行\src\aliyun.com\iot\securetunnel\main.go文件,启动代理程序。

  3. 启动代理程序成功后,在弹出的代理软件窗口,输入一键复制保存的设备安全隧道信息。

    在代理软件中,默认配置的ServiceType为CUSTOM_SSH,对应LocalProxyPort默认为6421。本示例使用ServiceType默认配置,LocalProxyPort修改为6422,实际业务场景中,您也可根据需要进行修改。

    ServiceType需要确保在设备端SDK侧已经配置,LocalProxyPort需要为本地未被使用的端口。代理软件

  4. 在代理软件界面单击start,启动访问端代理的主程序后,该程序会使用配置的访问端建连信息与物联网平台建立WebSocket连接,并等待服务访问端的建连请求。运行日志如下图。

    代理端运行连接
说明

您可依赖Go语言的打包能力,生成您所用操作系统的可运行程序,方便后续使用或分发给其他用户使用。

通过本地代理远程访问设备

访问端代理程序启动成功后,可通过以下方式,实现设备的远程访问。

以Windows 10 64位系统下SSH至Linux系统设备为例:打开本地CMD命令窗口,输入ssh root@localhost -p 6422命令,按回车键,即可登录设备。截图如下:

  • CMD窗口登录:

    登录
  • 服务端的建连请求日志:

    • Java

      服务端
    • Go

      Go请求连接
  • 设备端响应日志:

    设备端