Përshëndetje të gjithëve, kjo është përvoja ime e parë në Habra. Dua të shkruaj rreth mënyrës se si të menaxhoni pajisjet rrjetërore në një rrjet të jashtëm në mënyrë jo standarde. Çfarë do të thotë jo standarde: në shumicën e rasteve, për të menaxhuar pajisjet në një rrjet të jashtëm, ju nevojitet:
- Një adresë IP publike. Ose, nëse pajisja ndodhet pas një NAT-i të dikujt, atëherë një IP publike dhe një port i "kalur".
- Një tunel (PPTP/OpenVPN/L2TP+IPSec etj.) në faqen kryesore, përmes të cilit do të ishte e aksesueshme.
Prandaj, "biçikleta ime" do t'ju nevojitet kur metodat standarde nuk ju përshtaten, për shembull:
- Pajisja ndodhet pas NAT-it dhe përveç http të zakonshëm (porti 80) – gjithçka tjetër është e mbyllur. Një situatë mjaft normale për rrjetet korporative federale të mëdha. Të kalosh portet – mund të bëhet, por jo menjëherë, jo shpejt dhe jo për ju.
- Një kanal komunikimi i paqëndrueshëm dhe/ose "ngushtë". Shpejtësi të vogla, humbje të vazhdueshme. Dhimbje dhe zhgënjim gjatë përpjekjes për të organizuar një tunel.
- Një kanal komunikimi të shtrenjtë, ku çdo megabajt ka rëndësi. Shembuj janë lidhjet satelitore. Plus vonesa të mëdha dhe një "ngushtë" e kanalit.
- Situata kur ju duhet të "xhongloni" me shumë routerë të vegjël, në të cilët nga njëra anë është instaluar OpenWrt/Lede për ta zgjeruar funksionalitetin, kurse nga ana tjetër burimet (memoria) e routerit nuk mjaftojnë për të gjitha.
Shënim numër një Por, çfarë e pengon të vendosni një "flash" në portin USB të routerit dhe të zgjeroni memorien e tij?
Shpesh herë kërkesat për kostot e zgjidhjes në tërësi, por ndonjëherë luajnë rolin kryesor edhe faktorët e formës. Për shembull, në objekt ndodhet një TP-Link ML3020, porta e vetme USB përdoret për modem 2G/3G, gjithçka është e vendosur në ndonjë kuti të vogël plastike dhe është vendosur diku lart (në shtyllë), larg-larg (në fushë, 30 km nga stacioni më i afërt bazë të operatorit të telefonisë mobile). Po, mund të lidhni një USB-hub dhe të zgjeroni numrin e porteve, por eksperienca tregon se kjo është e madhe dhe e pasigurt.
Pra, përpiqem të përshkruaj situatën time tipike: "diku larg-larg, ndodhet një router shumë i rëndësishëm, i vetëm dhe i vogël nën menaxhim Linux. Është e rëndësishme të dihet të paktën një herë në ditë se ai është "në jetë" dhe në rast nevoje t'i dërgoj komandat, për shembull "dielli, ri në këmbë!"
Të kalojmë te realizimi:
1) Në anën e routerit, nëpërmjet cron-it çdo 5/10/1440 minuta, ose sa herë të nevojitet, duhet të dërgohet një kërkesë http në server me wget, rezultati i kërkesës ruhet në një skedar, skedari bëhet ekzekutues dhe ekzekutohet.
Rreshti im në cron duket më pak si:
Skedari /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 , ku:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai — domeni i serverit tim. Të tregoj, po, mund të specifikoni gjithashtu një IP të caktuar të serverit, ne e bënim këtë më parë, derisa shteti ynë, në një përpjekje të drejtë për të luftuar diçka që nuk e di — mbylli qasjen në një pjesë të madhe të "rethey" DigitalOcean dhe Amazon. Në rast se përdorni një domen simbolik, në rast të ngjarjeve të tilla, ju do të jeni në gjendje të ngrisni një re rezervë, të drejtoni domenin dhe të rikuperoni monitorimin e pajisjeve.
a.php — emri i skriptit në anën e serverit. Po, e di që është gabim të quash variablat dhe emrat e skedarëve me një shkronjë... le të mendojmë se kështu kursejmë disa byte gjatë dërgimit të kërkesës 🙂
u — emri i përdoruesit, identifikuesi i pajisjes
p — fjalëkalimi
"-O /tmp/wa.sh" — skedari në routerin e largët, ku do të ruhet përgjigjja e serverit, për shembull komanda reboot.
Shënimi numër dy: Aaaah, pse përdorim wget dhe jo curl, sepse me curl mund të dërgojmë kërkesa https dhe jo vetëm GET, por edhe POST? Aaaah sepse si në atë shaka të vjetra "Në kosh nuk hyn!". Curl përmban biblioteka kriptimi që peshojnë rreth 2MB dhe për shkak të kësaj është e vështirë të krijoni një imazh për një TP-LINK ML3020, për shembull. Ndërsa me wget — është e mundur.
2) Në anën e serverit (unë kam Ubuntu) do të përdorim Zabbix. Pse: dua që të duket mirë (me grafika) dhe të jetë e përshtatshme (të dërgoj komanda përmes menusë kontekstuale). Zabbix ka një gjë të bukur, siç është agjenti zabbix. Përmes agentit do të thërrasim një skript php në сервере, i cili do të kthejë informacionin nëse routeri ynë është regjistruar në periudhën e kërkuar. Për ruajtjen e informacionit mbi kohën e regjistrimit, komandat për pajisjet, unë përdor MySQL, një tavolinë të veçantë përdoruesish me të paktën këto fusha:
KRIJO TABELËN `users` (
`id` varchar(25) NUK E LEJOHET,
`passwd` varchar(25) NUK E LEJOHET,
`description` varchar(150) NUK E LEJOHET,
`category` varchar(30) NUK E LEJOHET,
`status` varchar(10) NUK E LEJOHET,
`last_time` varchar(20) NUK E LEJOHET,
`last_ip` varchar(20) NUK E LEJOHET,
`last_port` int(11) NUK E LEJOHET,
`task` text NUK E LEJOHET,
`reg_task` varchar(150) NUK E LEJOHET,
`last_task` text NUK E LEJOHET,
`response` text NUK E LEJOHET,
`seq` int(11) NUK E LEJOHET
) MOTOR=InnoDB DEFAULT CHARSET=utf8; Të gjitha burimet mund të merren nga repo Git, në adresën:
Tani skriptet PHP, të vendosura në anën e serverit (për lehtësi mund t’i vendosim në dosjen /usr/share/zabbix/):
Skedari a.php:
set_charset("utf8");
// Këtu kërkojmë routerin tonë në tabelën e bazës së të dhënave
$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();
// Këtu i dërgojmë routerit detyrat e tij
echo $task;
echo "n";
echo $reg_task;
// Këtu shkruajmë kohën e përgjigjes dhe vetë përgjigjen e routerit
$response_history="[".date("Y-m-d H:i")."] ".$message;
// Detyrën e dërguam, tani duhet ta fshijmë, dhe pas fshirjes të shënojmë në log se kjo detyrë është përfunduar
$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();
}
// Tani duhet të ruajmë kohën e regjistrimit të përdoruesit, IP-në e tij dhe mesazhin nga ai. Deri tani vetëm mesazhin
$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();
}
// Nëse nuk e gjetëm routerin në bazën tonë të të dhënave, ose statusi i tij është "inaktiv", i dërgohet komandë reboot....
// Pse kaq ashpër? Sepse routerët ndonjëherë zhduken, dhe kjo është një mënyrë e vogël për të ndëshkuar "pronarët e rinj".
else
{
echo "reboot";
}
$sql_users->close();
?>Skedari agent.php (ky është skripti i agentit të thirrur zabbix):
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();
// dera e të dhënave ndodh përmes fushës seq. Gjatë regjistrimit pajisja e vendos këtë fushë në "1"
if (($sql_users->num_rows)==1){
$sql_users->fetch();
echo $seq;
}
// zbrazim $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();
?> Dhe tani faza përfundimtare: konfiguroi agjentin dhe shto grafikat.
Nëse ende nuk e keni instaluar zabbix-agent, atëherë:
apt-get install zabbix-agentEditoni skedarin /etc/zabbix/zabbix_agentd.conf.
Shtoni rreshtin:
UserParameter=test,php /usr/share/zabbix/agent.php user password , ku:
test — emri i agjentit tonë
„php /usr/share/zabbix/agent.php user password“ — skripti i thirrur me akreditive të pajisjes.
Shtimi i grafikëve: hapni ndërfaqen web të zabbix, në menunë zgjidhni:
Konfigurimi -> Nyjat e rrjetit -> Krijo nyjën e rrjetit. Këtu mjafton të jepni emrin e nyjës së rrjetit, grupin e saj dhe ndërfaqen e agjentit nga default:

Tani për këtë nyjë rrjeti na nevojitet të shtojmë një element të dhënash. Vini re dy fushat: „çelësi“ — kjo është ajo që kemi shkruar në skedarin /etc/zabbix/zabbix_agentd.conf (në rastin tonë është test), dhe „intervali i azhurnimit“ — unë vë 5 minuta, sepse pajisja regjistrohet gjithashtu në server çdo pesë minuta.

Dhe tani shtojmë grafikun. Këshilloj të zgjidhni „Plotësimi“ si stil të vizatimit.

Rezultati është diçka shumë elegante, për shembull kështu:

Për pyetjen e arsyeshme: „a ja vlen?“, do të përgjigjem: natyrisht, shihni „arsyet për krijimin e një biciklete“ në fillim të artikullit.
Nëse përvoja ime e parë si shkrimtar do të zgjojë interesin e lexuesve, atëherë në artikujt e ardhshëm do të përshkruaj si të dërgoj urdhra në pajisje të largëta. Kështu që arrita të realizoj tërë skemën edhe për pajisjet e bazuara në RouterOS (Mikrotik).
Burimi: habr.com
