Aller au contenu
Réseaux medium

ipcalc : calculateur d'adresses IP et sous-réseaux

23 min de lecture

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.

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.

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èmeConséquenceSolution ipcalc
Erreur de masqueMachines qui ne communiquent pasValidation instantanée
Mauvais broadcastPaquets perdusCalcul automatique
Sous-réseau trop petitPas assez d'IPs pour les hôtesCalcul du nombre d'hôtes
VLSM mal planifiéGaspillage d'adressesOption --split

ipcalc existe en deux versions :

VersionLangageMainteneurParticularités
0.51 (ce guide)Perljodies.deAffichage binaire pédagogique, --split, --range
1.0.3CGitLab/nmavIPv6 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.

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.

Fenêtre de terminal
sudo apt update && sudo apt install ipcalc

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.

Fenêtre de terminal
ipcalc --version

Sortie attendue avec la version Perl couverte ici :

0.51

Si 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.

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é :

Fenêtre de terminal
ipcalc 192.168.1.100/24 -b

Sortie :

Address: 192.168.1.100
Netmask: 255.255.255.0 = 24
Wildcard: 0.0.0.255
=>
Network: 192.168.1.0/24
HostMin: 192.168.1.1
HostMax: 192.168.1.254
Broadcast: 192.168.1.255
Hosts/Net: 254 Class C, Private Internet

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.

ChampValeurSignification
Address192.168.1.100L'IP analysée
Netmask255.255.255.0 = 24Masque en décimal et notation CIDR
Wildcard0.0.0.255Masque inverse (pour ACL Cisco)
Network192.168.1.0/24Adresse du réseau (tous les bits hôtes à 0)
HostMin192.168.1.1Première IP utilisable
HostMax192.168.1.254Dernière IP utilisable
Broadcast192.168.1.255Adresse de diffusion (tous les bits hôtes à 1)
Hosts/Net254Nombre d'IPs assignables (2^8 - 2)

Sans l'option -b, ipcalc affiche la représentation binaire :

Fenêtre de terminal
ipcalc 192.168.1.100/24
Address: 192.168.1.100 11000000.10101000.00000001. 01100100
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111
=>
Network: 192.168.1.0/24 11000000.10101000.00000001. 00000000
HostMin: 192.168.1.1 11000000.10101000.00000001. 00000001
HostMax: 192.168.1.254 11000000.10101000.00000001. 11111110
Broadcast: 192.168.1.255 11000000.10101000.00000001. 11111111
Hosts/Net: 254 Class C, Private Internet

L'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

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.

Fenêtre de terminal
# Notation CIDR (recommandée)
ipcalc 10.0.0.1/24
# Masque décimal
ipcalc 10.0.0.1 255.255.255.0
# Masque inverse (wildcard Cisco)
ipcalc 10.0.0.1 0.0.0.255

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.

OptionDescription
-b, --nobinarySupprime l'affichage binaire
-n, --nocolorDésactive les couleurs ANSI
-c, --colorForce les couleurs
-s, --split N1 N2...Découpe en sous-réseaux de N hôtes
-r, --rangeDécompose une plage en blocs CIDR
--classAffiche uniquement le préfixe CIDR
-h, --htmlSortie HTML (expérimental)
-v, --versionAffiche la version

C'est la fonctionnalité killer de ipcalc. L'option --split calcule automatiquement le découpage optimal.

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
Fenêtre de terminal
ipcalc --split 50 30 20 10.0.0.0/24 -b

Sortie :

Address: 10.0.0.0
Netmask: 255.255.255.0 = 24
...
Hosts/Net: 254 Class A, Private Internet
1. Requested size: 50 hosts
Netmask: 255.255.255.192 = 26
Network: 10.0.0.0/26
HostMin: 10.0.0.1
HostMax: 10.0.0.62
Broadcast: 10.0.0.63
Hosts/Net: 62 Class A, Private Internet
2. Requested size: 30 hosts
Netmask: 255.255.255.224 = 27
Network: 10.0.0.64/27
HostMin: 10.0.0.65
HostMax: 10.0.0.94
Broadcast: 10.0.0.95
Hosts/Net: 30 Class A, Private Internet
3. Requested size: 20 hosts
Netmask: 255.255.255.224 = 27
Network: 10.0.0.96/27
HostMin: 10.0.0.97
HostMax: 10.0.0.126
Broadcast: 10.0.0.127
Hosts/Net: 30 Class A, Private Internet
Needed size: 128 addresses.
Used network: 10.0.0.0/25
Unused:
10.0.0.128/25

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épartementDemandéObtenuRéseauPlage utilisable
IT506210.0.0.0/26.1 → .62
Compta303010.0.0.64/27.65 → .94
Direction203010.0.0.96/27.97 → .126
Réserve-12610.0.0.128/25.129 → .254

L'option --range fait l'inverse : elle trouve le ou les blocs CIDR qui couvrent une plage.

Fenêtre de terminal
ipcalc --range 172.16.0.0-172.16.0.127

Sortie :

deaggregate 172.16.0.0 - 172.16.0.127
172.16.0.0/25

Tu as plusieurs réseaux contigus et veux les annoncer en une seule route :

Fenêtre de terminal
ipcalc --range 192.168.0.0-192.168.3.255
deaggregate 192.168.0.0 - 192.168.3.255
192.168.0.0/22

Résultat : les 4 réseaux /24 (192.168.0.0 à 192.168.3.0) s'agrègent en un seul /22.

ipcalc s'intègre facilement dans les scripts d'automatisation.

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.

Fenêtre de terminal
# Extraire l'adresse de broadcast
ipcalc 192.168.1.0/24 -b | grep Broadcast | awk '{print $2}'
# 192.168.1.255
# Extraire le nombre d'hôtes
ipcalc 10.0.0.0/22 -b | grep Hosts | awk '{print $2}'
# 1022

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=$1
SUBNET=$2
if [[ -z "$IP" || -z "$SUBNET" ]]; then
echo "Usage: $0 <IP> <RESEAU/CIDR>"
exit 1
fi
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 1
fi

Le 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.

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=$1
GATEWAY=$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 à $HOSTMAX
network:
version: 2
ethernets:
eth0:
addresses:
- $CIDR
routes:
- to: default
via: $GATEWAY
EOF

Un 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.

Ces exercices correspondent aux questions typiques CCNA et Network+.

Question : À quel réseau appartient l'hôte 172.16.45.200/20 ?

Fenêtre de terminal
ipcalc 172.16.45.200/20 -b
Network: 172.16.32.0/20
HostMin: 172.16.32.1
HostMax: 172.16.47.254
Broadcast: 172.16.47.255
Hosts/Net: 4094

Ré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.

Question : Combien d'adresses utilisables dans un /19 ?

Fenêtre de terminal
ipcalc 10.0.0.0/19 -b | grep Hosts
Hosts/Net: 8190

Ré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é.

Question : Quel masque pour 100 hôtes minimum ?

Méthode : tester les masques jusqu'à trouver le bon.

Fenêtre de terminal
# /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: 62

Ré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.

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
Fenêtre de terminal
ipcalc --split 60 25 25 10 10 10 10 192.168.10.0/24 -b

Ré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.

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.

CIDRMasqueHôtesUsage typique
/32255.255.255.2551Hôte unique (loopback)
/31255.255.255.2542*Liens point-à-point (RFC 3021)
/30255.255.255.2522Liens routeur-routeur
/29255.255.255.2486Petit segment
/28255.255.255.24014Petit bureau
/27255.255.255.22430Département
/26255.255.255.19262Étage
/25255.255.255.128126Grand bureau
/24255.255.255.0254Réseau standard
/23255.255.254.05102 × /24
/22255.255.252.010224 × /24
/16255.255.0.065534Classe B
/8255.0.0.016M+Classe A

*Le /31 est un cas spécial sans broadcast (RFC 3021).

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ômeCause probableSolution
"Invalid address"Format incorrectUtiliser notation CIDR : 10.0.0.1/24
Mauvais réseauIP hors plageVérifier que l'IP est dans le sous-réseau
Résultat tronquéTerminal trop étroitÉlargir le terminal ou utiliser -b
Pas de couleursVariable TERMForcer avec -c ou vérifier $TERM

Si tu obtiens des résultats différents de ce guide, vérifie ta version :

Fenêtre de terminal
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 ipcalc de 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.

BesoinVersion Perl 0.51Version 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 machineaucune--json
IPv6nonoui, 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.

  • ipcalc calcule instantanément masques, plages et broadcast
  • L'option -b simplifie la sortie en supprimant le binaire
  • --split découpe un réseau en sous-réseaux de tailles spécifiées
  • --range trouve 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

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn