401 lines
12 KiB
Markdown
Executable File
401 lines
12 KiB
Markdown
Executable File
# IPWatch - Scanner Réseau Temps Réel
|
|
|
|
IPWatch est une application web de scan réseau qui visualise en temps réel l'état des adresses IP, leurs ports ouverts, et l'historique des détections sur votre réseau local.
|
|
|
|
## Fonctionnalités
|
|
|
|
- 🔍 **Scan réseau automatique** : Ping, ARP lookup, et scan de ports périodiques
|
|
- 📊 **Visualisation temps réel** : Interface web avec mise à jour WebSocket
|
|
- 🎨 **Thème Monokai** : Interface sombre avec codes couleurs intuitifs
|
|
- 📝 **Gestion des IP** : Nommage, classification (connue/inconnue), métadonnées
|
|
- 📈 **Historique 24h** : Suivi de l'évolution de l'état du réseau
|
|
- 🔔 **Détection automatique** : Notification des nouvelles IP sur le réseau
|
|
- 🔗 **Intégration OPNsense** : Gestion des réservations DHCP Kea directement depuis l'interface
|
|
- 🌐 **Ports & Services** : Scan de services réseau (HTTP, SSH, Proxmox, etc.) avec résultats en temps réel et liens cliquables
|
|
- 🐳 **Déploiement Docker** : Configuration simple avec docker-compose
|
|
|
|
## Technologies
|
|
|
|
### Backend
|
|
- **FastAPI** - API REST et WebSocket
|
|
- **SQLAlchemy** - ORM pour SQLite
|
|
- **APScheduler** - Tâches planifiées
|
|
- **Scapy** - Scan ARP et réseau
|
|
- **httpx** - Client HTTP async (intégration OPNsense)
|
|
|
|
### Frontend
|
|
- **Vue 3** - Framework UI avec Composition API
|
|
- **Pinia** - State management
|
|
- **Tailwind CSS** - Styles avec palette Monokai
|
|
- **Vite** - Build tool
|
|
|
|
### Infrastructure
|
|
- **Docker** - Conteneurisation
|
|
- **SQLite** - Base de données
|
|
- **WebSocket** - Communication temps réel
|
|
|
|
## Installation
|
|
|
|
### Avec Docker (recommandé)
|
|
|
|
1. **Cloner le repository**
|
|
```bash
|
|
git clone <repo-url>
|
|
cd ipwatch
|
|
```
|
|
|
|
2. **Configurer le réseau**
|
|
|
|
Éditer `config.yaml` et ajuster le CIDR de votre réseau :
|
|
```yaml
|
|
network:
|
|
cidr: "192.168.1.0/24" # Adapter à votre réseau
|
|
```
|
|
|
|
3. **Lancer avec docker-compose**
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
4. **Accéder à l'interface**
|
|
|
|
Ouvrir votre navigateur : `http://localhost:8080`
|
|
|
|
### Installation manuelle (développement)
|
|
|
|
#### Backend
|
|
|
|
```bash
|
|
cd backend
|
|
pip install -r requirements.txt
|
|
python -m backend.app.main
|
|
```
|
|
|
|
#### Frontend
|
|
|
|
```bash
|
|
cd frontend
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
L'API sera accessible sur `http://localhost:8080`
|
|
Le frontend sur `http://localhost:3000`
|
|
|
|
## Configuration
|
|
|
|
Le fichier `config.yaml` permet de configurer :
|
|
|
|
- **Réseau** : CIDR, gateway, DNS
|
|
- **IPs connues** : Liste des appareils avec noms et emplacements
|
|
- **Scan** : Intervalles ping/ports, parallélisation
|
|
- **Ports** : Ports à scanner
|
|
- **Historique** : Durée de rétention
|
|
- **Interface** : Transparence, couleurs
|
|
- **Base de données** : Chemin SQLite
|
|
- **OPNsense** : Connexion API pour réservations DHCP Kea
|
|
- **Services** : Liste des services réseau à scanner (nom, port, protocole)
|
|
|
|
Exemple :
|
|
```yaml
|
|
network:
|
|
cidr: "192.168.1.0/24"
|
|
|
|
scan:
|
|
ping_interval: 60 # Scan ping toutes les 60s
|
|
port_scan_interval: 300 # Scan ports toutes les 5min
|
|
parallel_pings: 50 # 50 pings simultanés max
|
|
|
|
ports:
|
|
ranges:
|
|
- "22" # SSH
|
|
- "80" # HTTP
|
|
- "443" # HTTPS
|
|
- "3389" # RDP
|
|
|
|
ip_classes:
|
|
"192.168.1.1":
|
|
name: "Box Internet"
|
|
location: "Entrée"
|
|
host: "Routeur"
|
|
|
|
opnsense:
|
|
enabled: true
|
|
host: "10.0.0.1"
|
|
protocol: "http" # "http" ou "https"
|
|
api_key: "votre_api_key"
|
|
api_secret: "votre_api_secret"
|
|
verify_ssl: false
|
|
|
|
services:
|
|
- name: "HTTP"
|
|
port: 80
|
|
protocol: "http"
|
|
- name: "HTTPS"
|
|
port: 443
|
|
protocol: "https"
|
|
- name: "SSH"
|
|
port: 22
|
|
protocol: "ssh"
|
|
- name: "Proxmox VE"
|
|
port: 8006
|
|
protocol: "https"
|
|
```
|
|
|
|
## Interface utilisateur
|
|
|
|
L'interface est organisée en 3 colonnes :
|
|
|
|
### Colonne gauche - Détails IP
|
|
- Informations détaillées de l'IP sélectionnée
|
|
- Formulaire d'édition (nom, localisation, type d'hôte)
|
|
- Informations réseau (MAC, vendor, hostname, ports ouverts)
|
|
- Bouton de réservation DHCP OPNsense (si MAC disponible)
|
|
- Indicateur "DHCP réservé" (checkbox en lecture seule)
|
|
|
|
### Colonne centrale - Grille d'IP
|
|
- Vue d'ensemble de toutes les IP du réseau
|
|
- Codes couleurs selon l'état :
|
|
- 🟢 **Vert** : En ligne + connue
|
|
- 🔵 **Cyan** : En ligne + inconnue
|
|
- 🔴 **Rose** : Hors ligne + connue (bordure pointillée)
|
|
- 🟣 **Violet** : Hors ligne + inconnue (bordure pointillée)
|
|
- ⚪ **Gris** : IP libre
|
|
- Filtres : En ligne, Hors ligne, Connues, Inconnues, Libres
|
|
- Légende interactive
|
|
|
|
### Colonne droite - Nouvelles détections
|
|
- Liste des IP récemment découvertes
|
|
- Tri par ordre chronologique
|
|
- Indicateur temps relatif
|
|
|
|
## API REST
|
|
|
|
### Endpoints IPs
|
|
|
|
- `GET /api/ips/` - Liste toutes les IPs (avec filtres optionnels)
|
|
- `GET /api/ips/{ip}` - Détails d'une IP
|
|
- `PUT /api/ips/{ip}` - Mettre à jour une IP
|
|
- `DELETE /api/ips/{ip}` - Supprimer une IP
|
|
- `GET /api/ips/{ip}/history` - Historique d'une IP
|
|
- `GET /api/ips/stats/summary` - Statistiques globales
|
|
|
|
### Endpoints OPNsense (Kea DHCP)
|
|
|
|
- `GET /api/opnsense/status` - Test connexion OPNsense
|
|
- `GET /api/opnsense/dhcp/reservations` - Lister les réservations DHCP Kea
|
|
- `GET /api/opnsense/dhcp/reservation/{ip}` - Chercher une réservation par IP
|
|
- `POST /api/opnsense/dhcp/reservation` - Créer ou mettre à jour une réservation DHCP
|
|
|
|
### Endpoints Ports & Services
|
|
|
|
- `GET /api/services/list` - Liste des services configurés dans config.yaml
|
|
- `POST /api/services/scan` - Lancer un scan de services (ports sélectionnés sur toutes les IPs connues)
|
|
|
|
### Endpoints Scan
|
|
|
|
- `POST /api/scan/start` - Lancer un scan immédiat
|
|
- `POST /api/scan/cleanup-history` - Nettoyer l'historique ancien
|
|
|
|
### WebSocket
|
|
|
|
- `WS /ws` - Connexion WebSocket pour notifications temps réel
|
|
|
|
Messages WebSocket :
|
|
- `scan_start` - Début de scan
|
|
- `scan_complete` - Fin de scan avec statistiques
|
|
- `ip_update` - Changement d'état d'une IP
|
|
- `new_ip` - Nouvelle IP détectée
|
|
- `service_scan_start` - Début de scan de services
|
|
- `service_scan_progress` - Progression du scan (IP en cours)
|
|
- `service_scan_log` - Log individuel par IP scannée
|
|
- `service_scan_result` - Résultat individuel en temps réel (service détecté)
|
|
- `service_scan_complete` - Fin de scan avec résultats agrégés
|
|
|
|
## Tests
|
|
|
|
Exécuter les tests backend :
|
|
|
|
```bash
|
|
cd backend
|
|
pytest
|
|
```
|
|
|
|
Tests disponibles :
|
|
- `test_network.py` - Tests modules réseau (ping, ARP, port scan)
|
|
- `test_models.py` - Tests modèles SQLAlchemy
|
|
- `test_api.py` - Tests endpoints API
|
|
- `test_scheduler.py` - Tests scheduler APScheduler
|
|
|
|
## Intégration OPNsense / Kea DHCP
|
|
|
|
IPWatch peut se connecter à un pare-feu OPNsense pour gérer les réservations DHCP Kea directement depuis l'interface web.
|
|
|
|
### Configuration
|
|
|
|
Ajouter la section `opnsense` dans `config.yaml` :
|
|
|
|
```yaml
|
|
opnsense:
|
|
enabled: true
|
|
host: "10.0.0.1" # IP ou hostname OPNsense
|
|
protocol: "http" # "http" ou "https"
|
|
api_key: "votre_api_key"
|
|
api_secret: "votre_api_secret"
|
|
verify_ssl: false # false pour certificats auto-signés
|
|
```
|
|
|
|
Les clés API se génèrent dans OPNsense : **Système > Accès > Utilisateurs > [utilisateur] > Clés API**.
|
|
|
|
### Fonctionnement
|
|
|
|
1. Sélectionner un équipement dans la grille (il doit avoir une adresse MAC)
|
|
2. Cliquer sur le bouton **DHCP** (icone routeur) dans le volet gauche
|
|
3. Un popup s'ouvre avec les champs pré-remplis : MAC, IP, hostname, description
|
|
4. Cliquer **"Mettre à jour OPNsense"** pour créer ou mettre à jour la réservation
|
|
5. IPWatch résout automatiquement le subnet Kea correspondant à l'IP
|
|
6. Après succès, la checkbox **"DHCP réservé"** passe au vert
|
|
|
|
### Flux technique
|
|
|
|
```
|
|
IPWatch Frontend → POST /api/opnsense/dhcp/reservation
|
|
→ Résolution automatique du subnet UUID Kea
|
|
→ Recherche réservation existante par IP
|
|
→ Création ou mise à jour de la réservation
|
|
→ Reconfiguration du service Kea (application immédiate)
|
|
→ Mise à jour dhcp_synced=true en BDD
|
|
→ Retour au frontend (checkbox verte)
|
|
```
|
|
|
|
## Ports & Services
|
|
|
|
L'onglet **Ports & Services** permet de scanner le réseau à la recherche de services spécifiques et d'afficher les résultats dans un tableau avec des liens cliquables.
|
|
|
|
### Configuration
|
|
|
|
Les services à scanner sont définis dans la section `services` de `config.yaml` :
|
|
|
|
```yaml
|
|
services:
|
|
- name: "HTTP"
|
|
port: 80
|
|
protocol: "http"
|
|
- name: "Proxmox VE"
|
|
port: 8006
|
|
protocol: "https"
|
|
- name: "SSH"
|
|
port: 22
|
|
protocol: "ssh"
|
|
```
|
|
|
|
Chaque service a un `name`, un `port`, et un `protocol` optionnel (http, https, ssh, rdp, smb...). Le protocole détermine la construction des URLs cliquables.
|
|
|
|
### Fonctionnement
|
|
|
|
1. Ouvrir l'onglet **Ports & Services** depuis la barre de navigation
|
|
2. Cocher les services à scanner dans le volet gauche
|
|
3. Cliquer **"Lancer le scan"**
|
|
4. Le scan teste chaque IP connue (en base) pour les ports sélectionnés
|
|
5. Les résultats apparaissent **en temps réel** dans le tableau central
|
|
6. Les services HTTP/HTTPS sont affichés avec des liens cliquables
|
|
|
|
### Performances
|
|
|
|
Le scan est parallélisé : **20 IPs sont testées simultanément** (configurable via `PARALLEL_IPS`). Pour un réseau de 1000 IPs avec un timeout de 1s, le scan complet prend environ 50 secondes.
|
|
|
|
### Interface
|
|
|
|
- **Volet gauche** : Liste des services avec checkboxes de sélection
|
|
- **Zone centrale** : Barre de progression + tableau de résultats (IP, nom, service, port, lien)
|
|
- **Volet droit** : Logs de scan en temps réel (redimensionnable)
|
|
|
|
## Architecture
|
|
|
|
```
|
|
ipwatch/
|
|
├── backend/
|
|
│ ├── app/
|
|
│ │ ├── core/ # Configuration, database
|
|
│ │ ├── models/ # Modèles SQLAlchemy
|
|
│ │ ├── routers/ # Endpoints API
|
|
│ │ ├── services/ # Services réseau, scheduler, WebSocket, client OPNsense
|
|
│ │ └── main.py # Application FastAPI
|
|
│ └── requirements.txt
|
|
├── frontend/
|
|
│ ├── src/
|
|
│ │ ├── assets/ # CSS Monokai
|
|
│ │ ├── components/ # Composants Vue
|
|
│ │ ├── stores/ # Pinia stores
|
|
│ │ ├── views/ # Vues (Main, Tracking, Services, Architecture, Test)
|
|
│ │ └── main.js
|
|
│ └── package.json
|
|
├── tests/ # Tests backend
|
|
├── config.yaml # Configuration
|
|
├── docker-compose.yml
|
|
└── Dockerfile
|
|
|
|
```
|
|
|
|
## Workflow de scan
|
|
|
|
Le scan réseau suit ce workflow (10 étapes) :
|
|
|
|
1. Charger configuration YAML
|
|
2. Générer liste IP du CIDR
|
|
3. Ping (parallélisé)
|
|
4. ARP + MAC vendor lookup
|
|
5. Port scan selon intervalle
|
|
6. Classification état (online/offline)
|
|
7. Mise à jour SQLite
|
|
8. Détection nouvelles IP
|
|
9. Push WebSocket vers clients
|
|
10. Mise à jour UI temps réel
|
|
|
|
## Sécurité
|
|
|
|
⚠️ **Attention** : IPWatch nécessite des privilèges réseau élevés (ping, ARP).
|
|
|
|
Le conteneur Docker utilise :
|
|
- `network_mode: host` - Accès au réseau local
|
|
- `privileged: true` - Privilèges pour scan réseau
|
|
- `cap_add: NET_ADMIN, NET_RAW` - Capacités réseau
|
|
|
|
**N'exposez pas cette application sur internet** - Usage réseau local uniquement.
|
|
|
|
## Volumes Docker
|
|
|
|
Trois volumes sont montés :
|
|
- `./config.yaml` - Configuration (lecture seule)
|
|
- `./data/` - Base de données SQLite
|
|
- `./logs/` - Logs applicatifs
|
|
|
|
## Dépannage
|
|
|
|
### Le scan ne détecte aucune IP
|
|
|
|
1. Vérifier le CIDR dans `config.yaml`
|
|
2. Vérifier que Docker a accès au réseau (`network_mode: host`)
|
|
3. Vérifier les logs : `docker logs ipwatch`
|
|
|
|
### WebSocket déconnecté
|
|
|
|
- Vérifier que le port 8080 est accessible
|
|
- Vérifier les logs du navigateur (F12 → Console)
|
|
- Le WebSocket se reconnecte automatiquement après 5s
|
|
|
|
### Erreur de permissions réseau
|
|
|
|
Le conteneur nécessite `privileged: true` pour :
|
|
- Envoi de paquets ICMP (ping)
|
|
- Scan ARP
|
|
- Capture de paquets réseau
|
|
|
|
## Licence
|
|
|
|
MIT
|
|
|
|
## Auteur
|
|
|
|
Développé avec Claude Code selon les spécifications IPWatch.
|