🛡️ Construisez Votre Propre Système de Surveillance Réseau avec ESP32 (Alternative DIY au FortiGate)
💡 Note du Maker : Au lieu d'acheter un firewall coûteux comme le FortiGate 100F (plusieurs milliers d'euros), découvrez comment créer votre propre système de surveillance réseau domestique avec un ESP32 pour moins de 15€ !
Figure 1 : Système de surveillance réseau DIY basé sur ESP32
Pourquoi Créer Votre Propre Système de Surveillance Réseau ?
Les solutions professionnelles comme FortiGate coûtent cher et sont surdimensionnées pour un usage domestique. Avec un ESP32, vous pouvez :
- Surveiller les appareils connectés à votre réseau en temps réel
- Détecter les intrusions et appareils non autorisés
- Monitorer la bande passante et la consommation de données
- Bloquer des appareils spécifiques via MAC filtering
- Coût total : ~15€ vs plusieurs milliers pour une solution pro
📦 Liste des Composants (BOM)
| Composant | Quantité | Prix |
|---|---|---|
| ESP32 DevKit V1 (WiFi + Bluetooth) | 1 | $5-8 |
| Écran OLED 0.96" I2C (affichage temps réel) | 1 | $4-6 |
| Module Ethernet W5500 (optionnel, pour connexion filaire) | 1 | $5-8 |
| TOTAL | - | $14-22 |
🔧 Fonctionnalités du Système DIY
- Scan réseau automatique : Détection de tous les appareils connectés
- Alertes en temps réel : Notification quand un nouvel appareil se connecte
- Filtrage MAC : Liste blanche/noire d'appareils autorisés
- Statistiques de bande passante : Suivi de la consommation de données
- Interface Web : Tableau de bord accessible depuis navigateur
- Intégration MQTT : Compatible avec Home Assistant
💻 Code Arduino Complet
/*
* Système de Surveillance Réseau DIY avec ESP32
* TechFix Hub - DIY Electronics & IoT Projects
*
* Fonctionnalités :
* - Scan des appareils connectés au réseau WiFi
* - Détection d'intrusion (nouveaux appareils)
* - Affichage OLED temps réel
* - Alertes via MQTT
*/
#include
#include
#include
#include
#include
#include
// Configuration WiFi
const char* ssid = "VOTRE_SSID";
const char* password = "VOTRE_PASSWORD";
// Configuration OLED
#define OLED_SDA 21
#define OLED_SCL 22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Serveur Web
WebServer server(80);
// MQTT (optionnel)
WiFiClient espClient;
PubSubClient mqttClient(espClient);
const char* mqtt_server = "192.168.1.100";
// Liste des appareils connus (MAC addresses autorisées)
String allowedMACs[] = {
"AA:BB:CC:DD:EE:01", // Téléphone
"AA:BB:CC:DD:EE:02", // Ordinateur
"AA:BB:CC:DD:EE:03" // Tablette
};
int allowedCount = 3;
// Structure pour stocker les appareils détectés
struct Device {
String mac;
String ip;
int rssi;
unsigned long lastSeen;
bool isNew;
};
Device detectedDevices[50];
int deviceCount = 0;
void setup() {
Serial.begin(115200);
// Initialisation OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Erreur OLED"));
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Network Monitor");
display.println("Initialisation...");
display.display();
// Connexion WiFi
WiFi.begin(ssid, password);
display.println("Connexion WiFi...");
display.display();
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
display.println("WiFi Connecte!");
display.print("IP: ");
display.println(WiFi.localIP());
display.display();
// Configuration mDNS
if (MDNS.begin("networkmonitor")) {
Serial.println("MDNS responder started");
}
// Configuration serveur Web
setupWebServer();
// Configuration MQTT (optionnel)
mqttClient.setServer(mqtt_server, 1883);
connectToMQTT();
} else {
display.println("Echec connexion WiFi");
display.display();
}
}
void loop() {
server.handleClient();
if (!mqttClient.connected()) {
connectToMQTT();
}
mqttClient.loop();
// Scan réseau toutes les 30 secondes
static unsigned long lastScan = 0;
if (millis() - lastScan > 30000) {
lastScan = millis();
scanNetwork();
updateDisplay();
}
delay(100);
}
void scanNetwork() {
int n = WiFi.scanNetworks();
if (n == 0) {
Serial.println("Aucun reseau detecte");
return;
}
Serial.print(n);
Serial.println(" reseaux detectes");
for (int i = 0; i < n; ++i) {
String ssid = WiFi.SSID(i);
String mac = WiFi.BSSIDstr(i);
int rssi = WiFi.RSSI(i);
// Vérifier si c'est un nouvel appareil
bool isKnown = false;
for (int j = 0; j < allowedCount; j++) {
if (mac.equalsIgnoreCase(allowedMACs[j])) {
isKnown = true;
break;
}
}
if (!isKnown && deviceCount < 50) {
// Nouvel appareil détecté!
detectedDevices[deviceCount].mac = mac;
detectedDevices[deviceCount].ip = "N/A";
detectedDevices[deviceCount].rssi = rssi;
detectedDevices[deviceCount].lastSeen = millis();
detectedDevices[deviceCount].isNew = true;
deviceCount++;
// Alerte MQTT
String alertMsg = "Nouvel appareil: " + mac + " (" + ssid + ")";
mqttClient.publish("home/network/alert", alertMsg.c_str());
Serial.println("ALERTE: " + alertMsg);
}
}
WiFi.scanDelete();
}
void updateDisplay() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Appareils:");
display.print(deviceCount);
display.println(" detectes");
display.println();
// Afficher les 3 derniers appareils
int startIdx = max(0, deviceCount - 3);
for (int i = startIdx; i < deviceCount; i++) {
display.print(i + 1);
display.print(": ");
display.println(detectedDevices[i].mac.substring(12));
}
display.display();
}
void setupWebServer() {
server.on("/", [](){
String html = "Network Monitor
";
html += "Appareils detectes: " + String(deviceCount) + "
";
html += "";
for (int i = 0; i < deviceCount; i++) {
html += "";
html += "";
html += "";
}
html += "MAC RSSI Derniere vue " + detectedDevices[i].mac + " " + String(detectedDevices[i].rssi) + " dBm " + String((millis() - detectedDevices[i].lastSeen)/1000) + "s
";
server.send(200, "text/html", html);
});
server.begin();
}
void connectToMQTT() {
if (mqttClient.connect("ESP32NetworkMonitor")) {
Serial.println("Connecte au broker MQTT");
mqttClient.publish("home/network/status", "En ligne");
}
}
🔌 Schéma de Câblage
ESP32 OLED 0.96" ───── ────────── 3.3V ───→ VCC GND ───→ GND GPIO 21 ───→ SDA GPIO 22 ───→ SCL
🎯 Comparaison: DIY vs FortiGate Professionnel
| Fonctionnalité | Solution DIY ESP32 | FortiGate 100F |
|---|---|---|
| Coût | ~15€ | ~3000-5000€ |
| Consommation | ~0.5W | ~30W |
| Débit max | ~150 Mbps (WiFi) | 20 Gbps |
| Appareils supportés | ~50 appareils | 500+ appareils |
| Complexité | Moyenne (DIY) | Élevée (Pro) |
| Personnalisation | Totale (open source) | Limitée |
🚀 Améliorations Possibles
- Ajouter un module Ethernet pour une connexion filaire stable
- Intégrer un capteur de température pour monitorer l'environnement
- Ajouter un buzzer pour alertes sonores
- Créer une base de données locale pour historique
- Intégrer avec Telegram Bot pour notifications mobiles
⚠️ Limites du Système DIY
- Débit limité : L'ESP32 ne peut pas gérer du trafic réseau intense comme un firewall pro
- Fonctionnalités basiques : Pas de deep packet inspection ou VPN avancé
- Usage domestique uniquement : Ce projet est parfait pour la maison, pas pour une entreprise
📊 Intégration avec Home Assistant
Ajoutez cette configuration dans votre configuration.yaml :
# configuration.yaml - Home Assistant
mqtt:
sensor:
- name: "Network Devices Count"
state_topic: "home/network/devices/count"
unit_of_measurement: "devices"
- name: "Network Alerts"
state_topic: "home/network/alert"
automation:
- alias: "Alerte Nouvel Appareil Réseau"
trigger:
platform: mqtt
topic: "home/network/alert"
action:
- service: notify.mobile_app
data:
title: "🚨 Nouvel appareil détecté!"
message: "{{ trigger.payload }}"
Conclusion
Ce projet DIY vous permet de créer un système de surveillance réseau fonctionnel pour une fraction du coût d'une solution professionnelle. Bien qu'il ne remplace pas un FortiGate pour des besoins entreprises, il est parfait pour :
- ✅ Surveiller votre réseau domestique
- ✅ Détecter les intrusions et appareils non autorisés
- ✅ Apprendre les concepts de sécurité réseau
- ✅ Intégrer avec votre écosystème IoT existant
Prochaine étape : Consultez notre guide sur la création d'un routeur WiFi avec ESP32 pour aller plus loin !