Ngawaskeun jauh sareng kadali alat dumasar Lunix / OpenWrt / Lede via port 80…

Halo sadayana, ieu pangalaman munggaran kuring dina Habré. Abdi hoyong nyerat ngeunaan kumaha carana ngatur alat jaringan dina jaringan éksternal dina cara non-standar. Naon hartosna non-standar: dina kalolobaan kasus, pikeun ngatur alat dina jaringan éksternal anjeun peryogi:

  • Alamat IP umum. Nya, atanapi upami alatna aya di tukangeun NAT batur, maka IP umum sareng port "diteruskeun".
  • Torowongan (PPTP/OpenVPN/L2TP+IPSec, jeung sajabana) ka titik sentral anu tiasa diaksés.

Ku alatan éta, anjeun peryogi "sapédah abdi" nalika métode baku teu cocog anjeun, contona:

  1. alat-alat anu lokasina balik Nat na, iwal http dawam (port 80), sagalana geus ditutup. Ieu kaayaan lengkep normal pikeun jaringan perusahaan féderal badag. Éta bisa ngadaptar palabuhan, tapi teu langsung, teu gancang, sarta henteu keur anjeun.
  2. Saluran komunikasi anu teu stabil sareng / atanapi "sempit". speed low, karugian konstan. Nyeri sareng hanjelu nalika nyobian ngatur torowongan.
  3. Saluran komunikasi mahal, dimana sacara harfiah unggal megabyte diitung. Contona, komunikasi satelit. Ditambah reureuh panjang sarta band "sempit".
  4. Kaayaan nalika anjeun kedah "juggle" sajumlah ageung router leutik, dimana, di hiji sisi, OpenWrt / Lede dipasang pikeun ngalegaan kamampuan, sareng di sisi sanésna, sumber daya (memori) router henteu cekap. pikeun sagalana.

Catetan jumlah kali Naon anu nyegah anjeun masang flash drive kana port USB router sareng ngalegaan mémori router?

Seringna, sarat pikeun biaya solusi sacara gembleng, tapi sakapeung faktor bentuk ogé maénkeun peran konci. Salaku conto, aya TP-Link ML3020 dina situs, ngan ukur port USB na dianggo pikeun modem 2G / 3G, sadaya ieu dibungkus dina sababaraha jinis palastik leutik sareng disimpen dina tempat anu luhur, luhur (dina tihang). jauh, jauh (di sawah, 30 km ti base station operator mobile pangcaketna). Leres, anjeun tiasa nyolok dina hub USB sareng dilegakeun jumlah palabuhan, tapi pangalaman nunjukkeun yén ieu pajeujeut sareng teu tiasa dipercaya.

Janten, kuring nyobian ngajelaskeun ka anjeun kaayaan anu biasa kuring: "di tempat anu jauh, jauh, aya router anu penting pisan, sepi sareng leutik anu ngajalankeun Linux. Penting pikeun terang sahenteuna sakali sapoé yén anjeunna "hirup" sareng, upami diperyogikeun, paréntah dikirim ka anjeunna, contona, "madu, reboot!"

Hayu urang ngaléngkah ka palaksanaan:

1) Di sisi router, via cron, unggal 5/10/1440 menit, atanapi iraha waé anjeun hoyong, anjeun kedah ngirim pamundut http ka server nganggo wget, simpen hasil pamundut ka file, ngajantenkeun file tiasa dieksekusi. , sareng laksanakeunana.

Garis cron kuring siga kieu:

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

dimana:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai mangrupikeun domain server kuring. Hayu atuh catetan langsung: enya, anjeun bisa nangtukeun alamat IP husus tina server, kami dipaké pikeun ngalakukeun ieu nepi ka kaayaan urang, dina dorongan perjuangan bener, abdi bakal nyebutkeun, abdi henteu terang, diblokir aksés ka singa urang. babagi tina DigitalOcean jeung Amazon "awan". Upami anjeun nganggo domain simbolis, upami kajadian sapertos kitu, anjeun tiasa sacara gampil ngangkat awan cadangan, alihan domain ka dinya sareng malikkeun ngawaskeun alat.

a.php nyaeta nami Aksara server-sisi. Leres, abdi terang yén éta salah pikeun nami variabel sareng nami file sareng hurup anu sami ... Kuring nyarankeun yén ku cara ieu urang ngahémat sababaraha bait nalika ngirim pamundut :)
u - ngaran pamaké, hardware login
p - sandi
"-O /tmp/wa.sh" mangrupikeun file dina router jauh dimana réspon server, contona paréntah reboot, bakal disimpen.

Catetan nomer dua: Ahhh, naha urang make wget teu curl, sabab via curl anjeun bisa ngirim requests HTTPS teu kalawan GET, tapi kalawan POST? Ahhh sabab, sakumaha dina lulucon heubeul "NE naek kana toples!" curl kalebet perpustakaan enkripsi ukuranana sakitar 2MB sareng kusabab ieu sigana anjeun moal tiasa ngumpul gambar pikeun TP-LINK ML3020 leutik, contona. Sareng sareng wget - punten.

2) Dina sisi server (Kuring boga Ubuntu) kami bakal ngagunakeun Zabbix. Naha: Abdi hoyong janten geulis (kalawan grafik) jeung merenah (ngirim paréntah via menu konteks). Zabbix gaduh hal anu saé sapertos agén zabbix. Ngaliwatan agén, urang bakal nelepon hiji Aksara PHP dina server, nu bakal balik informasi ngeunaan naha router urang didaptarkeun salila periode diperlukeun waktu. Pikeun nyimpen inpormasi ngeunaan waktos pendaptaran, paréntah pikeun alat, kuring nganggo MySQL, pangguna méja anu misah sareng kira-kira widang di handap ieu:

		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;

Sadaya sumber tiasa diunduh tina gudang Git di: https://github.com/BazDen/iotnet.online.git
Ayeuna skrip PHP disimpen dina sisi server (pikeun genah, aranjeunna tiasa disimpen dina folder / usr / share / zabbix /):

a.php file:

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

file Agent.php (ieu naskah agén zabbix disebut):

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

Nya, tahap ahir: ngadaptar agén sareng nambihan jadwal.

Upami anjeun henteu acan masang agén zabbix, teras:

apt-get install zabbix-agent

Édit file /etc/zabbix/zabbix_agentd.conf.

Tambahkeun garis:

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

dimana:
test nyaeta nami agén urang
"php /usr/share/zabbix/agent.php sandi pamaké" - Aksara disebut nunjukkeun data pendaptaran alat.

Nambahkeun grafik: buka panganteur wéb zabbix, pilih tina ménu:
Setélan -> titik jaringan -> Jieun titik jaringan. Ieu cukup pikeun nangtukeun nami host jaringan, grup na, sareng antarmuka agén standar:

Ngawaskeun jauh sareng kadali alat dumasar Lunix / OpenWrt / Lede via port 80…

Ayeuna urang kedah nambihan unsur data pikeun titik jaringan ieu. Nengetan dua widang: "konci" - ieu persis parameter nu urang nulis dina file /etc/zabbix/zabbix_agentd.conf (bisi kami test), sarta "interval update" - Kuring disetel ka 5 menit. , sabab na alat ogé didaptarkeun dina server sakali unggal lima menit.

Ngawaskeun jauh sareng kadali alat dumasar Lunix / OpenWrt / Lede via port 80…

Nya, hayu urang tambahkeun grafik. Abdi nyarankeun milih "Eusian" salaku gaya rendering.

Ngawaskeun jauh sareng kadali alat dumasar Lunix / OpenWrt / Lede via port 80…

Kaluaran mangrupikeun hal anu laconic, contona sapertos kieu:

Ngawaskeun jauh sareng kadali alat dumasar Lunix / OpenWrt / Lede via port 80…

Pikeun patarosan anu lumrah: "éta éta patut?", Kuring bakal ngajawab: ogé, tangtosna, tingali "alesan pikeun nyiptakeun sapédah" dina awal tulisan.

Upami pangalaman graphomaniac munggaran kuring ngahudangkeun minat pamiarsa, maka dina tulisan di handap ieu kuring badé ngajelaskeun kumaha ngirim paréntah ka alat-alat jauh. Urang ogé junun nerapkeun sakabéh skéma pikeun alat dumasar kana RouterOS (Mikrotik).

sumber: www.habr.com

Tambahkeun komentar