Bonjour à tous, c'est ma première expérience sur Habré. Je veux écrire sur la façon de gérer un équipement réseau non standard dans un réseau externe. Qu'est-ce que cela signifie non standard: dans la plupart des cas, pour contrôler l'équipement d'un réseau externe, vous devez:
- L'adresse IP publique. Eh bien, ou si l'équipement est situé derrière le NAT de quelqu'un, alors l'adresse IP publique et le port "retransmis".
- Le tunnel (PPTP / OpenVPN / L2TP + IPSec, etc.) vers le nœud central par lequel il serait accessible.
Par conséquent, vous aurez besoin de mon vélo lorsque les méthodes standard ne vous conviennent pas, par exemple:
- L'équipement est situé derrière le NAT et, à part le http habituel (port 80), tout est fermé. La situation est tout à fait normale pour les grands réseaux d'entreprises fédérales. Enregistrez les ports - ils peuvent, mais pas immédiatement, pas rapidement et pas pour vous.
- Canal de communication instable et / ou «étroit». Basse vitesse, perte constante. Douleur et frustration en essayant d'organiser un tunnel.
- Un canal de communication coûteux, où chaque mégaoctet compte. Par exemple, les communications par satellite. Plus de gros retards et une bande "étroite".
- La situation où vous devez "jongler" avec un grand nombre de petits routeurs, sur lesquels, d'une part, OpenWrt / Lede est installé pour étendre les capacités, et d'autre part, les ressources (mémoire) du routeur sont loin d'être suffisantes.
Notez le nombre de foisEt qu'est-ce qui empêche l'installation d'une clé USB du routeur et l'extension de la mémoire du routeur?
Le plus souvent, les exigences relatives au coût de la solution dans son ensemble, mais parfois le facteur de forme joue également un rôle clé. Par exemple, TP-Link ML3020 est sur l'objet, son seul port USB est utilisé pour un modem 2G / 3G, tout cela est enveloppé dans un fil avec un petit boîtier en plastique et placé quelque part haut, haut (sur le mât), loin, loin (dans à 30 km de la station de base la plus proche d'un opérateur mobile). Oui, vous pouvez brancher un concentrateur USB et augmenter le nombre de ports, mais l'expérience a montré que cela est lourd et peu fiable.
J'ai donc essayé de vous décrire ma situation typique: «quelque part loin, très loin, il y a un routeur très important, solitaire et petit qui tourne sous Linux. Il est important de savoir au moins une fois par jour qu'il est «vivant» et, si nécessaire, des commandes lui ont été envoyées, par exemple, «soleil, redémarre!»
Passons à l'implémentation:
1) Côté routeur, cron toutes les 5/10/1440 minutes, ou chaque fois que vous devez envoyer une requête http au serveur à l'aide de wget, enregistrez le résultat de la requête dans un fichier, rendez le fichier exécutable et exécutez-le.
Ma ligne en cron ressemble à ceci:
Fichier / 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
où:
xn - 80abgfbdwanb2akugdrd3a2e5gsbj.xn - p1ai - le domaine de mon serveur. Je noterai tout de suite: oui, vous pouvez également spécifier une adresse IP de serveur spécifique, nous l'avons déjà fait, alors que notre état, dans une explosion de lutte juste, ne me semblait plus - n'a pas bloqué l'accès à la part du lion des «nuages» de DigitalOcean et d'Amazon. Dans le cas de l'utilisation d'un domaine symbolique, lorsqu'un tel incident se produit, vous pouvez soulever calmement le cloud de sauvegarde, y rediriger le domaine et restaurer la surveillance des appareils.
a.php - le nom du script côté serveur. Oui, je sais qu'il est faux de nommer les variables et les noms de fichiers avec une seule lettre ... Je suggère que nous économisions quelques octets lors de l'envoi d'une demande :)
u - nom d'utilisateur, connexion au matériel
p - mot de passe
«-O /tmp/wa.sh» est le fichier sur le routeur distant où la réponse du serveur sera enregistrée, par exemple, la commande de redémarrage.
Remarque numéro deux:Ahhh, pourquoi utilisons-nous wget, pas curl, car grâce à curl, vous pouvez envoyer des requêtes https et non GET, mais POST? Ahhh, parce que comme dans la vieille blague "NE se glisse dans la cabane!". Curl comprend des bibliothèques de chiffrement d'environ 2 Mo, et grâce à cela, vous pourrez assembler une image pour un petit TP-LINK ML3020 par exemple. Et avec wget, s'il vous plaît.
2) Côté serveur (j'ai Ubuntu) nous utiliserons Zabbix. Pourquoi: je veux que ce soit beau (avec des graphiques) et pratique (envoyer des commandes via le menu contextuel). Zabbix a une si belle chose qu'un agent zabbix. Par l'intermédiaire de l'agent, nous appellerons le script php sur le serveur, qui renverra des informations indiquant si notre routeur a été enregistré dans le délai requis. Pour stocker des informations sur l'heure d'enregistrement, des commandes pour les appareils, j'utilise MySQL, une table d'utilisateurs distincte avec approximativement les champs suivants:
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;
Toutes les sources peuvent être extraites du référentiel Git à l'
adresse :
https://github.com/BazDen/iotnet.online.gitMaintenant les scripts PHP hébergés côté serveur (pour plus de commodité, vous pouvez les mettre dans le dossier / usr / share / zabbix /):
Fichier A.php:
<?php
Fichier Agent.php (c'est le script de l'agent zabbix appelé):
<?php
Eh bien, la dernière étape: prescrire un agent et ajouter des horaires.
Si vous n'avez pas encore installé l'agent zabbix, alors:
apt-get install zabbix-agent
Modification du fichier /etc/zabbix/zabbix_agentd.conf.
Ajoutez la ligne:
UserParameter=test,php /usr/share/zabbix/agent.php user password
où:
test est le nom de notre agent
"Php /usr/share/zabbix/agent.php mot de passe utilisateur" - le script appelé avec les données d'enregistrement de l'appareil.
Ajout de graphiques: ouvrez l'interface Web zabbix, sélectionnez dans le menu:
Paramètres -> Hôtes -> Créer un hôte. Il suffit de spécifier le nom d'hôte, son groupe, l'interface d'agent par défaut:

Nous devons maintenant ajouter un élément de données pour cet hôte. Faites attention à deux champs: la "clé" est exactement le paramètre que nous avons spécifié dans le fichier /etc/zabbix/zabbix_agentd.conf (dans notre cas, il s'agit de test), et l '"intervalle de mise à jour" - je fixe 5 minutes, car et l'équipement est enregistré sur le serveur toutes les cinq minutes.

Eh bien, ajoutez le calendrier. Je recommande de choisir «Remplir» comme style de dessin.

La sortie est quelque chose de très concis, par exemple comme ceci:

À la question raisonnable: «Cela en valait-il la peine?», Je répondrai: eh bien, bien sûr, voir les «raisons de créer un vélo» au début de l'article.
Si ma première expérience graphomane suscitera l'intérêt des lecteurs, alors dans les articles suivants je veux décrire comment envoyer des commandes à un équipement distant. Il a également été possible de mettre en œuvre l'intégralité du schéma pour les appareils basés sur RouterOS (Mikrotiks).