Távoli monitorozás és eszközmenedzsment Lunix/OpenWrt/Lede alapú eszközökön a 80-as porton keresztül...

Üdvözlök mindenkit, ez az első tapasztalatom a Habrén. Arról szeretnék írni, hogyan lehet nem szokványosan kezelni a külső hálózati berendezéseket. Mit jelent a nem szokványos: legtöbb esetben a külső hálózati berendezések kezeléséhez szükséges:

  • Nyilvános IP-cím. Vagy ha az eszköz valakinek a NAT-ja mögött található, akkor nyilvános IP és az 'átirányított' port.
  • Tunneling (PPTP/OpenVPN/L2TP+IPSec stb.) a központi csomópontig, amelyen keresztül elérhetővé válik.

Ezért szükség lesz az én "biciklimre", amikor a szabványos módszerek nem megfelelőek, például:

  1. Az eszköz NAT mögött van, és a normál http (80-as port) kivételével minden zárva van. Ez teljesen normális helyzet a nagyobb szövetségi vállalati hálózatok esetében. A portokat be tudják állítani — de nem azonnal, nem gyorsan, és nem neked.
  2. Instabil és/vagy „keskeny” kommunikációs csatorna. Kis sebesség, folyamatos veszteségek. Fájdalom és csalódás a tunneling megszervezésének kísérlete során.
  3. Drága kommunikációs csatorna, ahol szó szerint minden megabájt számít. Például műholdas kommunikáció. Plusz jelentős késlekedések és „keskeny” sávszélesség.
  4. Olyan helyzet, amikor sok kis routerrel kell „zsonglőrködnünk”, amelyeken egyszerre OpenWrt/Lede van telepítve a lehetőségek bővítésére, de a router memóriája messze nem elegendő mindenhez.

Első megjegyzés Miért ne lehetne a router USB-portjába „pendrive”-ot csatlakoztatni a router memória bővítésére?

Leggyakrabban a megoldás költségére vonatkozó követelmények, de néha a formátum is kulcsszerepet játszik. Például a helyszínen TP-Link ML3020 található, egyetlen USB-portja 2G/3G modemhez van használva, mindez el van rejtve egy kis műanyag házban, és valahol nagyon magasan (tartóoszlopon) távol, egy mezőn, 30 km-re a legközelebbi mobil bázisállomástól. Igen, csatlakoztathatsz USB-hubot a portok számának növelésére, de a tapasztalat azt mutatja, hogy ez terjedelmes és megbízhatatlan.

Tehát próbáltam leírni a tipikus helyzetemet: "valahol távol, áll egy nagyon fontos, egyedülálló és kicsi Linuxot futtató router. Fontos tudni legalább naponta egyszer, hogy 'életben van', és szükség esetén parancsokat küldeni neki, például 'napocska, indíts újra!'"

Térjünk át a megvalósításra:

1) A router side cron job that runs every 5/10/1440 minutes, or whenever needed, should send an HTTP request to the server using wget, save the request result in a file, make the file executable, and execute it.

My cron line looks something like this:

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

, ahol:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai — my server's domain. Let me note: yes, you can specify an exact server IP address, we used to do that until our state, in a righteous battle against some unknown evil, closed access to most DigitalOcean and Amazon 'clouds'. If you use a symbolic domain and something like this happens, you can easily set up a backup cloud, redirect the domain to it, and restore device monitoring.

a.php — the name of the script on the server side. Yes, I know it's not right to name variables and files with a single letter... let's just say we save a few bytes when sending the request 🙂
u — the username, the device's login
p — the password
"-O /tmp/wa.sh" — the file on the remote router where the server's response will be saved, for example, the reboot command.

Note number two: Aaaa, why do we use wget instead of curl, since curl can send HTTPS requests and not just GET but also POST? Aaaa, because, as the old joke goes, "It doesn't fit in the jug!" Curl includes encryption libraries that are about 2MB in size, and because of this, you will hardly be able to build an image for a small TP-LINK ML3020, for example. But with wget — it's all good.

2) On the server side (I'm using Ubuntu), we will use Zabbix. Why: I want it to look nice (with graphs) and be convenient (to send commands via the context menu). Zabbix has this lovely thing called the Zabbix agent. Through the agent, we will call a PHP script on szerveren, which will return information about whether our router was registered during the specified period. For storing information about registration times and device commands, I use MySQL with a separate users table containing fields like this:

		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, // az utolsó kapcsolat ideje
		  `last_ip` varchar(20) NOT NULL, // az utolsó kapcsolat IP címe
		  `last_port` int(11) NOT NULL, // az utolsó kapcsolat portja
		  `task` text NOT NULL, // a feladat, amit a router kap
		  `reg_task` varchar(150) NOT NULL, // "szabályos" feladat, ha azt szeretnénk, hogy a feladat mindig végrehajtódjon regisztrációkor
		  `last_task` text NOT NULL, // a feladatok naplója
		  `response` text NOT NULL, // ide íródik a készülék válasza
		  `seq` int(11) NOT NULL
		) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Minden forrást letölthet a Git-repozitóriumból, a következő címen: https://github.com/BazDen/iotnet.online.git
Mostantól a szerveroldalon elhelyezett PHP-szkriptek (a kényelmesebb kezelhetőség érdekében elhelyezhetők a /usr/share/zabbix/ mappában):

a.php fájl:

set_charset("utf8");
	// itt keressük a routerünket az adatbázis táblában
	$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();
		// itt küldjük el a routernek a feladatait
		echo $task;
		echo "n";
		echo $reg_task;
		// itt írjuk az válasz időt és a router válaszát
		$response_history="[".date("Y-m-d H:i")."] ".$message;
		// a feladatot elküldtük, most el kell távolítani, majd a törlés után a naplókban megjelölni, hogy a feladat teljesítve lett
		$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();
		}
		// most el kell menteni a felhasználó regisztrációs idejét, az IP címét és az üzenetet tőle. Jelenleg csak az üzenet
		$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();
	}
	// ha nem találtuk meg a routert az adatbázisunkban, vagy állapota "inaktív", akkor ... újraindító parancsot fog kapni....
	// Miért ilyen szigorú? Mert a routerek néha eltűnnek, és ez egy apró módszer, hogy

A fájl agent.php (ez a hívott zabbix ügynök script):

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();
	// data exchange occurs through the seq field. During registration, the device sets this field to "1"
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		echo $seq;
	}
		
	// reset $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();
?>		

A végső lépés: az ügynök konfigurálása és a grafikonok hozzáadása.

Ha még nincs telepítve a zabbix-ügynök, akkor:

apt-get install zabbix-agent

Szerkesztjük a fájlt /etc/zabbix/zabbix_agentd.conf.

Hozzáadjuk a következő sort:

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

, ahol:
test — a mi ügynökünk neve
„php /usr/share/zabbix/agent.php user password“ — a hívott szkript, amely tartalmazza a készülék hitelesítő adatait.

Grafikonok hozzáadása: megnyitjuk a zabbix webfelületet, a menüben válasszuk a:
Beállítás -> Hálózati csomópontok -> Hálózati csomópont létrehozása. Itt elegendő megadni a csomópont nevét, a csoportját és az ügynök alapértelmezett interfészét:

Távoli monitorozás és eszközmenedzsment Lunix/OpenWrt/Lede alapú eszközökön a 80-as porton keresztül...

Most ehhez a hálózati csomóponthoz adat-elemet kell hozzáadnunk. Figyeljünk a két mezőre: a „kulcs“ - ez az a paraméter, amit az /etc/zabbix/zabbix_agentd.conf fájlban írtunk be (ebben az esetben ez a test), és a „frissítési intervallum“ - beállítok 5 percet, mert a készülékek is 5 percenként regisztrálódnak a szerveren.

Távoli monitorozás és eszközmenedzsment Lunix/OpenWrt/Lede alapú eszközökön a 80-as porton keresztül...

Most pedig adjunk hozzá grafikonokat. Javaslom, hogy a megjelenítési stílusként a „Kitöltés“-t válassza.

Távoli monitorozás és eszközmenedzsment Lunix/OpenWrt/Lede alapú eszközökön a 80-as porton keresztül...

Végül valami nagyon letisztult eredményt kapunk, például így:

Távoli monitorozás és eszközmenedzsment Lunix/OpenWrt/Lede alapú eszközökön a 80-as porton keresztül...

A jogos kérdésre: „megérte ezt?” azt válaszolom: természetesen, nézzük meg „a kerék létrehozásának okait” a cikk elején.

Ha az első grafomán tapasztalatom érdeklődést kelt, a következő cikkekben szeretném leírni, hogyan küldhetek parancsokat távoli berendezésekre. Ezenkívül a teljes séma megvalósítása is sikerült RouterOS (Mikrotik) alapú eszközökre.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster