80 порты арқылы Lunix/OpenWrt/Lede негізіндегі құрылғыларды қашықтан бақылау және басқару…

Барлығына сәлем, бұл менің Хабредегі алғашқы тәжірибем. Мен сыртқы желідегі желілік жабдықты стандартты емес әдіспен басқару туралы жазғым келеді. Стандартты емес дегеніміз нені білдіреді: көп жағдайда сыртқы желідегі жабдықты басқару үшін сізге қажет:

  • Жалпыға ортақ IP мекенжайы. Ал, немесе егер жабдық біреудің NAT артында болса, онда жалпыға қолжетімді IP және «қайта жіберілген» порт.
  • Туннель (PPTP/OpenVPN/L2TP+IPSec, т.б.) орталық түйінге, ол арқылы қол жеткізуге болады.

Сондықтан стандартты әдістер сізге сәйкес келмесе, сізге «менің велосипедім» қажет болады, мысалы:

  1. Жабдық NAT артында орналасқан және әдеттегі http (порт 80) қоспағанда, барлығы жабық. Бұл ірі федералды корпоративтік желілер үшін мүлдем қалыпты жағдай. Олар порттарды тіркей алады, бірақ бірден емес, тез емес және сіз үшін емес.
  2. Тұрақсыз және/немесе «тар» байланыс арнасы. Төмен жылдамдық, тұрақты жоғалтулар. Туннельді ұйымдастыруға тырысқанда ауырсыну мен көңілсіздік.
  3. Әрбір мегабайт есептелетін қымбат байланыс арнасы. Мысалы, спутниктік байланыс. Плюс ұзақ кешігулер және «тар» жолақ.
  4. Бір жағынан мүмкіндіктерді кеңейту үшін OpenWrt/Lede орнатылған, ал екінші жағынан маршрутизатордың ресурстары (жады) жеткіліксіз болатын көптеген шағын маршрутизаторларды «айластыру» қажет болған жағдай. барлығы үшін.

Сан реттерін ескеріңіз Флэш-дискіні маршрутизатордың USB портына орнатуға және маршрутизатордың жадын кеңейтуге не кедергі?

Көбінесе талаптар жалпы шешімнің құнына қатысты, бірақ кейде форма факторы да негізгі рөл атқарады. Мысалы, сайтта TP-Link ML3020 бар, оның жалғыз USB порты 2G/3G модемі үшін пайдаланылады, мұның бәрі қандай да бір шағын пластик қаптамаға оралып, биік, биік (маңақта) жерде орналастырылған, алыс, алыс (далада, ең жақын ұялы байланыс операторының базалық станциясынан 30 км). Иә, сіз USB хабын қосып, порттар санын көбейте аласыз, бірақ тәжірибе көрсеткендей, бұл қиын және сенімсіз.

Сонымен, мен сізге өзімнің әдеттегі жағдайымды сипаттауға тырыстым: «бір жерде, алыс жерде, Linux-ты басқаратын өте маңызды, жалғыз және кішкентай маршрутизатор бар. Күніне кем дегенде бір рет оның «тірі» екенін білу маңызды және қажет болған жағдайда оған командалар жіберіледі, мысалы, «жаным, қайта жүкте!»

Іске асыруға көшейік:

1) Маршрутизатор жағында, cron арқылы, әрбір 5/10/1440 минут сайын немесе кез келген уақытта, wget көмегімен серверге http сұрауын жіберу, сұраудың нәтижесін файлға сақтау, файлды орындалатын етіп жасау керек. , және оны орындаңыз.

Менің cron сызығым келесідей көрінеді:

/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

, мұнда:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai - менің серверімнің домені. Бірден атап өтейін: иә, сіз сервердің белгілі бір IP-мекен-жайын көрсете аласыз, біз мұны біздің мемлекетке дейін, әділ күрес серпінісінде істедік, мен айтамын, мен білмеймін, арыстанға кіруді бұғаттады. DigitalOcean және Amazon «бұлттарының» үлесі. Символдық доменді пайдалансаңыз, мұндай оқиға орын алса, сақтық көшірме бұлтын оңай көтеруге, доменді оған қайта бағыттауға және құрылғы мониторингін қалпына келтіруге болады.

a.php — сервер жағындағы сценарийдің атауы. Иә, айнымалылар мен файл атауларын бір әріппен атау дұрыс емес екенін білемін... Осылай сұрау жіберген кезде бірнеше байтты сақтауды ұсынамын :)
u - пайдаланушы аты, аппараттық жүйеге кіру
p - құпия сөз
“-O /tmp/wa.sh” қашықтағы маршрутизатордағы файл, онда сервердің жауабы, мысалы, қайта жүктеу пәрмені сақталады.

Екінші ескерту: Ахх, неге curl емес, wget пайдаланамыз, өйткені curl арқылы https сұрауларын GET арқылы емес, POST арқылы жіберуге болады? Аххх, өйткені, ескі әзілдегідей «НЭ құмыраға көтеріледі!» curl өлшемі шамамен 2 МБ шифрлау кітапханаларын қамтиды және осыған байланысты, мысалы, кішкентай TP-LINK ML3020 үшін кескінді жинай алуыңыз екіталай. Және wget арқылы - өтінемін.

2) Сервер жағында (менде Ubuntu бар) біз Zabbix қолданамыз. Неліктен: Мен оның әдемі (графиктері бар) және ыңғайлы болуын қалаймын (контекстік мәзір арқылы пәрмендерді жіберу). Zabbix-те zabbix агенті сияқты керемет нәрсе бар. Агент арқылы біз серверде PHP сценарийін шақырамыз, ол біздің маршрутизатордың қажетті уақыт аралығында тіркелгені туралы ақпаратты қайтарады. Тіркеу уақыты, құрылғыларға арналған пәрмендер туралы ақпаратты сақтау үшін мен MySQL, шамамен келесі өрістері бар жеке кесте пайдаланушыларын қолданамын:

		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;

Барлық дереккөздерді Git репозиторийінен мына жерден жүктеп алуға болады: https://github.com/BazDen/iotnet.online.git
Енді PHP сценарийлері сервер жағында орналастырылған (ыңғайлы болу үшін оларды /usr/share/zabbix/ қалтасына орналастыруға болады):

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

Agent.php файлы (бұл zabbix агентінің сценарийі деп аталады):

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

Ал, соңғы кезең: агентті тіркеу және кестелерді қосу.

Егер сіз әлі zabbix агентін орнатпаған болсаңыз, онда:

apt-get install zabbix-agent

/etc/zabbix/zabbix_agentd.conf файлын өңдеңіз.

Жолды қосыңыз:

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

, мұнда:
тест - біздің агенттің аты
“php /usr/share/zabbix/agent.php пайдаланушы құпия сөзі” – құрылғыны тіркеу деректерін көрсететін шақырылатын сценарий.

Диаграммаларды қосу: zabbix веб-интерфейсін ашыңыз, мәзірден таңдаңыз:
Параметрлер -> Желі түйіндері -> Желі түйінін жасау. Мұнда желі хостының атын, оның тобын және әдепкі агент интерфейсін көрсету жеткілікті:

80 порты арқылы Lunix/OpenWrt/Lede негізіндегі құрылғыларды қашықтан бақылау және басқару…

Енді осы желі түйіні үшін деректер элементін қосу керек. Екі өріске назар аударыңыз: «кілт» - бұл дәл /etc/zabbix/zabbix_agentd.conf файлында жазған параметр (біздің жағдайда бұл сынақ) және «жаңарту аралығы» - мен оны 5 минутқа қойдым. , өйткені және жабдық серверде бес минут сайын бір рет тіркеледі.

80 порты арқылы Lunix/OpenWrt/Lede негізіндегі құрылғыларды қашықтан бақылау және басқару…

Жарайды, графикті қосайық. Рендеринг стилі ретінде «Толтыру» опциясын таңдауды ұсынамын.

80 порты арқылы Lunix/OpenWrt/Lede негізіндегі құрылғыларды қашықтан бақылау және басқару…

Шығару өте қысқа нәрсе, мысалы:

80 порты арқылы Lunix/OpenWrt/Lede негізіндегі құрылғыларды қашықтан бақылау және басқару…

Ақылға қонымды сұраққа: «бұл тұрды ма?» Мен жауап беремін: әрине, мақаланың басындағы «велосипед жасаудың себептерін» қараңыз.

Егер менің алғашқы графоманиялық тәжірибем оқырмандардың қызығушылығын тудырса, онда келесі мақалаларда қашықтағы жабдыққа командаларды қалай жіберу керектігін сипаттағым келеді. Біз сондай-ақ RouterOS (Mikrotik) негізіндегі құрылғылардың барлық схемасын жүзеге асыра алдық.

Ақпарат көзі: www.habr.com

пікір қалдыру