Pemantauan dan kawalan jauh peranti Linux/OpenWrt/Lede melalui port 80, diteruskan

Ini adalah bahagian akhir artikel, inilah permulaannya habr.com/ms/post/445568
Kali terakhir saya menulis tentang cara saya melaksanakan pemantauan peranti, sekarang kita akan bercakap tentang pengurusan. Dalam perbincangan dengan "juruteknik" di pihak Pelanggan, saya sering menghadapi persepsi terhad tentang keupayaan peranti kecil sedemikian (dengan sumber memori dan prestasi rendah), ramai yang percaya bahawa "yang paling kami perlukan ialah menghantar but semula, untuk sesuatu yang lebih serius kami akan hantar pasukan” .
Tetapi amalan menunjukkan bahawa ini tidak sepenuhnya benar. Berikut ialah senarai kecil tugas biasa biasa:

  1. Diagnostik rangkaian dan penyelesaian masalah. Di sebalik port ethernet penghala anda biasanya terdapat satu lagi perkakasan yang mempunyai alamat IP dalaman sendiri. Kadangkala, anda boleh (sepatutnya) "ping" itu. Atau pengurusan terowong - jika terowong tiba-tiba tidak naik pada penghala yang beroperasi melalui modem 3G, tetapi kita dapat melihat penghala itu sendiri.
  2. Penyelenggaraan sistem. Kemas kini perisian tegar, peningkatan skrip perkhidmatan.
  3. Perbuatan mengimbangi. Ini boleh dipanggil "penyelewengan", tetapi konsep "keseimbangan" seperti, saya petik, "keupayaan pemain sarkas mengekalkan keseimbangan dalam kedudukan badan yang tidak stabil" - lebih sesuai. Situasi sedemikian timbul disebabkan oleh bajet pelanggan yang terhad. Di bawah saya berikan beberapa contoh, tetapi... Mereka tidak berkaitan langsung dengan tema cerita, saya letakkan dalam nota

Pemantauan Wi-FiTopik yang bergaya selama lima tahun yang lalu, terutamanya dalam kalangan rangkaian runcit persekutuan. Anda berjalan-jalan santai di tingkat perdagangan, dan telefon mudah alih anda dengan Wi-Fi dihidupkan, dalam percubaan untuk "melekat" pada beberapa rangkaian rangkaian, menghantar paket Permintaan Siasatan secara kerap, yang boleh dianalisis untuk mengira anda: berapa kerap anda datang ke kedai ini, atas sebab apa? anda berjalan di sepanjang trajektori dan sebagainya. Kemudian data dikumpul, dianalisis, peta haba dilukis, dan pengurus "memeras" wang daripada pengurusan atau pelabur untuk gambar sedemikian. Nah, buat masa ini.... "tidak ada wang, tetapi anda bertahan ...", dan hasilnya (sebenar) sudah perlu ditunjukkan, lagu lama yang baik bermula: "Ya, ya, maka sudah tentu kita akan memasang cis dan semua yang anda mahukan, tetapi kini kami perlu menunjukkan hasilnya kepada Pelanggan! Ngomong-ngomong, kami terlupa untuk mengatakan bahawa Pelanggan membenarkan kami menyambungkan peralatan kami ke tempat liputannya melalui Wi-Fi, tetapi secara umum, seolah-olah kami adalah pelanggan tetamu.” Oleh itu, kita perlu membuat penghala pengimbang - beberapa subantara muka WiFi dinaikkan, salah satunya berpaut pada hotspot, dan yang kedua memantau persekitaran, memuat naik hasil tcpdump ke dalam dirinya sendiri, kemudian membungkus kandungan fail ke dalam arkib dan berisiko mati akibat "makan berlebihan" cuba meludahkan kandungan pada pelayan FTP. Tidak menghairankan bahawa penghala pengimbang sering "terputus" dan entah bagaimana harus "dihidupkan semula" dari jauh.

RadiusLebih mudah untuk menerangkan situasi di sini dengan sesuatu seperti pernyataan daripada pelanggan ini: "Kami mahukan rangkaian tempat liputan terdesentralisasi yang akan berfungsi pada peralatan yang modelnya tidak diketahui terlebih dahulu, melalui saluran, tetapi yang mana kami belum tahu. Oh, kami terlupa untuk mengatakan, kami bukan sahaja mahu memaparkan pengiklanan kepada pelanggan, tetapi juga menganalisis segala-galanya di sekitar lokasi tempat liputan dipasang. Tidak, kami tidak tahu mengapa lagi, tetapi kami akan memikirkannya, jangan ragu-ragu, kami dapat menghasilkan idea ini."

Dan kita tidak boleh lupa bahawa disebabkan oleh banyak keadaan yang tidak diketahui sebelum ini, kawalan mesti dijalankan dalam keadaan tidak standard, apabila kita tidak dapat menyambung ke penghala secara langsung melalui port IP: dan terpaksa hanya menunggu aktiviti daripadanya. Jika kita abstrak diri kita sendiri, dialog antara pelayan dan penghala boleh diwakili seperti ini:

  • Penghala: Hello. Saya ini dan ini penghala, adakah terdapat sebarang tugas untuk saya?
  • pelayan: penghala itu dan itu, saya mendaftarkan anda, bahawa anda masih hidup. Inilah cabarannya: tunjukkan saya hasil arahan ifconfig?
  • Penghala: Hello. Saya ini dan ini penghala, kali terakhir anda meminta untuk menunjukkan hasil ifconfig, ini dia. Adakah terdapat sebarang tugas untuk saya?
  • pelayan: penghala itu dan itu, saya mendaftarkan anda, bahawa anda masih hidup. Tiada tugas untuk anda.

Soalan yang paling menarik: bagaimana penghala jauh boleh menghantar sejumlah maklumat? Pada bahagian terakhir, saya menerangkan bahawa disebabkan oleh sumber yang terhad, penghala hanya mempunyai wget "dilucutkan", yang berfungsi hanya melalui GET dan tidak ada yang lain; tiada klien FTP atau curl. Lebih tepat lagi, kita memerlukan kaedah sejagat, tanpa mengira ciri pemasangan imej. Saya memutuskan menggunakan wget. Lebih tepat lagi, bagaimana saya "berhenti" - Saya tidak mempunyai pilihan :)

Sekadar penafianPenyelesaian pengurusan saya berfungsi, tidak terlalu terhad, dan saya pasti ia bengkok, walaupun ia sesuai dengan kebanyakan pelanggan saya. Bagaimanakah anda boleh melakukannya dengan bijak - tulis utiliti kecil yang menghantar data binari POST melalui port 80. Sertakan ia (utiliti) dalam perisian tegar penghala dan aksesnya menggunakan bash. Tetapi realitinya ialah: a) kita perlu cepat b) kita mungkin perlu melakukan segala-galanya pada "zoo penghala" sedia ada c) "jangan membahayakan!" — jika penghala berfungsi dan menjalankan tugas lain, cuba buat perubahan yang tidak akan menjejaskan fungsi sedia ada.

Mari kita beralih kepada pelaksanaan. Katakan pelanggan anda mahu but semula penghala daripada zabbix dengan mudah dan semula jadi, dengan “klik tetikus”. Hari ini kita akan mula menerangkan pelaksanaan dengan Zabbix.
Dalam menu “Pentadbiran” -> “Skrip”, tambahkan skrip baharu. Kami memanggilnya "But Semula", masukkan "php /usr/share/zabbix/reboot.php {HOST.HOST}" sebagai arahan

Pemantauan dan kawalan jauh peranti Linux/OpenWrt/Lede melalui port 80, diteruskan

Seterusnya: Menu "Pemantauan" -> "Data terkini" -> "Klik kanan pada nod rangkaian yang dikehendaki." Inilah rupa menu selepas menambah skrip.

Pemantauan dan kawalan jauh peranti Linux/OpenWrt/Lede melalui port 80, diteruskan
Sehubungan itu, kami meletakkan skrip reboot.php dalam direktori /usr/share/zabbix (milik anda mungkin berbeza, saya menggunakan direktori akar zabbixa).

Penafian KeselamatanUntuk membuat penjelasan lebih jelas dalam skrip, saya hanya menggunakan id penghala, tetapi tidak menggunakan kata laluan. Ia tidak disyorkan untuk melakukan ini dalam versi pengeluaran! Mengapa saya melakukan ini: kerana persoalan besar ialah di mana untuk menyimpan kata laluan untuk penghala? Dalam zabbixe sendiri dalam "data inventori"? Amalan kontroversi. Sebagai alternatif: hadkan akses luaran kepada fail reboot.php itu sendiri

Fail 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();
?>

Itu sahaja. Persoalannya tetap terbuka: "bagaimana untuk mendapatkan hasil pelaksanaan arahan dari peranti." Mari kita lihat tugas menggunakan arahan ifconfig sebagai contoh. Perintah ini boleh dihantar ke peranti:

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

, di mana:
mesej=`ifconfig` — kami memberikan hasil output arahan ifconfig kepada pembolehubah $message
wget"xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — skrip a.php kami yang mendaftarkan penghala dan menerima mesej daripadanya
u=pengguna&p=kata laluan!&m=$mesej — bukti kelayakan dan nilai pembolehubah permintaan m — memperuntukkan kandungan pembolehubah $mesej
-O /tmp/out.txt — kami tidak memerlukan output ke fail /tmp/out.txt dalam kes ini, tetapi jika parameter ini tidak ditentukan, wget tidak berfungsi

Mengapa ini tidak berfungsi?Kerana ia adalah lubang keselamatan yang berpotensi. Ralat paling tidak berbahaya yang boleh berlaku ialah jika, sebagai contoh, terdapat aksara "&" dalam output arahan anda. Oleh itu, adalah perlu untuk menapis kedua-dua semua yang dihantar dari penghala dan semua yang datang ke pelayan. Ya, saya benar-benar malu. Dalam pembelaan saya, saya hanya boleh menulis bahawa keseluruhan artikel ditumpukan kepada cara mengurus penghala dengan perisian tegar dan saluran komunikasi yang telah ditetapkan yang tidak ditentukan terlebih dahulu.

Baiklah, permulaan untuk masa depan: Saya masih belum mengetahui cara menggunakan alat zabbix standard untuk mencerminkan keputusan (contohnya, hasil daripada melaksanakan arahan) yang datang ke pelayan.

Saya mengingatkan anda bahawa semua sumber boleh diperolehi daripada repositori Git di: github.com/BazDen/iotnet.online.git

Sumber: www.habr.com

Tambah komen