Passer au contenu

Vérifier n’importe quel service avec envoi/attente

Frappez à un port et guettez la réponse que seul le vrai service donne. Comment trouver cette réponse pour tout ce qui parle TCP, avec des réglages éprouvés pour SSH, FTP, le courriel, Memcached, ZooKeeper, NATS, MQTT et bien d’autres.

Vérifications que vous ajouterez
TCP envoi/attente TCP envoi/attente (agent)
L’agent
Agent facultatif
Écrit pour
Tout système

Ce que vous saurez

  • Le service sur le port est bien celui que vous croyez, et il répond. Gryphon se connecte, dit quelque chose au besoin, et attend un texte que seul ce service renverrait.
  • Ce n’est pas qu’un socket ouvert. Une simple vérification de port réussit dès que la connexion s’ouvre. Le système d’exploitation peut accepter la connexion pour un programme figé : un serveur de courriel bloqué a donc encore l’air d’aller. L’envoi/attente exige que le programme lui-même réponde.

Ce que cela ne peut pas vous dire : quoi que ce soit au-delà du premier échange. Elle n’ouvre pas de session, n’envoie pas de message et ne lance pas de requête. Pour cela, utilisez une vérification par script, qui peut faire tout ce que peut faire une commande.

Fonctionnement

À chaque exécution de la vérification, Gryphon :

  1. se connecte au port, et effectue d’abord une poignée de main TLS si vous le demandez ;
  2. écrit le contenu de Envoyer, s’il y en a un ;
  3. lit la réponse, pendant au plus 10 secondes et jusqu’aux 4 premiers Ko, en y cherchant le contenu de Attendre.

Si le texte arrive, la vérification est en bon état. Une mauvaise réponse, le silence, une connexion fermée ou refusée, ou une poignée de main ratée est un problème. Le message dit ce qui est revenu : c’est le moyen le plus rapide de corriger un mauvais réglage.

Il y a deux sortes de services, et la sorte décide de ce qui va dans Envoyer :

  • Les services qui parlent en premier saluent chaque connexion avant qu’elle ne dise quoi que ce soit : SMTP, SSH, FTP, IMAP, POP3 et NATS. Laissez Envoyer vide et attendez le message d’accueil.
  • Les services qui attendent qu’on leur parle ne disent rien tant que le client n’a rien dit : Memcached, ZooKeeper, Beanstalkd, RabbitMQ et les courtiers MQTT. Mettez une requête inoffensive dans Envoyer et attendez sa réponse.

Avant de commencer

  • La machine, ajoutée comme hôte dans Gryphon, et le port sur lequel le service écoute.
  • Si le port est ouvert sur Internet, la vérification n’a besoin de rien d’autre : c’est TCP envoi/attente. S’il n’est joignable qu’à l’intérieur de votre réseau, installez-y l’agent Gryphon et utilisez TCP envoi/attente (agent), qui a un champ Hôte pour l’adresse à laquelle l’agent doit se connecter.
  • Un terminal sur n’importe quelle machine qui peut joindre le port, pour voir ce que dit le service.

Si votre service figure dans les réglages tout faits ci-dessous, vous pouvez passer directement à l’étape 3.

Étapes

1Voir ce que dit le service

Connectez-vous à la main et regardez. Sous Linux ou sur un Mac, nc montre un service qui parle en premier. Laissez-lui quelques secondes, et il affiche le message d’accueil :

Un service qui parle en premier
nc -w 3 mail.example.com 25
Ce qui est revenu
220 mail.example.com ESMTP Postfix

Pour un service qui attend, envoyez la requête et regardez la réponse. \r\n termine la ligne :

Un service qui attend qu’on lui parle
printf 'version\r\n' | nc -w 3 cache.internal 11211
Ce qui est revenu
VERSION 1.6.45

Pour un port qui parle TLS dès le premier octet, comme 993 ou 995, utilisez plutôt openssl :

Un port TLS
openssl s_client -quiet -connect mail.example.com:993 < /dev/null

Sous Windows, PowerShell peut faire de même. Changez l’adresse et le port, ainsi que la requête s’il en faut une :

PowerShell
$c = New-Object Net.Sockets.TcpClient('cache.internal', 11211)
$s = $c.GetStream(); $s.ReadTimeout = 3000
$send = [Text.Encoding]::ASCII.GetBytes('version' + [char]13 + [char]10)
$s.Write($send, 0, $send.Length)
$b = New-Object byte[] 4096
[Text.Encoding]::ASCII.GetString($b, 0, $s.Read($b, 0, $b.Length))
$c.Close()

Pour un service qui parle en premier, retirez les deux lignes qui construisent et écrivent $send.

2Choisir le texte à attendre

Choisissez quelque chose de court que ce service dit toujours, et qu’aucun autre ne dirait :

  • Bon choix : le début du message d’accueil ou de la réponse, comme 220, SSH-, * OK ou VERSION.
  • Évitez les numéros de version et les noms d’hôte. VERSION 1.6.45 cesse de correspondre à la prochaine mise à niveau, et la vérification devient un problème sans raison.
  • Respectez la casse. ssh- ne correspond pas à SSH-2.0-OpenSSH.

3Ajouter la vérification

Ouvrez l’hôte, allez dans Services, choisissez Ajouter le service, puis TCP envoi/attente. Celle-ci surveille SSH de l’extérieur :

Ajouter : TCP envoi/attente Services → Ajouter le service
Nom
SSH
Port
22
TLS
none
Envoyer (facultatif)
vide — SSH parle en premier
Attendre
SSH-
Intervalle de vérification
Fréquence 3 Minutes

Celle-ci surveille Memcached sur une adresse privée, par l’agent. Choisissez plutôt TCP envoi/attente (agent) :

Ajouter : TCP envoi/attente (agent) Services → Ajouter le service
Nom
Cache de sessions
Hôte
10.0.0.12 — telle que l’agent la joint
Port
11211
TLS
none
Envoyer (facultatif)
version\r\n
Attendre
VERSION
Intervalle de vérification
Fréquence 3 Minutes

Les champs, un par un

  • TLS :
    • none est du TCP simple.
    • tls effectue d’abord une poignée de main TLS et exige un certificat de confiance émis pour l’adresse, comme le ferait un navigateur.
    • tls-no-verify effectue la poignée de main mais accepte n’importe quel certificat, pour un service interne au certificat autosigné.
    Ne choisissez tls que pour un port qui parle TLS dès le tout premier octet. Un port qui commence en texte clair et passe à TLS plus tard, comme SMTP sur 25 ou 587, est none.
  • Envoyer est écrit une seule fois, dès que la connexion est ouverte. Écrivez les caractères spéciaux sous forme de séquences d’échappement. Les espaces au début ou à la fin de l’un ou l’autre champ sont supprimées : écrivez donc une espace à ces endroits sous la forme \x20.
  • Attendre accepte les mêmes séquences d’échappement. Omettez la fin de ligne : le texte n’a qu’à apparaître quelque part dans la réponse.
ÉcrivezPour
\r\nLa fin de ligne que la plupart des protocoles texte veulent après une commande
\nUn simple saut de ligne
\tUne tabulation
\0Un octet nul
\xHHN’importe quel octet, en hexadécimal : \x20 est une espace, \x00 un zéro
\\Une barre oblique inverse

Réglages tout faits

Chaque ligne a été testée contre un vrai serveur. Utilisez le port par défaut du service, à moins que le vôtre n’écoute ailleurs.

ServicePortTLSEnvoyerAttendre
SSH, SFTP22none—SSH-
FTP21none—220
SMTP, soumission25, 587none—220
IMAP143none—* OK
IMAP sur TLS993tls—* OK
POP3110none—+OK
POP3 sur TLS995tls—+OK
NATS4222none—INFO {
Memcached11211noneversion\r\nVERSION
ZooKeeper2181noneruokimok
Beanstalkd11300nonestats\r\nOK
RabbitMQ (AMQP)5672noneAMQP\x00\x00\x09\x01RabbitMQ
MQTT (Mosquitto et autres)1883none\x10\x0c\x00\x04MQTT\x04\x02\x00\x3c\x00\x00\x20\x02
  • ZooKeeper ne répond à ruok que si c’est permis : 4lw.commands.whitelist=ruok dans zoo.cfg, ou ZOO_4LW_COMMANDS_WHITELIST=ruok pour l’image Docker. Sinon, il répond que ruok n’est pas dans la liste autorisée, et ferme la connexion.
  • RabbitMQ : l’envoi est le début d’une connexion AMQP 0-9-1, et RabbitMQ se nomme dans sa réponse. Il journalise chaque fois un avertissement au sujet d’un client qui a fermé sa connexion. Le guide RabbitMQ va plus loin.
  • MQTT : l’envoi est une requête de connexion MQTT 3.1.1 minimale, et \x20\x02 est le début de la réponse du courtier. Un courtier qui refuse les clients anonymes répond quand même avant de fermer la connexion : cela fonctionne donc dans les deux cas.
  • Courriel sur TLS : avec un certificat autosigné, choisissez tls-no-verify. Le guide du serveur de courriel traite aussi des certificats et de l’enregistrement MX.

Faire un essai

  1. Utilisez Vérifier maintenant sur la nouvelle vérification. Un résultat en bon état nomme le texte trouvé et le temps qu’a pris la réponse, par exemple answered with "SSH-" in 13ms.
  2. Arrêtez le service, ou pointez la vérification vers un port où rien n’écoute. Elle devient un problème. Gryphon revérifie chaque minute dès qu’une vérification échoue, et alerte quand trois résultats de suite concordent : prévenez donc d’abord ceux qui reçoivent les alertes.

Quand ça ne va pas

Le message cite ce que le service a renvoyé : la plupart des corrections s’y copient donc telles quelles.

  • did not answer with "VERSION" within 10s; got nothing. Le service attend la suite de votre requête. Ajoutez \r\n à la fin de Envoyer.
  • did not answer with "* OK" within 10s; got nothing, sur un port comme 993, 995 ou 465. Le port parle TLS, mais pas la vérification. Réglez TLS à tls.
  • did not answer with "ssh-" within 10s; got "SSH-2.0-OpenSSH_10.3\r\n". Le service a répondu, mais pas avec le texte attendu. Copiez le bon texte à partir de la réponse.
  • TLS handshake failed. Le certificat n’est pas de confiance ou n’est pas émis pour l’adresse. Utilisez tls-no-verify pour un certificat autosigné, et surveillez son expiration avec une vérification Certificat SSL sur le même port.
  • closed the connection without answering. Le service a refusé la requête, et ce qui est revenu dit généralement pourquoi : ZooKeeper répond ruok is not executed because it is not in the whitelist.
  • connection refused. Rien n’écoute sur ce port, ou un pare-feu rejette Gryphon. Les vérifications faites de l’extérieur viennent des adresses de la page des emplacements de vérification.

Quand utiliser autre chose

  • Sites Web et API : Surveiller une page Web, ou HTTP (agent) et HTTPS (agent). Elles parlent HTTP correctement, suivent les redirections et jugent les codes d’état. Voyez points d’accès de santé.
  • PostgreSQL, MariaDB, MySQL et Redis : Gryphon a des vérifications qui leur sont propres et qui n’exigent aucune poignée de main écrite à la main.
  • Ouvrir une session, lancer une commande ou lire un nombre : une vérification par script.
  • Seulement savoir si le port est ouvert : Port TCP, qui se connecte, sans plus.
  • Services UDP : ces vérifications ne parlent que TCP. DNS a sa propre vérification ; pour le reste, utilisez un script.

Ce n’est pas ce que vous exploitez ? Parcourez tous les guides, ou dites-nous ce que vous devez surveiller et nous rédigerons le guide.

Quatorze jours gratuits. Puis à partir de $4.99 par mois.

L’agent, le tableau de bord, les applications et toutes les vérifications sauf les cinq pour Kubernetes font partie de chaque forfait. Les forfaits diffèrent par la quantité que vous surveillez, la fréquence, la provenance des vérifications, et le nombre de personnes et de pages d’état qu’ils comprennent. Comparer les forfaits. Annulez quand vous voulez.