Pemantauan jarak jauh dan kontrol perangkat berbasis Lunix/OpenWrt/Lede melalui port 80…

Halo semuanya, ini adalah pengalaman pertama saya di Habré. Saya ingin menulis tentang cara mengelola peralatan jaringan di jaringan eksternal dengan cara yang tidak standar. Apa yang dimaksud dengan non-standar: dalam banyak kasus, untuk mengelola peralatan di jaringan eksternal, Anda memerlukan:

  • Alamat IP publik. Ya, atau jika peralatan berada di belakang NAT seseorang, maka IP publik dan port "diteruskan".
  • Terowongan (PPTP/OpenVPN/L2TP+IPSec, dll.) ke node pusat yang dapat diakses.

Oleh karena itu, Anda memerlukan “sepeda saya” jika metode standar tidak cocok untuk Anda, misalnya:

  1. Peralatan terletak di belakang NAT dan, kecuali http biasa (port 80), semuanya ditutup. Ini adalah situasi yang normal untuk jaringan perusahaan federal yang besar. Mereka dapat mendaftarkan port, tapi tidak segera, tidak cepat, dan tidak untuk Anda.
  2. Saluran komunikasi yang tidak stabil dan/atau “sempit”. Kecepatan rendah, kerugian konstan. Rasa sakit dan frustrasi ketika mencoba mengatur terowongan.
  3. Saluran komunikasi yang mahal, di mana setiap megabita berarti. Misalnya komunikasi satelit. Ditambah penundaan yang lama dan jalur yang “sempit”.
  4. Situasi ketika Anda perlu "menyulap" sejumlah besar router kecil, di mana, di satu sisi, OpenWrt/Lede diinstal untuk memperluas kemampuan, dan di sisi lain, sumber daya (memori) router tidak cukup untuk semuanya.

Catat nomor kali Apa yang menghalangi Anda memasang flash drive ke port USB router dan memperluas memori router?

Seringkali, persyaratannya adalah biaya solusi secara keseluruhan, namun terkadang faktor bentuk juga memainkan peran kunci. Misalnya ada TP-Link ML3020 di situsnya, port USB-nya hanya digunakan untuk modem 2G/3G, semua ini dibungkus dalam semacam wadah plastik kecil dan ditempatkan di suatu tempat yang tinggi, tinggi (di tiang), jauh, jauh sekali (di lapangan, 30 km dari base station operator seluler terdekat). Ya, Anda dapat menyambungkan hub USB dan menambah jumlah port, namun pengalaman menunjukkan bahwa ini rumit dan tidak dapat diandalkan.

Jadi, saya mencoba menjelaskan kepada Anda situasi khas saya: “di suatu tempat yang jauh, jauh sekali, ada router yang sangat penting, sepi dan kecil yang menjalankan Linux. Penting untuk mengetahui setidaknya sekali sehari bahwa dia "hidup" dan, jika perlu, perintah dikirimkan kepadanya, misalnya, "sayang, reboot!"

Mari kita lanjutkan ke implementasinya:

1) Di sisi router, melalui cron, setiap 5/10/1440 menit, atau kapan pun Anda mau, Anda perlu mengirim permintaan http ke server menggunakan wget, menyimpan hasil permintaan ke file, membuat file dapat dieksekusi , dan jalankan.

Baris cron saya terlihat seperti ini:

Berkas /etc/crontab/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

, di mana:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai adalah domain server saya. Izinkan saya segera mencatat: ya, Anda dapat menentukan alamat IP tertentu dari server, kami biasa melakukan ini sampai negara kami, dalam dorongan perjuangan yang benar, saya akan mengatakan, saya tidak tahu, memblokir akses ke singa bagian dari “awan” DigitalOcean dan Amazon. Jika Anda menggunakan domain simbolik, jika kejadian seperti itu terjadi, Anda dapat dengan mudah membuat cloud cadangan, mengalihkan domain ke sana, dan memulihkan pemantauan perangkat.

a.php adalah nama skrip sisi server. Ya, saya tahu bahwa memberi nama variabel dan nama file dengan huruf yang sama itu salah... Saya menyarankan agar dengan cara ini kita menghemat beberapa byte saat mengirim permintaan :)
u - nama pengguna, login perangkat keras
p - kata sandi
“-O /tmp/wa.sh” adalah file di router jarak jauh tempat respons server, misalnya perintah reboot, akan disimpan.

Catatan nomor dua: Ahhh kenapa kita menggunakan wget dan bukan curl, karena melalui curl Anda dapat mengirim permintaan https bukan dengan GET, tetapi dengan POST? Ahhh karena, seperti dalam lelucon lama “NE naik ke toples!” curl menyertakan perpustakaan enkripsi berukuran sekitar 2MB dan karena itu kecil kemungkinannya Anda dapat merakit gambar untuk TP-LINK ML3020 kecil, misalnya. Dan dengan wget - tolong.

2) Di sisi server (Saya punya Ubuntu) kita akan menggunakan Zabbix. Mengapa: Saya ingin tampilannya indah (dengan grafik) dan nyaman (mengirim perintah melalui menu konteks). Zabbix memiliki hal yang luar biasa seperti agen zabbix. Melalui agen, kami akan memanggil skrip PHP di server, yang akan mengembalikan informasi apakah router kami terdaftar selama jangka waktu yang diperlukan. Untuk menyimpan informasi tentang waktu pendaftaran, perintah untuk perangkat, saya menggunakan MySQL, tabel pengguna terpisah dengan kira-kira bidang berikut:

		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;

Semua sumber dapat diunduh dari repositori Git di: https://github.com/BazDen/iotnet.online.git
Sekarang skrip PHP ditempatkan di sisi server (untuk kenyamanan, skrip tersebut dapat ditempatkan di folder /usr/share/zabbix/):

file 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("Y-m-d 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();
	?>

File Agent.php (inilah skrip agen zabbix yang disebut):

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

Nah, tahap terakhir: mendaftar agen dan menambah jadwal.

Jika Anda belum menginstal agen zabbix, maka:

apt-get install zabbix-agent

Edit file /etc/zabbix/zabbix_agentd.conf.

Tambahkan baris:

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

, di mana:
tes adalah nama agen kami
“kata sandi pengguna php /usr/share/zabbix/agent.php” - skrip yang dipanggil yang menunjukkan data pendaftaran perangkat.

Menambahkan grafik: buka antarmuka web zabbix, pilih dari menu:
Pengaturan -> Node jaringan -> Buat node jaringan. Di sini cukup menentukan nama host jaringan, grupnya, dan antarmuka agen default:

Pemantauan jarak jauh dan kontrol perangkat berbasis Lunix/OpenWrt/Lede melalui port 80…

Sekarang kita perlu menambahkan elemen data untuk node jaringan ini. Perhatikan dua bidang: "kunci" - ini adalah parameter yang kami tulis di file /etc/zabbix/zabbix_agentd.conf (dalam kasus kami ini adalah pengujian), dan "perbarui interval" - saya setel ke 5 menit , karena dan peralatan juga didaftarkan di server setiap lima menit sekali.

Pemantauan jarak jauh dan kontrol perangkat berbasis Lunix/OpenWrt/Lede melalui port 80…

Baiklah, mari tambahkan grafik. Saya sarankan memilih “Isi” sebagai gaya rendering.

Pemantauan jarak jauh dan kontrol perangkat berbasis Lunix/OpenWrt/Lede melalui port 80…

Outputnya adalah sesuatu yang sangat singkat, misalnya seperti ini:

Pemantauan jarak jauh dan kontrol perangkat berbasis Lunix/OpenWrt/Lede melalui port 80…

Untuk pertanyaan yang masuk akal: “apakah itu layak?”, Saya akan menjawab: ya, tentu saja, lihat “alasan membuat sepeda” di awal artikel.

Jika pengalaman graphomaniac pertama saya menarik minat pembaca, maka pada artikel berikut saya ingin menjelaskan cara mengirim perintah ke peralatan jarak jauh. Kami juga berhasil mengimplementasikan seluruh skema untuk perangkat berbasis RouterOS (Mikrotik).

Sumber: www.habr.com

Tambah komentar