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

みなさん、こんにちは、これがHabréでの初めての経験です。 外部ネットワークで非標準のネットワーク機器を管理する方法について書きたいです。 非標準とはどういう意味ですか:ほとんどの場合、外部ネットワークの機器を制御するには、次のことが必要です。





したがって、次のような標準的な方法が適切でない場合は、「my bike」が必要になります。

  1. 機器はNATの背後にあり、通常のhttp(ポート80)を除き、すべてが閉じられています。 大規模な連邦企業ネットワークの場合、状況は非常に正常です。 ポートを登録します-すぐにではなく、すぐにではなく、あなたのためではありません。
  2. 不安定な、または「狭い」通信チャネル。 低速、一定の損失。 トンネルを整理しようとするときの痛みと欲求不満。
  3. 文字通りすべてのメガバイトがカウントされる高価な通信チャネル。 たとえば、衛星通信。 さらに、大きな遅延と「狭い」ストリップ。
  4. 多数の小さなルーターを「ジャグリング」する必要がある場合、一方では機能を拡張するためにOpenWrt / Ledeがインストールされ、もう一方ではルーターのリソース(メモリ)が十分ではありません。


回数メモ
そして、ルーターからのUSBスティックがインストールされ、ルーターのメモリが拡張されるのを防ぐものは何ですか?



ほとんどの場合、ソリューション全体のコストに対する要件が、フォームファクターも重要な役割を果たすことがあります。 たとえば、オブジェクトにはTP-Link ML3020が装備されており、その唯一のUSBポートは2G / 3Gモデムに使用され、これらはすべて小さなプラスチックケースのスレッドでラップされ、高さ、高さ(マスト上)、遠く、遠く(フィールド、携帯電話会社の最寄りの基地局から30 km)。 はい、USBハブを接続してポート数を増やすことができますが、経験上、面倒で信頼性に欠けることがわかっています。



だから、私はあなたに私の典型的な状況を説明しようとしました。 彼が「生きている」こと、そして必要に応じて「太陽、再起動!」などのコマンドが彼に送信されたことを少なくとも1日に1回知ることが重要です。



実装に移りましょう:



1)ルーター側では、5/10/1440分ごと、またはwgetを使用してサーバーにhttpリクエストを送信する必要があるときはいつでもcronし、リクエストの結果をファイルに保存し、ファイルを実行可能にし、実行します。



cronの私の行は次のようになります。



ファイル/ etc / crontabs / root:



*/5 * * * * wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password" -O /tmp/wa.sh && chmod 777 /tmp/wa.sh && /tmp/wa.sh
      
      





ここで:

xn-80abgfbdwanb2akugdrd3a2e5gsbj.xn-p1ai-私のサーバーのドメイン。 私はすぐに注意します。はい、特定のサーバーIPアドレスを指定することもできます。以前にこれを行いました。 シンボリックドメインを使用する場合、このようなインシデントが発生すると、落ち着いてバックアップクラウドを上げ、ドメインをリダイレクトして、デバイスモニタリングを復元できます。



a.php-サーバー側のスクリプトの名前。 はい、変数とファイル名に1文字で名前を付けるのは間違っていることを知っています...リクエストを送信するときに数バイトを節約することをお勧めします:)

u-ユーザー名、ハードウェアログイン

p-パスワード

「-O /tmp/wa.sh」は、リブートコマンドなど、サーバーの応答が保存されるリモートルーター上のファイルです。



注2:
Ahhh、なぜcurlではなくwgetを使用するのですか?curlを使用すると、GETではなくHTTPSリクエストを送信できますが、POSTを使用できるのはなぜですか? ああ、古いジョークのように「NEが小屋に忍び込む!」 Curlにはサイズが約2MBの暗号化ライブラリが含まれており、これにより、たとえば小さなTP-LINK ML3020のイメージを組み立てることができます。 そして、wgetでお願いします。



2)サーバー側(Ubuntuがあります)では、Zabbixを使用します。 理由:美しい(グラフ付き)で便利(コンテキストメニューからコマンドを送信)にしたい。 Zabbixには、zabbixエージェントのような素晴らしいものがあります。 エージェントを介して、サーバーでphpスクリプトを呼び出します。このスクリプトは、必要な期間にルーターが登録されたかどうかに関する情報を返します。 登録時間に関する情報、デバイスのコマンドを保存するには、MySQLを使用します。MySQLは、およそ次のフィールドを持つ個別のユーザーテーブルです。



  CREATE TABLE `users` ( `id` varchar(25) NOT NULL, `passwd` varchar(25) NOT NULL, `description` varchar(150) NOT NULL, `category` varchar(30) NOT NULL, `status` varchar(10) NOT NULL, `last_time` varchar(20) NOT NULL, //    `last_ip` varchar(20) NOT NULL, // IP   `last_port` int(11) NOT NULL, //    `task` text NOT NULL, //     `reg_task` varchar(150) NOT NULL, // "" ,          `last_task` text NOT NULL, //   `response` text NOT NULL, //     `seq` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      
      





すべてのソースは次のGitリポジトリから取得できます: https : //github.com/BazDen/iotnet.online.git

サーバー側でホストされるPHPスクリプト(便宜上、/ usr / share / zabbix /フォルダーに配置できます):



A.phpファイル:



 <?php //   :  ,       //   message ?    ,         $user=$_REQUEST['u']; $password=$_REQUEST['p']; $message=$_REQUEST['m']; //      (MySQL) $conn=new mysqli("localhost","db_login","db_password","DB_name"); if (mysqli_connect_errno()) { exit(); } $conn->set_charset("utf8"); //         $sql_users=$conn->prepare("SELECT task, reg_task, response, last_time FROM users WHERE id=? AND passwd=? AND status='active';"); $sql_users->bind_param('ss', $user, $password); $sql_users->bind_result($task, $reg_task, $response, $last_time); $sql_users->execute(); $sql_users->store_result(); if (($sql_users->num_rows)==1){ $sql_users->fetch(); //       echo $task; echo "\n"; echo $reg_task; //           $response_history="[".date("Ymd H:i")."] ".$message; //  ,    ,     ,  -   $last_ip=$_SERVER["REMOTE_ADDR"]; $last_port=$_SERVER["REMOTE_PORT"]; $ts_last_conn_time=$last_time; $sql_users=$conn->prepare("UPDATE users SET task='', seq=1 WHERE (id=?);"); $sql_users->bind_param('s', $user); $sql_users->execute(); if (strlen($message)>1){ $sql_users=$conn->prepare("UPDATE users SET response=?, seq=1 WHERE (id=?);"); $sql_users->bind_param('ss', $response_history, $user); $sql_users->execute(); } //      ,      .    $ts_now=time(); $sql_users=$conn->prepare("UPDATE users SET last_time=?, last_ip=?, last_port=? WHERE (id=?);"); $sql_users->bind_param('ssss', $ts_now, $last_ip, $last_port, $user); $sql_users->execute(); } //         ,    "",   ...    reboot.... //    ?     ,      " ". else { echo "reboot"; } $sql_users->close(); ?>
      
      





Agent.phpファイル(これは呼び出されたzabbixエージェントのスクリプトです):



 <?php //   Zabbix.      users   "1"        // user  password -    $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"); $sql_users=$conn->prepare("SELECT seq FROM users WHERE id=? AND passwd=? AND status='active';"); $sql_users->bind_param('ss', $user, $password); $sql_users->bind_result($seq); $sql_users->execute(); $sql_users->store_result(); //      seq.        "1" if (($sql_users->num_rows)==1){ $sql_users->fetch(); echo $seq; } //  $seq. $sql_users=$conn->prepare("UPDATE users SET seq=0 WHERE id=? AND passwd=? AND status='active';"); $sql_users->bind_param('ss', $user, $password); $sql_users->execute(); $sql_users->close(); ?>
      
      





最後の段階:エージェントの処方とスケジュールの追加。



zabbixエージェントをまだインストールしていない場合:



 apt-get install zabbix-agent
      
      





ファイル/etc/zabbix/zabbix_agentd.confを編集します。



次の行を追加します。



 UserParameter=test,php /usr/share/zabbix/agent.php user password
      
      





ここで:

testはエージェントの名前です

「Php /usr/share/zabbix/agent.phpユーザーパスワード」-デバイスの登録データを含む呼び出されたスクリプト。



グラフの追加:zabbixウェブインターフェースを開き、メニューから選択します:

設定->ホスト->ホストの作成。 ホスト名、そのグループ、デフォルトのエージェントインターフェイスを指定するだけで十分です。







次に、このホストのデータ要素を追加する必要があります。 2つのフィールドに注意してください。「キー」は、/ etc / zabbix / zabbix_agentd.confファイルで指定したパラメーター(この場合はテスト)と「更新間隔」です。また、機器は5分ごとにサーバーに登録されます。







さて、スケジュールを追加します。 描画スタイルとして「塗りつぶし」を選択することをお勧めします。







出力は、たとえば次のような非常に簡潔なものです。







「それは価値があったのか?」という合理的な質問に答えます。もちろん、もちろん、記事の冒頭にある「自転車を作る理由」を参照してください。



私の最初のグラフォマニアックな経験が読者の興味をそそるなら、次の記事でコマンドをリモート機器に送る方法を説明したいと思います。 RouterOS(Mikrotiks)に基づいたデバイスのスキーム全体を実装することもできました。



All Articles