Port 80 üzerinden Linux/OpenWrt/Lede cihazlarının uzaktan izlenmesi ve kontrolü, devamı

Bu yazının son kısmı, işte başlangıç habr.com/en/post/445568
En son cihaz izlemeyi nasıl uyguladığımı yazmıştım, şimdi yönetimden bahsedeceğiz. Müşteri tarafında "teknisyenler" ile yapılan görüşmelerde, bu tür küçük cihazların (düşük bellek kaynakları ve performansa sahip) yeteneklerine ilişkin sınırlı bir algıyla sık sık karşılaşıyorum; çoğu kişi "en çok ihtiyacımız olan şeyin daha fazlası için yeniden başlatma göndermek olduğuna" inanıyor ciddi bir ekip göndereceğiz”.
Ancak uygulama bunun tamamen doğru olmadığını gösteriyor. İşte ortak tipik görevlerin küçük bir listesi:

  1. Ağ tanılama ve sorun giderme. Yönlendiricinizin Ethernet bağlantı noktasının arkasında genellikle kendi dahili IP adresine sahip başka bir donanım parçası bulunur. Bazen ona “ping” atabilirsiniz (gerekir). Veya tünel yönetimi - 3G modem aracılığıyla çalışan bir yönlendiricide tünel aniden yükselmezse, ancak yönlendiricinin kendisini görebiliriz.
  2. Sistem bakımı. Ürün yazılımı güncellemesi, servis komut dosyası yükseltmesi.
  3. Dengeleme eylemi. Buna “sapkınlık” denilebilir ama “dengeci” kavramı alıntıladığım gibi, “Bir sirk sanatçısının dengesiz bir vücut pozisyonunda dengeyi koruyabilme yeteneği” - daha iyi uyuyor. Bu gibi durumlar müşterinin bütçesinin kısıtlı olmasından dolayı ortaya çıkmaktadır. Aşağıda birkaç örnek verdim ama... Hikayenin temasıyla doğrudan alakalı değiller, notlara koydum

Wi-Fi izlemeSon beş yıldır özellikle federal perakende zincirleri arasında moda olan bir konu. Ticaret katlarında yavaşça dolaşıyorsunuz ve Wi-Fi açık olan cep telefonunuz, ağın bir iş parçacığına "yapışmak" amacıyla düzenli olarak, hesaplamak için analiz edilebilecek olan Araştırma İsteği paketleri gönderiyor. siz: bu mağazaya ne sıklıkta geliyorsunuz, hangi nedenlerle, rotalar boyunca yürüyorsunuz vb. Daha sonra veriler toplanır, analiz edilir, ısı haritaları çizilir ve yöneticiler bu tür resimler için yönetimden veya yatırımcılardan "gasp" eder. Eh, şimdilik.... “Para yok ama dayan...” ve sonucun (gerçek) zaten gösterilmesi gerekiyor, eski güzel şarkı başlıyor: “Evet, evet, o zaman elbette biz cis'i ve istediğiniz her şeyi kuracağız, ancak şimdi Müşteriye sonucu göstermemiz gerekiyor! Bu arada, Müşterinin ekipmanlarımızı Wi-Fi aracılığıyla kendi erişim noktasına bağlamamıza izin verdiğini söylemeyi unuttuk, ancak genel olarak sanki misafir müşterilermişiz gibi." Ve bu yüzden dengeleme yönlendiricileri yapmalıyız - birkaç WiFi alt arayüzü yükseltilir, bunlardan biri sıcak noktaya yapışır ve ikincisi çevreyi izler, tcpdump sonucunu çılgınca kendisine yükler, ardından dosyanın içeriğini bir arşive paketler ve riskler oluşturur "aşırı yemekten" ölmek üzere olan kişi, FTP sunucusundaki içeriği tükürmeye çalışır. Dengeleme yönlendiricisinin sıklıkla "bozulması" ve bir şekilde uzaktan "canlandırılması" gerekmesi şaşırtıcı değildir.

yarıçapBuradaki durumu müşteriden gelen şu ifadeye benzer bir ifadeyle anlatmak daha kolaydır: “Modeli önceden bilinmeyen, ancak hangisini henüz bilmediğimiz ekipmanlar üzerinde kanallar aracılığıyla çalışacak, merkezi olmayan bir erişim noktaları ağı istiyoruz. Ah, söylemeyi unuttuk, müşterilerimize yalnızca reklam göstermek değil, aynı zamanda erişim noktasının kurulu olduğu konumdaki her şeyi analiz etmek istiyoruz. Hayır, nedenini henüz bilmiyoruz ama çözeceğiz, şüpheniz olmasın, bu fikri biz ortaya atabildik.”

Ve daha önce bilinmeyen pek çok durum nedeniyle, yönlendiriciye doğrudan IP: bağlantı noktası üzerinden bağlanamadığımızda ve ondan gelen etkinliği beklemek zorunda kaldığımızda kontrolün standart olmayan koşullarda yapılması gerektiğini unutmamalıyız. Kendimizi özetlersek, sunucu ile yönlendirici arasındaki diyalog şu şekilde temsil edilebilir:

  • Router: Merhaba. Ben filanca yönlendiriciyim, benim için herhangi bir görev var mı?
  • Sunucu: yönlendirici falan falan, seni kaydettim, yaşıyorsun. İşte zorluk şu: ifconfig komutunun sonucunu bana göster?
  • Router: Merhaba. Ben falanca yönlendiriciyim, en son ifconfig sonucunu göstermeyi istediğinde, işte burada. Benim için herhangi bir görev var mı?
  • Sunucu: yönlendirici falan falan, seni kaydettim, yaşıyorsun. Sizin için hiçbir görev yok.

En ilginç soru: Uzak bir yönlendirici belirli miktarda bilgiyi nasıl gönderebilir? Son bölümde, sınırlı kaynaklar nedeniyle yönlendiricinin yalnızca "sadeleştirilmiş" bir wget'e sahip olduğunu, yalnızca GET aracılığıyla çalıştığını ve başka hiçbir şey yapmadığını, FTP istemcisi veya curl olmadığını anlatmıştım. Daha doğrusu, görüntü birleştirmenin özelliklerinden bağımsız olarak evrensel bir yönteme ihtiyacımız var. Wget kullanmaya karar verdim. Daha doğrusu, nasıl "durdum" - başka seçeneğim yoktu :)

Sadece bir sorumluluk reddi beyanıYönetim çözümüm çalışıyor, çok sınırlı değil ve müşterilerimin çoğuna uygun olsa bile çarpık olduğundan eminim. Bunu nasıl akıllıca yapabilirsiniz - POST ikili verilerini 80 numaralı bağlantı noktası üzerinden gönderen küçük bir yardımcı program yazın. Bunu (yardımcı program) yönlendirici donanım yazılımına ekleyin ve ona bash kullanarak erişin. Ancak gerçek şu ki: a) hızlı bir şekilde yapmamız gerekiyor b) muhtemelen her şeyi mevcut "yönlendiriciler hayvanat bahçesinde" yapmamız gerekiyor c) "zarar verme!" — Yönlendirici çalışıyorsa ve başka görevler gerçekleştiriyorsa, mevcut işlevselliği etkilemeyecek değişiklikler yapmaya çalışın.

Uygulamaya geçelim. Diyelim ki müşteriniz, "fare tıklamasıyla" yönlendiriciyi zabbix'ten kolay ve doğal bir şekilde yeniden başlatmak istiyor. Bugün Zabbix ile uygulamayı anlatmaya başlayacağız.
“Yönetim” -> “Komut Dosyaları” menüsüne yeni bir komut dosyası ekleyin. Biz buna “Yeniden Başlat” diyoruz, komut olarak “php /usr/share/zabbix/reboot.php {HOST.HOST}” girin

Port 80 üzerinden Linux/OpenWrt/Lede cihazlarının uzaktan izlenmesi ve kontrolü, devamı

Sonraki: Menü “İzleme” -> “En son veriler” -> “İstenen ağ düğümüne sağ tıklayın.” Betiği ekledikten sonra menünüz böyle görünecek.

Port 80 üzerinden Linux/OpenWrt/Lede cihazlarının uzaktan izlenmesi ve kontrolü, devamı
Buna göre,boot.php scriptini /usr/share/zabbix dizinine koyuyoruz (sizinki farklı olabilir, ben zabbixa kök dizinini kullanıyorum).

Güvenlik Sorumluluk Reddi BeyanıKomut dosyasındaki açıklamayı daha net hale getirmek için yalnızca yönlendirici kimliğini kullanıyorum, şifreyi kullanmıyorum. Üretim versiyonunda bunu yapmanız önerilmez! Bunu neden yaptım: Çünkü asıl soru, yönlendiricilerin şifrelerinin nerede saklanacağıdır? Zabbixe'in kendisinde "envanter verileri" mi var? Tartışmalı uygulama. Alternatif olarak: yeniden başlatma.php dosyasının kendisine harici erişimi kısıtlayın

Dosya yeniden başlatma.php

<?php
	// присваиваем параметры с консоли переменным
	$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");
			
	// "Отправляем" команду reboot за счет изменения поля task таблицы users. В поле task можно отправлять любую команду.
	$sql_users=$conn->prepare("UPDATE users SET task='reboot' WHERE id=? AND status='active';");
	$sql_users->bind_param('s', $user);
	$sql_users->execute();
	$sql_users->close();
?>

Bu kadar. Soru hala açık: "Cihazdan bir komutun yürütülmesi sonucunun nasıl elde edileceği." Örnek olarak ifconfig komutunu kullanarak göreve bakalım. Bu komut cihaza gönderilebilir:

message=`ifconfig`; wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password!&m=$message" -O /tmp/out.txt

, nerede:
mesaj=`ifconfig` — ifconfig komutunun çıktısının sonucunu $message değişkenine atarız
"xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php — yönlendiricileri kaydeden ve onlardan mesaj alan a.php betiğimiz
u=kullanıcı&p=şifre!&m=$mesaj — kimlik bilgileri ve istek değişkeninin değeri m — $message değişkeninin içeriğini atar
-O /tmp/out.txt — bu durumda /tmp/out.txt dosyasına çıktıya ihtiyacımız yok, ancak bu parametre belirtilmezse wget çalışmaz

Bu neden işe yaramıyor?Çünkü bu potansiyel bir güvenlik açığıdır. Oluşabilecek en zararsız hata örneğin komut çıktısında “&” karakterinin bulunmasıdır. Bu nedenle hem yönlendiricilerden gönderilen her şeyi hem de sunucuya gelen her şeyi filtrelemek gerekir. Evet, gerçekten utanıyorum. Savunmamda, yalnızca makalenin tamamının önceden tanımlanmış ürün yazılımı ve önceden tanımlanmamış iletişim kanallarına sahip yönlendiricilerin nasıl yönetileceğine ayrıldığını yazabilirim.

Gelecek için bir başlangıç: Sunucuya gelen sonuçları (örneğin, bir komutun yürütülmesinin sonucunu) yansıtmak için standart zabbix araçlarının nasıl kullanılacağını henüz anlamadım.

Tüm kaynakların Git deposundan alınabileceğini hatırlatmak isterim: github.com/BazDen/iotnet.online.git

Kaynak: habr.com

Yorum ekle