ポート80を介したLinux / OpenWrt / Ledeベースのデバイスのリモート監視と管理、続き

これが記事の最後の部分であり、 ここから始まりです。



デバイスモニタリングの実装方法について前回書いたとき、今度は管理に焦点を当てます。 顧客側の「技術者」との議論では、そのような小さなデバイス(メモリリソースとパフォーマンスが低い)の機能についての限られた認識にしばしば遭遇します。 。



しかし、実践はこれが完全に真実ではないことを示しています。



一般的な一般的なタスクの短いリストを次に示します。



  1. ネットワークの診断とトラブルシューティング。 ルーターのイーサネットポートの背後では、通常、別のハードウェアが独自の内部IPアドレスで「存続」します。 場合によっては、「ping」が可能(必要)です。 またはトンネル管理-3Gモデムを介して動作しているルーターで突然ルーターが起動しない場合、ルーター自体が表示されます。
  2. システムサービス。 ファームウェアのアップグレード、サービススクリプトのアップグレード。
  3. バランスをとる行為。 これは「倒錯」と呼ぶこともできますが、 「身体の不安定な位置でバランスを維持するサーカスの芸術家の能力 」として引用する「バランサー」の概念がより適しています。 顧客の予算が限られているため、同様の状況が発生します。 以下にいくつかの例を示しますが、 それらは物語の主題とは直接関係がありません;私はそれらをメモに入れます


Wifiモニタリング
過去5年間の流行のトピックは、主に連邦の小売チェーンです。 トレーディングフロアをゆっくりと歩いていくと、Wi-Fiがオンになっている携帯電話がネットワークスレッドに「固執」しようとして定期的にプローブリクエストパケットを送信します。軌跡などを歩きます。 その後、データが収集、分析され、ヒートマップが作成され、そのような写真の管理者が経営者や投資家からお金を「ノックアウト」します。 その間....「お金はありませんが、あなたは…を保持します」、そして結果(本物)はすでに示されているはずです、古き良き歌が含まれています顧客に結果を見せてください! ちなみに、彼らはお客様がWi-Fiを介して当社の機器をホットスポットに接続することを許可したと言うのを忘れていましたが、一般的にはまるでゲストクライアントのようです。 そして今、ルーターバランサーを作成する必要があります-いくつかのWiFiサブインターフェイスが上昇し、その1つはホットスポットにしがみつき、2つ目は環境を監視し、tcpdumpの結果を必死にそれ自体にアンロードします。 ftpサーバーのコンテンツを吐き出そうとしています。 ルーターバランサーがしばしば「故障」し、どういうわけか遠隔的に蘇生しなければならないのは驚くことではありません。



半径
ここでは、次のようなお客様の声明で状況を説明する方が簡単です。 「チャネルを介してモデルが事前に知られていないが、まだ知られていない機器で動作するホットスポットの分散ネットワークが必要です。 ああ、彼らは顧客に広告を表示したいだけでなく、ホットスポットの設置場所周辺のすべてを分析したいと言ったのを忘れていました。 いいえ、まだ理由はわかりませんが、思い浮かぶことはありません。このアイデアを思いついたのです」



また、不確実な状況が非常に多いため、ip:ポートを介してルーターに直接接続できず、そこからのアクティビティを待機せざるを得ない場合、制御は非標準状態で実行する必要があることを忘れてはなりません。 無視すると、サーバーとルーター間のダイアログは次のように表現できます。





最も興味深い質問は、リモートルーターが特定の量の情報をどのように送信できるかということです。 最後の部分では、リソースが限られているため、ルーターにはGETを介してのみ機能する「削除された」wgetがあり、ftpクライアントもcurlもありません。 より正確には、画像アセンブリの機能に関係なく、普遍的な方法が必要です。 wgetを使用することに決めました。 より正確には、どのように「停止」したか-選択肢がなかっただけです:)



すぐに予約
私の管理ソリューションは機能していますが、非常に限られているため、ほとんどのお客様に適していても、曲がっていると確信しています。 どのように賢くそれを行うことができますか-80番目のポートを介してバイナリデータを送信する小さなユーティリティを作成します。 ルーターのファームウェアに(ユーティリティ)を含め、bashを使用してアクセスします。 しかし、現実は次のとおりです。a)迅速に行う必要があるb)多分、既存の「ルーター動物園」ですべてを行う必要があるc)「害を及ぼさない!」-ルーターが機能し、他のタスクを実行する場合は、既存の機能に影響を与える変更を試みます。



実装に移りましょう。 顧客がzabbixから「マウスのクリック」で簡単かつ自然にルーターを再起動したいとします。 今日は、zabbiksaで実装の説明を始めます。



[管理]メニューの[スクリプト]で、新しいスクリプトを追加します。 「php /usr/share/zabbix/reboot.php {HOST.HOST}」と書くコマンドとして「Reboot」と呼びます







さらに:メニュー「監視」->「最近のデータ」->「ネットワークノードを右クリック」 これは、スクリプトを追加した後のメニューの外観です。





したがって、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
      
      





ここで:

message = `ifconfig` -ifconfigコマンドの出力結果を$ message変数に割り当てます

wget " xn-80abgfbdwanb2akugdrd3a2e5gsbj.xn-p1ai / a.php-ルーターを登録し、ルーターからメッセージを受信するa.phpスクリプト

u =ユーザー&p =パスワード!&m = $ message-資格情報とリクエスト変数の値m-変数の内容を割り当てる$ message

-O /tmp/out.txt-この場合、/ tmp / out.txtファイルへの出力は必要ありませんが、このパラメーターを指定しないと、wgetは機能しません。



なぜ曲がって機能するのか
それは潜在的なセキュリティホールだからです。 発生する可能性のある最も無害な間違いは、たとえば、コマンドの出力に記号「&」が表示される場合です。 そのため、ルーターから送信されるすべてのものとサーバーに届くすべてのものをフィルタリングする必要があります。 ええ、本当に恥ずかしいです。 私の防御では、書くことしかできません-記事全体が、未定義のファームウェアを備えたルーターを事前に定義し、通信チャンネルを事前に定義する方法に専念していることです。



さて、私は未来に触れました:サーバーに来る標準的なzabbixの手段によって結果(たとえば、コマンドの結果)を反映する方法を理解していません。



すべてのソースはGitリポジトリから取得できることを思い出してください



All Articles