Supervisió i control remots de dispositius basats en Lunix/OpenWrt/Lede mitjançant el port 80...

Hola a tots, aquesta és la meva primera experiència a Habré. Vull escriure sobre com gestionar equips de xarxa en una xarxa externa d'una manera no estàndard. Què vol dir no estàndard: en la majoria dels casos, per gestionar equips en una xarxa externa necessiteu:

  • Adreça IP pública. Bé, o si l'equip està darrere del NAT d'algú, llavors una IP pública i un port "reenviat".
  • Túnel (PPTP/OpenVPN/L2TP+IPSec, etc.) al node central a través del qual seria accessible.

Per tant, necessitareu "la meva bicicleta" quan els mètodes estàndard no us convinguin, per exemple:

  1. L'equip es troba darrere de NAT i, excepte l'habitual http (port 80), està tot tancat. Aquesta és una situació completament normal per a les grans xarxes corporatives federals. Poden registrar ports, però no immediatament, no ràpidament i no per a tu.
  2. Canal de comunicació inestable i/o “estret”. Baixa velocitat, pèrdues constants. Dolor i frustració en intentar organitzar un túnel.
  3. Un canal de comunicació car, on literalment cada megabyte compta. Per exemple, comunicacions per satèl·lit. A més de retards llargs i una banda "estreta".
  4. Una situació en què cal fer malabars amb un gran nombre d'encaminadors petits, en els quals, d'una banda, s'instal·la OpenWrt/Lede per ampliar les capacitats i, d'altra banda, els recursos (memòria) de l'encaminador no són suficients. per tot.

Anoteu el nombre de vegades Què us impedeix instal·lar una unitat flaix al port USB de l'encaminador i ampliar la memòria de l'encaminador?

Molt sovint, els requisits són pel cost de la solució en conjunt, però de vegades el factor de forma també juga un paper clau. Per exemple, hi ha un TP-Link ML3020 al lloc, el seu únic port USB s'utilitza per a un mòdem 2G/3G, tot això s'embolica en una petita caixa de plàstic i es col·loca en algun lloc alt, alt (al pal), lluny, molt lluny (al camp, a 30 km de l'estació base de l'operador mòbil més propera). Sí, podeu connectar un concentrador USB i ampliar el nombre de ports, però l'experiència demostra que això és complicat i poc fiable.

Per tant, he intentat descriure-vos la meva situació típica: “en algun lloc molt, molt llunyà, hi ha un encaminador molt important, solitari i petit que executa Linux. És important saber almenys una vegada al dia que està "viu" i, si cal, se li envien ordres, per exemple, "car, reinicia!"

Passem a la implementació:

1) Al costat de l'encaminador, mitjançant cron, cada 5/10/1440 minuts, o quan vulgueu, heu d'enviar una sol·licitud http al servidor mitjançant wget, deseu el resultat de la sol·licitud en un fitxer, feu que el fitxer sigui executable , i executar-lo.

La meva línia cron sembla una cosa així:

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

on:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai és el domini del meu servidor. Deixeu-me notar de seguida: sí, podeu especificar una adreça IP concreta del servidor, ho fèiem fins que el nostre estat, en un just impuls de lluita, diré, no ho sé, va bloquejar l'accés al lleó. quota dels "núvols" de DigitalOcean i Amazon. Si utilitzeu un domini simbòlic, si es produeix un incident d'aquest tipus, podeu crear fàcilment un núvol de còpia de seguretat, redirigir-hi el domini i restaurar la vigilància del dispositiu.

a.php és el nom de l'script del costat del servidor. Sí, sé que és incorrecte anomenar variables i noms de fitxer amb la mateixa lletra... Suggereixo que així desem uns quants bytes quan enviem una sol·licitud :)
u - nom d'usuari, inici de sessió de maquinari
p - contrasenya
"-O /tmp/wa.sh" és un fitxer de l'encaminador remot on es desarà la resposta del servidor, per exemple, l'ordre de reinici.

Nota número dos: Ahhh, per què fem servir wget i no curl, perquè mitjançant curl podeu enviar peticions https no amb GET, sinó amb POST? Ahhh perquè, com en l'antic acudit "NE s'enfila al pot!" curl inclou biblioteques de xifratge d'uns 2 MB de mida i, per això, és poc probable que pugueu muntar una imatge per a un petit TP-LINK ML3020, per exemple. I amb wget - si us plau.

2) Al costat del servidor (tinc Ubuntu) utilitzarem Zabbix. Per què: vull que sigui bonic (amb gràfics) i còmode (envieu ordres mitjançant el menú contextual). Zabbix té una cosa tan meravellosa com l'agent zabbix. Mitjançant l'agent, cridarem un script PHP al servidor, que retornarà informació sobre si el nostre encaminador s'ha registrat durant el període de temps requerit. Per emmagatzemar informació sobre el temps de registre, ordres per als dispositius, faig servir MySQL, una taula separada d'usuaris amb aproximadament els camps següents:

		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;

Totes les fonts es poden descarregar des del repositori Git a: https://github.com/BazDen/iotnet.online.git
Ara els scripts PHP col·locats al costat del servidor (per comoditat, es poden col·locar a la carpeta /usr/share/zabbix/):

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

Fitxer Agent.php (aquest és l'script de l'agent zabbix anomenat):

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

Bé, l'etapa final: registrar un agent i afegir horaris.

Si encara no heu instal·lat l'agent zabbix, aleshores:

apt-get install zabbix-agent

Editeu el fitxer /etc/zabbix/zabbix_agentd.conf.

Afegeix la línia:

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

on:
test és el nom del nostre agent
“php /usr/share/zabbix/agent.php user password”: un script anomenat que indica les dades de registre del dispositiu.

Afegir gràfics: obriu la interfície web de zabbix, seleccioneu al menú:
Configuració -> Nodes de xarxa -> Crear un node de xarxa. Aquí n'hi ha prou amb especificar el nom de l'amfitrió de la xarxa, el seu grup i la interfície d'agent predeterminada:

Supervisió i control remots de dispositius basats en Lunix/OpenWrt/Lede mitjançant el port 80...

Ara hem d'afegir un element de dades per a aquest node de xarxa. Fixeu-vos en dos camps: "clau" - aquest és exactament el paràmetre que vam escriure al fitxer /etc/zabbix/zabbix_agentd.conf (en el nostre cas és prova) i "interval d'actualització" - el vaig establir en 5 minuts , perquè i l'equip també es registra al servidor una vegada cada cinc minuts.

Supervisió i control remots de dispositius basats en Lunix/OpenWrt/Lede mitjançant el port 80...

Bé, afegim un gràfic. Recomano que escolliu "Emplenar" com a estil de renderització.

Supervisió i control remots de dispositius basats en Lunix/OpenWrt/Lede mitjançant el port 80...

La sortida és una cosa molt lacònica, per exemple com aquesta:

Supervisió i control remots de dispositius basats en Lunix/OpenWrt/Lede mitjançant el port 80...

A la pregunta raonable: "va valdre la pena?", respondré: bé, per descomptat, vegeu "raons per crear una bicicleta" al principi de l'article.

Si la meva primera experiència grafomana desperta l'interès dels lectors, en els articles següents vull descriure com enviar ordres a equips remots. També hem aconseguit implementar tot l'esquema per a dispositius basats en RouterOS (Mikrotik).

Font: www.habr.com

Afegeix comentari