Aceasta este partea finală a articolului, iată începutul
Ultima dată am scris despre cum am implementat monitorizarea dispozitivelor, acum vom discuta despre gestionare. În discuțiile cu „tehnicienii” din partea Clientului, mă confrunt adesea cu o percepție limitată a capacităților acestor mici dispozitive (cu resurse de memorie și performanță reduse), mulți consideră că „maximul de care avem nevoie este să trimitem un reboot, pentru ceva mai serios — vom trimite o echipă”.
Dar practica arată că nu este chiar așa. Iată o listă scurtă de sarcini tipice frecvente:
- Diagnosticare și remedieri în rețea. În spatele portului ethernet al routerului dumneavoastră, de obicei „trăiește” un alt dispozitiv, care are un ip intern propriu. Uneori, acesta poate (sau trebuie) „pingat”. Sau gestionarea tunelului — dacă tunelul nu se ridică pe routerul care funcționează prin modem 3G, dar routerul în sine este vizibil.
- Întreținere sistemică. Actualizări de firmware, upgrade-uri ale scripturilor de sistem.
- Echilibru. Acest lucru ar putea fi numit „perversiuni”, dar noțiunea de „echilibristică” ca, citez, „capacitatea unui artist de circ de a menține echilibrul într-o poziție instabilă a corpului” — se potrivește mai bine. Astfel de situații apar din cauza bugetului limitat al clientului. Mai jos am furnizat câteva exemple, dar deoarece nu au o legătură directă cu subiectul narativ, le-am inclus în notele de subsol.
Monitorizare Wi-FiTema la modă din ultimii cinci ani este în principal printre rețelele de retail federale. Te plimbi încet prin sălile de cumpărături, iar telefonul tău mobil, cu Wi-Fi-ul activat, încearcă să se conecteze la o rețea, trimițând constant pachete Probe Request, care pot fi analizate pentru a te urmări: cât de des vii în acest magazin, pe ce căi te plimbi și așa mai departe. Apoi, datele sunt colectate, analizate, iar hărțile termice sunt desenate, iar managerii folosește graficele respective pentru a obține finanțare de la conducere sau investitori. Între timp... „nu sunt bani, dar tu rezistă…”, iar rezultatul (real) trebuie să fie prezentat, se reîntoarce vechea melodie „Da, da, desigur că vom instala echipamentele și tot ce dorești, dar acum trebuie să arătăm Clientului rezultatul! Apropo, am uitat să menționăm că Clientul a permis echipamentului nostru să se conecteze la hotspotul său prin Wi-Fi, dar pe baze comune, doar ca și cum am fi clienți de ocazie”. Și astfel, suntem nevoiți să facem routere-ecchilibrist, ridicând mai multe subinterfețe WiFi, una dintre ele conectându-se la hotspot, iar cealaltă monitorizând mediul înconjurător, descărcând frenetic rezultatul tcpdump-ului, apoi ambalând conținutul fișierului într-un arhivă și riscând să „sufere de suprasaturare”, încearcă să expulzeze conținutul pe un server FTP. Nu este de mirare că routerul-ecchilibrist se „prăbușește” frecvent și trebuie să fie cumva „reanimați” de la distanță.
RadiusAici este mai simplu să descrii situația printr-o afirmație a clientului: „Dorim o rețea descentralizată de hotspoturi care să funcționeze pe echipamente ale căror modele nu le știm deocamdată, prin canale, dar nu știm încă ce canale. Ah, am uitat să spunem, nu vrem doar să afișăm reclame clienților, ci și să analizăm totul în jurul locului în care este instalat hotspotul. Nu, deocamdată nu știm de ce, dar vom găsi o justificare, nu te îngrijora, am reușit să inventăm această idee.”
Și nu trebuie să uităm că, din cauza multor circumstanțe imprevizibile, gestionarea trebuie să se realizeze în condiții neobișnuite, când nu ne putem conecta direct la router prin ip: port și suntem nevoiți să așteptăm manifestarea activității din partea acestuia. Dacă ne abținem de la detalii, dialogul dintre server și router poate fi reprezentat astfel:
- Router: Salut. Eu sunt routerul cu numele [xxx], am vreo sarcină pentru mine?
- Server: routerul acesta, te-am înregistrat, deci ești activ. Iată sarcina: arată-mi rezultatul comenzii ifconfig?
- Router: salut. eu sunt routerul acesta, data trecută ai solicitat să-ți arăt rezultatul ifconfig, iată-l. Ai vreo sarcină pentru mine?
- Server: routerul acesta, te-am înregistrat, deci ești activ. Nu am sarcini pentru tine.
Cea mai interesantă întrebare: cum poate un router la distanță să trimită un volum specific de informații? În parte anterioară am descris că pe router, din cauza resurselor limitate, există doar un wget „reducere”, care funcționează doar prin GET și nimic mai mult, nu există client ftp și nici curl. Mai exact, urmăm un mod universal, indiferent de particularitățile imaginii de instalare. M-am oprit la utilizarea wget. Mai precis, m-am „oprit” — pur și simplu nu am avut de ales 🙂
Immediate disclaimerSoluția mea de management funcționează, nu este prea limitată și sunt sigur — este imperfectă, chiar dacă satisface majoritatea clienților mei. Cum ar putea fi realizată mai bine — aș scrie un mic utilitar care trimite binare prin portul 80 folosind POST. L-aș integra în firmware-ul routerului și aș accesa prin bash. Dar realitatea este că: a) trebuie să fie rapid b) posibil că trebuie să lucrăm cu „zoologicul” existent de routere c) „nu face rău!” — dacă routerul funcționează și îndeplinește alte sarcini, încearcă să aduci modificări care să nu afecteze funcționalitatea existentă.
Să trecem la implementare. Să presupunem că clientul tău dorește din zabbix, să repornească routerul ușor și fără efort, „cu un clic de mouse”. Astăzi vom începe descrierea implementării cu zabbix.
În meniul „Administrare” -> „Scripturi”, adăugăm un nou script. Îi dăm numele „Reboot”, iar ca și comandă scriem „php /usr/share/zabbix/reboot.php {HOST.HOST}”.

Mai departe: Meniul „Monitorizare” -> „Date recente” -> „Click dreapta pe nodul de rețea dorit”. Așa va arăta meniul după adăugarea scriptului.

În consecință, scriptul reboot.php se va pune în directorul /usr/share/zabbix (la tine poate fi diferit, eu folosesc directorul rădăcină al zabbix-ului).
Disclaimer pentru securitatePentru claritatea explicației în script, folosesc doar ID-ul routerului, fără a utiliza parola. În versiunea de lucru, acest lucru nu este recomandat! De ce am procedat așa: pentru că există o întrebare majoră — unde să stocăm parolele routerelor? În Zabbix, în "datele de inventar"? O practică controversată. O alternativă ar fi limitarea accesului din afară la fișierul reboot.php.
Fișierul reboot.php
set_charset("utf8");
// "Trimitem" comanda reboot prin modificarea câmpului task din tabelul users. În câmpul task se poate trimite orice comandă.
$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();
?>Asta e tot. Rămâne deschisă întrebarea „cum să obținem rezultatul executării comenzii din partea dispozitivului”. Să analizăm problema folosind comanda ifconfig. O astfel de comandă poate fi trimisă dispozitivului:
message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt, unde:
message=`ifconfig` — noi atribuim variabilei $message rezultatul comenzii ifconfig
wget " — scriptul nostru a.php, care înregistrează routerele și primește mesaje de la acestea
u=user&p=password!&m=$message — datele de autentificare, iar valorii variabilei de cerere m îi este asociat conținutul variabilei $message
-O /tmp/out.txt — ieșirea în fișier /tmp/out.txt nu este necesară în cazul nostru, dar dacă nu specificăm acest parametru, wget nu funcționează
De ce funcționează atât de prostPentru că aceasta este o potențială vulnerabilitate de securitate. Cea mai inofensivă eroare care poate apărea este dacă în ieșirea comenzii dvs., de exemplu, apare simbolul „&”. De aceea trebuie să filtrăm tot ce se trimite de la routere și tot ce vine pe server. Da, îmi este rușine, într-adevăr. În apărarea mea, pot doar să spun — că întreg articolul este dedicat gestionării routerelor cu un firmware nedeterminat anticipat, cu canale de comunicare nedeterminate anticipat.
La mulți ani în viitor: deocamdată nu am reușit să înțeleg cum să reflect rezultatele (de exemplu, rezultatul execuției unei comenzi) care vin pe server, folosind mijloacele standard ale Zabbix.
Îmi amintesc că toate sursele pot fi descărcate din repository-ul Git, la adresa:
Sursa: habr.com
