La caisse qui affiche connexion refusée
La caisse d'un magasin affiche un message rouge : connexion refusée. Le lecteur de cartes est allumé et son câble est bon.
Le message dit quelque chose de précis. La caisse a atteint la machine, et rien là-bas n'attendait sur cette porte.
Cette leçon apprend à lire les portes d'une machine, et la réponse d'un serveur web.
À la fin de cette leçon
Remarque
Je peux vérifier quels ports une machine écoute et lire une réponse web.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Port | un nombre qui désigne une porte d'une machine | 80 |
| À l'écoute | qui attend des connexions sur un port | |
| HTTP | le langage des requêtes et des réponses web | |
| Code d'état | un nombre à trois chiffres qui dit comment une requête s'est passée | 200 |
| En-tête | une ligne d'information en plus dans une requête ou une réponse |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un port est une porte de la machine
Une adresse trouve une machine. Un port trouve un programme sur elle. Un serveur web attend sur le port 80, et un autre programme attend sur un autre port.
Un programme qui attend sur un port est à l'écoute. La commande ss -ltn liste tous les ports à l'écoute : l pour listening, t pour TCP et n pour des nombres simples.
Lister ce que la machine LAN écoute
sudo ip netns exec lan ss -ltnAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lister ce que le serveur extérieur écoute
sudo ip netns exec srv ss -ltnAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Frapper à un port pour voir qui répond
Depuis une autre machine, nc -zv frappe à un port sans rien envoyer. Le z veut dire seulement vérifier, et v dire ce qui s'est passé.
Il affiche l'un de trois résultats, et le tableau ci-dessous dit ce que chacun signifie.
Frapper à un port ouvert
sudo ip netns exec gw nc -zv -w 2 10.0.0.2 80Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Frapper à un port où personne n'écoute
sudo ip netns exec gw nc -zv -w 2 10.0.0.2 9999Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple : lire un coup à la porte
| nc affiche | Ce que cela veut dire | Où regarder |
|---|---|---|
| succeeded | Un programme écoute | Le programme lui-même |
| Connection refused | La machine a répondu et personne n'écoute là | Le programme tourne-t-il, et sur quel port |
| timed out | Aucune réponse n'est revenue | Un pare-feu, ou une route qui échoue |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une réponse web a trois parties
Une requête web est du texte simple. La réponse aussi, en trois parties : une ligne de code d'état, des en-têtes, puis le corps.
Le code d'état dit comment cela s'est passé. Le premier chiffre donne la famille. Un 2 est un succès et un 3 un déplacement. Un 4 est une erreur de celui qui demande, et un 5 une erreur du serveur.
Lire une réponse entière, en-têtes d'abord
sudo ip netns exec gw curl --noproxy '*' -s -i -m 3 http://10.0.0.2/Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
N'afficher que le code d'état
sudo ip netns exec gw curl --noproxy '*' -s -o /dev/null -w '%{http_code}\n' http://10.0.0.2:8081/Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple : les familles de code d'état
| Code | Famille | En mots simples |
|---|---|---|
| 200 | 2xx | Cela a marché, et voici la page |
| 301 | 3xx | Cela a déménagé : demandez cette autre adresse |
| 404 | 4xx | Il n'y a rien à ce chemin |
| 503 | 5xx | Le serveur n'a pas pu le faire à l'instant |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Envoyer une requête à la main
printf 'GET /hello HTTP/1.0\r\n\r\n' | sudo ip netns exec gw nc -w 2 10.0.0.2 80Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
On croit souvent que le port 80 est le web et qu'aucun autre port ne peut l'être. Un port est un nombre que quelqu'un a choisi, et 80 n'est que le choix habituel pour HTTP. Le serveur extérieur parle HTTP sur le port 8000. Demandez ce qui écoute, puis posez-lui une question.
Pour aller plus loin : trouver le processus
Lancez sudo ip netns exec lan ss -ltnp et lisez la dernière colonne de chaque ligne. Elle nomme le programme qui tient le port.
Quel programme écoute sur le port 80 ? Est-ce le même processus que celui du 8081 ? En quoi cela vous aiderait-il quand un port est déjà pris ?