phpIPAM : cartographier son réseau en self-hosted
Dès qu'un réseau dépasse une poignée d'appareils — plusieurs VLAN, des serveurs, des objets connectés, des caméras — le classique tableur "qui a quelle IP" devient vite intenable. phpIPAM est un outil open source de gestion d'adresses IP (IPAM) qui centralise sous-réseaux, VLAN et appareils dans une interface web claire, avec historique et API. C'est l'outil que j'utilise en interne pour garder une vue à jour de mon propre réseau, et que je déploie chez mes clients dès que le parc dépasse une dizaine d'équipements.
1. Architecture
phpIPAM se déploie en trois conteneurs : une base MariaDB, l'interface web, et un conteneur "cron" chargé des tâches planifiées (scans réseau automatiques, notamment). Voici le docker-compose.yml :
services:
phpipam-db:
image: mariadb:11
container_name: phpipam-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: change-moi
volumes:
- ./db-data:/var/lib/mysql
phpipam-web:
image: phpipam/phpipam-www:latest
container_name: phpipam-web
restart: unless-stopped
ports:
- "8083:80"
environment:
IPAM_DATABASE_HOST: phpipam-db
IPAM_DATABASE_PASS: change-moi
IPAM_TRUST_X_FORWARDED: "true"
dns:
- 192.168.1.1 # votre routeur/DNS local, voir section 3
depends_on:
- phpipam-db
phpipam-cron:
image: phpipam/phpipam-cron:latest
container_name: phpipam-cron
restart: unless-stopped
environment:
IPAM_DATABASE_HOST: phpipam-db
IPAM_DATABASE_PASS: change-moi
SCAN_INTERVAL: 1h
dns:
- 192.168.1.1
depends_on:
- phpipam-db
2. Premier lancement
Démarrez la stack, puis suivez l'assistant d'installation web :
$ docker compose up -d
# Interface disponible sur http://<IP_SERVEUR>:8083
L'assistant "New phpipam installation" crée le schéma de base automatiquement. Une fois terminé, ajoutez la variable IPAM_DISABLE_INSTALLER=1 au service phpipam-web et relancez — cela évite de relancer accidentellement l'installeur, qui écraserait la base existante.
dns: pointant vers votre routeur/résolveur local) sur les deux conteneurs phpipam-web et phpipam-cron, les scans réseau ne résolvent aucun nom d'hôte — vous récupérez des IP nues sans nom de machine, bien moins utile au quotidien.3. Configurer le scan réseau automatique
- Dans Administration → Sections/Subnets, activez le scan sur les sous-réseaux à surveiller.
- Le conteneur
phpipam-cronexécute le scan selon l'intervalle défini (SCAN_INTERVAL). - Les nouveaux appareils détectés apparaissent en attente de validation, avec leur adresse MAC et, si la résolution DNS fonctionne, leur nom d'hôte.
4. Derrière un reverse proxy
Si phpIPAM est exposé via un reverse proxy (Nginx, Traefik, ou celui de votre NAS), la variable IPAM_TRUST_X_FORWARDED=true est indispensable : sans elle, l'application ne fait pas confiance à l'en-tête X-Forwarded-For et peut mal interpréter les adresses IP des visiteurs dans ses journaux.
5. Astuce : un champ personnalisé pour stocker les ports scannés
Si vous couplez phpIPAM à un scanner de ports externe (via son API), le champ description standard est trop court pour stocker une liste de ports (environ 250 caractères en pratique). Créez plutôt un champ personnalisé de type Text (et non Varchar) dans Administration → IP related management → Custom fields : la limite de taille disparaît.
L'API REST de phpIPAM permet d'automatiser entièrement la mise à jour des fiches IP depuis un outil tiers (n8n, un script Python, etc.) — pratique pour transformer un scan de ports périodique en inventaire toujours à jour, sans ressaisie manuelle.
Conclusion
phpIPAM ne demande que quelques minutes à mettre en place et change vraiment la donne dès que le réseau grandit : fini les conflits d'IP découverts par hasard et les tableurs qui traînent. C'est un des premiers outils que j'installe lors d'un audit d'infrastructure chez un client.