dimanche 13 mars 2011

VLSM (Variable Length Subnetting Mask) et Supernetting

Prérequis

  • IPv4 et ses classes d'adresses
  • Subnetting avec CIDR (Classless Inter-Domain Routing)

Introduction

Je voulais faire une petite parenthèse sur le subnetting. Lors de mes études on m'avait appris le subnetting au travers de la notation CIDR (Classless Inter-Domain Routing). Le principe est simple mais on aboutit à un partage des sous-réseaux tout à fait régulier. Si vous avez un réseau de classe C et que vous le partagez selon ce principe simple vous aurez X sous-réseaux qui pourront adresser chacun Y machines. Le souci de cette approche c'est le gaspillage des adresses qui se fait d'autant plus ressentir qu'on dispose d'une plage d'adresse conséquente. Comprendre qu'on aura tendance à davantage ressentir le gaspillage sur un partage d'une plage de classe A que sur une plage de la classe C.
Si j'ai 200 utilisateurs en tout dans une organisation et qu'on lui attribue un réseau dans chacune des classes utiles voilà ce qui se passe :
  • Classe A : (2^24) - 2 = 16777216 - 2 = 16777214 adresses utilisables
    Soit 16777214 - 200 = 16777014 adresses gaspillées.
  • Classe B : (2^16) - 2 = 65536 - 2 = 65534 adresses utilisables
    Soit 65534 - 200 = 65334 adresses gaspillées.
  • Classe C : (2^8) - 2 = 256 - 2 = 254 adresses utilisables
    Soit 254 - 200 = 54 adresses gaspillées.
L'exemple est un peu extrême mais il illustre bien ce que j'évoquais juste avant. Sachant que si vous définissez des sous-réseaux ils auront tous la même taille.
Une organisation de 200 personnes peut très bien décider d'utiliser le réseau tel quel mais elle risque fort d'avoir des pertes conséquentes sur celui-ci car le domaine de collision n'est pas négligeable (avis perso, je n'ai pas encore rencontré de gros réseaux mais déjà chez moi avec 2 machines j'ai un peu de pertes et plus on a de machines plus on a de pertes donc...). C'est l'une des raisons qui pousse à faire du subnetting.
Admettons que l'effectif des services soit réparti comme suit (on oublie les routeurs et autres matériels nécessitant une adresse IP pour ces explications ) :
  • 43 personnes à la compta
  • 57 personnes à la vente
  • 55 personnes au service technique
  • 45 personnes au service logistique
Comme nous le disions, avec un subnetting classique tous les sous-réseaux auront une plage d'adresses de la même taille. Donc il faut trouver la plus petite taille de bloc qui englobe les clients IP du sous-réseau qui en a le plus grand besoin en n'oubliant pas qu'on raisonne en puissances de 2. Généralement il faut faire un choix entre avoir beaucoup de petits réseaux ou peu de grands. Ici je fais le choix d'avoir le plus petit réseau qui peut fournir au moins 57 adresses dans un service donc 57 adresses s'englobent dans un bloc de 64 adresses auxquelles on en retirera 2 à cause de l'adresse du réseau et de broadcast. 64 bits font 2^6 donc il nous reste 8 - 6 = 2 bits pour définir nos sous-réseaux soit 4 possibilités. On est vraiment justes. On vous a attribué le réseau 210.54.21.0/24.
Je vais vous faire un petit tableau récapitulatif du découpage des sous-réseaux.
NomEffectifBloc@ réseau@ de diffusionPlage d'adresses utilisables
Compta4364210.54.21.0/26210.54.21.63210.54.21.1 ~ 62
Vente5764210.54.21.64/26210.54.21.127210.54.21.65 ~ 126
S. tech.5564210.54.21.128/26210.54.21.191210.54.21.129 ~ 190
S. logis.4564210.54.21.192/26210.54.21.255210.54.21.193 ~ 254

VLSM

C'est ici que les choses commencent à devenir fun. Dans la précédente section j'ai introduis le subnetting disons "classique" qui permet de découper un réseau en parts régulières.
Pour une raison quelconque notre organisation à décidée de revoir sa structure interne comme suit :
  • 3 personnes à la compta
  • 57 personnes à la vente
  • 73 personnes au service technique
  • 27 personnes au service logistique

Oui 20% du personnel à viré mais le point important à voir c'est que le service ayant le plus d'effectif est constitué de 73 personnes et ne rentre plus dans un bloc de 64 mais de 128 adresses. Si on devait utiliser la même logique que précédemment à savoir partager en parts égales nous obtiendrions 4×(128-2) = 504 adresses utilisables soit bien plus que ce que nous offre un réseau de classe C (ça reste envisageable avec un supernetting. cf. § Supernetting) soit 254 adresses utilisables. D'autre part un des services ne comporte plus que 3 personnes donc le gaspillage d'adresses serait énorme.

Comment faire alors ?
Simplement permettre l'utilisation de blocs de tailles différentes comme illustré dans le tableau suivant :
NomEffectif@ allouéesBlocMasqueNota° CIDR
Compta368255.255.255.248/29
Vente576264255.255.255.192/26
S. tech.73126128255.255.255.128/25
S. logis.273032255.255.255.224/27

On va mettre en premier les plus gros blocs d'adresses c'est-à-dire ceux dont la notation CIDR donne le plus petit nombre :
NomEffectifBloc@ réseau@ de diffusionPlage d'adresses utilisables
S. tech.73128210.54.21.0210.54.21.127210.54.21.1 ~ 126
Vente5764210.54.21.128210.54.21.191210.54.21.129 ~ 190
S. logis.2732210.54.21.192210.54.21.223210.54.21.193 ~ 222
Compta38210.54.21.224210.54.21.231210.54.21.225 ~ 230
Non utiliséN/A3×8210.54.21.232210.54.21.255N/A

Et voilà le travail ! Il reste encore 3 blocs de 8 adresses à pourvoir ou un bloc de 16 et un bloc de 8 si on préfère.

Notes complémentaires

L'exemple de VLSM qui a été vu ici est vraiment très semblable à ce que propose CIDR mais il est possible d'aller plus loin dans le raisonnement et ce de manière imbriquée et récursive de sorte que vos adresses de sous-réseau semblent correspondre à un certain format.

Pour illustrer cette idée je vais raisonner sur une adresse de classe B.
Maintenant prenons notre organisation 20 ans plus tard. Elle a bien prospéré et emploi disons 20000 personnes à travers le monde.
Je ne vais pas faire les calculs détaillés mais juste développer un point.
VLSM est un magnifique outil pour organiser son adressage réseau.
Admettons que notre organisation a désormais des filiales en France, au Grand Duché du Luxembourg, en Allemagne, en Pologne et au Japon. Puis dans chaque pays on prévois 3 filiales, chaque filiale comprend 4 services, etc...
Notre adressage qui était encore organisé dans une logique de blocs compactes du plus gros au plus petit devient en quelque sorte plus disparate et répond à un formatage ou sérialisation au travers de son masque de sous-réseau.
Nous allons en effet séquentiellement attribuer des bits au pays puis aux filiales et enfin aux services par exemple.
  • 5 pays -> 3 bits soit 8 possibilités.
  • 3 filiales ->2 bits soit 4 possibilités.
  • 4 services par filiale -> 2 bits soit 4 possibilités.
Notre adresse ressemblera donc à ceci :
XXXXXXXX.XXXXXXXX.AAABBCCX.XXXXXXXX
Il suffit ensuite de faire des tableaux pour organiser la répartition des adresses :
  • CODE AAA
    • 000 France
    • 001 Luxembourg
    • 010 Allemagne
    • 011 Pologne
    • 100 Japon
    • 101 N/A
    • 110 N/A
    • 111 N/A
  • CODE BB
    • France
      • 00 Metz -> 000 00
      • 01 Grenoble -> 000 01
      • 10 Bordeaux -> 000 10
      • 11 N/A -> 000 11
    • Luxembourg
      • 00 Luxembourg -> 001 00
      • 01 Esch -> 001 01
      • 10 Bettembourg -> 001 10
      • 11 N/A -> 001 11
    • ...
    • Japon
      • 00 大阪 -> 100 00
      • 01 京都 -> 100 01
      • 10 名古屋 -> 100 10
      • 11 N/A -> 100 11
Faisons le plan pour une filiale et écrivons les adresses complètes pour le réseau initial 172.16.0.0/16 :
  • 大阪
    • Compta -> 100 00 00
      • 10101100.00010000.1000000X.XXXXXXXX
      • @ réseau -> 10101100.00010000.10000000.00000000
        -> 172.16.128.0/23
      • @ de diffusion -> 10101100.00010000.10000001.11111111
        ->172.16.129.255/23
    • Vente -> 100 00 01
      • 10101100.00010000.1000001X.XXXXXXXX
      • @ réseau -> 10101100.00010000.10000010.00000000
        ->172.16.130.0/23
      • @ de diffusion -> 10101100.00010000.10000011.11111111
        ->172.16.131.255/23
    • Service technique -> 100 00 10
      • 10101100.00010000.1000010X.XXXXXXXX
      • @ réseau -> 10101100.00010000.10000100.00000000
        ->172.16.132.0/23
      • @ de diffusion -> 10101100.00010000.10000101.11111111
        ->172.16.133.255/23
    • Service logistique -> 100 00 11
      • 10101100.00010000.1000011X.XXXXXXXX
      • @ réseau -> 10101100.00010000.10000110.00000000
        -> 172.16.134.0/23
      • @ de diffusion -> 10101100.00010000.10000111.11111111
        -> 172.16.135.255/23

Supernetting

En 2 mots c'est comme on peut le deviner le principe inverse du Subnetting. Cela consiste donc à emprunter des bits à la partie réseau pour les attribuer à la partie hôte.
L'un des principaux usages du supernetting est la simplification des tables de routage.
Exemple :
Admettons qu'un routeur prenne en charge plusieurs réseaux privés de classe C :
  • 192.168.0.0/24
  • 192.168.1.0/24
  • 192.168.2.0/24
  • ...
Les masques de chacun de ces réseau est le même : 255.255.255.0.
Ces réseaux sont tous distincts et ne se voient pas. Pourtant le routeur à son niveau peu définir une règle reliant tous ces réseaux en isolant la partie commune des adresses en binaire entre elles.
On supposera que le dernier réseau utilisé est 192.168.32.0/24
  • 192.168.0.0 -> 11000000.10101000.00000000.00000000
  • 192.168.32.0 -> 11000000.10101000.00100000.00000000
La partie commune s'arrête au 18ème bit donc le masque qui inclus ces réseaux est 255.255.192.0 et la notation CIDR donne 192.168.0.0/18. On a emprunté 24-18 = 6 bits pour définir une règle englobante pour les réseaux pris en considération.

Bonus

Je me suis amusé à refaire un plan d'adressage en partant de l'exemple donné par l'article de Linux-France.org (cf. § Documentation) mais le diagramme devrait aider à mieux comprendre en tant qu'appui visuel.
Je vous donne le tableau de mon découpage.
NomBesoinAttribuéMasque@ Réseau@ de diffusionPlage d'adresses
A1530/27(224)120.1.50.0120.1.50.31120.1.50.(1-30)
B1230/27(224)120.1.50.32120.1.50.63120.1.50.(33-62)
C1530/27(224)120.1.50.64120.1.50.95120.1.50.(65-94)
D614/28(240)120.1.50.96120.1.50.111120.1.50.(97-110)
E22/30(252)120.1.50.112120.1.50.115120.1.50.(113-114)
F22/30(252)120.1.50.116120.1.50.119120.1.50.(117-118)

Documentation