To je zaključni del članka, tukaj je začetek
V prejšnjem delu sem pisal o tem, kako sem implementiral spremljanje naprav, zdaj pa bomo govorili o upravljanju. Med razpravami s 'tehniki' s strani naročnika se pogosto srečujem z omejenim razumevanjem možnosti takšnih majhnih naprav (z nizkimi zmogljivostmi pomnilnika in procesiranja), mnogi menijo, da 'maksimum, kar potrebujemo, je poslati reboot, za kaj bolj resnega pa bomo poslali ekipo.'
Toda praksa kaže, da to ne drži povsem. Tukaj je majhen seznam pogostih tipičnih nalog:
- Mrežna diagnostika in odpravljanje težav. Za ethernet pristaniščem vašega usmerjevalnika se običajno nahaja drug stroj, ki ima svoj notranji IP naslov. Včasih ga je mogoče (treba) 'pingati'. Ali upravljanje tunela - če na usmerjevalniku, ki deluje preko 3G modema, nenadoma tunel ne deluje, vendar usmerjevalnik vidimo.
- Sistemsko vzdrževanje. Posodobitev programske opreme, nadgradnja službenih skript.
- Ekvilibristika. To bi lahko imenovali 'izvršenstva', toda izraz 'ekvilibristika', kot pravim, ‘sposobnost cirkuškega umetnika za ohranjanje ravnotežja v nestabilnem položaju telesa’ — se bolj ujema. Takšne situacije nastanejo zaradi omejitve proračuna naročnika. Spodaj sem navedel nekaj primerov, vendar ker nimajo neposredne povezave z temo, sem jih izpostavil v opombah.
Wi-Fi spremljanjeModerna tema, ki se je v zadnjih petih letih razvila predvsem med zveznimi maloprodajnimi verigami. Po trgovskih dvoranah se sprehajate počasi, vaš mobilnik z vklopljenim Wi-Fi pa redno pošilja pakete Probe Request v poskusih, da se priključi na katero koli omrežje, kar je mogoče analizirati, da bi ugotovili, kako pogosto prihajate v to trgovino, po katerih poteh hodite itd. Nato se zbrani podatki analizirajo, narisane so toplotne karte, vodje pa za takšne slike 'izsiljujejo' denar od uprave ali investitorjev. No, trenutno.... 'denarja ni, ampak vi zdržite...', rezultati (pravi) pa jih je treba prikazati, zato se vklopi stara dobra pesem: 'Da, seveda, kasneje bomo vstavili vse, kar želite, vendar mora zdaj pokazati rezultat naročniku! Mimogrede, pozabili smo povedati, da je naročnik dovolil, da se naša oprema poveže z njegovim hotspotom prek Wi-Fi, vendar na splošni osnovi, preprosto kot da smo gostujoči kupci.' In tako je treba izdelati ekvilibristične usmerjevalnike — dvignemo več WiFi podinterfejsov, od katerih se eden poveže na hotspot, drugi pa spremlja okolico, obupno izvaža rezultate tcpdump-a v sebe, nato vsebino datoteke pakira v arhiv in v nevarnosti, da 'se preobremeni', poskuša izpljuniti vsebino na ftp strežnik. Ni presenetljivo, da se ekvilibristični usmerjevalnik pogosto 'sesuje' in ga je treba nekako daljinsko 'oživiti'.
RadiusSituacijo lahko preprosto opišemo z naslednjim trditjem naročnika: «Želimo decentralizirano omrežno hotspotov, ki bi delovali na opremi, katere model vnaprej ni znan, preko kanalov, katerih še ne poznamo. Ah, pozabili smo povedati, da ne želimo samo prikazovati oglasov strankam, ampak tudi analizirati vse okrog mesta namestitve hotspot-a. Ne, zaenkrat ne vemo, zakaj, ampak to bomo ugotovili, ne dvomite, mi smo že uspeli razviti to idejo»
In ne smemo pozabiti, da mora upravljanje zaradi množice vnaprej neodrejenih okoliščin potekati v nestandardnih pogojih, ko se ne moremo neposredno povezati z usmerjevalnikom prek ip: vrat in smo prisiljeni preprosto čakati na aktivnost z njegove strani. Če se abstrahiramo, lahko dialog med strežnikom in usmerjevalnikom predstavimo takole:
- Usmerjevalnik: pozdrav. jaz sem takšen usmerjevalnik, ali imam kakšne naloge?
- Server: Router such-and-such, I have registered you, so you are alive. Here’s the task: can you show me the output of the ifconfig command?
- Usmerjevalnik: Hello. I am the router such-and-such, the last time you asked me to show the result of ifconfig, here it is. Do you have any tasks for me?
- Server: Router such-and-such, I have registered you, so you are alive. There are no tasks for you.
The most interesting question is: how can a remote router send a specific amount of information? In the previous part, I described that due to resource limitations, the router only has a ‘stripped-down’ wget which works only through GET, and there’s no FTP client or curl. More precisely, we need a universal way, regardless of the specifics of the image build. I settled on using wget. To be precise, well, it’s not so much that I ‘settled’ — I just had no choice 🙂
A quick caveatMy management solution is functional, not overly limited, and I am sure — somewhat clumsy, even if it suits most of my clients. How it could ideally be done — to write a small utility that sends binary data via POST over port 80. Include this utility in the router's firmware and then access it using bash. But the reality is: a) it needs to be done quickly b) it might need to work on the existing ‘zoo of routers’ c) ‘do no harm!’ — if the router is working and performing other tasks, try to make changes that do not affect existing functionality.
Let’s move on to implementation. Suppose your client wants to restart the router from zabbix easily and effortlessly, with a ‘click of the mouse’. Today we will start describing the implementation with Zabbix.
In the ‘Administration’ menu -> ‘Scripts’, we add a new script. We name it ‘Reboot’, and for the command, we write ‘php /usr/share/zabbix/reboot.php {HOST.HOST}’

Next: Menu ‘Monitoring’ -> ‘Latest Data’ -> ‘Right-click on the desired network node’. This is what the menu will look like after adding the script.

Accordingly, we place the reboot.php script in the directory /usr/share/zabbix (yours may be different; I use the root directory of Zabbix).
Caveat for securityZa jasno razumevanje v skripti uporabljam samo id usmerjevalnika, vendar ne uporabljam gesla. V delovni različici to ni priporočljivo! Zakaj sem to naredil? Velik vprašaj je, kje shraniti gesla za usmerjevalnike? V samem Zabbixu v 'inventarnih podatkih'? Zelo sporna praksa. Kot možnost: omejite dostop od zunaj do same datoteke reboot.php
Datoteka reboot.php
set_charset("utf8");
// "Pošiljamo" ukaz za ponovni zagon z spremembo polja task v tabeli users. V polju task lahko pošljemo kakršenkoli ukaz.
$sql_users=$conn->prepare("UPDATE users SET task='reboot' WHERE id=? AND status='active';");
$sql_users->bind_param('s', $user);
$sql_users->execute();
$sql_users->close();
?>To je vse. Odprto ostaja vprašanje, 'kako pridobiti rezultat izvajanja ukaza s strani naprave'. Oglejmo si nalogo na primeru ukaza ifconfig. Tak ukaz lahko pošljemo napravi:
message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt, kjer:
message=`ifconfig` — spremenljivki $message dodelimo rezultat izhoda ukaza ifconfig
wget " — naš skript a.php, ki registrira usmerjevalnike in prejema sporočila od njih
u=user&p=password!&m=$message — uporabniški podatki in vrednost spremenljivke m dodeli vsebino spremenljivke $message
-O /tmp/out.txt — izhod v datoteko /tmp/out.txt nam v tem primeru ni potreben, toda če tega parametra ne navedemo, wget ne deluje
Zakaj to slabo delujeKer je to potencialna varnostna luknja. Najneškodljivejša napaka, ki se lahko zgodi, je, če je v izhodu vašega ukaza na primer simbol „&“. Zato je potrebno filtrirati vse, kar se pošilja z usmerjevalnikov in vse, kar prihaja na strežnik. Da, res sram me je. V svojo obrambo lahko samo napišem, da je celoten članek posvečen temu, kako upravljati z usmerjevalniki z nepredvidljivo programsko opremo in nepredvidljivimi kanali povezave.
In addition, I have a future plan: I haven't figured out yet how to display results (for example, the result of executing a command) that come to the server using standard Zabbix methods.
Just a reminder that you can retrieve all source files from the Git repository at the following address:
Izvor: habr.com
