Ukubeka iliso okude kunye nolawulo lweLunix/OpenWrt/Lede esekwe izixhobo ngezibuko lama-80…

Molweni nonke, eli liva lam lokuqala kuHabré. Ndifuna ukubhala malunga nendlela yokulawula izixhobo zenethiwekhi kwinethiwekhi yangaphandle ngendlela engekho-standard. Kuthetha ukuthini okungaqhelekanga: kwiimeko ezininzi, ukulawula izixhobo kwinethiwekhi yangaphandle oyifunayo:

  • Idilesi ye-IP yoluntu. Ewe, okanye ukuba izixhobo zisemva kwe-NAT yomntu, ke i-IP yoluntu kunye ne-port "ethunyelwe".
  • Itonela (PPTP/OpenVPN/L2TP+IPSec, njl.) kwi-node ephakathi apho iya kufumaneka khona.

Ke ngoko, uya kufuna "ibhayisekile yam" xa iindlela eziqhelekileyo zingakufanelanga, umzekelo:

  1. Izixhobo zifumaneka emva kwe-NAT kwaye, ngaphandle kwe-http eqhelekileyo (i-port 80), yonke into ivaliwe. Le yimeko eqhelekileyo ngokupheleleyo kuthungelwano ezinkulu corporate federal. Bangakwazi ukubhalisa amachweba, kodwa kungekhona ngokukhawuleza, kungekhona ngokukhawuleza, kwaye kungekhona kuwe.
  2. Ijelo lonxibelelwano elingazinzanga kunye/okanye “elimxinwa”. Isantya esiphantsi, ilahleko rhoqo. Intlungu kunye nokukhungatheka xa uzama ukuququzelela itonela.
  3. Umjelo wonxibelelwano olubizayo, apho ngokoqobo yonke i-megabyte ibala. Umzekelo, unxibelelwano ngesathelayithi. Plus ukulibaziseka ixesha elide kunye nebhendi "emxinwa".
  4. Imeko xa ufuna "juggle" inani elikhulu lee-router ezincinci, apho, kwelinye icala, i-OpenWrt / Lede ifakwe ukwandisa amandla, kwaye ngakolunye uhlangothi, izixhobo (inkumbulo) ye-router ayanelanga. kuyo yonke into.

Qaphela amanani amaxesha Yintoni ekuthintelayo ekufakeni i-flash drive kwi-port ye-USB ye-router kunye nokwandisa imemori ye-router?

Amaxesha amaninzi, iimfuno zeendleko zesisombululo ngokupheleleyo, kodwa ngamanye amaxesha ifom factor idlala indima ephambili. Ngokomzekelo, kukho i-TP-Link ML3020 kwindawo, i-port yayo ye-USB kuphela isetyenziselwa imodem ye-2G / 3G, yonke le nto isongelwe kuhlobo oluthile lweplastiki encinci kwaye ibekwe kwindawo ephezulu, ephezulu (kwimasti), kude, kude (ebaleni, iikhilomitha ezingama-30 ukusuka kwisikhululo esikufutshane sabaqhubi abahambahambayo). Ewe, unokuplaga kwi-hub ye-USB kwaye wandise inani lamachweba, kodwa amava abonisa ukuba oku kunzima kwaye akuthembeki.

Ke, ndizamile ukukuchazela imeko yam eqhelekileyo: “endaweni ekude, kude, kukho irutha ebaluleke kakhulu, eyedwa kunye nencinci eqhuba iLinux. Kubalulekile ukwazi ubuncinane kanye ngosuku ukuba "uyaphila" kwaye, ukuba kuyimfuneko, imiyalelo ithunyelwa kuye, umzekelo, "ubusi, qalisa kwakhona!"

Masiqhubele phambili ekuphunyezweni:

1) Kwicala le-router, nge-cron, yonke imizuzu ye-5/10/1440, okanye nanini na ufuna, kufuneka uthumele isicelo se-http kumncedisi usebenzisa i-wget, gcina umphumo wesicelo kwifayile, yenza ifayile iqhutywe. , kwaye uyenze.

Umgca wam wecron ujongeka ngolu hlobo:

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

, apho:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai yindawo yomncedisi wam. Makhe ndiqaphele ngokukhawuleza: ewe, unokucacisa idilesi ethile ye-IP yomncedisi, sasisoloko sikwenza oku de kube yimeko yethu, kwimpembelelo yobulungisa yomzabalazo, ndiya kuthi, andazi, ivaliwe ukufikelela kwingonyama. isabelo se-DigitalOcean kunye ne-Amazon "amafu". Ukuba usebenzisa i-domain engumfuziselo, ukuba isiganeko esinjalo senzeka, unokuphakamisa ngokulula ilifu eligcinayo, uqondise kwakhona i-domain kuyo kwaye ubuyisele esweni isixhobo.

a.php ligama lomncedisi-wecala lokushicilelweyo. Ewe, ndiyazi ukuba akulunganga ukubiza amagama aguquguqukayo kunye namagama efayile anobumba omnye... Ndicebisa ukuba ngale ndlela sigcine iibytes ezimbalwa xa sithumela isicelo :)
u - igama lomsebenzisi, ukungena kwihardware
p - igama lokugqitha
"-O /tmp/wa.sh" yifayile kwi-router ekude apho impendulo yomncedisi, umzekelo umyalelo wokuqalisa, iya kugcinwa.

Inqaku lesibini: Ahhh, kutheni sisebenzisa i-wget kwaye hayi i-curl, kuba nge-curl ungathumela izicelo ze-https kungekhona nge-GET, kodwa nge-POST? Ahhh kuba, njengakwiqhula elidala "NE ukhwela ejagini!" I-curl ibandakanya iilayibrari ezifihliweyo malunga ne-2MB ngobukhulu kwaye ngenxa yoku akunakwenzeka ukuba ube nakho ukudibanisa umfanekiso we-TP-LINK ML3020 encinci, umzekelo. Kwaye kunye ne-wget-nceda.

2) Kwicala lomncedisi (ndinoBuntu) siya kusebenzisa iZabbix. Kutheni: Ndifuna ibe ntle (kunye neegrafu) kwaye ilungele (thumela imiyalelo ngemenyu yomxholo). I-Zabbix inento emangalisayo njenge-agent ye-zabbix. Nge-arhente, siya kubiza iskripthi se-PHP kumncedisi, esiza kubuyisela ulwazi malunga nokuba i-router yethu ibhalisiwe ngexesha lexesha elifunekayo. Ukugcina ulwazi malunga nexesha lokubhalisa, imiyalelo yezixhobo, ndisebenzisa i-MySQL, abasebenzisi betafile eyahlukileyo malunga nale mihlaba ilandelayo:

		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;

Yonke imithombo inokukhutshelwa kwindawo yokugcina iGit apha: https://github.com/BazDen/iotnet.online.git
Ngoku izikripthi ze-PHP zibekwe kwicala leseva (ukwenzela lula, zinokubekwa kwi/usr/share/zabbix/folder):

a.php ifayile:

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

Ifayile ye-Agent.php (esi siscript se-arhente ye-zabbix ebizwa):

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

Ewe, inqanaba lokugqibela: ukubhalisa iarhente kunye nokongeza iishedyuli.

Ukuba awukayifaki i-agent ye-zabbix, ngoko:

apt-get install zabbix-agent

Hlela ifayile /etc/zabbix/zabbix_agentd.conf.

Yongeza umgca:

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

, apho:
uvavanyo ligama arhente yethu
"php /usr/share/zabbix/agent.php igama eliyimfihlo lomsebenzisi" - iskripthi esibizwa ngokuba siskripthi esibonisa idatha yokubhaliswa kwesixhobo.

Ukongeza iitshathi: vula ujongano lwewebhu lwe-zabbix, khetha kwimenyu:
Iisetingi -> Iinodi zenethiwekhi -> Yenza indawo yenethiwekhi. Apha kwanele ukukhankanya igama lenginginya yomsebenzi womnatha, iqela layo, kunye nojongano lwearhente olungagqibekanga:

Ukubeka iliso okude kunye nolawulo lweLunix/OpenWrt/Lede esekwe izixhobo ngezibuko lama-80…

Ngoku kufuneka songeze into yedatha yale nodi yenethiwekhi. Nika ingqalelo kwiindawo ezimbini: "isitshixo" - le yiparameter kanye esiyibhalileyo kwifayile /etc/zabbix/zabbix_agentd.conf (kwimeko yethu iluvavanyo), kunye "nexesha lokuhlaziya" - ndiyibeke kwimizuzu emi-5. , kuba kunye nezixhobo zibhaliswe kwakhona kumncedisi kanye emva kwemizuzu emihlanu.

Ukubeka iliso okude kunye nolawulo lweLunix/OpenWrt/Lede esekwe izixhobo ngezibuko lama-80…

Kulungile, masidibanise igrafu. Ndincoma ukuba ukhethe "Gcwalisa" njengendlela yonikezelo.

Ukubeka iliso okude kunye nolawulo lweLunix/OpenWrt/Lede esekwe izixhobo ngezibuko lama-80…

Imveliso yinto e-laconic kakhulu, umzekelo onje:

Ukubeka iliso okude kunye nolawulo lweLunix/OpenWrt/Lede esekwe izixhobo ngezibuko lama-80…

Kumbuzo onengqiqo: "Ngaba kwakufanelekile?", Ndiya kuphendula: kakuhle, ngokuqinisekileyo, bona "izizathu zokudala ibhayisekile" ekuqaleni kwenqaku.

Ukuba amava am okuqala e-graphomaniac avuselela umdla wabafundi, ngoko kumanqaku alandelayo ndifuna ukuchaza indlela yokuthumela imiyalelo kwizixhobo ezikude. Siphinde sakwazi ukuphumeza iskimu sonke sezixhobo ezisekelwe kwi-RouterOS (Mikrotik).

umthombo: www.habr.com

Yongeza izimvo