Daljinski nadzor i upravljanje Lunix/OpenWrt/Lede baziranim uređajima preko porta 80…

Pozdrav svima, ovo je moje prvo iskustvo na Habréu. Želim pisati o tome kako upravljati mrežnom opremom na vanjskoj mreži na nestandardan način. Što znači nestandardno: u većini slučajeva za upravljanje opremom na vanjskoj mreži trebate:

  • Javna IP adresa. Pa, ili ako je oprema iza nečijeg NAT-a, onda javni IP i "proslijeđeni" port.
  • Tunel (PPTP/OpenVPN/L2TP+IPSec itd.) do središnjeg čvora preko kojeg bi se moglo pristupiti.

Stoga će vam trebati "moj bicikl" kada vam standardne metode ne odgovaraju, na primjer:

  1. Oprema se nalazi iza NAT-a i, osim uobičajenog http-a (port 80), sve je zatvoreno. To je sasvim normalna situacija za velike federalne korporativne mreže. Mogu registrirati portove, ali ne odmah, ne brzo i ne za vas.
  2. Nestabilan i/ili "uzak" komunikacijski kanal. Mala brzina, stalni gubici. Bol i frustracija pri pokušaju organiziranja tunela.
  3. Skup komunikacijski kanal, gdje se doslovno svaki megabajt računa. Na primjer, satelitske komunikacije. Plus duga kašnjenja i "uzak" pojas.
  4. Situacija kada treba “žonglirati” velikim brojem malih rutera, na kojima je s jedne strane instaliran OpenWrt/Lede za proširenje mogućnosti, a s druge strane resursi (memorija) rutera nisu dovoljni. za sve.

Zabilježite broj puta Što vas sprječava da instalirate flash pogon u USB priključak usmjerivača i proširite memoriju usmjerivača?

Najčešće se zahtjevi odnose na cijenu rješenja u cjelini, ali ponekad faktor oblika također igra ključnu ulogu. Na primjer, na mjestu je TP-Link ML3020, njegov jedini USB priključak služi za 2G/3G modem, sve je to umotano u nekakvu malu plastičnu kutiju i postavljeno negdje visoko, visoko (na jarbol), daleko, daleko (u polju, 30 km od najbliže bazne stanice mobilnog operatera). Da, možete priključiti USB čvorište i proširiti broj priključaka, ali iskustvo pokazuje da je to glomazno i ​​nepouzdano.

Dakle, pokušao sam vam opisati svoju tipičnu situaciju: “negdje daleko, daleko, postoji vrlo važan, usamljen i mali router koji pokreće Linux. Važno je barem jednom dnevno znati da je "živ" i, ako je potrebno, šalju mu se naredbe, na primjer, "dušo, ponovno pokreni!"

Prijeđimo na implementaciju:

1) Na strani usmjerivača, putem crona, svakih 5/10/1440 minuta, ili kad god želite, trebate poslati http zahtjev poslužitelju koristeći wget, spremiti rezultat zahtjeva u datoteku, učiniti datoteku izvršnom , i izvršite ga.

Moja cron linija izgleda otprilike ovako:

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

, gdje:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai je domena mog poslužitelja. Odmah da napomenem: da, možete odrediti konkretnu IP adresu poslužitelja, to smo radili dok naša država, u pravedničkom nagonu borbe, reći ću, ne znam, nije blokirala pristup lavljoj udio "oblaka" DigitalOcean i Amazon. Ako koristite simboličku domenu, ako se dogodi takav incident, možete jednostavno podići backup oblak, preusmjeriti domenu na njega i vratiti nadzor uređaja.

a.php je naziv skripte na strani poslužitelja. Da, znam da nije u redu imenovati varijable i datoteke istim slovom... Predlažem da na ovaj način uštedimo par bajtova pri slanju zahtjeva :)
u - korisničko ime, prijava na hardver
p - lozinka
“-O /tmp/wa.sh” je datoteka na udaljenom usmjerivaču gdje će se spremiti odgovor poslužitelja, na primjer naredba za ponovno pokretanje.

Napomena broj dva: Ahhh, zašto koristimo wget, a ne curl, jer putem curla možete slati https zahtjeve ne s GET-om, već s POST-om? Ahhh jer, kao u starom vicu "NE se penje u teglu!" curl uključuje biblioteke za enkripciju veličine oko 2 MB i zbog toga je malo vjerojatno da ćete moći sastaviti sliku za mali TP-LINK ML3020, na primjer. A s wgetom - molim.

2) Na strani poslužitelja (imam Ubuntu) koristit ćemo Zabbix. Zašto: Želim da bude lijepo (s grafikonima) i zgodno (šalji naredbe putem kontekstnog izbornika). Zabbix ima tako divnu stvar kao što je zabbix agent. Preko agenta ćemo na serveru pozvati PHP skriptu koja će nam vratiti informaciju da li se naš ruter registrirao u traženom vremenskom periodu. Za pohranjivanje informacija o vremenu registracije, naredbama za uređaje, koristim MySQL, zasebnu tablicu korisnici s približno sljedećim poljima:

		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;

Svi izvori mogu se preuzeti iz Git repozitorija na: https://github.com/BazDen/iotnet.online.git
Sada su PHP skripte smještene na strani poslužitelja (radi praktičnosti, mogu se smjestiti u mapu /usr/share/zabbix/):

a.php datoteka:

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

Datoteka Agent.php (ovo je skripta zabbix agenta pod nazivom):

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

Pa, posljednja faza: registracija agenta i dodavanje rasporeda.

Ako još niste instalirali zabbix agenta, tada:

apt-get install zabbix-agent

Uredite datoteku /etc/zabbix/zabbix_agentd.conf.

Dodajte redak:

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

, gdje:
test je ime našeg agenta
“php /usr/share/zabbix/agent.php korisnička lozinka” - pozvana skripta koja označava podatke o registraciji uređaja.

Dodavanje grafikona: otvorite zabbix web sučelje, odaberite iz izbornika:
Postavke -> Mrežni čvorovi -> Stvori mrežni čvor. Ovdje je dovoljno navesti naziv mrežnog hosta, njegovu grupu i zadano sučelje agenta:

Daljinski nadzor i upravljanje Lunix/OpenWrt/Lede baziranim uređajima preko porta 80…

Sada moramo dodati podatkovni element za ovaj mrežni čvor. Obratite pažnju na dva polja: “ključ” - to je upravo onaj parametar koji smo napisali u datoteci /etc/zabbix/zabbix_agentd.conf (u našem slučaju to je test), i “interval ažuriranja” - postavio sam ga na 5 minuta , jer se i oprema registrira na poslužitelju svakih pet minuta.

Daljinski nadzor i upravljanje Lunix/OpenWrt/Lede baziranim uređajima preko porta 80…

Pa, dodajmo graf. Preporučujem odabir "Ispuni" kao stil prikazivanja.

Daljinski nadzor i upravljanje Lunix/OpenWrt/Lede baziranim uređajima preko porta 80…

Rezultat je nešto vrlo lakonski, na primjer ovako:

Daljinski nadzor i upravljanje Lunix/OpenWrt/Lede baziranim uređajima preko porta 80…

Na razumno pitanje: "je li se isplatilo?", Odgovorit ću: pa, naravno, pogledajte "razloge za stvaranje bicikla" na početku članka.

Ako moje prvo grafomansko iskustvo pobudi zanimanje čitatelja, onda u sljedećim člancima želim opisati kako poslati naredbe udaljenoj opremi. Također smo uspjeli implementirati cijelu shemu za uređaje temeljene na RouterOS (Mikrotik).

Izvor: www.habr.com

Dodajte komentar