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 :
- se connecte au port, et effectue d’abord une poignée de main TLS si vous le demandez ;
- écrit le contenu de Envoyer, s’il y en a un ;
- 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 :
nc -w 3 mail.example.com 25
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 :
printf 'version\r\n' | nc -w 3 cache.internal 11211
VERSION 1.6.45
Pour un port qui parle TLS dès le premier octet, comme 993 ou 995, utilisez plutôt openssl :
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 :
$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-,* OKouVERSION. - Évitez les numéros de version et les noms d’hôte.
VERSION 1.6.45cesse 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 :
- 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) :
- 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 :
noneest du TCP simple.tlseffectue 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-verifyeffectue la poignée de main mais accepte n’importe quel certificat, pour un service interne au certificat autosigné.
tlsque 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, estnone. - 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.
| Écrivez | Pour |
|---|---|
\r\n | La fin de ligne que la plupart des protocoles texte veulent après une commande |
\n | Un simple saut de ligne |
\t | Une tabulation |
\0 | Un octet nul |
\xHH | N’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.
| Service | Port | TLS | Envoyer | Attendre |
|---|---|---|---|---|
| SSH, SFTP | 22 | none | — | SSH- |
| FTP | 21 | none | — | 220 |
| SMTP, soumission | 25, 587 | none | — | 220 |
| IMAP | 143 | none | — | * OK |
| IMAP sur TLS | 993 | tls | — | * OK |
| POP3 | 110 | none | — | +OK |
| POP3 sur TLS | 995 | tls | — | +OK |
| NATS | 4222 | none | — | INFO { |
| Memcached | 11211 | none | version\r\n | VERSION |
| ZooKeeper | 2181 | none | ruok | imok |
| Beanstalkd | 11300 | none | stats\r\n | OK |
| RabbitMQ (AMQP) | 5672 | none | AMQP\x00\x00\x09\x01 | RabbitMQ |
| MQTT (Mosquitto et autres) | 1883 | none | \x10\x0c\x00\x04MQTT\x04\x02\x00\x3c\x00\x00 | \x20\x02 |
- ZooKeeper ne répond à
ruokque si c’est permis :4lw.commands.whitelist=ruokdanszoo.cfg, ouZOO_4LW_COMMANDS_WHITELIST=ruokpour l’image Docker. Sinon, il répond queruokn’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\x02est 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
- 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.
- 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-verifypour 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.