Բարև բոլորին, սա իմ առաջին փորձն է Habré-ում: Ես ուզում եմ գրել այն մասին, թե ինչպես կառավարել ցանցային սարքավորումները արտաքին ցանցում ոչ ստանդարտ եղանակով: Ինչ է նշանակում ոչ ստանդարտ. շատ դեպքերում արտաքին ցանցում սարքավորումները կառավարելու համար ձեզ անհրաժեշտ է.
- Հանրային IP հասցե. Դե, կամ եթե սարքավորումը գտնվում է ինչ-որ մեկի NAT-ի հետևում, ապա հանրային IP և «փոխանցված» նավահանգիստ:
- Թունել (PPTP/OpenVPN/L2TP+IPSec և այլն) դեպի կենտրոնական հանգույց, որի միջոցով այն հասանելի կլինի:
Հետևաբար, ձեզ անհրաժեշտ կլինի «իմ հեծանիվը», երբ ստանդարտ մեթոդները ձեզ չեն համապատասխանում, օրինակ.
- Սարքավորումը գտնվում է NAT-ի հետևում և, բացառությամբ սովորական http-ի (պորտ 80), ամեն ինչ փակ է։ Սա լիովին նորմալ իրավիճակ է խոշոր դաշնային կորպորատիվ ցանցերի համար: Նրանք կարող են գրանցել նավահանգիստներ, բայց ոչ անմիջապես, ոչ արագ և ոչ ձեզ համար:
- Անկայուն և (կամ) «նեղ» հաղորդակցման ալիք: Ցածր արագություն, մշտական կորուստներ: Ցավ և հիասթափություն թունել կազմակերպելիս:
- Թանկարժեք կապի ալիք, որտեղ բառացիորեն յուրաքանչյուր մեգաբայթը հաշվում է: Օրինակ՝ արբանյակային կապը։ Գումարած երկար ձգձգումներ և «նեղ» խումբ:
- Իրավիճակ, երբ պետք է «խոնգել» մեծ թվով փոքր երթուղիչներ, որոնց վրա մի կողմից տեղադրված է OpenWrt/Lede հնարավորությունները ընդլայնելու համար, իսկ մյուս կողմից՝ երթուղիչի ռեսուրսները (հիշողությունը) բավարար չեն։ ամեն ինչի համար.
Նշեք ժամանակների թիվը Ի՞նչն է խանգարում ձեզ ֆլեշ կրիչը տեղադրել երթուղիչի USB պորտում և ընդլայնել երթուղիչի հիշողությունը:
Ամենից հաճախ պահանջները վերաբերում են լուծման արժեքին, որպես ամբողջություն, բայց երբեմն ձևի գործոնը նույնպես առանցքային դեր է խաղում: Օրինակ, կայքում կա TP-Link ML3020, դրա միակ USB պորտն օգտագործվում է 2G/3G մոդեմի համար, այս ամենը փաթաթված է ինչ-որ փոքր պլաստիկ պատյանով և տեղադրված է ինչ-որ տեղ բարձր, բարձր (կայմի վրա), հեռու, հեռու (դաշտում, մոտակա բջջային օպերատորի բազային կայանից 30 կմ հեռավորության վրա): Այո, դուք կարող եք միացնել USB հանգույցը և ընդլայնել պորտերի քանակը, բայց փորձը ցույց է տալիս, որ դա դժվար է և անվստահելի:
Այսպիսով, ես փորձեցի ձեզ նկարագրել իմ բնորոշ իրավիճակը. «ինչ-որ տեղ հեռու, հեռու, կա շատ կարևոր, միայնակ և փոքր երթուղիչ, որն աշխատում է Linux-ով: Կարևոր է գոնե օրական մեկ անգամ իմանալ, որ նա «կենդանի է», և անհրաժեշտության դեպքում նրան հրամաններ են ուղարկվում, օրինակ՝ «սիրելի՛ս, վերագործարկի՛ր»:
Անցնենք իրականացմանը.
1) Երթուղիչի կողմից, cron-ի միջոցով, ամեն 5/10/1440 րոպեն մեկ կամ երբ ցանկանաք, դուք պետք է http հարցում ուղարկեք սերվերին wget-ի միջոցով, պահեք հարցման արդյունքը ֆայլում, ֆայլը գործարկելի դարձրեք: , և կատարիր այն։
Իմ cron գիծը նման է հետևյալին.
Ֆայլ /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
, Որտեղ:
xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai-ն իմ սերվերի տիրույթն է: Միանգամից նշեմ՝ այո, կարող եք նշել սերվերի կոնկրետ IP հասցեն, մենք դա անում էինք այնքան ժամանակ, քանի դեռ մեր պետությունը, պայքարի արդար մղումով, կասեմ՝ չգիտեմ, արգելափակեց առյուծի մուտքը։ DigitalOcean-ի և Amazon-ի «ամպերի» մասնաբաժինը: Եթե դուք օգտագործում եք խորհրդանշական տիրույթ, եթե նման միջադեպ տեղի ունենա, կարող եք հեշտությամբ բարձրացնել պահուստային ամպը, վերահղել տիրույթը դրան և վերականգնել սարքի մոնիտորինգը։
a.php-ը սերվերի կողմի սկրիպտի անունն է: Այո, ես գիտեմ, որ սխալ է փոփոխականների և ֆայլերի անունները նույն տառով անվանելը... Առաջարկում եմ այս կերպ հարցում ուղարկելիս մի քանի բայթ խնայենք :)
u - օգտվողի անուն, ապարատային մուտք
p - գաղտնաբառ
«-O /tmp/wa.sh»-ը հեռակառավարվող երթուղիչի ֆայլ է, որտեղ սերվերի պատասխանը, օրինակ՝ reboot հրամանը, կպահվի:
Նշում թիվ երկու. Աաաաաաա, ինչի՞ ենք օգտագործում wget-ը և ոչ թե curl-ը, որովհետև curl-ի միջոցով կարող եք https հարցումներ ուղարկել ոչ թե GET-ով, այլ POST-ով։ Ահ, որովհետև, ինչպես հին կատակում էր, «NE մագլցում է սափորի մեջ»: curl-ը ներառում է մոտ 2 ՄԲ չափի գաղտնագրման գրադարաններ, և այդ պատճառով քիչ հավանական է, որ դուք կարողանաք պատկեր հավաքել, օրինակ, փոքր TP-LINK ML3020-ի համար: Իսկ wget-ով - խնդրում եմ:
2) Սերվերի կողմից (ես ունեմ Ubuntu) մենք կօգտագործենք Zabbix-ը: Ինչու. ես ուզում եմ, որ այն գեղեցիկ լինի (գրաֆիկներով) և հարմար (հրամաններ ուղարկի համատեքստի ընտրացանկի միջոցով): Zabbix-ն ունի այնպիսի հրաշալի բան, ինչպիսին է zabbix գործակալը: Գործակալի միջոցով մենք սերվերի վրա կկանչենք PHP սկրիպտ, որը կվերադարձնի տեղեկատվություն այն մասին, թե արդյոք մեր երթուղիչը գրանցվել է պահանջվող ժամանակահատվածում: Գրանցման ժամանակի, սարքերի հրամանների մասին տեղեկատվությունը պահելու համար ես օգտագործում եմ MySQL՝ առանձին աղյուսակ օգտագործողներ մոտավորապես հետևյալ դաշտերով.
CREATE TABLE `users` (
`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, // IP последнего соединения
`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;
Բոլոր աղբյուրները կարելի է ներբեռնել Git պահոցից հետևյալ հասցեով՝
Այժմ սերվերի կողմում տեղադրված PHP սկրիպտներ (հարմարության համար դրանք կարող են տեղադրվել /usr/share/zabbix/ պանակում).
a.php ֆայլ:
<?php
// Получаем входные параметры: имя пользователя, пароль и сообщение от удаленного роутера
// Зачем нужен message ? Это способ ответа роутера, например если вы захотите посмотреть содержимое файла роутера
$user=$_REQUEST['u'];
$password=$_REQUEST['p'];
$message=$_REQUEST['m'];
// Подключаемся к нашей базе данных (MySQL)
$conn=new mysqli("localhost","db_login","db_password","DB_name");
if (mysqli_connect_errno()) {
exit();
}
$conn->set_charset("utf8");
// здесь ищем наш роутер в таблице базы данных
$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();
// здесь мы роутеру отправляем его задачи
echo $task;
echo "n";
echo $reg_task;
// вот здесь мы пишем время ответа и сам ответ роутера
$response_history="[".date("Y-m-d H:i")."] ".$message;
// задачу отправили, теперь надо ее удалить,а после удаления отметить в логах, что такая-то задача выполнена
$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();
}
// теперь надо сохранить время регистрации пользователя, его айпи и сообщение от него. Пока только сообщение
$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();
}
// если мы не нашли роутер в нашей базе данных, или его статус "неактивный", то ему ... будет отправлена команда reboot....
// Почему так жестоко ? Потому что роутеры иногда пропадают, а это маленький способ проучить "новых владельцев".
else
{
echo "reboot";
}
$sql_users->close();
?>
Agent.php ֆայլ (սա zabbix գործակալի սցենարն է, որը կոչվում է).
<?php
// файл агента Zabbix. Данный скрипт обращается к таблице users и получает "1" если устройство регистрировалось с момента последнего обращения
// user и password - учетные данные оборудования
$user = $argv[1];
$password = $argv[2];
// подключаемся к нашей базе данных
$conn=new mysqli("localhost","db_user","db_password","db_name");
if (mysqli_connect_errno()) {
exit();
}
$conn->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();
// обмен данными происходит через поле seq. При регистрации железка ставит данное поле в "1"
if (($sql_users->num_rows)==1){
$sql_users->fetch();
echo $seq;
}
// обнуляем $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();
?>
Դե, վերջնական փուլ՝ գործակալի գրանցում և ժամանակացույցերի ավելացում։
Եթե դեռ չեք տեղադրել zabbix գործակալը, ապա.
apt-get install zabbix-agent
Խմբագրել ֆայլը /etc/zabbix/zabbix_agentd.conf.
Ավելացնել տողը.
UserParameter=test,php /usr/share/zabbix/agent.php user password
, Որտեղ:
թեստը մեր գործակալի անունն է
«php /usr/share/zabbix/agent.php օգտվողի գաղտնաբառ» - կոչված սկրիպտ, որը ցույց է տալիս սարքի գրանցման տվյալները:
Գծապատկերների ավելացում. բացեք zabbix վեբ ինտերֆեյսը, ընտրեք ընտրացանկից.
Կարգավորումներ -> Ցանցային հանգույցներ -> Ստեղծեք ցանցային հանգույց: Այստեղ բավական է նշել ցանցի հոսթի անունը, նրա խումբը և լռելյայն գործակալի միջերեսը.
Այժմ մենք պետք է ավելացնենք տվյալների տարր այս ցանցային հանգույցի համար: Ուշադրություն դարձրեք երկու դաշտին. «բանալին» - սա հենց այն պարամետրն է, որը մենք գրել ենք /etc/zabbix/zabbix_agentd.conf ֆայլում (մեր դեպքում դա թեստ է) և «թարմացման ընդմիջում» - ես այն սահմանել եմ 5 րոպե: , քանի որ և սարքավորումները նույնպես գրանցվում են սերվերում հինգ րոպեն մեկ։
Դե, եկեք ավելացնենք գրաֆիկ: Ես խորհուրդ եմ տալիս ընտրել «Լրացնել»՝ որպես մատուցման ոճ:
Արդյունքը շատ լակոնիկ բան է, օրինակ՝ այսպես.
Խելամիտ հարցին՝ «արժե՞ր», ես կպատասխանեմ՝ լավ, իհարկե, տես հոդվածի սկզբում «հեծանիվ ստեղծելու պատճառները»։
Եթե իմ առաջին գրաֆոմանական փորձը առաջացնում է ընթերցողների հետաքրքրությունը, ապա հաջորդ հոդվածներում ես ուզում եմ նկարագրել, թե ինչպես կարելի է հրամաններ ուղարկել հեռավոր սարքավորումներին: Մեզ հաջողվեց նաև իրականացնել RouterOS-ի (Mikrotik) վրա հիմնված սարքերի ամբողջ սխեման:
Source: www.habr.com