Siveyans ak kontwòl adistans nan aparèy ki baze sou Lunix/OpenWrt/Lede atravè pò 80...

Bonjou tout moun, sa se premye eksperyans mwen sou Habré. Mwen vle ekri sou fason pou jere ekipman rezo sou yon rezo ekstèn nan yon fason ki pa estanda. Ki sa ki pa estanda vle di: nan pifò ka yo, jere ekipman sou yon rezo ekstèn ou bezwen:

  • Adrès IP piblik. Oke, oswa si ekipman an se dèyè NAT yon moun, Lè sa a, yon IP piblik ak yon pò "voye".
  • Tinèl (PPTP/OpenVPN/L2TP+IPSec, elatriye) nan ne santral kote li ta aksesib.

Se poutèt sa, w ap bezwen "bisiklèt mwen an" lè metòd estanda pa adapte ou, pou egzanp:

  1. Ekipman an sitiye dèyè NAT epi, eksepte http abityèl la (pò 80), tout bagay fèmen. Sa a se yon sitiyasyon konplètman nòmal pou gwo rezo antrepriz federal yo. Yo ka anrejistre pò, men pa touswit, pa rapid, epi yo pa pou ou.
  2. Chanèl kominikasyon enstab ak/oswa "etwat". Vitès ki ba, pèt konstan. Doulè ak fristrasyon lè w ap eseye òganize yon tinèl.
  3. Yon kanal kominikasyon chè, kote literalman chak megaokte konte. Pou egzanp, kominikasyon satelit. Plis reta long ak yon bann "etwat".
  4. Yon sitiyasyon lè ou bezwen "jongle" yon gwo kantite ti routeurs, sou yon bò, OpenWrt/Lede enstale pou elaji kapasite yo, epi sou lòt men an, resous (memwa) routeur la pa ase. pou tout bagay.

Remake nimewo fwa Ki sa ki anpeche w enstale yon kondwi flash nan pò USB routeur la ak elaji memwa routeur la?

Pi souvan, kondisyon yo se pou pri a nan solisyon an kòm yon antye, men pafwa faktè nan fòm tou jwe yon wòl kle. Pou egzanp, gen yon TP-Link ML3020 nan sit la, se sèlman pò USB li yo itilize pou yon modèm 2G / 3G, tout bagay sa a se vlope nan kèk kalite ti ka plastik epi yo mete yon kote wo, wo (sou ma a), byen lwen, byen lwen (nan jaden, 30 km de estasyon baz operatè mobil ki pi pre a). Wi, ou ka ploge nan yon mwaye USB ak elaji kantite pò, men eksperyans montre ke sa a se ankonbran ak enfidèl.

Se konsa, mwen te eseye dekri ou sitiyasyon tipik mwen an: "yon kote byen lwen, byen lwen, gen yon trè enpòtan, poukont ak ti routeur ki kouri Linux. Li enpòtan pou w konnen omwen yon fwa pa jou ke li se "vivan" epi, si sa nesesè, yo voye kòmandman ba li, pou egzanp, "siwo myèl, rdemare!"

Ann ale nan aplikasyon an:

1) Sou bò routeur, atravè cron, chak 5/10/1440 minit, oswa nenpòt lè ou vle, ou bezwen voye yon demann http nan sèvè a lè l sèvi avèk wget, sove rezilta demann lan nan yon dosye, fè dosye a ègzekutabl. , epi egzekite li.

Liy cron mwen an sanble yon bagay tankou sa a:

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

, kote:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai se domèn sèvè mwen an. Kite m 'note touswit: wi, ou ka presize yon adrès IP espesifik nan sèvè a, nou te konn fè sa jiskaske eta nou an, nan yon enpilsyon jis nan lit, mwen pral di, mwen pa konnen, bloke aksè a lyon an. pataje nan DigitalOcean ak Amazon "nwaj". Si ou itilize yon domèn senbolik, si yon ensidan konsa rive, ou ka fasilman monte yon nwaj backup, redireksyon domèn nan li epi retabli siveyans aparèy la.

a.php se non script bò sèvè a. Wi, mwen konnen ke li pa bon pou non varyab ak non dosye ak menm lèt la... Mwen sijere ke fason sa a nou sove kèk byte lè w ap voye yon demann :)
u - non itilizatè, login pyès ki nan konpitè
p - modpas
"-O /tmp/wa.sh" se yon dosye sou routeur aleka kote repons sèvè a, pou egzanp kòmandman rdemare, yo pral sove.

Remak nimewo de: Ahhh, poukisa nou itilize wget epi yo pa curl, paske atravè curl ou ka voye demann https pa ak GET, men ak POST? Ahhh paske, tankou nan ansyen blag la "NE monte nan bokal la!" curl gen ladan bibliyotèk chifreman apeprè 2MB nan gwosè e poutèt sa li pa posib ke ou pral kapab rasanble yon imaj pou yon ti TP-LINK ML3020, pou egzanp. Ak wget - tanpri.

2) Sou bò sèvè (mwen gen Ubuntu) nou pral sèvi ak Zabbix. Poukisa: Mwen vle li bèl (ak graf) ak pratik (voye kòmandman atravè meni an kontèks). Zabbix gen yon bèl bagay tankou ajan zabbix la. Atravè ajan an, nou pral rele yon script PHP sou sèvè a, ki pral retounen enfòmasyon sou si wi ou non routeur nou an anrejistre pandan peryòd tan ki nesesè yo. Pou estoke enfòmasyon sou tan enskripsyon an, kòmandman pou aparèy, mwen itilize MySQL, yon tab separe itilizatè yo ak apeprè jaden sa yo:

		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;

Tout sous yo ka telechaje nan depo Git la nan: https://github.com/BazDen/iotnet.online.git
Koulye a, script PHP yo mete sou bò sèvè a (pou konvenyans, yo ka mete yo nan /usr/share/zabbix/ katab la):

yon.php dosye:

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

Fichye Agent.php (sa a se script ajan zabbix yo rele):

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

Oke, etap final la: enskri yon ajan epi ajoute orè.

Si ou poko enstale ajan zabbix la, lè sa a:

apt-get install zabbix-agent

Edite fichye /etc/zabbix/zabbix_agentd.conf.

Ajoute liy lan:

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

, kote:
tès se non ajan nou an
"php /usr/share/zabbix/agent.php modpas itilizatè" - yon script ki rele ki endike done anrejistreman aparèy la.

Ajoute tablo: louvri koòdone entènèt zabbix la, chwazi nan meni an:
Anviwònman -> Rezo nœuds -> Kreye yon nœud rezo. Isit la li se ase yo presize non an nan lame rezo a, gwoup li yo, ak koòdone nan ajan default:

Siveyans ak kontwòl adistans nan aparèy ki baze sou Lunix/OpenWrt/Lede atravè pò 80...

Koulye a, nou bezwen ajoute yon eleman done pou ne rezo sa a. Peye atansyon sou de jaden: "kle" - sa a se egzakteman paramèt la ke nou te ekri nan /etc/zabbix/zabbix_agentd.conf fichye a (nan ka nou an li se tès), ak "entèval aktyalizasyon" - mwen mete l 'nan 5 minit. , paske ak ekipman an tou anrejistre sou sèvè a yon fwa chak senk minit.

Siveyans ak kontwòl adistans nan aparèy ki baze sou Lunix/OpenWrt/Lede atravè pò 80...

Oke, ann ajoute yon graf. Mwen rekòmande pou w chwazi "Ranpli" kòm style rann.

Siveyans ak kontwòl adistans nan aparèy ki baze sou Lunix/OpenWrt/Lede atravè pò 80...

Pwodiksyon an se yon bagay trè lakonik, pou egzanp tankou sa a:

Siveyans ak kontwòl adistans nan aparèy ki baze sou Lunix/OpenWrt/Lede atravè pò 80...

Nan kesyon an rezonab: "èske li vo li?", Mwen pral reponn: byen, nan kou, gade "rezon pou kreye yon bisiklèt" nan kòmansman atik la.

Si premye eksperyans graphomaniac mwen an eksite enterè lektè yo, Lè sa a, nan atik sa yo mwen vle dekri ki jan yo voye kòmandman nan ekipman aleka. Nou menm tou nou te jere aplike konplo a tout antye pou aparèy ki baze sou RouterOS (Mikrotik).

Sous: www.habr.com

Add nouvo kòmantè