Monitro a rheoli dyfeisiau sy'n seiliedig ar Lunix / OpenWrt / Lede o bell trwy borthladd 80…

Helo bawb, dyma fy mhrofiad cyntaf ar Habré. Rwyf am ysgrifennu am sut i reoli offer rhwydwaith ar rwydwaith allanol mewn ffordd ansafonol. Beth mae ansafonol yn ei olygu: yn y rhan fwyaf o achosion, i reoli offer ar rwydwaith allanol mae angen:

  • Cyfeiriad IP cyhoeddus. Wel, neu os yw'r offer y tu ôl i NAT rhywun, yna IP cyhoeddus a phorthladd “a anfonwyd ymlaen”.
  • Twnnel (PPTP / OpenVPN / L2TP + IPSec, ac ati) i'r nod canolog y byddai'n hygyrch.

Felly, bydd angen “fy meic” arnoch pan nad yw dulliau safonol yn addas i chi, er enghraifft:

  1. Mae'r offer wedi'i leoli y tu ôl i NAT ac, heblaw am yr http arferol (porthladd 80), mae popeth ar gau. Mae hon yn sefyllfa gwbl arferol ar gyfer rhwydweithiau corfforaethol ffederal mawr. Gallant gofrestru porthladdoedd, ond nid ar unwaith, nid yn gyflym, ac nid i chi.
  2. Sianel gyfathrebu ansefydlog a/neu “gul”. Cyflymder isel, colledion cyson. Poen a rhwystredigaeth wrth geisio trefnu twnnel.
  3. Sianel gyfathrebu ddrud, lle mae pob megabeit yn cyfrif yn llythrennol. Er enghraifft, cyfathrebu lloeren. Yn ogystal ag oedi hir a band “cul”.
  4. Sefyllfa pan fydd angen i chi “jyglo” nifer fawr o lwybryddion bach, y mae OpenWrt / Lede wedi'i osod arnynt ar y naill law i ehangu galluoedd, ac ar y llaw arall, nid yw adnoddau (cof) y llwybrydd yn ddigon am bopeth.

Nodwch amseroedd rhif Beth sy'n eich atal rhag gosod gyriant fflach ym mhorth USB y llwybrydd ac ehangu cof y llwybrydd?

Yn fwyaf aml, mae'r gofynion ar gyfer cost yr ateb yn ei gyfanrwydd, ond weithiau mae'r ffactor ffurf hefyd yn chwarae rhan allweddol. Er enghraifft, mae TP-Link ML3020 ar y wefan, defnyddir ei unig borthladd USB ar gyfer modem 2G / 3G, mae hyn i gyd wedi'i lapio mewn rhyw fath o gas plastig bach a'i osod yn rhywle uchel, uchel (ar y mast), ymhell, bell i ffwrdd (yn y cae, 30 km o orsaf sylfaen y gweithredwr symudol agosaf). Gallwch, gallwch chi blygio canolbwynt USB i mewn ac ehangu nifer y porthladdoedd, ond mae profiad yn dangos bod hyn yn feichus ac yn annibynadwy.

Felly, ceisiais ddisgrifio fy sefyllfa arferol i chi: “rhywle ymhell, bell i ffwrdd, mae llwybrydd pwysig, unig a bach iawn yn rhedeg Linux. Mae'n bwysig gwybod o leiaf unwaith y dydd ei fod yn "fyw" ac, os oes angen, anfonir gorchmynion ato, er enghraifft, "mêl, ailgychwyn!"

Symudwn ymlaen at y gweithredu:

1) Ar ochr y llwybrydd, trwy cron, bob 5/10/1440 munud, neu pryd bynnag y dymunwch, mae angen i chi anfon cais http at y gweinydd gan ddefnyddio wget, arbed canlyniad y cais i ffeil, gwnewch y ffeil yn weithredadwy , a'i weithredu.

Mae fy llinell cron yn edrych rhywbeth fel hyn:

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

, lle:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai yw parth fy gweinydd. Gadewch imi nodi ar unwaith: ie, gallwch nodi cyfeiriad IP penodol y gweinydd, rydym yn arfer gwneud hyn hyd nes ein cyflwr, mewn ysgogiad cyfiawn o frwydr, byddaf yn dweud, nid wyf yn gwybod, rhwystro mynediad i'r llew cyfran o “gymylau” DigitalOcean ac Amazon. Os ydych chi'n defnyddio parth symbolaidd, os bydd digwyddiad o'r fath yn digwydd, gallwch chi godi cwmwl wrth gefn yn hawdd, ailgyfeirio'r parth iddo ac adfer monitro dyfais.

a.php yw enw'r sgript ochr y gweinydd. Ydw, dwi'n gwybod ei bod hi'n anghywir enwi newidynnau a ffeilio enwau gyda'r un llythyren... Dwi'n awgrymu fel hyn ein bod ni'n arbed ambell beit wrth anfon cais :)
u - enw defnyddiwr, mewngofnodi caledwedd
p - cyfrinair
Mae “-O /tmp/wa.sh” yn ffeil ar y llwybrydd anghysbell lle bydd ymateb y gweinydd, er enghraifft y gorchymyn ailgychwyn, yn cael ei gadw.

Nodyn rhif dau: Ahhh, pam rydyn ni'n defnyddio wget ac nid cyrl, oherwydd trwy cyrl gallwch chi anfon ceisiadau https nid gyda GET, ond gyda POST? Ahhh oherwydd, fel yn yr hen jôc “NE yn dringo i'r jar!” Mae curl yn cynnwys llyfrgelloedd amgryptio o tua 2MB o faint ac oherwydd hyn mae'n annhebygol y byddwch yn gallu cydosod delwedd ar gyfer TP-LINK ML3020 bach, er enghraifft. A chyda wget - os gwelwch yn dda.

2) Ar ochr y gweinydd (mae gen i Ubuntu) byddwn yn defnyddio Zabbix. Pam: Rwyf am iddo fod yn brydferth (gyda graffiau) ac yn gyfleus (anfonwch orchmynion trwy'r ddewislen cyd-destun). Mae gan Zabbix beth mor wych â'r asiant zabbix. Trwy'r asiant, byddwn yn galw sgript PHP ar y gweinydd, a fydd yn dychwelyd gwybodaeth ynghylch a gofrestrodd ein llwybrydd yn ystod y cyfnod amser gofynnol. I storio gwybodaeth am amser cofrestru, gorchmynion ar gyfer dyfeisiau, rwy'n defnyddio MySQL, defnyddwyr bwrdd ar wahân gyda thua'r meysydd canlynol:

		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;

Gellir lawrlwytho pob ffynhonnell o ystorfa Git yn: https://github.com/BazDen/iotnet.online.git
Nawr mae sgriptiau PHP wedi'u gosod ar ochr y gweinydd (er hwylustod, gellir eu gosod yn y ffolder / usr/share/zabbix/):

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

Ffeil Agent.php (dyma sgript yr asiant zabbix o'r enw):

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

Wel, y cam olaf: cofrestru asiant ac ychwanegu amserlenni.

Os nad ydych wedi gosod yr asiant zabbix eto, yna:

apt-get install zabbix-agent

Golygwch y ffeil /etc/zabbix/zabbix_agentd.conf.

Ychwanegwch y llinell:

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

, lle:
prawf yw enw ein hasiant
“cyfrinair defnyddiwr php /usr/share/zabbix/agent.php” - sgript o'r enw sy'n nodi data cofrestru'r ddyfais.

Ychwanegu siartiau: agorwch y rhyngwyneb gwe zabbix, dewiswch o'r ddewislen:
Gosodiadau -> Nodau rhwydwaith -> Creu nod rhwydwaith. Yma mae'n ddigon nodi enw gwesteiwr y rhwydwaith, ei grŵp, a'r rhyngwyneb asiant rhagosodedig:

Monitro a rheoli dyfeisiau sy'n seiliedig ar Lunix / OpenWrt / Lede o bell trwy borthladd 80…

Nawr mae angen inni ychwanegu elfen ddata ar gyfer y nod rhwydwaith hwn. Rhowch sylw i ddau faes: “allweddol” - dyma'r union baramedr a ysgrifennom yn y ffeil /etc/zabbix/zabbix_agentd.conf (yn ein hachos ni mae'n brawf), a "cyfwng diweddaru" - gosodais ef i 5 munud , oherwydd ac mae'r offer hefyd wedi'i gofrestru ar y gweinydd unwaith bob pum munud.

Monitro a rheoli dyfeisiau sy'n seiliedig ar Lunix / OpenWrt / Lede o bell trwy borthladd 80…

Wel, gadewch i ni ychwanegu graff. Rwy'n argymell dewis “Llenwi” fel yr arddull rendro.

Monitro a rheoli dyfeisiau sy'n seiliedig ar Lunix / OpenWrt / Lede o bell trwy borthladd 80…

Mae'r allbwn yn rhywbeth laconig iawn, er enghraifft fel hyn:

Monitro a rheoli dyfeisiau sy'n seiliedig ar Lunix / OpenWrt / Lede o bell trwy borthladd 80…

I'r cwestiwn rhesymol: "a oedd yn werth chweil?", Byddaf yn ateb: wel, wrth gwrs, gweler "rhesymau dros greu beic" ar ddechrau'r erthygl.

Os yw fy mhrofiad graffomaidd cyntaf yn ennyn diddordeb darllenwyr, yna yn yr erthyglau canlynol rwyf am ddisgrifio sut i anfon gorchmynion i offer anghysbell. Llwyddom hefyd i weithredu'r cynllun cyfan ar gyfer dyfeisiau yn seiliedig ar RouterOS (Mikrotik).

Ffynhonnell: hab.com

Ychwanegu sylw