NetDTL — Manuel de référence
Référence complète de l'application web d'inventaire réseau agentless et de diagnostic NetDTL v3.0.
Présentation
NetDTL est une application web auto-hébergée pour la découverte réseau agentless et la gestion d'inventaire sur infrastructure Windows. Elle fonctionne sur un stack PHP/MySQL/Nmap (XAMPP ou LAMP) et fournit un scan en temps réel via Server-Sent Events, le profilage des machines, des diagnostics réseau et la gestion du panneau de brassage — le tout via une interface web sombre sans dépendance JavaScript externe.
L'application est structurée en un ensemble de pages PHP, chacune responsable d'un domaine fonctionnel, partageant une couche de base de données commune (db.php), une feuille de style CSS (style.php) et des partiels de mise en page (topbar.php, sidebar.php).
Prérequis
| Composant | Version | Notes |
|---|---|---|
| PHP | 8.x | Extensions requises : pdo_mysql, mbstring |
| MySQL / MariaDB | toute version récente | Utilisé via PDO |
| Nmap | toute version récente | Doit être accessible depuis le processus PHP ; chemin défini via NMAP_PATH |
| XAMPP or LAMP | — | Tout environnement serveur PHP+MySQL standard |
| PowerShell | 5.1 / 7+ | Requis pour les descriptions WMI et les requêtes IP/services locaux |
shell_exec. Le compte du processus PHP doit disposer de privilèges suffisants, et Nmap doit être dans le PATH système ou son chemin complet renseigné dans db.php.Installation
Déployer les fichiers de l'application dans la racine du serveur web (ex. htdocs/netdtl/ sous XAMPP, ou un virtual host dédié).
1. Créer la base de données
CREATE DATABASE netdtl CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'netdtl'@'localhost' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON netdtl.* TO 'netdtl'@'localhost';
FLUSH PRIVILEGES;
2. Configurer db.php
Modifier les constantes en haut de db.php pour correspondre à l'environnement. Le schéma de base de données est créé automatiquement au premier démarrage par initDB().
3. Premier démarrage
Ouvrir l'application dans un navigateur. initDB() créera toutes les tables requises si elles n'existent pas. Se connecter avec les identifiants définis dans AUTH_USER / AUTH_PASS.
Configuration
Toute la configuration se trouve dans db.php sous forme de constantes PHP. Il n'existe pas de fichier de configuration séparé.
| Constante | Description |
|---|---|
| DB_HOST | Hôte MySQL, typiquement localhost |
| DB_NAME | Nom de la base de données |
| DB_USER | Utilisateur de la base de données |
| DB_PASS | Mot de passe de la base de données |
| AUTH_USER | Nom d'utilisateur HTTP Basic Auth |
| AUTH_PASS | Mot de passe HTTP Basic Auth (en clair dans la version actuelle) |
| NMAP_PATH | Chemin complet vers le binaire Nmap, ex. C:/Program Files (x86)/Nmap/nmap.exe |
| DEFAULT_NETWORK | Plage CIDR pré-remplie affichée sur la page de découverte |
| APP_VERSION | Chaîne de version affichée dans le pied de la barre latérale |
Schéma de base de données
Les tables sont créées automatiquement par initDB() dans db.php via CREATE TABLE IF NOT EXISTS.
machines
Table d'inventaire centrale. Une ligne par adresse IP (clé unique sur ip).
| Colonne | Type | Description |
|---|---|---|
| id | INT AUTO_INCREMENT | Clé primaire |
| hostname | VARCHAR | Hostname court ou IP si aucun nom résolu |
| ip | VARCHAR(45) | Adresse IPv4 — contrainte d'unicité |
| mac | VARCHAR(17) | Adresse MAC en majuscules séparée par des deux-points |
| vendor | VARCHAR | Fabricant de la carte réseau issu de la table OUI Nmap |
| os | VARCHAR | Chaîne OS issue de la détection Nmap ou d'une saisie manuelle |
| switch_port | VARCHAR | Étiquette du port switch (ex. port1.0.3), renseigné manuellement |
| patch_port | VARCHAR | Étiquette du port brassage (ex. B31), renseigné manuellement |
| open_ports | TEXT | Liste des ports ouverts séparés par des virgules, issus du dernier scan de ports |
| status | ENUM('up','down','unknown') | Statut de joignabilité courant |
| last_ping_ms | INT | RTT ping moyen en millisecondes du dernier ping |
| comment | TEXT | Note libre ; aussi alimentée par l'enrichissement WMI / NetBIOS |
| first_seen | DATETIME | Définie à l'INSERT, jamais mise à jour |
| last_seen | DATETIME | Mise à jour à chaque hit de scan ou ping |
scan_history
Une ligne par scan de découverte terminé.
| Colonne | Type | Description |
|---|---|---|
| id | INT AUTO_INCREMENT | Clé primaire |
| scan_date | DATETIME | Horodatage de fin de scan |
| network | VARCHAR | Plage CIDR qui a été scannée |
| hosts_up | INT | Nombre d'hôtes trouvés actifs |
| hosts_down | INT | Stocké à 0 dans la version actuelle |
| duration_s | INT | Durée du scan en secondes |
diag_history
Journal de toutes les opérations de diagnostic (ping, traceroute, DNS, scan de ports, détection OS).
| Colonne | Type | Description |
|---|---|---|
| id | INT AUTO_INCREMENT | Clé primaire |
| action | VARCHAR | Nom de l'outil : ping, nmap, traceroute, dns, ports, infos, services, nmap_os |
| target | VARCHAR | IP, hostname ou CIDR ciblé |
| result | TEXT | 20 premières lignes de la sortie de la commande |
| success | TINYINT | Toujours 1 dans la version actuelle |
| created | DATETIME | Horodatage de l'opération |
patch_panel
Ports du panneau de brassage physique, généralement alimentés par import (CSV ou SQL direct).
| Colonne | Type | Description |
|---|---|---|
| id | INT AUTO_INCREMENT | Clé primaire |
| prise | VARCHAR | Étiquette de la prise murale (ex. B31) — unique |
| type | VARCHAR | RJ45, RJ11, ou autre |
| entite | VARCHAR | Entité ou département propriétaire |
| local_name | VARCHAR | Nom du local ou de la pièce |
| etage | VARCHAR | Étage |
| poste | VARCHAR | Référence du poste ou du bureau |
| switch | VARCHAR | Nom ou identifiant du switch |
| port_switch | VARCHAR | Port switch (ex. port1.0.3) |
| notes | TEXT | Notes libres |
patch_machines
Jointure many-to-many entre les ports du panneau de brassage et les machines (un port peut desservir plusieurs IP).
| Colonne | Type | Description |
|---|---|---|
| id | INT AUTO_INCREMENT | Clé primaire |
| prise | VARCHAR | Référence étrangère vers patch_panel.prise |
| machine_ip | VARCHAR | Adresse IP de la machine sur ce port |
| hostname | VARCHAR | Hostname au moment de l'association |
Pages
Tableau de bord
Nécessite une authentification via requireAuth(). Page d'accueil par défaut après connexion.
- Nombre total de machines, compteurs par statut (
up,down,unknown) - Dernier scan : date, réseau, nombre d'hôtes (depuis
scan_history) - 8 machines les plus récemment vues, triées par
last_seen DESC - 5 entrées les plus récentes de
diag_history
Page en lecture seule. Toutes les actions (ping, ajout, suppression) se trouvent sur inventory.php et machine.php.
Inventaire
| Paramètre | Description |
|---|---|
| q | Recherche libre sur hostname, IP, OS, commentaire |
| status | Filtre par statut : up, down, ou unknown |
| export=csv | Déclenche le téléchargement CSV de l'inventaire complet (ignore tous les filtres) |
| Champ | Action |
|---|---|
| add_machine | Insère une nouvelle ligne machine. Champs obligatoires : hostname, ip (IP valide). Optionnels : os, comment, switch_port, patch_port. |
| delete_id | Supprime la machine avec l'ID donné. Demande une confirmation JavaScript avant soumission. |
| ping_id | Lance un ping contre l'IP de la machine via runPing(), met à jour status, last_ping_ms, last_seen. |
| ping_all | Ping toutes les machines de l'inventaire séquentiellement. Met à jour tous les champs de statut. |
Déclenché par ?export=csv. Exporte toutes les machines triées par INET_ATON(ip) (tri IP numérique). Colonnes : Hostname, IP, MAC, Fabricant, Port switch, Brassage, OS, Statut, Ports ouverts, Ping (ms), Dernière vue, Commentaire. BOM ajouté pour compatibilité Excel UTF-8.
$_SERVER['SERVER_ADDR'] et remplace l'affichage du champ MAC par ce PC (en italique) pour éviter toute confusion avec la MAC de Nmap (que Nmap ne peut pas lire pour la machine qui scanne).Fiche machine
diag_history.| Paramètre | Description |
|---|---|
| id | ID de la machine (entier). Redirige vers inventory.php si non trouvée. |
| Champ / valeur | Action |
|---|---|
| save | Met à jour os, switch_port, patch_port, comment pour la machine. |
| diag=ping | Lance un ping via runPing(). Met à jour status et last_ping_ms. |
| diag=ports | Lance nmap -p 21,22,23,25,80,110,143,443,445,3306,3389,5900,8080. Met à jour open_ports en BDD. |
| diag=traceroute | Lance tracert (Windows). |
| diag=dns | Lance nslookup. |
| diag=nmap_os | Lance nmap -O --host-timeout 10s. Extrait et sauvegarde la ligne OS details dans machines.os. |
Chaque ligne de sortie est classifiée et colorée : les lignes correspondant à TTL, Reply ou open sont en vert ; timeout / unreachable / filtered en orange ; error / failed en rouge. Un élément <pre id="raw-output"> masqué contient le texte brut pour la copie dans le presse-papier.
nmap -O requiert que le processus PHP s'exécute en tant qu'Administrateur (Windows) ou root (Linux).Découverte réseau
scan_stream.php. Les hôtes découverts sont automatiquement insérés ou mis à jour dans la table machines.| Contrôle | Description |
|---|---|
| Champ réseau | Plage CIDR (ex. 192.168.1.0/24). Pré-rempli avec DEFAULT_NETWORK. |
| Ports communs | Si coché, lance un scan de ports supplémentaire sur chaque hôte découvert (?ports=1). |
| Détection OS | Ajoute -O à la commande Nmap (?os=1). Requiert admin/root. |
| Identifier NetBIOS | Lance une seconde passe de requêtes nbstat après le scan principal (?nbstat=1). |
| Descriptions WMI | Interroge chaque hôte actif via PowerShell WMI pour la description OS (?wmi=1). |
La page ouvre une connexion EventSource vers scan_stream.php avec des paramètres de requête reflétant les options sélectionnées. Les événements sont traités par handleEvent(data) en JavaScript.
| Type d'événement | Description |
|---|---|
| line | Ligne brute de sortie Nmap. Classifiée par couleur et ajoutée au bloc terminal. |
| host_saved | Un hôte a été inséré ou mis à jour. Ajoute une ligne au tableau des hôtes découverts dans l'interface. |
| mac | Adresse MAC et fabricant résolus pour une IP. Met à jour la ligne correspondante dans le tableau. |
| os | Chaîne OS détectée. Met à jour la ligne correspondante dans le tableau. |
| nbstat | Nom NetBIOS résolu. Met à jour la colonne description dans le tableau des hôtes. |
| wmi | Description WMI récupérée. Ajoutée à la colonne description dans le tableau des hôtes. |
| done | Scan terminé. Met à jour les stats (nombre d'hôtes, durée), ajoute une ligne au tableau d'historique, complète la barre de progression. |
| error | Erreur fatale côté serveur. Ferme l'EventSource, affiche le message d'erreur. |
Le bas de la page affiche les 10 entrées les plus récentes de scan_history. Une nouvelle ligne est ajoutée dynamiquement en JavaScript à la réception de l'événement done, sans rechargement de la page.
Endpoint SSE de découverte
discovery.php. Exécute Nmap, analyse sa sortie ligne par ligne, insère ou met à jour les machines en base de données, et lance optionnellement des passes d'enrichissement NetBIOS et WMI. Non destiné à être accédé directement.| Paramètre | Défaut | Description |
|---|---|---|
| network | DEFAULT_NETWORK | Plage CIDR à scanner. Validée par isValidTarget() avant utilisation. |
| ports | 0 | Si 1, lance un scan de ports sur chaque hôte découvert après le sweep ping. |
| os | 0 | Si 1, utilise nmap -sS -O au lieu de nmap -sn. Requiert des privilèges élevés. |
| nbstat | 0 | Si 1, lance une passe NetBIOS après le scan principal. |
| wmi | 0 | Si 1, interroge les descriptions WMI via PowerShell après le scan principal. |
- Phase 1 — Sweep Nmap : lance
nmap -sn -R -T4(ou-sS -Osi la détection OS est activée) viapopen(). La sortie est analysée ligne par ligne. À chaque ligneNmap scan report for, l'hôte précédent (le cas échéant) est sauvegardé en BDD et un événementhost_savedest émis. Les adresses MAC, fabricants et chaînes OS sont extraits par regex et émis comme événements séparés. - Phase 2 — NetBIOS (optionnel) : itère toutes les machines
status='up'. Pour chacune, lancenmap -sU -p 137 --script nbstat. Extrait le nom NetBIOS, le groupe de travail et l'utilisateur connecté. Met à jour le hostname (s'il est actuellement une IP) et le commentaire en BDD. - Phase 3 — WMI (optionnel) : itère toutes les machines
status='up'. Pour chacune, lance une requête PowerShellGet-WmiObject Win32_OperatingSystem. Stocke le champDescriptiondansmachines.comments'il n'est pas déjà renseigné.
La fonction saveMachineStream() utilise INSERT ... ON DUPLICATE KEY UPDATE sur la colonne ip. Les valeurs existantes pour MAC, fabricant et OS sont préservées avec COALESCE(VALUES(col), col) — un scan n'écrasera pas les données saisies manuellement avec une valeur nulle.
La sortie Nmap sous Windows est typiquement en CP850. Chaque ligne est convertie en UTF-8 via mb_convert_encoding($raw, 'UTF-8', 'CP850') avant d'être émise comme payload JSON SSE.
set_time_limit(600) est appelé. Les grands réseaux ou les hôtes lents peuvent approcher cette limite. Le buffering de sortie est désactivé (ob_end_flush()) pour garantir que les événements sont diffusés dès leur arrivée.Panneau de brassage
patch_panel jointe aux IPs et hostnames de machines associées depuis patch_machines. Supporte le filtrage par switch, entité et recherche libre.| Paramètre | Description |
|---|---|
| q | Recherche libre sur l'étiquette de prise, le nom du local, le poste, l'IP, le hostname |
| switch | Filtre par identifiant de switch |
| entite | Filtre par entité / département |
La table patch_panel n'est pas alimentée par NetDTL lui-même. Elle est destinée à être remplie par import externe (CSV, script SQL ou le moteur de patch panel du NetDTL Installer). L'application fournit uniquement l'interface de consultation et de filtrage.
Pour chaque port, les machines associées sont récupérées depuis patch_machines via une jointure GROUP_CONCAT. Plusieurs IPs et hostnames par port s'affichent sous forme de listes séparées par des virgules.
Les types de ports sont colorés : RJ45 en bleu, RJ11 en orange, inconnu en gris. Les badges d'entité distinguent l'équipement local (bleu-vert) du délégué (vert) par une correspondance insensible à la casse sur le mot locale dans le nom de l'entité.
Composants partagés
Sécurité
NetDTL utilise l'authentification HTTP Basic implémentée dans requireAuth(). Les identifiants sont stockés en clair dans db.php. Cela est acceptable pour un déploiement sur un réseau local de confiance, mais ne doit pas être exposé sur internet sans protection complémentaire (reverse proxy avec TLS, filtrage IP, etc.).
- Toutes les valeurs saisies par l'utilisateur rendues en HTML sont passées par
htmlspecialchars(). - Toutes les requêtes de base de données utilisent des requêtes préparées PDO avec des paramètres liés.
- Les commandes shell utilisent
escapeshellarg()sur toutes les cibles fournies par l'utilisateur, validées au préalable parisValidTarget(). - La plage CIDR dans
scan_stream.phpest validée parisValidTarget()avant d'être transmise à Nmap.
AUTH_PASS est stockée en clair. Ne pas réutiliser un mot de passe sensible. Pour les environnements de production, envisager de remplacer requireAuth() par une authentification basée sur les sessions ou de déléguer l'authentification au serveur web.Limitations connues
- Commandes centrées Windows. Le ping utilise
ping -n 4et le traceroute utilisetracert. Sous Linux,runPing()bascule versping -c 4, maistracert(menu.php) n'est pas adapté — utilisertraceroutemanuellement sous Linux. - Adresse MAC non disponible pour la machine qui scanne. Nmap ne peut pas lire sa propre MAC. La page d'inventaire détecte ce cas et remplace le champ MAC par l'étiquette ce PC.
- La détection OS nécessite des privilèges élevés.
nmap -Oetnmap -sSnécessitent que le processus du serveur web s'exécute en tant qu'Administrateur (Windows) ou root (Linux). Sans élévation, ces options ne retournent silencieusement aucune donnée OS. - Les requêtes WMI nécessitent un accès réseau et une cible Windows. L'appel PowerShell WMI dans
scan_stream.phpne fonctionne que contre des machines Windows autorisant le WMI distant, et uniquement lorsque le serveur qui scanne dispose d'identifiants appropriés sur la cible. - L'identification NetBIOS nécessite UDP 137. Le script Nmap
nbstatutilise le port UDP 137. Les pare-feux ou règles Windows Firewall bloquant ce port empêcheront la résolution des noms NetBIOS. - Les données du panneau de brassage ne sont pas gérées par l'application. Les tables
patch_paneletpatch_machinesdoivent être alimentées en externe (ex. via le moteur de patch panel du NetDTL Installer ou un import SQL direct). - Authentification mono-utilisateur. Il n'existe qu'un seul jeu d'identifiants. Il n'y a pas de gestion de rôles ni de journal d'audit par utilisateur.
- Limite de durée de scan.
set_time_limit(600)limite les scans à 10 minutes. Les grands réseaux ou les réseaux lents peuvent dépasser cette limite. hosts_downest toujours 0. La colonnescan_history.hosts_downest insérée à 0 ; les hôtes qui ne répondent pas ne sont simplement pas ajoutés à l'inventaire lors d'un scan.
NetDTL Web site