Pozdrav svima, ovo je moje prvo iskustvo na Habru. Želim pisati o tome kako neovisno upravljati mrežnom opremom u eksternoj mreži. Što znači neovisno: u većini slučajeva, za upravljanje opremom u eksternoj mreži potrebno vam je:
- Javni IP-adresa. Ili, ako je oprema iza nečijeg NAT-a, tada javni IP i 'proknjižena' port.
- TUnel (PPTP/OpenVPN/L2TP+IPSec itd.) do središnje točke, putem koje bi bila dostupna.
Stoga će vam 'moj bicikl' trebati kada vam standardne metode ne odgovaraju, na primjer:
- Oprema se nalazi iza NAT-a i osim uobičajenog http (port 80) — sve je zatvoreno. Sasvim normalna situacija za velike federalne korporativne mreže. Mogu napisati portove — ali ne odmah, ne brzo i ne za vas.
- Nestabilna i/ili 'uska' veza. Mala brzina, stalni gubici. Bol i razočaranje prilikom pokušaja organiziranja tunela.
- Skupa veza, gdje je svaki megabajt od velike važnosti. Na primjer, satelitska veza. Plus veliki latencije i 'uska' propusnost.
- Situacija u kojoj morate 'žonglirati' s velikim brojem malih usmjerivača, na kojima s jedne strane stoji OpenWrt/Lede za proširenje mogućnosti, a s druge strane resursi (memorija) usmjerivača nisu dovoljni za sve.
Napomena broj jedan Što sprječava da u USB-port usmjerivača umetnete 'flash' i proširite memoriju usmjerivača?
Najčešće su zahtjevi za troškovima rješenja u cjelini, ali ponekad ključnu ulogu igra i form-faktor. Na primjer, na objektu je postavljen TP-Link ML3020, njegov jedini USB-port koristi se za 2G/3G modem, sve to je umotano u neki mali plastični kućište i smješteno negdje visoko (na stupu), daleko (na terenu, 30 km od najbliže bazne stanice mobilnog operatera). Da, možete umetnuti USB-hub i povećati broj portova, ali iskustvo pokazuje da je to glomazno i nepouzdano.
Dakle, pokušao sam opisati svoju tipičnu situaciju: 'negdje daleko, nalazi se vrlo važan, usamljeni i mali usmjerivač pod upravljanjem Linuxa. Važno je znati barem jednom dnevno da je 'živ' i po potrebi mu slati komande, na primjer 'sunce, restartaj se!'
Pređimo na implementaciju:
1) Na strani usmjerivača, prema cron-u, svake 5/10/1440 minuta ili kad god je potrebno slati http zahtjev na server pomoću wget, rezultat zahtjeva spremati u datoteku, napraviti datoteku izvršnom i izvršiti je.
Moj cron redak izgleda otprilike ovako:
Datoteka /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 , gdje:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai — domena mog servera. Odmah da napomenem: da, možete navesti i određenu ip adresu servera, mi smo to radili ranije, sve dok naše državne vlasti, u plemenitom porivu borbe protiv nečega što ne znam — nisu zatvorile pristup većini „oblaka“ DigitalOcean i Amazon. U slučaju korištenja simbolične domene, u slučaju takvih problema, moći ćete mirno pokrenuti rezervno oblak, preusmjeriti na njega domenu i obnoviti nadzor uređaja.
a.php — ime skripte na strani servera. Da, znam da nije ispravno, nazivati varijable i imena datoteka jednom slovom… predlažem da smatramo da tako štedimo nekoliko bajtova pri slanju zahtjeva 🙂
u — ime korisnika, prijava uređaja.
p — lozinka.
„-O /tmp/wa.sh“ — datoteka na udaljenom usmjerivaču, gdje će se spremati odgovor servera, na primjer naredba reboot.
Napomena broj dva: Aaaa, zašto koristimo wget, a ne curl, jer se preko curl može slati https zahtjeve i to ne samo GET, nego i POST? Aaaa zato što, kao u starom vicevu „U krnju nE lezi!“. U sastav curl ulaze knjižnice šifriranja veličine oko 2MB i stoga je malo vjerojatno da ćete moći sastaviti sliku za mali TP-LINK ML3020, na primjer. A s wget — nema problema.
2) Na strani servera (kod mene je to Ubuntu) koristit ćemo Zabbix. Zašto: želim da bude lijepo (s grafikonima) i zgodno (slati naredbe kroz kontekstni izbornik). Zabbix ima jednu divnu stvar, zabbix-agent. Kroz agenta ćemo pozvati php skriptu na serveru, koja će vraćati informacije o tome je li se naš usmjerivač registrirao u potrebnom vremenskom periodu. Za pohranu informacija o vremenu registracije, naredbama za uređaje, koristim MySQL, zasebnu tablicu korisnika s približno takvim poljima:
KREIRAJ TABLICU `users` (
`id` varchar(25) NE MOŽE BITI NULL,
`passwd` varchar(25) NE MOŽE BITI NULL,
`description` varchar(150) NE MOŽE BITI NULL,
`category` varchar(30) NE MOŽE BITI NULL,
`status` varchar(10) NE MOŽE BITI NULL,
`last_time` varchar(20) NE MOŽE BITI NULL, // vrijeme zadnjeg povezivanja
`last_ip` varchar(20) NE MOŽE BITI NULL, // IP zadnjeg povezivanja
`last_port` int(11) NE MOŽE BITI NULL, // port zadnjeg povezivanja
`task` text NE MOŽE BITI NULL, // zadatak koji dobiva router
`reg_task` varchar(150) NE MOŽE BITI NULL, // "redoviti" zadatak, ako želimo da se zadatak izvršava uvijek prilikom registracije
`last_task` text NE MOŽE BITI NULL, // log zadataka
`response` text NE MOŽE BITI NULL, // ovdje se zapisuje odgovor uređaja
`seq` int(11) NE MOŽE BITI NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; Sve izvore možete preuzeti s Git-repozitorija, na adresi:
Sada PHP skripte, koje se nalaze na strani poslužitelja (za praktičnost ih možete staviti u mapu /usr/share/zabbix/):
Datoteka a.php:
set_charset("utf8");
// ovdje tražimo naš usmjerivač u tablici baze podataka
$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();
// ovdje šaljemo usmjerivaču njegove zadatke
echo $task;
echo "n";
echo $reg_task;
// ovdje zapisujemo vrijeme odgovora i sam odgovor usmjerivača
$response_history="[".date("Y-m-d H:i")."] ".$message;
// zadatak je poslan, sada ga trebamo izbrisati, a nakon brisanja označiti u logovima da je taj zadatak izvršen
$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();
}
// sada trebamo sačuvati vrijeme registracije korisnika, njegov IP i poruku od njega. Za sada samo poruku
$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();
}
// ako nismo pronašli usmjerivač u našoj bazi podataka, ili je njegov status "neaktivan", onda će mu biti poslana naredba reboot....
// Zašto ovako strogo? Zato što usmjerivači ponekad nestaju, a to je mali način da se "novi vlasnici" nauče pameti.
else
{
echo "reboot";
}
$sql_users->close();
?>Datoteka agent.php (ovo je skripta pozvanog zabbix agenta):
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();
// razmjena podataka se odvija putem polja seq. Tijekom registracije oprema postavlja ovo polje na "1"
if (($sql_users->num_rows)==1){
$sql_users->fetch();
echo $seq;
}
// resetiramo $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();
?> I posljednji korak: evidentiranje agenta i dodavanje grafova.
Ako još niste instalirali zabbix-agent, učinite sljedeće:
apt-get install zabbix-agentUređujemo datoteku /etc/zabbix/zabbix_agentd.conf.
Dodajemo redak:
UserParameter=test,php /usr/share/zabbix/agent.php user password , gdje:
test — ime našeg agenta
„php /usr/share/zabbix/agent.php user password“ — pozivana skripta s podacima za registraciju uređaja.
Dodavanje grafova: otvaramo web sučelje zabbixa, u izborniku biramo:
Postavke -> Čvorovi mreže -> Stvori čvor mreže. Ovdje je dovoljno navesti ime čvora mreže, njegovu grupu, zadani agentov sučelje:

Sada trebamo dodati element podataka za ovaj čvor mreže. Obratite pažnju na dva polja: „ključ“ — to je onaj parametar koji smo naveli u datoteci /etc/zabbix/zabbix_agentd.conf (u našem slučaju to je test), i „interval ažuriranja“ — postavljam ga na 5 minuta, jer se i oprema registrira na serveru također jednom svakih pet minuta.

I dodajemo graf. Preporučujem kao stil prikaza odabrati „Ispunjavanje“.

Na izlazu dobivamo nešto vrlo suvislo, na primjer ovako:

Na razuman upit: „je li to bilo vrijedno?“, odgovaram: naravno, pogledajte „razloge za stvaranje bicikla“ na početku članka.
Ako će moje prvo grafomansko iskustvo izazvati interes čitatelja, u sljedećim člancima želim opisati kako slati naredbe na udaljenu opremu. Također je uspjelo realizirati cijelu shemu i za uređaje temeljen na RouterOS-u (Mikrotik-ov).
Izvor: habr.com
