Tere kÔigile, see on minu esimene kogemus Habras. Soovin kirjutada, kuidas ebatavaliselt hallata vÔrguseadet vÀlises vÔrgus. Mis tÀhendab ebatavaliselt: enamikul juhtudel peate seadme vÀlises vÔrgus haldamiseks:
- Avalik IP-aadress. VĂ”i kui seade asub kellegi NAT-i taga, siis avalik IP ja âedastatudâ port.
- Tunnel (PPTP/OpenVPN/L2TP+IPSec jne) keskse sÔlme juurde, mille kaudu oleks vÔimalik juurde pÀÀseda.
SeetĂ”ttu on âminu jalgratasâ vajalik, kui standardsed meetodid ei sobi teile, nĂ€iteks:
- Seade on NAT-i taga ja peale tavapĂ€rase http (80. port) on kĂ”ik suletud. TĂ€iesti normaalne olukord suurtes föderaalsetes Ă€rivĂ”rkudes. Portide avamine â nad saavad, kuid mitte kohe, mitte kiiresti ja mitte teile.
- Ebatavaliselt stabiilsuseta ja/vĂ”i âkitsasâ sidekanal. Madal kiirus, pidevad kaotused. Valu ja pettumus tunnelite loomise katsetes.
- Kallis sidekanal, kus iga megabait on arvel. NĂ€iteks satelliitside. Pluss suured viivitused ja âkitsasâ ribalaius.
- Situatsioon, kus peate âkullamaâ paljusid vĂ€ikseid ruutereid, millel ĂŒhelt poolt on installitud OpenWrt/Lede vĂ”imaluste laiendamiseks, kuid teiselt poolt jÀÀb ruuteri ressurssidest (mĂ€lu) kaugel puudu.
MĂ€rkus number ĂŒks Mis takistab sisestamast USB-porti ruuterisse âmĂ€lupulkaâ ja suurendamast ruuteri mĂ€lu?
Enamasti on ĂŒldise lahenduse kulunĂ”uded, kuid mĂ”nikord mĂ€ngib olulist rolli ka vormifaktor. NĂ€iteks objektis on TP-Link ML3020, selle ainus USB-port on kasutusel 2G/3G modemiga, kĂ”ik on pakitud mingisse vĂ€ikesesse plastkorpusesse ja paigutatud kĂ”rgele (mastile), kaugele (vĂ€lja, 30 km kaugusel lĂ€himast mobiilside operaatori baasjaamast). Jah, USB-hubi saab sisse lĂŒlitada ja portide arvu suurendada, kuid kogemus nĂ€itab, et see on kohmakas ja ebamugav.
Nii et ma pĂŒĂŒdsin kirjeldada teile oma tĂŒĂŒpilist olukorda: âkusagil kaugel, seisab vĂ€ga oluline, ĂŒksi ja vĂ€ike ruuter Linuxi haldamisel. On oluline teada vĂ€hemalt kord pĂ€evas, et ta "elus" on ja hĂ€davajalik, et saata talle kĂ€ske, nĂ€iteks âpĂ€ike, taaskĂ€ivita end!â
Liigume rakendamise juurde:
1) Ruuteri kĂŒljes cron-i kaudu iga 5/10/1440 minuti jĂ€rel vĂ”i igal ajal on vaja saata HTTP-pĂ€ring serverisse kasutades wget, pĂ€ringu tulemus salvestada faili, faili muuta tĂ€idetavaks ja see kĂ€ivitada.
Minu cron-rida nÀeb umbes vÀlja selline:
Fail /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 , kus:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai â on minu serveri domeen. Teen kohe selgeks: jah, saate mĂ€rkida ka konkreetse serveri IP-aadressi, me tegime seda varem, kuni meie riik, Ă”iguslike impulsside taga vaatluse lĂ”petamiseks, sulges ligipÀÀsu suurele osale âpilvedestâ DigitalOceanis ja Amazonis. Kui kasutate sĂŒmbolidomeeni, siis sellise olukorra tekkides saate rahulikult ĂŒles tĂ”sta varuplaani, suunata domeeni selle suunas ja taastada seadmete jĂ€lgimine.
a.php â skripti nimi serveri kĂŒljel. Jah, ma tean, et see on vale, nimeta muutujaid ja failide nimesid ĂŒhe tĂ€hega⊠pakun vĂ€lja, et nii sÀÀstame pĂ€ringu saatmisel mĂ”ne bait.
u â kasutajanimi, seadme sisselogimine
p â parool
"-O /tmp/wa.sh" â fail eemaloleval ruuteril, kuhu serveri vastus salvestatakse, nĂ€iteks kĂ€sk reboot.
MĂ€rkus number kaks: Aaaa, miks me kasutame wget-d, mitte curl-i, ehkki curl-i kaudu saab saata HTTPS-pĂ€ringuid ja mitte ainult GET-i, vaid ka POST-i? Aaaa, sest nagu vanas anekdoodis âKruubipudeli sisse ei mahu!â. Curl sisaldab krĂŒptimise teeke, mille suurus on umbes 2MB ja seetĂ”ttu on tĂ”enĂ€oliselt keeruline kokku panna pilti vĂ€ikesest TP-LINK ML3020-st nĂ€iteks. Aga wget-ga â palun.
2) Serveri kĂŒljel (minu puhul on see Ubuntu) kasutame Zabbixit. Miks: tahan, et see nĂ€eks hea vĂ€lja (graafikud) ja oleks mugav (saata kĂ€ske kontekstimenĂŒĂŒst). Zabbixil on selline meeldiv asi nagu zabbix-agent. Agentsi kaudu kutsume ĂŒles PHP-skripti serveris, mis naaseb teavet selle kohta, kas meie ruuter registreerus nĂ”utud ajavahemikul. Aja registreerimise teabe ja seadmete kĂ€skude salvestamiseks kasutan MySQL-i, eraldi tabelit users umbes selliste vĂ€ljadega:
LOO KAA END ALLE USERIDID TABEL TUGEVATEKS (
`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,
`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; KÔik lÀhtekoodid on saadaval Git-repositoriumist aadressil:
NĂŒĂŒd PHP-skripte, mis asuvad serveri poolel (mugavuse huvides saad neid panna ka kausta /usr/share/zabbix/):
Fail a.php:
set_charset("utf8");
// siin otsime meie ruuterit andmebaasi tabelist
$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();
// siin saadame ruuterile tema ĂŒlesanded
echo $task;
echo "n";
echo $reg_task;
// siin kirjutame vastuse aja ja ise ruuteri vastuse
$response_history="[".date("Y-m-d H:i")."] ".$message;
// ĂŒlesanne saadetud, nĂŒĂŒd tuleb see kustutada, ja pĂ€rast kustutamist tĂ€histada logides, et see ĂŒlesanne on tĂ€idetud
$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();
}
// nĂŒĂŒd tuleb salvestada kasutaja registreerimise aeg, tema IP ja sĂ”num tema poolt. Hetkel ainult sĂ”num
$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();
}
// kui me ei leidnud ruuterit meie andmebaasist, vÔi tema staatus on "mitteaktiivne", siis saadetakse talle ... kÀskuta restart....
// Miks nii karm? Sest ruuterid kaovad vahel, ja see on vÀike viis "uute omanike" Ôpetamiseks.
else
{
echo "reboot";
}
$sql_users->close();
?>Fail agent.php (see on kutsutud zabbix-agendi skript):
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();
// andmete vahetus toimub seq vÀlja kaudu. Seadme registreerimisel seade seab selle vÀlja "1"
if (($sql_users->num_rows)==1){
$sql_users->fetch();
echo $seq;
}
// nullime $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();
?> Ja viimane etapp: agendi seadistamine ja graafikute lisamine.
Kui Zabbixi agent pole veel installitud, siis:
apt-get install zabbix-agentRedigeerime faili /etc/zabbix/zabbix_agentd.conf.
Lisame rea:
UserParameter=test,php /usr/share/zabbix/agent.php user password , kus:
test â meie agendi nimi
âphp /usr/share/zabbix/agent.php user passwordâ â kutsutav skript, mis sisaldab seadme registreerimise andmeid.
Graafikute lisamine: avame Zabbixi veebiliidese, menĂŒĂŒst valime:
Seaded -> VÔrgusÔlmed -> Loo vÔrgusÔlm. Siin piisab, kui mÀrkida vÔrgusÔlme nimi, selle grupp, vaikimisi agendi liides:

NĂŒĂŒd peame selle vĂ”rgusĂ”lme jaoks lisama andmeelemendi. Pange tĂ€hele kahte vĂ€lja: âvĂ”tiâ â see on see parameeter, mille me mÀÀrasime failis /etc/zabbix/zabbix_agentd.conf (meie puhul see on test), ja âuuendamise intervallâ â mina seadsin 5 minutit, kuna seade registreeritakse serverisse samuti kord 5 minuti jooksul.

Lisame graafiku. Soovitan joonistamisstiiliks valida âTĂ€ideâ.

LÔpptulemus on midagi vÀga lakoonilist, nÀiteks selline:

MĂ”istlikule kĂŒsimusele: âkas see oli seda vÀÀrt?â, vastan: muidugi, vaadake âkĂ”ikuvateks pĂ”hjusteksâ artikli alguses.
Kui minu esimene graafiku loomise kogemus tekitab huvi lugejates, siis jÀrgmistes artiklites plaanin kirjeldada, kuidas saata kÀske kaugseadmetele. Samuti Ônnestus kogu skeem realiseerida ka RouterOS (Mikrotik) seadmete jaoks.
Allikas: habr.com
