部分物聯網設備基于安全的考慮或因部署于私有網絡內部,是無法在外網直接訪問設備上的服務的。物聯網平臺提供設備安全隧道產品功能,助您建立雙向安全的通信鏈路,您可基于該通信鏈路實現對設備的遠程訪問、遠程診斷和管理等功能。
背景信息
通過物聯網平臺的安全隧道功能,您可基于訪問端代理對設備本地服務進行遠程訪問。例如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" }
定制SDK時,在SDK定制頁面的高級能力區域,選中遠程登錄,集成包含安全隧道功能的設備端SDK。
本文示例使用Linux系統開發環境,需在端口號22啟動SSH服務進程SSHD。
重要本示例中訪問端遠程訪問設備進行數據通信需依賴SSHD服務,因此必須完成SSHD服務配置并啟動。
啟動設備端例程
解壓獲取的SDK壓縮包,在C Link SDK中的Demo文件
LinkSDK./demos/remote_access_basic_demo.c
中完成以下配置并保存。設備端C Link SDK開發更多內容,請參見C Link SDK概述。將設備證書信息替換為已獲取的測試設備的證書信息。
將設備接入的mqtt_host值替換為當前設備所屬企業版實例的MQTT接入地址。
在服務列表中增加CUSTOM_SSH服務的配置,原_SSH服務不可刪除。
配置信息如下圖所示。
登錄Linux虛擬機,將上一步驟中已修改完成的LinkSDK文件,上傳至Linux虛擬機的開發環境。
在SDK根目錄/LinkSDK下,執行
make
命令,完成樣例程序的編譯,然后運行樣例文件。./output/remote-access-basic-demo
查看運行日志,顯示如下信息,表示設備正常在線且安全隧道SDK正常啟動。
登錄物聯網平臺控制臺,進入企業版實例頁面,在左側導航欄選擇設備管理 > 設備,找到目標設備,確認設備狀態為在線。
創建安全隧道
按照以下操作,在物聯網平臺控制臺添加目標設備的安全隧道。您也可調用物聯網平臺云端API CreateDeviceTunnel創建安全隧道,使用說明,請參見云端SDK。
登錄物聯網平臺控制臺。
在實例概覽頁面,單擊目標企業版實例,進入實例詳情頁面。
在左側導航欄選擇監控運維>安全隧道。
在安全隧道頁面,單擊創建安全隧道。
在創建隧道對話框,設置以下參數,單擊確認。
在彈出的對話框中,單擊一鍵復制,保存安全隧道ID、訪問端Token和URL信息。
安全隧道創建成功后,設備端會收到建連通知,安全隧道的SDK會使用該建連通知中的信息與物聯網平臺建立WebSocket連接。消息如下:
物聯網平臺控制臺的監控運維>安全隧道頁面,顯示安全隧道已打開,設備端已連接。
訪問端代理服務開發(Java)
準備工作
下載訪問端代理服務的示例代碼。詳細內容,請參見alibabacloud-iot-java-demo。
準備開發環境。本文使用Java開發環境,具體如下:
操作系統:Windows 10 64位
JDK版本:JDK8(支持更高版本)
集成開發環境:IntelliJ IDEA社區版
啟動訪問端代理例程
解壓已下載的示例代碼包。
打開IntelliJ IDEA,導入解壓后的示例工程。
在com.aliyun.iotx.lp.demo.secure.tunnel.source.proxy下SourceProxyStarter.java文件中,配置已保存的安全隧道ID、訪問端Token和URL值。
在訪問端代理的SourceProxyStarter類中,默認配置的ServiceType為CUSTOM_SSH,對應本地代理默認的端口為6422。本示例使用默認配置,實際業務場景中,您也可根據需要在SourceProxyStarter類中進行修改。
運行SourceProxyStarter.java示例代碼,啟動訪問端代理的主程序后,該程序會使用配置的訪問端建連信息與物聯網平臺建立WebSocket連接,并等待服務訪問端的建連請求。運行日志如下圖。
訪問端代理服務開發(Go)
準備工作
下載訪問端代理服務的示例代碼。詳細內容,請參見alibabacloud-iot-go-demo。
安裝Go開發環境。請訪問Go官網獲取。
說明Go語言示例代碼的編譯運行還需要軟件GCC,請在本地系統安裝GCC。
啟動訪問端代理例程
解壓已下載的示例代碼包。
使用已安裝的語言開發環境編譯運行\src\aliyun.com\iot\securetunnel\main.go文件,啟動代理程序。
啟動代理程序成功后,在彈出的代理軟件窗口,輸入一鍵復制保存的設備安全隧道信息。
在代理軟件中,默認配置的ServiceType為CUSTOM_SSH,對應LocalProxyPort默認為6421。本示例使用ServiceType默認配置,LocalProxyPort修改為6422,實際業務場景中,您也可根據需要進行修改。
ServiceType需要確保在設備端SDK側已經配置,LocalProxyPort需要為本地未被使用的端口。
在代理軟件界面單擊start,啟動訪問端代理的主程序后,該程序會使用配置的訪問端建連信息與物聯網平臺建立WebSocket連接,并等待服務訪問端的建連請求。運行日志如下圖。
您可依賴Go語言的打包能力,生成您所用操作系統的可運行程序,方便后續使用或分發給其他用戶使用。
通過本地代理遠程訪問設備
訪問端代理程序啟動成功后,可通過以下方式,實現設備的遠程訪問。
以Windows 10 64位系統下SSH至Linux系統設備為例:打開本地CMD命令窗口,輸入ssh root@localhost -p 6422
命令,按回車鍵,即可登錄設備。截圖如下:
CMD窗口登錄:
服務端的建連請求日志:
Java
Go
設備端響應日志: