Guide de référence pour déployer un laboratoire d'émulation réseau PNETLab v6 dans une machine virtuelle Ubuntu Server 20.04, y charger des images Cisco (IOL, Dynamips, QEMU) et Fortinet (FortiGate-VM), puis valider l'ensemble par un lab de test.
| Plateforme cible | Ubuntu Server 20.04 LTS (Focal), x86_64 |
| Version PNETLab | 6.0.0-103 (paquet principal) |
| Noyau | 5.17.15-pnetlab-uksm-2 |
| Public | Administrateurs systèmes et réseaux, architectes, équipes sécurité |
| Convention | Toutes les commandes sont exécutées en root (sudo -i) sauf mention contraire |
Statut des informations. Les versions de paquets et les URL proviennent du script d'origine et doivent être revérifiées avant tout déploiement. Les procédures Fortinet (§12) et Cisco QEMU (§11.3) suivent les conventions de nommage de PNETLab/EVE-NG ; contrôlez-les sur votre version exacte avant de les figer dans une procédure interne.
Partie I · Conception
Partie II · Installation de la plateforme
- Installation d'Ubuntu Server 20.04
- Installation de PNETLab
- Configuration réseau
- Vérifications post-installation
- Premier accès et modes Online / Offline
- Durcissement
Partie III · Images Cisco et Fortinet
Partie IV · Validation et exploitation
Annexes
pnetlab-reference/
├── README.md ce document
└── scripts/
└── install_pnetlab_v6.sh installation de PNETLab v6 (Ubuntu 20.04)
Avertissement. Ce guide décrit des outils tiers (paquets PNETLab hébergés sur labhub, images communautaires via ishare2). À utiliser dans un laboratoire isolé, avec les droits d'usage nécessaires sur les images (voir §17).
Vue d'ensemble de la procédure complète. Chaque étape renvoie à la section qui la détaille.
| # | Étape | Section |
|---|---|---|
| 1 | Préparer la VM : 4+ vCPU, 16 Go de RAM, virtualisation imbriquée, nom d'hôte pnetlab |
§2, §3, §4 |
| 2 | Installer PNETLab avec le script | §5 |
| 3 | Configurer le réseau (pnet0, neutraliser netplan), puis redémarrer |
§6 |
| 4 | Vérifier noyau, KVM, services, accès web | §7 |
| 5 | Changer les mots de passe par défaut, choisir le mode Online / Offline | §8 |
| 6 | Durcir (SSH, pare-feu, segmentation) | §9 |
| 7 | Installer ishare2 et tester la connectivité | §10.1 |
| 8 | Rechercher et télécharger les images Cisco et FortiGate | §10.2, §11, §12 |
| 9 | Corriger les permissions | §10.5 |
| 10 | Valider avec le lab de bout en bout | §13 |
# Étape 2
sudo -i && chmod +x install_pnetlab_v6.sh && ./install_pnetlab_v6.sh
# Étape 3 : après édition de /etc/network/interfaces (§6)
mkdir -p /root/netplan-backup && mv /etc/netplan/*.yaml /root/netplan-backup/
reboot
# Étape 4
uname -r && ls -l /dev/kvm && systemctl is-active apache2 mysql
# Étapes 7 à 9
apt install -y git
git clone https://github.com/ishare2-org/ishare2-cli.git
mkdir -p /opt/ishare2/cli && cp -r ishare2-cli/* /opt/ishare2/cli/
cp /opt/ishare2/cli/ishare2 /usr/sbin/ishare2 && chmod +x /usr/sbin/ishare2
ishare2 test
ishare2 search bin | grep -i l3
ishare2 search forti
ishare2 pull bin <n°> && ishare2 pull qemu <n°>
/opt/unetlab/wrappers/unl_wrapper -a fixpermissionsChoix d'architecture, dimensionnement et préparation de l'hyperviseur.
Installation de PNETLab, configuration réseau, durcissement, import d'images et validation. Les environnements cloud (GCP, Azure) ne sont pas couverts par le script fourni : l'imbrication de virtualisation y dépend du type d'instance et doit être traitée séparément.
Réseau d'administration / LAN
│
┌─────┴─────┐
│ eth0 │ (port de la VM, sans IP)
│ │ │
│ pnet0 ◄──┼── bridge Linux : porte l'IP de gestion
│ │ │ et la "Cloud0" des labs
Navigateur ── HTTP(S) ─►│ Apache / PHP / MySQL (interface web)
│ Tomcat + Guacamole (consoles HTML5)
│ Docker (nœuds conteneurs)
│ │
│ ┌───────────────────────┐ │
│ │ Nœuds émulés │ │
│ │ IOL (binaires x86) │ │
│ │ QEMU (KVM) : vIOS, │ │
│ │ CSR, FortiGate... │ │
│ │ Dynamips, VPCS │ │
│ └───────────────────────┘ │
│ Noyau 5.17.15-pnetlab │
└───────────────────────────┘
Hyperviseur (nested)
Chaque interface ethN de la VM correspond à une pnetN (bridge) et à une « Cloud N » dans l'interface web. Un nœud relié à Cloud0 accède donc au réseau de l'interface eth0.
| Élément | Exigence |
|---|---|
| OS invité | Ubuntu Server 20.04, installation propre. Les autres versions sont refusées par le script |
| Architecture | x86_64 |
| Virtualisation | Extensions matérielles (VT-x / AMD-V) exposées à la VM (virtualisation imbriquée) |
| Nom d'hôte | pnetlab, à ne jamais modifier ensuite (voir §11.1 : les licences IOL en dépendent) |
| Réseau | Accès Internet pendant l'installation (APT, PPA, labhub.eu.org) |
| Droits | root ou sudo |
| Profil | vCPU | RAM | Disque | Usage typique |
|---|---|---|---|---|
| Minimal | 2 | 4 Go | 60 Go | Quelques IOL / VPCS |
| Standard | 4 | 16 Go | 150 Go | Labs CCNA/CCNP, 1 à 2 FortiGate, quelques vIOS |
| Avancé | 8+ | 32 Go et plus | 300 Go et plus (SSD/NVMe) | Topologies sécurité multi-éditeurs |
Ordres de grandeur de consommation par nœud (à ajuster selon la version) :
| Nœud | RAM | Remarque |
|---|---|---|
| VPCS | quasi nulle | Poste virtuel léger |
| IOL L2 / L3 | 256 à 512 Mo | Très économe, idéal pour le routage et la commutation |
| Dynamips (c7200) | 256 à 512 Mo | Dépend de l'IOS |
| vIOS / vIOS-L2 | 512 Mo à 1 Go | QEMU |
| CSR1000v | 3 à 4 Go | QEMU |
| FortiGate-VM | 2 Go | Sans licence payante, limité à 1 vCPU |
La VM doit exposer les instructions de virtualisation au système invité.
| Hyperviseur | Réglage |
|---|---|
| VMware Workstation / Fusion | Processors > cocher « Virtualize Intel VT-x/EPT or AMD-V/RVI » |
| VMware ESXi | Option CPU « Expose hardware assisted virtualization to the guest OS ». Placer le port group du réseau en mode promiscuité, modifications d'adresse MAC et transmissions forgées sur « Accept » |
| Proxmox / KVM | Type de CPU host, et nested=1 sur l'hôte (/sys/module/kvm_intel/parameters/nested ou kvm_amd) |
| VirtualBox | La virtualisation imbriquée n'est disponible que sur certaines combinaisons matériel/version. À éviter pour un usage sérieux (QEMU sans KVM est très lent) |
Configuration recommandée de la VM :
- Contrôleur disque VirtIO ou SCSI, disque en provisionnement fin ou épais selon la politique de stockage.
- Carte réseau : au moins une, en mode bridge ou réseau d'administration. Prévoir des cartes supplémentaires si vous voulez plusieurs Clouds.
- Sur un réseau virtuel d'hyperviseur, autoriser le trafic de MAC multiples (promiscuité), sinon les nœuds émulés n'auront aucune connectivité externe.
De l'OS invité à une plateforme PNETLab opérationnelle et durcie.
- Choisir « Ubuntu Server (minimized) » ou standard, sans snap supplémentaire.
- Nom d'hôte :
pnetlab. - Partitionnement : LVM recommandé (extension aisée du volume).
- Cocher l'installation du serveur OpenSSH.
- Créer un utilisateur d'administration nominatif. Le compte
rootne sera pas utilisé pour l'accès SSH.
sudo -i
apt update && apt full-upgrade -y
hostname # doit afficher : pnetlab
egrep -c '(vmx|svm)' /proc/cpuinfo # doit être > 0
lsb_release -rs # doit afficher : 20.04Si la première commande de contrôle ne renvoie pas pnetlab :
hostnamectl set-hostname pnetlabPrenez un snapshot de la VM à ce stade (état « Ubuntu propre »). Il permet de rejouer l'installation sans réinstaller l'OS.
Le dépôt contient scripts/install_pnetlab_v6.sh, version corrigée du script d'origine.
| Point | Script d'origine | Script fourni |
|---|---|---|
| Gestion des erreurs | Aucune, poursuit après un échec | set -Eeuo pipefail, arrêt avec numéro de ligne |
| Verrous dpkg | Supprimés avec rm /var/lib/dpkg/lock* (risque de corruption) |
Attente de la libération |
| Répertoire de travail | rm -rf /tmp/* |
Répertoire mktemp dédié, supprimé en fin de script |
| Idempotence | Partielle | Test de version avant chaque paquet |
| Traçabilité | Aucune | Journal /var/log/pnetlab-install.log et SHA-256 de chaque téléchargement |
/etc/hosts |
Test sur 127.0.1.1 mais écriture de 127.0.2.1 (incohérent) |
Entrée 127.0.1.1 pnetlab.example.com pnetlab unique |
Mot de passe root pnet |
Imposé | Supprimé (voir §9) |
PermitRootLogin yes |
Imposé | Opt-in : ENABLE_ROOT_SSH=1 |
| Extension LVM | Automatique | Opt-in : RESIZE_ROOT_LV=1 |
| Blocs GCP / Azure | Inclus | Retirés (hors périmètre) |
Coquille $DOwnload |
Présente | Corrigée |
Les paquets .deb et le noyau sont téléchargés depuis labhub.eu.org, source tierce non officielle, et installés en root. Pour une machine autre qu'un laboratoire isolé :
- Exécutez l'installation dans une VM dédiée, sans accès aux réseaux de production.
- Conservez le journal des SHA-256 produit par le script et comparez-le entre déploiements.
- Faites relire le script et figez un miroir interne des paquets si votre politique l'exige.
sudo -i
mkdir -p /root/pnetlab && cd /root/pnetlab
# copier le script dans ce répertoire (scp, git clone, etc.)
chmod +x install_pnetlab_v6.sh
dos2unix install_pnetlab_v6.sh # uniquement si créé sous Windows
./install_pnetlab_v6.shOptions :
RESIZE_ROOT_LV=1 ./install_pnetlab_v6.sh # étend le LV racine
ENABLE_ROOT_SSH=1 ./install_pnetlab_v6.sh # déconseillé, voir §9À la fin, ne redémarrez pas encore : configurez d'abord le réseau (§6), car le noyau PNETLab et la pile réseau ifupdown s'activent au redémarrage.
PNETLab gère son réseau avec ifupdown (/etc/network/interfaces), pas avec netplan. Le bridge pnet0 porte l'adresse IP ; eth0 n'a pas d'IP et sert de port au bridge.
Ubuntu 20.04 installe une configuration netplan qui entre en conflit. Travaillez depuis la console de l'hyperviseur, pas en SSH : vous allez couper la connectivité.
mkdir -p /root/netplan-backup
mv /etc/netplan/*.yaml /root/netplan-backup/IP statique (recommandé pour un serveur de labs) :
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto pnet0
iface pnet0 inet static
address 192.168.10.20
netmask 255.255.255.0
gateway 192.168.10.1
dns-nameservers 1.1.1.1 9.9.9.9
bridge_ports eth0
bridge_stp off
bridge_fd 0
Variante DHCP : remplacer le bloc pnet0 par iface pnet0 inet dhcp en conservant bridge_ports eth0, bridge_stp off, bridge_fd 0.
Cartes supplémentaires (Cloud1, Cloud2, ...) :
auto eth1
iface eth1 inet manual
auto pnet1
iface pnet1 inet manual
bridge_ports eth1
bridge_stp off
bridge_fd 0
Appliquer :
rebootip -br a
ping -c2 192.168.10.1 # passerelle
ping -c2 8.8.8.8 # IP externe
ping -c2 pnetlab.com # résolution DNS
cat /etc/resolv.conf| Résultat | Diagnostic |
|---|---|
8.8.8.8 répond mais pas pnetlab.com |
DNS : corriger dns-nameservers |
| Ni l'un ni l'autre ne répond | Passerelle, VLAN ou configuration du port de l'hyperviseur |
| Passerelle injoignable | bridge_ports erroné ou carte absente |
- Un nœud relié à
Cloud0partage le segment deeth0. Il doit donc être adressé dans le LAN d'administration (ou dans un VLAN dédié si le port de l'hyperviseur est en trunk). - Pour isoler les labs du LAN d'administration, utilisez une seconde carte (
eth1/pnet1/ Cloud1) sur un réseau dédié aux labs. - Si votre version propose un type de réseau NAT, il fournit un accès Internet aux nœuds sans exposer le LAN ; vérifiez sa disponibilité dans le menu d'ajout de réseau.
Le Wi-Fi ne peut pas être ponté simplement vers pnet0. Dans ce montage, wlan0 (configuré par netplan) porte l'accès Internet et l'adresse de l'interface web, et les nœuds reliés à Cloud0 n'ont pas d'accès extérieur sans câble sur eth0 ou sans NAT. Protégez le fichier netplan (chmod 600) car il contient le mot de passe Wi-Fi, et ne le partagez jamais en clair. Cette configuration ne convient pas à un usage de référence ; privilégiez une VM filaire.
Après la configuration réseau du §6 et un redémarrage :
uname -r # attendu : 5.17.15-pnetlab-uksm-2
lsmod | grep kvm # kvm_intel ou kvm_amd chargé
ls -l /dev/kvm # le périphérique doit exister
dpkg -l | grep -i pnetlab # paquets pnetlab* à l'état ii
systemctl is-active apache2 mysql # active / active
docker ps 2>&1 | head -3 # le démon Docker répond
ip -br a # pnet0 porte l'adresse de gestionSi /dev/kvm est absent, la virtualisation imbriquée n'est pas exposée (§3) ; les nœuds QEMU ne démarreront pas ou seront inutilisables.
Test d'accès web : depuis un poste du réseau d'administration, ouvrir http://<IP_pnet0>.
| Accès | Identifiant | Mot de passe par défaut |
|---|---|---|
| Interface web (mode Offline) | admin |
pnet |
| Système (console / SSH) | compte créé à l'installation d'Ubuntu | celui que vous avez défini |
Changez immédiatement le mot de passe admin (menu de l'utilisateur dans l'interface web).
| Online | Offline | |
|---|---|---|
| Internet requis | Oui | Non |
| Compte | Compte PNETLab enregistré (pnetlab.com) | Compte local |
| Labs du Store | Tous | « Open Labs » uniquement |
Le mode actif s'affiche dans le menu System > System Mode.
mode default offline # mode proposé par défaut à la connexion : offline
mode default online
mode reset offline # réinitialise le mot de passe du compte offline
mode reset all # remise à zéro des modesSi l'interface affiche « OFFLINE Mode is disabled », connectez-vous une première fois en mode Online, puis activez-le dans System > System Mode.
Pour ouvrir les consoles dans des clients natifs (telnet via PuTTY, VNC, Wireshark), installez le client pack sur le poste de travail. La console HTML5 (Guacamole) fonctionne sans aucune installation.
PNETLab est conçu pour un laboratoire ; il n'a pas vocation à être exposé sur Internet.
| Mesure | Commande / action |
|---|---|
| Aucun mot de passe par défaut | Changer admin / pnet et ne pas conserver de mot de passe système faible |
| SSH par clés, sans root | PermitRootLogin no et PasswordAuthentication no dans /etc/ssh/sshd_config, puis systemctl restart ssh |
| Segmentation | Placer l'interface de gestion dans un VLAN d'administration, les labs sur un réseau dédié (Cloud1) |
| Pare-feu hôte | Ouvrir uniquement SSH et HTTP(S) depuis les postes d'administration (exemple ci-dessous) |
| HTTPS | Mettre un reverse proxy ou un certificat sur Apache si la machine est partagée |
| Sauvegardes | Voir §14 |
| Pas de secrets dans les configurations | Ne jamais versionner de iourc, de fichier netplan Wi-Fi ou de configuration d'équipement contenant des clés |
Exemple ufw (à valider avant d'activer, depuis la console de l'hyperviseur) :
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow from 192.168.10.0/24 to any port 22 proto tcp
ufw allow from 192.168.10.0/24 to any port 80 proto tcp
ufw allow from 192.168.10.0/24 to any port 443 proto tcp
# Consoles natives (telnet/VNC) : à n'ouvrir que si le client pack est utilisé.
# Vérifier les plages exactes avec : ss -tlnp | grep -E 'qemu|iol|dynamips'
ufw enableTestez le comportement de
ufwavec vos labs : selon la configuration debr_netfilter, les règles peuvent aussi s'appliquer au trafic ponté entre nœuds.
Téléchargement avec ishare2 et déploiement par famille d'équipements.
Cette partie décrit l'outil de téléchargement (ishare2), puis l'emplacement des images et la règle de permissions qui s'applique à toutes les méthodes d'import.
ishare2 est un outil en ligne de commande pour rechercher et récupérer des images communautaires. Utilisez le dépôt ishare2-org/ishare2-cli (l'ancien dépôt pnetlabrepo/ishare2 n'est plus maintenu).
apt install -y git
git clone https://github.com/ishare2-org/ishare2-cli.git
mkdir -p /opt/ishare2/cli
cp -r ishare2-cli/* /opt/ishare2/cli/
cp /opt/ishare2/cli/ishare2 /usr/sbin/ishare2
chmod +x /usr/sbin/ishare2
ishare2 # première exécution : initialisation
which ishare2Le projet propose aussi une installation en une ligne (curl ... | sh). Comme pour tout script distant, lisez-le avant exécution.
| Commande | Fonction |
|---|---|
ishare2 test |
Vérifie l'accès aux dépôts |
ishare2 search bin |
Liste les images IOL |
ishare2 search qemu |
Liste les images QEMU |
ishare2 search dynamips |
Liste les images Dynamips |
ishare2 search all |
Liste tout |
ishare2 pull bin <n°> |
Télécharge l'image IOL portant ce numéro |
ishare2 pull qemu <n°> |
Télécharge une image QEMU |
ishare2 pull dynamips <n°> |
Télécharge une image Dynamips |
ishare2 pull <type> <n°> --overwrite |
Réécrit une image déjà présente (image corrompue, remplacement) |
ishare2 pull bin all / pull dynamips all |
Télécharge toutes les images du type (volumineux ; déconseillé pour qemu) |
ishare2 search <nom> |
Recherche par nom, tous types confondus : vios, csr, forti, nxos, palo... |
ishare2 search <type> <nom> |
Recherche ciblée, par exemple ishare2 search qemu forti |
ishare2 installed qemu / installed dynamips |
Liste les images installées par type |
ishare2 pull docker <n°> |
Télécharge une image Docker (si proposée par votre version) |
ishare2 installed bin |
Liste les images IOL installées |
ishare2 upgrade |
Met à jour ishare2 |
Filtrer par type d'IOL :
ishare2 search bin | grep -i l3 # routeurs
ishare2 search bin | grep -i l2 # commutateursRemarques :
ishare2 upgradepeut proposer des mises à jour de PNETLab. N'acceptez pas sur une installation faite par script sans avoir pris un snapshot.- L'interface web d'ishare2 (
ishare2 gui install) est signalée comme instable par ses auteurs ; elle s'exécute en root. - En mode Offline de PNETLab, ishare2 reste dépendant d'Internet. Téléchargez en amont ou transférez par SCP/WinSCP, puis exécutez
fixpermissions. - En cas d'erreur
Failed to download the JSON index file, le problème est presque toujours DNS ou pare-feu : reprenez le §6.4.
Pour tout type d'image, la séquence est identique. ishare2 crée le bon répertoire, avec le bon préfixe et le bon nom de disque, ce qui évite les erreurs de nommage du dépôt manuel.
ishare2 test # 1. connectivité aux dépôts
ishare2 search <nom ou type> # 2. identifier le numéro de l'image
ishare2 pull <type> <n°> # 3. télécharger (type : bin, qemu, dynamips)
ishare2 installed <type> # 4. vérifier la présence
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions # 5. permissionsExemple de sortie d'un téléchargement QEMU (chemin créé automatiquement) :
[i] Download path: /opt/unetlab/addons/qemu/<préfixe>-<nom>
[+] Downloading file from ... /virtioa.qcow2
[+] Download completed for Image: <préfixe>-<nom>, Type: QEMU, ID: <n°>
Points d'attention :
- Espace disque. Les images QEMU pèsent de quelques centaines de Mo à plusieurs Go. Contrôlez
df -h /optavant de télécharger. - Provenance. Les images ishare2 sont hébergées par la communauté, pas par les éditeurs. Notez l'ID, le nom et la taille de chaque image téléchargée, et isolez le serveur de labs des réseaux de production.
- Droits d'usage. Le téléchargement d'une image ne vaut pas licence : voir §17.
- Sans Internet. Téléchargez depuis une machine connectée, puis transférez par SCP vers les mêmes chemins (§10.4) et lancez
fixpermissions. L'import manuel de chaque famille est décrit aux §11 et §12 comme solution de repli.
| Type de nœud | Répertoire |
|---|---|
| IOL (binaires Cisco x86) | /opt/unetlab/addons/iol/bin/ |
| Dynamips (IOS 7200, etc.) | /opt/unetlab/addons/dynamips/ |
| QEMU (vIOS, CSR, FortiGate, ASAv...) | /opt/unetlab/addons/qemu/<préfixe>-<nom>/ |
| Docker | Géré par docker (images locales) |
Après chaque ajout d'image, quelle que soit la méthode :
/opt/unetlab/wrappers/unl_wrapper -a fixpermissionsSans cela, l'image n'est pas reconnue ou le nœud s'éteint immédiatement.
Les images IOL sont des binaires 32 bits très légers, adaptés au routage et à la commutation.
Bibliothèques 32 bits (le script les installe, à vérifier) :
dpkg --add-architecture i386
apt update
apt install -y libc6:i386 zlib1g:i386
ldd /opt/unetlab/addons/iol/bin/<IMAGE>.bin # aucune ligne "not found"Téléchargement avec ishare2 (méthode de référence) :
ishare2 search bin | grep -i l3 # routeurs
ishare2 search bin | grep -i l2 # commutateurs
ishare2 pull bin <n°> # exemple : un L3 et un L2
ishare2 installed bin
/opt/unetlab/wrappers/unl_wrapper -a fixpermissionsRepli : dépôt manuel (serveur sans Internet) :
cp <IMAGE>.bin /opt/unetlab/addons/iol/bin/
chmod +x /opt/unetlab/addons/iol/bin/<IMAGE>.bin
/opt/unetlab/wrappers/unl_wrapper -a fixpermissionsLicence. Les images IOL exigent un fichier /opt/unetlab/addons/iol/bin/iourc, au format :
[license]
pnetlab = <clé de licence>;
La clé est liée au nom d'hôte de la machine (pnetlab) : c'est la raison pour laquelle le nom d'hôte ne doit pas changer, notamment après clonage de la VM. Ce document ne décrit aucune méthode de génération de licence : l'utilisation d'IOL suppose que vous disposez des droits Cisco correspondants. L'alternative officielle est Cisco Modeling Labs (CML).
Choix du template.
| Image | Fonction | Template PNETLab |
|---|---|---|
L3 (...-l3-...) |
Routage | « Cisco IOL » |
L2 (...-l2-...) |
Commutation | « Cisco IOL L2 » |
Ne mélangez pas les deux : un template L3 avec une image L2 (ou inversement) provoque des arrêts au démarrage.
Création du nœud. Dans un lab : clic droit > Add an object > Node > Cisco IOL. Sélectionner l'image, ajuster RAM (256 Mo en général), nombre de groupes d'interfaces Ethernet / série, puis démarrer.
Pour les routeurs 7200 et plateformes anciennes :
ishare2 search dynamips
ishare2 pull dynamips <n°>
ishare2 installed dynamips
/opt/unetlab/wrappers/unl_wrapper -a fixpermissionsRepli manuel : cp c7200-adventerprisek9-mz.<version>.image /opt/unetlab/addons/dynamips/, puis fixpermissions.
L'IOS doit être au format décompressé accepté par Dynamips. Utilisez le template « Dynamips » (c7200 ou autre) et, si l'interface le demande, ajustez l'idle-PC pour limiter la charge CPU.
Convention : un répertoire par version, dont le préfixe détermine le template, et un disque nommé selon l'interface émulée.
| Équipement | Préfixe de répertoire (exemple) | Nom du disque |
|---|---|---|
| vIOS (routeur) | vios-adventerprisek9-m.SPA.<version> |
hda.qcow2 |
| vIOS-L2 (commutateur) | viosl2-adventerprisek9-m.<version> |
hda.qcow2 |
| CSR1000v | csr1000vng-universalk9.<version> |
virtioa.qcow2 |
| ASAv | asav-<version> |
hda.qcow2 |
Téléchargement avec ishare2 (méthode de référence) :
ishare2 search vios # vIOS et vIOS-L2
ishare2 search csr # CSR1000v
ishare2 search asav # ASAv
ishare2 search nxos # Nexus
ishare2 pull qemu <n°>
ishare2 installed qemu
/opt/unetlab/wrappers/unl_wrapper -a fixpermissionsishare2 crée le répertoire /opt/unetlab/addons/qemu/<préfixe>-<nom>/ et y place le disque sous le nom attendu par le template. Il n'y a rien à renommer.
Repli : import manuel. Procédure générique :
mkdir -p /opt/unetlab/addons/qemu/vios-adventerprisek9-m.SPA.159-3.M6
cd /opt/unetlab/addons/qemu/vios-adventerprisek9-m.SPA.159-3.M6
# placer ici l'image disque (qcow2) sous le nom attendu
mv /chemin/source.qcow2 hda.qcow2
/opt/unetlab/wrappers/unl_wrapper -a fixpermissionsSi l'image est fournie dans un autre format (VMDK, OVA, ISO), convertissez-la :
qemu-img convert -f vmdk -O qcow2 source.vmdk hda.qcow2Contrôlez le nom de disque et les paramètres exacts de chaque template dans l'interface (menu d'ajout de nœud, onglet de description du template) : ils varient selon la plateforme (par exemple virtioa.qcow2, sataa.qcow2).
ishare2 search forti # liste toutes les images Fortinet
ishare2 search qemu forti # variante ciblée sur le type qemu
ishare2 pull qemu <n°> # n° lu dans la colonne ID
ishare2 installed qemu | grep -i forti
/opt/unetlab/wrappers/unl_wrapper -a fixpermissionsChoisissez la version selon votre besoin (par exemple une branche 7.0 / 7.2 pour reproduire un parc existant). Les images FortiGate se téléchargent par ishare2 comme n'importe quelle image QEMU : le répertoire fortinet-FGT-<version> et le disque virtioa.qcow2 sont créés automatiquement. Contrôlez le résultat :
ls -l /opt/unetlab/addons/qemu/ | grep -i fortinet
ls -l /opt/unetlab/addons/qemu/fortinet-FGT-*/virtioa.qcow2Comme pour les autres images ishare2, la source est communautaire. Pour un usage proche de la production (validation de configuration avant déploiement, tests de sécurité), préférez le firmware officiel (§12.2) et comparez sa version avec celle de l'image ishare2.
- Créer un compte sur le portail support Fortinet (FortiCloud).
- Télécharger le firmware FortiGate-VM pour KVM (archive du type
FGT_VM64_KVM-v<version>-build<xxxx>-FORTINET.out.kvm.zip). - Extraire l'archive : elle contient
fortios.qcow2.
Le préfixe de répertoire fortinet- active le template Fortinet ; le disque doit s'appeler virtioa.qcow2.
VER="v7.2.8-build1639" # adapter à la version téléchargée
mkdir -p /opt/unetlab/addons/qemu/fortinet-FGT-${VER}
cp fortios.qcow2 /opt/unetlab/addons/qemu/fortinet-FGT-${VER}/virtioa.qcow2
/opt/unetlab/wrappers/unl_wrapper -a fixpermissionsVérification :
ls -l /opt/unetlab/addons/qemu/fortinet-FGT-${VER}/Le fichier virtioa.qcow2 doit être présent, avec les droits positionnés par fixpermissions.
Dans un lab : Add an object > Node > Fortinet FortiGate. Paramètres recommandés :
| Paramètre | Valeur |
|---|---|
| Image | fortinet-FGT-<version> |
| CPU | 1 (une licence d'évaluation ou absente limite le nombre de vCPU) |
| RAM | 2048 Mo (ne pas descendre en dessous de ce que demande la version) |
| Ethernet | 4 à 8 ports |
| Console | telnet ou HTML5 |
- Démarrer le nœud et ouvrir la console. Le démarrage prend plusieurs minutes.
- Connexion initiale : utilisateur
admin, mot de passe vide. Le système impose la définition d'un nouveau mot de passe. - Configurer l'interface de gestion (connectée à
Cloud0ou à un autre réseau du lab) :
config system interface
edit "port1"
set mode static
set ip 192.168.10.50 255.255.255.0
set allowaccess ping https ssh
next
end
config router static
edit 1
set gateway 192.168.10.1
set device "port1"
next
end
config system dns
set primary 1.1.1.1
set secondary 9.9.9.9
end
- Accéder à l'interface web :
https://192.168.10.50depuis le poste d'administration.
Pour un durcissement dès la première minute : restreindre allowaccess aux protocoles nécessaires, définir des trusthost pour l'administrateur, et ne laisser aucun accès HTTP non chiffré.
| Situation | Effet |
|---|---|
| Sans licence | Le système démarre avec un fonctionnement très restreint. Une activation est requise pour une utilisation réelle |
| Licence d'évaluation (compte FortiCloud) | Fonctionnalités limitées : 1 vCPU, RAM plafonnée, nombre d'interfaces et de fonctions réduit |
| Licence achetée | Capacités selon le contrat |
La politique d'évaluation de Fortinet évolue selon les versions de FortiOS (durée, activation par connexion FortiCloud depuis l'interface, ouverture de ports sortants vers FortiGuard). Consultez la documentation Fortinet de votre version. Si l'activation passe par Internet, donnez un accès sortant au nœud (NAT ou Cloud0 avec passerelle).
- Les performances d'un FortiGate émulé en lab ne sont pas représentatives de la production : ne dimensionnez pas d'après un lab.
- Certaines versions récentes exigent plus de RAM ou un format de disque particulier. Si le nœud boucle au démarrage, consultez la console série et les notes de version.
- Une topologie de test avec plusieurs FortiGate (HA, IPsec site à site) demande de la RAM supplémentaire : prévoir 2 Go par instance.
- FortiManager et FortiAnalyzer suivent la même procédure, avec des images et des ressources beaucoup plus volumineuses (plusieurs vCPU, 8 Go et plus).
Test de bout en bout, sauvegarde, maintenance et dépannage.
Ce lab valide la chaîne complète : PNETLab, réseau, IOL et FortiGate.
[R1 IOL L3] ──── [FortiGate port2] FortiGate port1 ──── [Cloud0]
10.0.0.1/24 10.0.0.2/24 (LAN / Internet)
│
[SW1 IOL L2] ──── [VPCS1 192.168.1.10]
- Créer un lab : New > Lab.
- Ajouter R1 (Cisco IOL L3), SW1 (Cisco IOL L2), VPCS1, un FortiGate et un réseau Cloud0.
- Câbler comme sur le schéma, puis démarrer tous les nœuds.
- Configuration de R1 :
enable
configure terminal
hostname R1
interface Ethernet0/0
ip address 10.0.0.1 255.255.255.0
no shutdown
interface Ethernet0/1
ip address 192.168.1.1 255.255.255.0
no shutdown
ip route 0.0.0.0 0.0.0.0 10.0.0.2
end
write memory
- Configuration du FortiGate :
port2en10.0.0.2/24, route vers192.168.1.0/24via10.0.0.1, et une politique firewall autorisantport2versport1(avec NAT). - Sur VPCS1 :
ip 192.168.1.10/24 192.168.1.1
ping 10.0.0.2
ping 192.168.10.1
| Test | Résultat attendu |
|---|---|
ping 10.0.0.2 depuis VPCS1 |
Réponses |
| Accès à l'interface web du FortiGate | Page de connexion HTTPS |
show ip route sur R1 |
Route par défaut présente |
| Redémarrage du lab | Les nœuds repartent sans erreur |
| Élément | Chemin | Fréquence |
|---|---|---|
| Labs et projets | /opt/unetlab/labs/ |
À chaque modification importante |
| Base de données | mysqldump --all-databases > /root/pnet-db.sql |
Quotidien |
| Images | /opt/unetlab/addons/ |
Après chaque import (volumineux) |
| Réseau | /etc/network/interfaces |
À chaque changement |
| Snapshot VM | Hyperviseur | Avant toute mise à jour |
Exemple :
tar czf /root/pnet-labs-$(date +%F).tgz /opt/unetlab/labs
mysqldump --all-databases > /root/pnet-db-$(date +%F).sqlStockez ces sauvegardes hors de la VM.
Aucune mise à jour automatique n'est recommandée : prenez un snapshot, vérifiez la compatibilité avec la version d'Ubuntu et l'état des paquets, puis testez sur une copie. Évitez ishare2 upgrade pour PNETLab lui-même sur une installation par script.
tail -n 50 /opt/unetlab/data/Logs/unl_wrapper.txt
tail -n 50 /var/log/pnetlab-install.log
journalctl -u apache2 --since "1 hour ago"| Symptôme | Cause probable | Action |
|---|---|---|
| « Ubuntu 20.04 requis » | Mauvaise version d'OS | Réinstaller en 20.04 |
bad interpreter |
Fins de ligne Windows | dos2unix install_pnetlab_v6.sh |
| Attente prolongée du verrou dpkg | unattended-upgrades actif |
Laisser terminer ou systemctl stop unattended-upgrades |
| Virtualisation matérielle absente | Imbrication non exposée | Reprendre le §3 |
| Pas d'accès web | Réseau mal configuré | §6.4, puis systemctl status apache2 |
| Nœuds QEMU qui ne démarrent pas | /dev/kvm absent |
§3 |
| Image invisible ou nœud qui s'éteint immédiatement | Permissions | fixpermissions |
IOL : not found avec ldd |
Bibliothèques 32 bits | §11.1 |
IOL : invalid license |
iourc absent, invalide ou nom d'hôte modifié |
Contrôler iourc et hostname |
Segmentation fault |
Image corrompue ou RAM insuffisante | Retélécharger, vérifier free -m |
unable to open NETMAP |
Message normal en lancement manuel | Aucune action |
| FortiGate bloqué au démarrage | RAM ou version incompatible | Console série, augmenter la RAM, consulter les notes de version |
| FortiGate : disque non trouvé | Mauvais nom de fichier | Le disque doit s'appeler virtioa.qcow2 |
| Nœud sans accès externe | Cloud non relié à une interface active, promiscuité refusée | §3 et §6.5 |
Failed to download the JSON index file |
DNS ou pare-feu | §6.4 |
Test manuel d'une image IOL pour lire l'erreur réelle :
cd /opt/unetlab/addons/iol/bin
export IOURC=/opt/unetlab/addons/iol/bin/iourc
./<IMAGE>.bin 1Autres contrôles :
ps aux | grep -E 'i86bi|qemu'
free -m
df -h /opt- Snapshot de la VM une fois le système stable.
- Ne jamais renommer l'hôte
pnetlab. - Lancer
fixpermissionsaprès chaque ajout d'image. - Ne pas mélanger les templates L2 et L3.
- Changer tous les mots de passe par défaut.
- Ne jamais publier de fichier contenant un mot de passe, une clé ou une licence.
- Documenter les versions d'images utilisées dans chaque lab.
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
ishare2 test
ishare2 search all
ishare2 installed bin
mode default offline| Objet | Chemin |
|---|---|
| IOL | /opt/unetlab/addons/iol/bin/ |
| Licence IOL | /opt/unetlab/addons/iol/bin/iourc |
| Dynamips | /opt/unetlab/addons/dynamips/ |
| QEMU | /opt/unetlab/addons/qemu/<préfixe>-<nom>/ |
| Labs | /opt/unetlab/labs/ |
| Journaux du wrapper | /opt/unetlab/data/Logs/unl_wrapper.txt |
| Journal d'installation | /var/log/pnetlab-install.log |
| Configuration réseau | /etc/network/interfaces |
- Les images Cisco (IOL, IOS, vIOS, CSR, ASAv) et Fortinet (FortiOS) sont la propriété de leurs éditeurs. Il vous appartient de disposer des licences nécessaires. Ce document ne décrit pas de méthode pour contourner ou générer des licences.
- ishare2 facilite le téléchargement d'images hébergées par la communauté ; il ne fournit aucune licence. Certaines images (Cisco, Fortinet, Palo Alto...) restent soumises aux conditions de leur éditeur, et leur usage hors évaluation ou laboratoire autorisé relève de votre responsabilité.
- Les alternatives officielles : Cisco Modeling Labs (CML) pour Cisco, et les licences d'évaluation ou de laboratoire de Fortinet.
- Les paquets d'installation de PNETLab proviennent de sources tierces : vérifiez leur provenance avant tout usage hors laboratoire.