80 порт аркылуу Lunix/OpenWrt/Lede негизиндеги түзмөктөрдү алыстан көзөмөлдөө жана башкаруу…

Баарына салам, бул менин Habréдеги биринчи тажрыйбам. Мен стандарттуу эмес жол менен тышкы тармакта тармактык жабдууларды башкаруу жөнүндө жазгым келет. Стандарттуу эмес деген эмнени билдирет: көпчүлүк учурларда тышкы тармактагы жабдууларды башкаруу үчүн сизге керек:

  • Коомдук IP дареги. Ооба, же жабдуулар кимдир бирөөнүн NAT артында болсо, анда коомдук IP жана "багытталган" порт.
  • Туннель (PPTP/OpenVPN/L2TP+IPSec, ж.б.) борбордук түйүнгө, ал аркылуу жеткиликтүү болот.

Демек, стандарттуу ыкмалар сизге туура келбегенде, сизге "менин велосипедим" керек болот, мисалы:

  1. Жабдуу NAT артында жайгашкан жана кадимки http (порт 80) тышкары, баары жабык. Бул ири федералдык корпоративдик тармактар ​​үчүн толугу менен нормалдуу абал. Алар портторду каттай алышат, бирок дароо эмес, тез эмес жана сиз үчүн эмес.
  2. Туруксуз жана/же "тар" байланыш каналы. Төмөн ылдамдык, туруктуу жоготуулар. Туннелди уюштурууга аракет кылып жатканда оору жана нааразычылык.
  3. Ар бир мегабайт эсептелген кымбат байланыш каналы. Мисалы, спутниктик байланыш. Plus узак кечигүү жана "тар" тобу.
  4. Бир жагынан мүмкүнчүлүктөрдү кеңейтүү үчүн OpenWrt/Lede орнотулган, ал эми экинчи жагынан роутердин ресурстары (эс тутуму) жетишсиз болгон көп сандагы кичинекей роутерлерди "жонглёрдук кылуу" керек болгон кырдаал. баары үчүн.

Сан жолуна көңүл буруңуз Роутердин USB портуна флеш-дискти орнотууга жана роутердин эс тутумун кеңейтүүгө эмне тоскоол болот?

Көбүнчө, талаптар бүтүндөй чечимдин баасы үчүн, бирок кээде форма фактору да негизги ролду ойнойт. Мисалы, сайтта TP-Link ML3020 бар, анын жалгыз USB порту 2G/3G модеми үчүн колдонулат, мунун баары кандайдыр бир кичинекей пластик кутуга оролгон жана бийик, бийик (мачтада) жерге коюлган, алыс, алыс (талаада, жакынкы мобилдик оператордун базалык станциясынан 30 км). Ооба, сиз USB хабын туташтырсаңыз жана порттордун санын көбөйтө аласыз, бирок тажрыйба көрсөткөндөй, бул түйшүктүү жана ишенимсиз.

Ошентип, мен сизге өзүмдүн типтүү абалымды сүрөттөөгө аракет кылдым: “бир жерде, алыс жерде, Linux иштеткен абдан маанилүү, жалгыз жана кичинекей роутер бар. Күнүнө жок дегенде бир жолу анын "тирүү" экенин билүү маанилүү жана керек болсо, ага буйруктар жөнөтүлөт, мисалы, "бал, кайра жүктөө!"

Келгиле, ишке ашырууга өтөлү:

1) Маршрутизатор тарапта, cron аркылуу, ар 5/10/1440 мүнөт сайын же каалаган убакта, сиз wget аркылуу серверге http суроо-талапты жөнөтүшүңүз керек, сурамдын натыйжасын файлга сактап, файлды аткарылуучу кылуу керек. , жана аны аткарыңыз.

Менин 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” бул алыскы роутердеги файл, анда сервердин жообу, мисалы, кайра жүктөө буйругу сакталат.

Экинчи эскертүү: Ахх, эмне үчүн биз curl эмес, wget колдонобуз, анткени curl аркылуу https сурамдарын GET менен эмес, POST аркылуу жөнөтө аласыз? Эхх, анткени, эски тамашадагыдай, "Н.Э. банкага чыгат!" curl болжол менен 2 МБ өлчөмүндөгү шифрлөө китепканаларын камтыйт жана ушундан улам, мисалы, кичинекей TP-LINK ML3020 үчүн сүрөттү чогулта алышыңыз күмөн. Жана wget менен - ​​сураныч.

2) Сервер тарапта (менде Ubuntu бар) биз 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 репозиторийинен жүктөп алса болот: https://github.com/BazDen/iotnet.online.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 веб интерфейсин ачып, менюдан тандаңыз:
Орнотуулар -> Тармак түйүндөрү -> Тармак түйүн түзүү. Бул жерде тармак хостунун атын, анын тобун жана демейки агент интерфейсин көрсөтүү жетиштүү:

80 порт аркылуу Lunix/OpenWrt/Lede негизиндеги түзмөктөрдү алыстан көзөмөлдөө жана башкаруу…

Эми бул тармак түйүнү үчүн маалымат элементин кошуубуз керек. Эки талаага көңүл буруңуз: "ачкыч" - бул так биз /etc/zabbix/zabbix_agentd.conf файлында жазган параметр (биздин учурда бул сыноо) жана "жаңыртуу аралыгы" - мен аны 5 мүнөткө койдум. , анткени жана жабдуулар да серверде беш мүнөттө бир жолу катталат.

80 порт аркылуу Lunix/OpenWrt/Lede негизиндеги түзмөктөрдү алыстан көзөмөлдөө жана башкаруу…

Мейли, графикти кошолу. Мен көрсөтүү стили катары "Толтурууну" тандоону сунуштайм.

80 порт аркылуу Lunix/OpenWrt/Lede негизиндеги түзмөктөрдү алыстан көзөмөлдөө жана башкаруу…

Чыгуу абдан кыска нерсе, мисалы:

80 порт аркылуу Lunix/OpenWrt/Lede негизиндеги түзмөктөрдү алыстан көзөмөлдөө жана башкаруу…

Акылдуу суроого: "бул татыктуу беле?" Мен жооп берем: албетте, макаланын башында "велосипедди түзүүнүн себептерин" караңыз.

Эгерде менин биринчи графомикалык тажрыйбам окурмандардын кызыгуусун туудурса, анда кийинки макалаларда мен алыскы жабдууларга буйруктарды кантип жөнөтүүнү сүрөттөгүм келет. Ошондой эле биз RouterOS (Mikrotik) негизиндеги түзмөктөр үчүн бүт схеманы ишке ашырууга жетиштик.

Source: www.habr.com

Комментарий кошуу