Aller au contenu

Exercice 3 — Exposer un serveur web sur le VLAN public

Objectif

Brancher un conteneur sur le VLAN public du collège, lui donner une vraie adresse IP routée sur Internet, et y faire tourner un serveur web joignable de l'extérieur.

Prérequis

  • L'exercice 2 terminé : vous savez ce que fait un VLAN Tag.
  • Le gabarit Debian 13 standard disponible dans le stockage local.
  • Le numéro de votre serveur, noté # partout dans ce document. Pour le serveur S10, # vaut 10.

Ce qui passe vraiment dans votre câble

Dans les deux exercices précédents, vous avez fabriqué un VLAN de toutes pièces dans un switch virtuel qui n'existait que dans votre hôte Proxmox. Dans cet exercice, on utilisera un VLAN existant dans le réseau du collège, qui est routé sur Internet. Le switch physique de la salle des serveurs (ToR) est configuré pour accepter deux VLAN sur le même câble, et c'est exactement ce que vous allez faire.

Si vous aviez accès à la configuration du switch ToR, vous verriez que le port de votre serveur est configuré comme ceci (admettons que votre serveur est branché dans le port Gi1/0/13 de la switch ToR) :

Texte
sw-tor-rack-13> show vlan brief
VLAN Name                                        Status    Ports
700  interne-salle-serveurs-10-70-0-0            active    
460  publiques-salle-serveurs-206-167-46-0       active
Texte
sw-tor-rack-13> show interface trunk
Port        Mode         Encapsulation  Status        Native vlan
Gi1/0/13    on           802.1q         trunking      700
Port        Vlans allowed on trunk
Gi1/0/13    460,700
Port        Vlans allowed and active in management domain
Gi1/0/13    460,700
Port        Vlans in spanning tree forwarding state and not pruned
Gi1/0/13    460,700 

Le port de switch où arrive votre câble est un port trunk. Ça veut dire qu'il transporte deux VLAN en même temps sur le même câble :

VLAN À quoi il sert Étiquette Sous-réseau
700 Réseau interne de la salle des serveurs natif, donc sans étiquette 10.70.0.0/16
460 Adresses IP publiques étiqueté 206.167.46.0/24

Le VLAN natif, c'est celui dont le switch enlève l'étiquette avant d'envoyer la trame dans le câble. Votre serveur reçoit donc du trafic Ethernet tout ce qu'il y a de plus normal, sans avoir besoin de savoir que les VLAN existent.

C'est pour ça que Proxmox s'est installé et a obtenu son adresse 10.70.44.# sans que vous ayez jamais entendu parler de VLAN jusqu'ici. Le trafic de gestion, c'est justement celui qui n'a pas d'étiquette.

Ce VLAN est réellement sur Internet

Les adresses du VLAN 460 sont joignables depuis n'importe où dans le monde, et les ports 22, 80 et 443 y sont ouverts. Tout ce que vous démarrez là-dessus est visible du monde entier, dès la seconde où vous le démarrez.

Étape 1 — Regarder la configuration du bridge avant de le modifier

Ouvrez le Shell du nœud.

Bash
bridge vlan show dev nic0

Un seul VLAN apparaît sur nic0, le VLAN 1 en PVID Egress Untagged

Un seul VLAN. Pourtant, les trames étiquetées 460 arrivent bel et bien dans le câble. Le bridge les jette, tout simplement parce qu'il n'est pas en mode VLAN aware et qu'il ne sait pas quoi en faire.

Étape 2 — Activer le mode VLAN sur vmbr0

Allez dans System > Network, sélectionnez vmbr0 et cliquez sur Edit. Cochez VLAN Aware.

La fenêtre d'édition de vmbr0 avec la case VLAN Aware cochée

Vous touchez au bridge qui porte l'adresse de gestion

Le bridge est reconstruit. En pratique les sessions ouvertes tiennent le coup, mais faites cette modification depuis l'interface web, et pas au milieu d'une opération longue.

Étape 3 — Appliquer la configuration

Cliquez sur Apply Configuration et confirmez.

Proxmox ajoute au passage la ligne bridge-vids 2-4094, qui autorise absolument tous les numéros de VLAN sur le bridge.

Étape 4 — Ne garder que le VLAN dont vous avez besoin

Vous n'avez besoin que d'un seul VLAN étiqueté. Ce réglage n'existe pas dans l'interface web : il faut passer par l'API ou éditer le fichier à la main. Faites-le depuis le Shell du nœud.

Bash
nano /etc/network/interfaces

Dans le bloc vmbr0, remplacez bridge-vids 2-4094 par :

INI
    bridge-vids 460

Puis appliquez :

Bash
ifreload -a

Pourquoi s'embêter ? Parce qu'un bridge qui n'accepte que ce dont il a besoin ne laissera jamais passer un VLAN par accident, par exemple à cause d'un tag mal tapé sur une VM. C'est le même raisonnement qu'une règle de pare-feu : on autorise ce qu'on veut, plutôt que de tout laisser ouvert.

Étape 5 — Vérifier le résultat

Relisez le fichier :

Bash
cat /etc/network/interfaces

Le bloc vmbr0 contient bridge-vlan-aware yes et bridge-vids 460

Puis la table du switch :

Bash
bridge vlan show dev nic0

nic0 porte maintenant le VLAN 1 en PVID Egress Untagged, plus le VLAN 460 en dessous

Voilà à quoi ressemble un port trunk vu du côté serveur : un VLAN sans étiquette, qui est le natif, et un VLAN étiqueté par-dessus.

Vous remarquerez que le VLAN 700 n'apparaît nulle part. C'est logique : son trafic arrive sans étiquette, donc il tombe dans le PVID 1, comme n'importe quelle trame anonyme.

Étape 6 — Créer le conteneur web

Cliquez sur Create CT. Les valeurs générales sont celles de l'exercice 1, avec ces différences :

Onglet Champ Valeur
General CT ID 210
General Hostname web-public
DNS DNS servers 9.9.9.9

À l'onglet Network :

Champ Valeur
Bridge vmbr0
VLAN Tag 460
IPv4 Static
IPv4/CIDR 206.167.46.#/24
Gateway (IPv4) 206.167.46.1

L'onglet Network avec le bridge vmbr0, le VLAN Tag 460, l'adresse publique et la passerelle

Notez bien : ce conteneur est branché sur le même bridge que l'adresse de gestion de votre serveur. C'est seulement le tag 460 qui l'envoie dans un autre réseau, avec un autre plan d'adressage.

Étape 7 — Démarrer et vérifier l'adresse

Démarrez le conteneur, ouvrez sa Console et connectez-vous.

Bash
ip -brief addr show eth0
Bash
ip route

eth0 porte l'adresse publique, et la table de routage contient une ligne default via 206.167.46.1

Cette fois il y a une ligne default. C'est la route par défaut, celle qui manquait aux conteneurs des exercices précédents : elle dit où envoyer tout ce qui n'est pas dans le réseau local.

Étape 8 — Joindre la passerelle

Bash
ping -c 2 206.167.46.1

La passerelle répond au ping

Une réponse, même une seule sur deux, suffit pour valider l'étape. Les équipements de bordure limitent souvent le nombre de réponses ICMP qu'ils acceptent de produire, donc une perte sur un si petit échantillon n'a rien d'inquiétant.

Étape 9 — Joindre Internet

Bash
ping -c 2 9.9.9.9

Les deux pings vers 9.9.9.9 répondent en environ 1 milliseconde, 0% packet loss

Une milliseconde jusqu'à un serveur DNS public, qui est à l'extérieur du réseau du collège.

Étape 10 — Installer nginx

Bash
apt-get update
Bash
apt-get install -y nginx

Vérifiez que le service tourne :

Bash
systemctl is-active nginx

La commande répond active

Étape 11 — Mettre votre propre page

Bash
echo "<h1>Serveur web vlan 460 sur serveur S#</h1>" > /var/www/html/index.nginx-debian.html

Étape 12 — Faire la liste de ce qui écoute

Bash
ss -tlnp

Le port 80 est en écoute pour nginx et le port 22 pour sshd

Deux ports ouverts sur une machine que le monde entier peut joindre. Vous n'avez décidé ni l'un ni l'autre : le 80 est arrivé avec le paquet nginx, le 22 était déjà là dans le gabarit. C'est comme ça que la plupart des services se retrouvent exposés sans que personne ne l'ait voulu.

Étape 13 — Appeler le serveur depuis votre poste

Sortez de la console et ouvrez un navigateur sur votre poste, à l'adresse http://206.167.46.#.

Le navigateur affiche le titre de la page servie par le conteneur, avec l'adresse publique dans la barre d'adresse

Étape 14 — Prouver que l'adresse est vraiment publique

Une page qui répond depuis un poste du collège, ça ne prouve rien : le trafic pourrait très bien rester à l'intérieur du réseau. Il faut vérifier quelle adresse Internet voit quand votre conteneur sort.

Depuis la console du conteneur :

Bash
apt-get install -y curl
Bash
curl https://api.ipify.org

La commande renvoie exactement l'adresse publique configurée sur le conteneur

Ce service renvoie l'adresse d'où vient la requête, telle qu'elle lui arrive. C'est exactement celle que vous avez configurée sur la carte. Donc personne n'a réécrit votre adresse en chemin : il n'y a pas de NAT, votre conteneur est directement sur Internet.

Comparez avec le conteneur 201 de l'exercice 1, qui n'a même pas de route par défaut.

Question 1

L'adresse de gestion est dans le VLAN 700 et le conteneur dans le VLAN 460. Pourquoi la configuration de vmbr0 ne parle-t-elle jamais du VLAN 700 ?

  • a) Proxmox le devine à partir de l'adresse 10.70.44.#.
  • b) Le VLAN 700 est le VLAN natif du trunk : ses trames arrivent sans étiquette.
  • c) Le VLAN 700 est configuré dans le firmware de la carte réseau.
Voir la réponse **b) Le VLAN 700 est le VLAN natif du trunk : ses trames arrivent sans étiquette.** Le switch physique enlève l'étiquette du VLAN natif avant d'envoyer la trame. Votre serveur reçoit donc du trafic Ethernet ordinaire, qu'il range dans le PVID 1 de son bridge. Il n'y a rien à configurer pour ça, et c'est pour cette raison que l'installation de Proxmox a fonctionné du premier coup. Le choix a) prend le problème à l'envers. C'est le switch qui décide du VLAN, en fonction du port où vous êtes branché. L'hyperviseur n'a pas son mot à dire : vous pourriez mettre n'importe quelle adresse sur `vmbr0`, vous resteriez dans le VLAN 700.

Question 2

Vous avez remplacé bridge-vids 2-4094 par bridge-vids 460. Qu'est-ce que ça change concrètement ?

  • a) Le nœud ne peut plus utiliser le VLAN 700 pour sa gestion.
  • b) Une VM taguée avec un autre VLAN que 460 n'aura aucun réseau.
  • c) Le bridge ne peut plus traiter qu'un VLAN à la fois.
Voir la réponse **b) Une VM taguée avec un autre VLAN que 460 n'aura aucun réseau.** Le bridge jette les trames des VLAN qu'il n'a pas dans sa liste. Une VM taguée en 999 enverrait dans le vide, sans le moindre message d'erreur, et n'aurait jamais de réponse. Le symptôme ressemble beaucoup à un câble débranché, ce qui rend la panne pénible à diagnostiquer. Le choix a) est tentant, puisque 700 n'est effectivement pas dans la liste. Mais le trafic de gestion arrive **sans étiquette** et tombe dans le PVID 1, qui existe de toute façon. La liste `bridge-vids` ne concerne que les trames qui portent une étiquette.

Une machine publique, ce n'est pas une machine de labo

Les conteneurs des exercices 1 et 2 étaient injoignables de l'extérieur. Celui-ci ne l'est pas, et la différence tient à un champ de quatre caractères.

Un mot de passe de labo ne protège pas une machine publique

Les robots qui essaient des mots de passe sur le port 22 trouvent une nouvelle adresse publique en quelques heures. abc.123 ne tiendra pas.

Sur une machine du VLAN 460 :

  • Le gabarit Debian refuse par défaut la connexion root par mot de passe. La commande sshd -T affiche permitrootlogin without-password, ce qui vous protège justement de ce genre de robot. Ne changez pas ce réglage. Refus de login root avec mot de passe

  • Tout service que vous installez devient un service exposé. Prenez l'habitude de faire ss -tlnp avant de quitter la machine.

Nettoyage

Le conteneur 210 occupe une adresse publique, et il reste exposé tant qu'il tourne. S'il ne vous sert plus, arrêtez-le et détruisez-le plutôt que de le laisser tourner sans surveillance.