透過連接埠 80 遠端監控和管理基於 Linux/OpenWrt/Lede 的裝置(續)

這是文章的最後部分,這裡是開始部分 habr.com/en/post/445568
上次我寫瞭如何實現設備監控,現在我們來談談管理。 在與客戶方面的“技術人員”討論時,我經常遇到對這種小型設備(內存資源和性能較低)的功能認知有限的情況,許多人認為“我們最需要的是發送重啟,以獲取更多資訊」認真的我們會派一個團隊」。
但實踐表明這並不完全正確。 以下是常見典型任務的一小部分:

  1. 網路診斷和故障排除。 在路由器的乙太網路連接埠後面通常還有另一個具有自己的內部 IP 位址的硬體。 有時,您可以(應該)“ping”它。 或隧道管理 - 如果隧道在透過 3G 數據機運行的路由器上突然不出現,但我們可以看到路由器本身。
  2. 系統維​​護。 韌體更新、服務腳本升級。
  3. 平衡技術。 這可以被稱為“反常”,但我引用“平衡主義者”的概念, “馬戲表演者在不穩定的身體姿勢下保持平衡的能力” - 更適合。 出現這種情況是由於客戶的預算有限。 下面我舉了幾個例子,但是...... 和故事主題沒有直接關係,我放在筆記裡

無線網路監控這是過去五年的一個流行話題,主要是在聯邦零售連鎖店。 你悠閒地漫步在交易大廳,你的手機打開Wi-Fi,試圖「黏」在網路的某個線程上,定期發出Probe Request資料包,透過分析這些資料包可以計算出你:你多久來一次這家店,出於什麼原因?你走過的軌跡等等。 然後收集、分析數據,繪製熱圖,經理們從管理層或投資者那裡「勒索」金錢以獲得這些圖片。 好吧,現在......“沒有錢,但你堅持......”,結果(真實的)已經需要顯示,好聽的老歌開始:“是的,是的,然後我們當然將安裝cis 和您想要的一切,但現在我們需要向客戶展示結果! 順便說一句,我們忘了說,客戶允許我們透過 Wi-Fi 將我們的設備連接到他的熱點,但一般而言,就像我們是訪客客戶一樣。” 所以我們必須做平衡路由器——拉起幾個WiFi子接口,其中一個緊貼熱點,第二個監控環境,瘋狂地將tcpdump結果上傳給自己,然後將文件內容打包成存檔並風險死於“暴飲暴食」的人試圖將內容吐出到FTP 伺服器上。 平衡路由器經常「崩潰」並且必須以某種方式遠端「復甦」也就不足為奇了。

半徑用客戶的這樣的陳述來描述這裡的情況比較容易: 「我們想要一個去中心化的熱點網絡,該網絡可以在通過渠道提前未知型號的設備上運行,但我們還不知道哪些設備。 哦,我們忘了說,我們不僅要向客戶展示廣告,還要分析熱點安裝位置周圍的一切。 不,我們還不知道為什麼,但我們會弄清楚的,別懷疑,我們能夠想出這個主意。”

我們不能忘記,由於許多以前未知的情況,控制必須在非標準條件下進行,即我們無法透過 IP: 連接埠直接連接到路由器,而被迫簡單地等待其活動。 如果我們抽像一下,伺服器和路由器之間的對話可以這樣表示:

  • 路由器: 你好。 我是某某路由器,有什麼任務給我嗎?
  • 服務器:路由器某某,我註冊了你,表示你還活著。 挑戰如下:向我顯示 ifconfig 指令的結果?
  • 路由器: 你好。 我是某某路由器,上次你要求顯示ifconfig的結果,這裡就是。 有什麼任務給我嗎?
  • 服務器:路由器某某,我註冊了你,表示你還活著。 沒有適合您的任務。

最有趣的問題是:遠端路由器如何傳送一定程度的訊息? 在上一部分中,我描述了由於資源有限,路由器只有一個「精簡版」wget,它只能透過 GET 工作,沒有其他功能;沒有 FTP 用戶端或curl。 更準確地說,無論影像組裝的特徵如何,我們都需要一種通用的方法。 我決定使用 wget。 更準確地說,我是如何「停下來」的——我別無選擇:)

只是免責聲明我的管理解決方案是有效的,不是很有限,而且我確信它是扭曲的,即使它適合我的大多數客戶。 您如何明智地做到這一點 - 編寫一個透過連接埠 80 發送 POST 二進位資料的小型實用程式。 將其(實用程式)包含在路由器韌體中並使用 bash 存取它。 但現實是:a)我們需要快速 b)我們可能需要在現有的“路由器動物園”上做所有事情 c)“不要造成傷害!” — 如果路由器正在運作並執行其他任務,請嘗試進行不會影響現有功能的變更。

讓我們繼續實施。 假設您的客戶希望透過「點擊滑鼠」輕鬆自然地從 zabbix 重新啟動路由器。 今天我們將開始描述使用Zabbix的實作。
在「管理」->「腳本」選單中,新增一個新腳本。 我們稱為“Reboot”,輸入“php /usr/share/zabbix/reboot.php {HOST.HOST}”作為指令

透過連接埠 80 遠端監控和管理基於 Linux/OpenWrt/Lede 的裝置(續)

接下來:選單「監控」->「最新資料」->「右鍵點選所需的網路節點」。 這是添加腳本後菜單的樣子。

透過連接埠 80 遠端監控和管理基於 Linux/OpenWrt/Lede 的裝置(續)
因此,我們將reboot.php腳本放在/usr/share/zabbix目錄中(你的可能不同,我使用zabbixa根目錄)。

安全免責聲明為了讓腳本中的解釋更清楚,我只使用路由器ID,但不使用密碼。 不建議在生產版本中這樣做! 我為什麼要這樣做:因為最大的問題是在哪裡儲存路由器的密碼? 在 zabbixe 本身的“庫存數據”中? 有爭議的做法。 或者:限制對reboot.php 檔案本身的外部訪問

檔案reboot.php

<?php
	// присваиваем параметры с консоли переменным
	$user = $argv[1];
	// ВНИМАНИЕ. Вот здесь в целях безопасности все-таки прописывать пароль устройства! Но для демонстрации мы будем обращаться к базе данных без использования пароля. 
	//$password = $argv[2];
		
	$conn=new mysqli("localhost","db_user","db_password","db_name");
	if (mysqli_connect_errno()) {
		exit();
	}
	$conn->set_charset("utf8");
			
	// "Отправляем" команду reboot за счет изменения поля task таблицы users. В поле task можно отправлять любую команду.
	$sql_users=$conn->prepare("UPDATE users SET task='reboot' WHERE id=? AND status='active';");
	$sql_users->bind_param('s', $user);
	$sql_users->execute();
	$sql_users->close();
?>

就這樣。 問題仍然懸而未決:“如何獲取從設備執行命令的結果。” 讓我們以使用 ifconfig 指令為例來看看該任務。 該命令可以發送到設備:

message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt

,其中:
訊息=`ifconfig` — 我們將 ifconfig 指令輸出的結果指派給 $message 變數
得到“xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — 我們的 a.php 腳本,用於註冊路由器並從它們接收訊息
u=用戶&p=密碼!&m=$訊息 — 憑證與請求變數的值 m — 指派 $message 變數的內容
-O /tmp/out.txt - 在這種情況下我們不需要輸出到檔案/tmp/out.txt,但是如果不指定該參數,wget將不起作用

為什麼這不起作用?因為這是一個潛在的安全漏洞。 例如,可能發生的最無害的錯誤是命令輸出中存在“&”字元。 因此,有必要過濾從路由器發送的所有內容以及到達伺服器的所有內容。 是的,我真的很羞恥。 在我的辯護中,我只能寫整篇文章致力於如何管理具有預定義韌體和未提前定義的通訊通道的路由器。

好吧,未來的開始:我還沒有弄清楚如何使用標準 zabbix 工具來反映到達伺服器的結果(例如,執行命令的結果)。

我提醒您,所有原始程式碼都可以從 Git 儲存庫取得: github.com/BazDen/iotnet.online.git

來源: www.habr.com

添加評論