Ngawasi lan ngontrol piranti adhedhasar Lunix / OpenWrt / Lede liwat port 80…

Halo kabeh, iki pengalaman pertamaku ing Habré. Aku pengin nulis babagan carane ngatur peralatan jaringan ing jaringan eksternal kanthi cara sing ora standar. Apa tegese non-standar: ing umume kasus, kanggo ngatur peralatan ing jaringan eksternal sampeyan kudu:

  • Alamat IP umum. Ya, utawa yen peralatan ana ing mburi NAT wong, banjur IP umum lan port "diterusake".
  • Tunnel (PPTP/OpenVPN/L2TP+IPSec, etc.) menyang simpul tengah sing bisa diakses.

Mulane, sampeyan butuh "sepedaku" yen cara standar ora cocog karo sampeyan, contone:

  1. Peralatan dumunung konco NAT lan, kajaba http biasanipun (port 80), kabeh ditutup. Iki minangka kahanan normal kanggo jaringan perusahaan federal gedhe. Padha bisa ndhaftar bandar, nanging ora langsung, ora cepet, lan ora kanggo sampeyan.
  2. Saluran komunikasi sing ora stabil lan / utawa "sempit". kacepetan kurang, losses pancet. Nyeri lan frustasi nalika nyoba ngatur trowongan.
  3. Saluran komunikasi sing larang, ing ngendi saben megabyte diitung. Contone, komunikasi satelit. Plus telat dawa lan band "sempit".
  4. Kahanan nalika sampeyan kudu "juggle" nomer akeh router cilik, ing tangan siji, OpenWrt / Lede diinstal kanggo nggedhekake kapabilitas, lan ing tangan liyane, sumber daya (memori) saka router ora cukup. kanggo kabeh.

Cathetan nomer kaping Apa sing ngalangi sampeyan nginstal flash drive menyang port USB router lan nggedhekake memori router?

Paling asring, syarat kasebut kanggo biaya solusi kanthi sakabehe, nanging kadhangkala faktor wujud uga nduweni peran penting. Contone, ana TP-Link ML3020 ing situs kasebut, mung port USB sing digunakake kanggo modem 2G / 3G, kabeh iki dibungkus ing sawetara jinis plastik cilik lan diselehake ing endi wae sing dhuwur, dhuwur (ing mast). adoh, adoh (ing lapangan, 30 km saka stasiun pangkalan operator seluler paling cedhak). Ya, sampeyan bisa masang hub USB lan nggedhekake jumlah port, nanging pengalaman nuduhake manawa iki rumit lan ora bisa dipercaya.

Dadi, aku nyoba kanggo njlèntrèhaké kanggo sampeyan kahanan khas: "ing endi wae adoh, adoh, ana router penting banget, sepi lan cilik mlaku Linux. Penting kanggo ngerti paling sethithik sapisan dina yen dheweke "urip" lan, yen perlu, prentah dikirim menyang dheweke, contone, "mad, urip maneh!"

Ayo pindhah menyang implementasine:

1) Ing sisih router, liwat cron, saben menit 5/10/1440, utawa kapan wae sampeyan pengin, sampeyan kudu ngirim panjalukan http menyang server nggunakake wget, simpen asil panyuwunan menyang file, nggawe file bisa dieksekusi , lan nglakokaké.

Garis cronku katon kaya iki:

File /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

ngendi:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai minangka domain serverku. Ayo kula cathetan langsung: ya, sampeyan bisa nemtokake alamat IP tartamtu saka server, kita digunakake kanggo nindakake iki nganti negara kita, ing impuls mursid saka perjuangan, aku bakal ngomong, aku ora ngerti, akses diblokir menyang singa. nuduhake "awan" DigitalOcean lan Amazon. Yen sampeyan nggunakake domain simbolis, yen kedadeyan kasebut, sampeyan bisa kanthi gampang ngunggahake awan serep, ngarahake domain kasebut lan mulihake pemantauan piranti.

a.php iku jeneng saka script sisih server. Ya, aku ngerti manawa salah jeneng variabel lan jeneng file kanthi huruf sing padha ... Aku nyaranake supaya bisa nyimpen sawetara bita nalika ngirim panjaluk :)
u - jeneng pangguna, login hardware
p - sandi
"-O /tmp/wa.sh" iku file ing router remot ngendi respon server, contone printah urip maneh, bakal disimpen.

Cathetan nomer loro: Ahhh, kenapa kita nggunakake wget lan ora nggulung, amarga liwat curl sampeyan bisa ngirim panjalukan https ora nganggo GET, nanging nganggo POST? Ahhh amarga, kaya ing lelucon lawas "NE climbs menyang jar!" curl kalebu perpustakaan enkripsi ukurane kira-kira 2MB lan amarga iki ora mungkin sampeyan bisa ngumpulake gambar kanggo TP-LINK ML3020 cilik, umpamane. Lan karo wget - mangga.

2) Ing sisih server (Aku duwe Ubuntu) kita bakal nggunakake Zabbix. Apa: Aku pengin dadi ayu (karo grafik) lan trep (kirim printah liwat menu konteks). Zabbix nduweni barang sing apik banget kaya agen zabbix. Liwat agen kasebut, kita bakal nelpon skrip PHP ing server, sing bakal ngasilake informasi babagan apa router kita ndhaptar sajrone wektu sing dibutuhake. Kanggo nyimpen informasi babagan wektu registrasi, printah kanggo piranti, aku nggunakake MySQL, pangguna tabel sing kapisah kanthi kira-kira kolom ing ngisor iki:

		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;

Kabeh sumber bisa diundhuh saka gudang Git ing: https://github.com/BazDen/iotnet.online.git
Saiki skrip PHP diselehake ing sisih server (kanggo penak, bisa dilebokake ing 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 (iki skrip saka agen zabbix sing diarani):

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

Ya, tahap pungkasan: ndhaptar agen lan nambah jadwal.

Yen sampeyan durung nginstal agen zabbix, banjur:

apt-get install zabbix-agent

Sunting file /etc/zabbix/zabbix_agentd.conf.

Tambah baris:

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

ngendi:
test iku jeneng agen kita
"php /usr/share/zabbix/agent.php sandi pangguna" - script disebut nuduhake data registrasi piranti.

Nambahake grafik: bukak antarmuka web zabbix, pilih saka menu:
Setelan -> Jaringan simpul -> Gawe simpul jaringan. Ing kene cukup kanggo nemtokake jeneng host jaringan, klompok, lan antarmuka agen standar:

Ngawasi lan ngontrol piranti adhedhasar Lunix / OpenWrt / Lede liwat port 80…

Saiki kita kudu nambah unsur data kanggo simpul jaringan iki. Pay manungsa waé menyang rong kolom: "kunci" - iki persis parameter sing kita tulis ing file /etc/zabbix/zabbix_agentd.conf (ing kasus kita iku test), lan "interval nganyari" - Aku nyetel kanggo 5 menit , amarga lan peralatan uga kedhaftar ing server sapisan saben limang menit.

Ngawasi lan ngontrol piranti adhedhasar Lunix / OpenWrt / Lede liwat port 80…

Inggih, ayo nambah grafik. Aku nyaranake milih "Isi" minangka gaya rendering.

Ngawasi lan ngontrol piranti adhedhasar Lunix / OpenWrt / Lede liwat port 80…

Output iku banget laconic, contone kaya iki:

Ngawasi lan ngontrol piranti adhedhasar Lunix / OpenWrt / Lede liwat port 80…

Kanggo pitakonan sing cukup: "Apa worth iku?", Aku bakal mangsuli: uga, mesthi, ndeleng "alasan kanggo nggawe mancal" ing awal artikel.

Yen pengalaman graphomaniac pisanan saya narik minat para pamaca, banjur ing artikel ing ngisor iki aku pengin njlèntrèhaké cara ngirim printah menyang peralatan remot. Kita uga bisa ngetrapake kabeh skema kanggo piranti adhedhasar RouterOS (Mikrotik).

Source: www.habr.com

Add a comment