Tu dois découper un /24 en plusieurs sous-réseaux pour ton projet. Combien d'hôtes dans un /27 ? Quelle est l'adresse de broadcast du 10.0.0.64/26 ? Ces calculs reviennent sans cesse en administration réseau, et les erreurs coûtent cher : conflit d'IP, machines isolées, routage cassé.
ipcalc répond à ces questions en une commande. Donne-lui une adresse IP et un masque, il te retourne instantanément : plage d'hôtes utilisables, broadcast, wildcard Cisco, et même le découpage optimal en sous-réseaux.
Ce guide est fait pour toi si...
Section intitulée « Ce guide est fait pour toi si... »Le guide couvre quatre usages distincts d'un même binaire, et il n'est pas nécessaire de les lire dans l'ordre. Les quatre raccourcis ci-dessous mènent directement à la section correspondant au besoin du moment : comprendre une sortie, planifier un découpage, automatiser, ou réviser.
Pourquoi utiliser ipcalc ?
Section intitulée « Pourquoi utiliser ipcalc ? »Le subnetting (découpage en sous-réseaux) est une compétence fondamentale en réseau. Mais les calculs manuels sont fastidieux et sources d'erreurs :
| Problème | Conséquence | Solution ipcalc |
|---|---|---|
| Erreur de masque | Machines qui ne communiquent pas | Validation instantanée |
| Mauvais broadcast | Paquets perdus | Calcul automatique |
| Sous-réseau trop petit | Pas assez d'IPs pour les hôtes | Calcul du nombre d'hôtes |
| VLSM mal planifié | Gaspillage d'adresses | Option --split |
ipcalc existe en deux versions :
| Version | Langage | Mainteneur | Particularités |
|---|---|---|---|
| 0.51 (ce guide) | Perl | jodies.de | Affichage binaire pédagogique, --split, --range |
| 1.0.3 | C | GitLab/nmav | IPv6 complet, JSON, géolocalisation |
La version Perl (0.51) est celle que fournissent Debian, Ubuntu, Arch et Homebrew. Elle est parfaite pour l'apprentissage grâce à son affichage binaire, et c'est celle décrite dans tout ce guide.
La version C évolue de son côté : 1.0.3 est la dernière publiée en amont, mais RHEL 9 et ses dérivés livrent la 1.0.0 et RHEL 8 la 0.2.4. Si vous travaillez sur Rocky ou Alma, vérifiez votre version avant de recopier une commande d'ici.
Installation de ipcalc
Section intitulée « Installation de ipcalc »ipcalc est un paquet minuscule sans dépendance lourde, disponible dans les dépôts officiels de toutes les distributions courantes. Aucune configuration n'est nécessaire, le binaire est utilisable immédiatement après l'installation.
Un point d'attention avant de choisir votre onglet : le nom du paquet est identique partout, le programme ne l'est pas. Debian, Ubuntu, Arch et Homebrew livrent la version Perl 0.51 décrite dans ce guide ; RHEL et ses dérivés livrent une réécriture en C dont les options diffèrent.
sudo apt update && sudo apt install ipcalcsudo dnf install ipcalcAttention, le paquet porte le même nom mais fournit une implémentation différente : la réécriture en C, en version 1.0.0 sur RHEL 9 et 0.2.4 sur RHEL 8. Sa ligne de commande n'est pas compatible avec celle décrite ici, l'option -b y signifie --broadcast et non « pas de binaire ». Les détails sont dans le chapitre sur les différences entre versions.
sudo pacman -S ipcalcbrew install ipcalcVérification de l'installation
Section intitulée « Vérification de l'installation »Ce contrôle ne sert pas seulement à confirmer que le binaire répond : il détermine quelle implémentation votre distribution a installée, et donc quelle syntaxe s'applique aux commandes de ce guide.
ipcalc --versionSortie attendue avec la version Perl couverte ici :
0.51Si la sortie ressemble plutôt à ipcalc 1.0.0, vous avez la réécriture en C : les options diffèrent, reportez-vous au chapitre sur les différences entre versions.
Comprendre les sorties de ipcalc
Section intitulée « Comprendre les sorties de ipcalc »ipcalc n'a qu'un seul mode d'affichage, et il donne tout d'un coup. Apprendre à lire ce bloc une fois évite de relancer la commande avec dix options différentes. Commençons par un réseau courant, un /24 privé :
ipcalc 192.168.1.100/24 -bSortie :
Address: 192.168.1.100Netmask: 255.255.255.0 = 24Wildcard: 0.0.0.255=>Network: 192.168.1.0/24HostMin: 192.168.1.1HostMax: 192.168.1.254Broadcast: 192.168.1.255Hosts/Net: 254 Class C, Private InternetDécryptage de chaque champ
Section intitulée « Décryptage de chaque champ »Trois lignes portent l'essentiel de l'information. Network identifie le sous-réseau, c'est la valeur à comparer quand on cherche si deux machines peuvent se parler directement. HostMin et HostMax délimitent les adresses réellement attribuables : tout ce qui est en dehors provoque un plan d'adressage incohérent.
Les autres champs servent à des usages précis. Wildcard ne sert que si vous écrivez des ACL sur du matériel Cisco. La mention de classe (Class C, Private Internet) est un vestige de l'adressage par classes abandonné en 1993 avec le CIDR ; elle n'a aucun effet sur le calcul et peut être ignorée.
| Champ | Valeur | Signification |
|---|---|---|
| Address | 192.168.1.100 | L'IP analysée |
| Netmask | 255.255.255.0 = 24 | Masque en décimal et notation CIDR |
| Wildcard | 0.0.0.255 | Masque inverse (pour ACL Cisco) |
| Network | 192.168.1.0/24 | Adresse du réseau (tous les bits hôtes à 0) |
| HostMin | 192.168.1.1 | Première IP utilisable |
| HostMax | 192.168.1.254 | Dernière IP utilisable |
| Broadcast | 192.168.1.255 | Adresse de diffusion (tous les bits hôtes à 1) |
| Hosts/Net | 254 | Nombre d'IPs assignables (2^8 - 2) |
Affichage binaire (mode pédagogique)
Section intitulée « Affichage binaire (mode pédagogique) »Sans l'option -b, ipcalc affiche la représentation binaire :
ipcalc 192.168.1.100/24Address: 192.168.1.100 11000000.10101000.00000001. 01100100Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111=>Network: 192.168.1.0/24 11000000.10101000.00000001. 00000000HostMin: 192.168.1.1 11000000.10101000.00000001. 00000001HostMax: 192.168.1.254 11000000.10101000.00000001. 11111110Broadcast: 192.168.1.255 11000000.10101000.00000001. 11111111Hosts/Net: 254 Class C, Private InternetL'espace dans la représentation binaire marque la frontière entre :
- Bits réseau (à gauche) : fixes pour tout le sous-réseau
- Bits hôtes (à droite) : varient pour chaque machine
Syntaxe et options principales
Section intitulée « Syntaxe et options principales »Formats d'entrée acceptés
Section intitulée « Formats d'entrée acceptés »ipcalc accepte trois écritures pour désigner le même masque, et les traite de façon identique. Cela permet de recopier une valeur telle qu'elle apparaît ailleurs, notation CIDR issue d'un ip addr, masque décimal lu dans une interface graphique, ou wildcard extrait d'une ACL Cisco, sans conversion préalable.
# Notation CIDR (recommandée)ipcalc 10.0.0.1/24
# Masque décimalipcalc 10.0.0.1 255.255.255.0
# Masque inverse (wildcard Cisco)ipcalc 10.0.0.1 0.0.0.255Options de la CLI
Section intitulée « Options de la CLI »Le jeu d'options tient sur une main, et deux d'entre elles couvrent 90 % des usages : -b pour une sortie lisible et --split pour découper. Les autres relèvent du confort ou de cas particuliers.
Une remarque sur -c : l'aide intégrée de la version 0.51 l'attribue à la fois à --color et à --class. Dans les faits, -c active la couleur, et l'affichage du seul préfixe exige la forme longue --class. Écrivez donc toujours les options longues dans un script.
| Option | Description |
|---|---|
-b, --nobinary | Supprime l'affichage binaire |
-n, --nocolor | Désactive les couleurs ANSI |
-c, --color | Force les couleurs |
-s, --split N1 N2... | Découpe en sous-réseaux de N hôtes |
-r, --range | Décompose une plage en blocs CIDR |
--class | Affiche uniquement le préfixe CIDR |
-h, --html | Sortie HTML (expérimental) |
-v, --version | Affiche la version |
Découper un réseau en sous-réseaux
Section intitulée « Découper un réseau en sous-réseaux »C'est la fonctionnalité killer de ipcalc. L'option --split calcule automatiquement le découpage optimal.
Exemple : 3 départements, 1 réseau
Section intitulée « Exemple : 3 départements, 1 réseau »Tu disposes du réseau 10.0.0.0/24 (254 hôtes) et dois créer 3 sous-réseaux :
- IT : 50 postes
- Compta : 30 postes
- Direction : 20 postes
ipcalc --split 50 30 20 10.0.0.0/24 -bSortie :
Address: 10.0.0.0Netmask: 255.255.255.0 = 24...Hosts/Net: 254 Class A, Private Internet
1. Requested size: 50 hostsNetmask: 255.255.255.192 = 26Network: 10.0.0.0/26HostMin: 10.0.0.1HostMax: 10.0.0.62Broadcast: 10.0.0.63Hosts/Net: 62 Class A, Private Internet
2. Requested size: 30 hostsNetmask: 255.255.255.224 = 27Network: 10.0.0.64/27HostMin: 10.0.0.65HostMax: 10.0.0.94Broadcast: 10.0.0.95Hosts/Net: 30 Class A, Private Internet
3. Requested size: 20 hostsNetmask: 255.255.255.224 = 27Network: 10.0.0.96/27HostMin: 10.0.0.97HostMax: 10.0.0.126Broadcast: 10.0.0.127Hosts/Net: 30 Class A, Private Internet
Needed size: 128 addresses.Used network: 10.0.0.0/25Unused:10.0.0.128/25Analyse du résultat
Section intitulée « Analyse du résultat »Comparez la colonne « Demandé » à la colonne « Obtenu » : c'est là que se lit le coût du CIDR. La Direction avait besoin de 20 adresses et reçoit un bloc de 30, parce qu'aucune taille intermédiaire n'existe entre 14 et 30. Ces 10 adresses perdues ne sont pas une erreur de l'outil, elles sont imposées par l'alignement sur les puissances de 2.
Le second point à regarder est la ligne de réserve. ipcalc a placé les trois sous-réseaux dans la première moitié du /24 et laisse 10.0.0.128/25 intact, soit 126 adresses disponibles pour un quatrième service. Un découpage qui ne laisse aucune réserve est un découpage à refaire dans six mois.
| Département | Demandé | Obtenu | Réseau | Plage utilisable |
|---|---|---|---|---|
| IT | 50 | 62 | 10.0.0.0/26 | .1 → .62 |
| Compta | 30 | 30 | 10.0.0.64/27 | .65 → .94 |
| Direction | 20 | 30 | 10.0.0.96/27 | .97 → .126 |
| Réserve | - | 126 | 10.0.0.128/25 | .129 → .254 |
Décomposer une plage d'adresses
Section intitulée « Décomposer une plage d'adresses »L'option --range fait l'inverse : elle trouve le ou les blocs CIDR qui couvrent une plage.
ipcalc --range 172.16.0.0-172.16.0.127Sortie :
deaggregate 172.16.0.0 - 172.16.0.127172.16.0.0/25Cas d'usage : agrégation de routes
Section intitulée « Cas d'usage : agrégation de routes »Tu as plusieurs réseaux contigus et veux les annoncer en une seule route :
ipcalc --range 192.168.0.0-192.168.3.255deaggregate 192.168.0.0 - 192.168.3.255192.168.0.0/22Résultat : les 4 réseaux /24 (192.168.0.0 à 192.168.3.0) s'agrègent en un seul /22.
Utilisation dans les scripts
Section intitulée « Utilisation dans les scripts »ipcalc s'intègre facilement dans les scripts d'automatisation.
Extraire une valeur spécifique
Section intitulée « Extraire une valeur spécifique »La sortie de ipcalc est un texte aligné en colonnes, donc directement exploitable par grep et awk. Bonne nouvelle pour les scripts : ipcalc désactive automatiquement les couleurs quand sa sortie n'est pas un terminal, aucune séquence ANSI ne vient polluer la valeur extraite.
Deux pièges subsistent. D'abord, grep Network renvoie plusieurs lignes dès qu'on utilise --split, puisque chaque sous-réseau produit la sienne ; ancrez le motif avec awk '/^Network:/' et prenez explicitement la ligne voulue. Ensuite, sur la ligne Netmask, le champ $2 contient le masque décimal (255.255.252.0) tandis que le préfixe (22) se trouve en $4.
# Extraire l'adresse de broadcastipcalc 192.168.1.0/24 -b | grep Broadcast | awk '{print $2}'# 192.168.1.255
# Extraire le nombre d'hôtesipcalc 10.0.0.0/22 -b | grep Hosts | awk '{print $2}'# 1022Script de validation d'IP
Section intitulée « Script de validation d'IP »Vérifier qu'une adresse appartient à un sous-réseau ne se fait pas en comparant des chaînes de caractères : 10.0.0.200 et 10.0.0.70 commencent pareil et ne sont pourtant pas dans le même /27. La méthode fiable consiste à calculer l'adresse réseau de l'IP avec le préfixe visé, puis à la comparer à celle du sous-réseau de référence. Deux appels à ipcalc suffisent.
#!/bin/bash# validate-subnet.sh : vérifie qu'une IP appartient bien à un sous-réseau
IP=$1SUBNET=$2
if [[ -z "$IP" || -z "$SUBNET" ]]; then echo "Usage: $0 <IP> <RESEAU/CIDR>" exit 1fi
PREFIX=${SUBNET#*/}NET_REF=$(ipcalc "$SUBNET" -b | awk '/^Network:/ {print $2}')NET_IP=$(ipcalc "$IP/$PREFIX" -b | awk '/^Network:/ {print $2}')
if [[ "$NET_IP" == "$NET_REF" ]]; then echo "OK : $IP appartient bien à $NET_REF"else echo "KO : $IP est dans $NET_IP, pas dans $NET_REF" exit 1fiLe script renvoie un code de retour 1 en cas d'échec, ce qui permet de l'enchaîner dans un && ou de le brancher sur une tâche Ansible. Vérification rapide : ./validate-subnet.sh 10.0.0.200 10.0.0.64/27 doit répondre KO en indiquant 10.0.0.192/27.
Générer la config réseau
Section intitulée « Générer la config réseau »ipcalc ne génère pas de configuration, mais il fournit les valeurs dérivées qu'on recopie sinon à la main. Le script ci-dessous produit un fichier Netplan à partir d'une simple notation CIDR et d'une passerelle, et annote le résultat avec la plage utilisable calculée par ipcalc.
#!/bin/bash# generate-netplan.sh : génère une config Netplan et rappelle la plage utilisable
CIDR=$1GATEWAY=$2
NETWORK=$(ipcalc "$CIDR" -b | awk '/^Network:/ {print $2}')HOSTMIN=$(ipcalc "$CIDR" -b | awk '/^HostMin:/ {print $2}')HOSTMAX=$(ipcalc "$CIDR" -b | awk '/^HostMax:/ {print $2}')
cat <<EOF# Réseau $NETWORK - plage utilisable $HOSTMIN à $HOSTMAXnetwork: version: 2 ethernets: eth0: addresses: - $CIDR routes: - to: default via: $GATEWAYEOFUn appel ./generate-netplan.sh 192.168.1.50/24 192.168.1.1 produit une configuration prête à copier dans /etc/netplan/. Le commentaire en tête sert de garde-fou lors de la relecture : si la passerelle indiquée ne tombe pas entre HostMin et HostMax, la configuration est fausse avant même d'être appliquée.
Cas pratiques d'examen
Section intitulée « Cas pratiques d'examen »Ces exercices correspondent aux questions typiques CCNA et Network+.
Exercice 1 : Identifier le réseau
Section intitulée « Exercice 1 : Identifier le réseau »Question : À quel réseau appartient l'hôte 172.16.45.200/20 ?
ipcalc 172.16.45.200/20 -bNetwork: 172.16.32.0/20HostMin: 172.16.32.1HostMax: 172.16.47.254Broadcast: 172.16.47.255Hosts/Net: 4094Réponse : Le réseau est 172.16.32.0/20 (pas 172.16.45.0 !).
C'est l'erreur la plus répandue en examen : avec un préfixe qui ne tombe pas sur un octet entier, l'adresse réseau ne s'obtient pas en remplaçant le dernier octet par zéro. Un /20 laisse 4 bits réseau dans le troisième octet, donc des blocs de 16 : 172.16.32.0, 172.16.48.0, 172.16.64.0. L'hôte .45 tombe dans le premier.
Exercice 2 : Combien d'hôtes ?
Section intitulée « Exercice 2 : Combien d'hôtes ? »Question : Combien d'adresses utilisables dans un /19 ?
ipcalc 10.0.0.0/19 -b | grep HostsHosts/Net: 8190Réponse : 8190 hôtes (2^13 - 2).
Le calcul mental tient en deux temps : 32 moins le préfixe donne le nombre de bits hôtes (32 - 19 = 13), puis on retire les deux adresses réservées. En examen, ipcalc sert de vérification, pas de méthode : c'est le raisonnement qui est noté.
Exercice 3 : Trouver le bon masque
Section intitulée « Exercice 3 : Trouver le bon masque »Question : Quel masque pour 100 hôtes minimum ?
Méthode : tester les masques jusqu'à trouver le bon.
# /25 = 126 hôtes ✓ipcalc 10.0.0.0/25 -b | grep Hosts# Hosts/Net: 126
# /26 = 62 hôtes ✗ (insuffisant)ipcalc 10.0.0.0/26 -b | grep Hosts# Hosts/Net: 62Réponse : /25 (255.255.255.128) pour 126 hôtes utilisables.
Le piège tient au sens de la comparaison : un préfixe plus grand donne un réseau plus petit. On cherche donc le plus grand préfixe dont la capacité reste supérieure au besoin, ce qui revient à descendre de /25 vers /26 jusqu'à passer sous les 100 hôtes demandés.
Exercice 4 : Découpage VLSM
Section intitulée « Exercice 4 : Découpage VLSM »Question : Découpe 192.168.10.0/24 en :
- 1 réseau de 60 hôtes
- 2 réseaux de 25 hôtes
- 4 réseaux de 10 hôtes
ipcalc --split 60 25 25 10 10 10 10 192.168.10.0/24 -bRéponse : les sept sous-réseaux tiennent. La fin de sortie annonce Needed size: 192 addresses et laisse 192.168.10.192/26 inutilisé, soit 64 adresses de réserve. Le détail du calcul : un /26 pour les 60 hôtes, deux /27 pour les blocs de 25, quatre /28 pour ceux de 10, ce qui fait bien 64 + 64 + 64 adresses consommées sur les 256 disponibles.
Tableau de référence CIDR
Section intitulée « Tableau de référence CIDR »Ce tableau sert de repère mémoire quand ipcalc n'est pas sous la main, en examen par exemple. La progression est régulière : chaque bit retiré au préfixe double le nombre d'adresses. Retenir trois lignes suffit à reconstruire les autres, typiquement /24 = 254, /26 = 62 et /30 = 2.
La colonne « Usage typique » n'a rien d'une norme, c'est une convention d'ingénierie. Le seul cas vraiment normalisé est le /31, décrit par la RFC 3021 : il supprime les adresses de réseau et de broadcast pour offrir deux adresses utilisables sur un lien point à point, là où un /30 en gaspille deux.
| CIDR | Masque | Hôtes | Usage typique |
|---|---|---|---|
| /32 | 255.255.255.255 | 1 | Hôte unique (loopback) |
| /31 | 255.255.255.254 | 2* | Liens point-à-point (RFC 3021) |
| /30 | 255.255.255.252 | 2 | Liens routeur-routeur |
| /29 | 255.255.255.248 | 6 | Petit segment |
| /28 | 255.255.255.240 | 14 | Petit bureau |
| /27 | 255.255.255.224 | 30 | Département |
| /26 | 255.255.255.192 | 62 | Étage |
| /25 | 255.255.255.128 | 126 | Grand bureau |
| /24 | 255.255.255.0 | 254 | Réseau standard |
| /23 | 255.255.254.0 | 510 | 2 × /24 |
| /22 | 255.255.252.0 | 1022 | 4 × /24 |
| /16 | 255.255.0.0 | 65534 | Classe B |
| /8 | 255.0.0.0 | 16M+ | Classe A |
*Le /31 est un cas spécial sans broadcast (RFC 3021).
Dépannage
Section intitulée « Dépannage »"Invalid address" ou résultat inattendu
Section intitulée « "Invalid address" ou résultat inattendu »ipcalc échoue rarement, et quand il le fait, c'est presque toujours sur la forme de l'argument plutôt que sur le calcul. Un espace manquant entre l'adresse et le masque, un préfixe supérieur à 32, ou une notation mêlant CIDR et masque décimal suffisent à déclencher le message d'erreur.
Le cas le plus déroutant n'est pas une erreur : ipcalc répond correctement mais avec un réseau inattendu. Cela signifie que l'adresse fournie n'est pas alignée sur le préfixe demandé, et ipcalc affiche alors le réseau réel auquel elle appartient. C'est exactement le comportement recherché dans l'exercice 1 plus haut.
| Symptôme | Cause probable | Solution |
|---|---|---|
| "Invalid address" | Format incorrect | Utiliser notation CIDR : 10.0.0.1/24 |
| Mauvais réseau | IP hors plage | Vérifier que l'IP est dans le sous-réseau |
| Résultat tronqué | Terminal trop étroit | Élargir le terminal ou utiliser -b |
| Pas de couleurs | Variable TERM | Forcer avec -c ou vérifier $TERM |
Différences entre versions
Section intitulée « Différences entre versions »Si tu obtiens des résultats différents de ce guide, vérifie ta version :
ipcalc --version- Version 0.51 (Perl) : ce guide, disponible sur Debian, Ubuntu, Arch et Homebrew
- Version 1.0.x (C) : livrée par le paquet
ipcalcde RHEL, Rocky et Alma
Les deux ne partagent pas la même ligne de commande. Le piège le plus coûteux concerne -b : sur la version Perl, il supprime l'affichage binaire ; sur la version C, c'est l'abréviation de --broadcast et la commande ne renvoie alors que l'adresse de diffusion. Un script écrit pour l'une échoue silencieusement sur l'autre.
| Besoin | Version Perl 0.51 | Version C 1.0.x |
|---|---|---|
| Découper un réseau | --split 50 30 20 (par nombre d'hôtes) | --split (par préfixe) |
| Décomposer une plage | --range 10.0.0.0-10.0.0.127 | --deaggregate 10.0.0.0-10.0.0.127 |
| Adresse de broadcast seule | -b puis filtrage | -b directement |
| Sortie machine | aucune | --json |
| IPv6 | non | oui, avec -6 |
Le réflexe fiable dans un script portable consiste à lire ipcalc --version en premier, ou à figer l'implémentation attendue dans la documentation de votre dépôt.
À retenir
Section intitulée « À retenir »- ipcalc calcule instantanément masques, plages et broadcast
- L'option
-bsimplifie la sortie en supprimant le binaire --splitdécoupe un réseau en sous-réseaux de tailles spécifiées--rangetrouve les blocs CIDR pour une plage d'adresses- Le nombre d'hôtes = 2^(32-prefix) - 2 (sauf /31 et /32)
- Wildcard = inverse du masque, utilisé dans les ACL Cisco
- Les sous-réseaux doivent être alignés sur des puissances de 2