Air-gapper sa machine d'inférence
Air-gapper une machine d'inférence, c'est la priver de toute liaison réseau (câble, Wi-Fi, Bluetooth) et n'y faire entrer modèles et mises à jour que par un support physique contrôlé. Un pare-feu sortant est une couche utile, pas un air-gap : ce n'est qu'une configuration logicielle. Les points faibles réels sont les logiciels qui appellent dehors (Ollama Cloud, mises à jour, téléchargements) et la clé USB.
Le mot « local » ne suffit pas pour certains contextes sensibles : une machine locale reste connectée, et ses logiciels peuvent contacter l'extérieur. Ce guide distingue l'air-gap véritable de l'isolement par pare-feu, dresse la liste des composants d'une pile LLM qui appellent dehors par défaut et de la manière de les couper, décrit un transfert de modèles par clé USB vérifié par empreintes, et propose des tests d'étanchéité que vous pouvez rejouer.
#Quand un air-gap se justifie, et quand il coûte trop cher
Un air-gap se décide par une analyse de risques, pas par principe. Les cas où il se justifie : données classifiées ou couvertes par un secret industriel de haut niveau, exigences contractuelles ou sectorielles qui imposent explicitement un réseau isolé, environnements qui pratiquent déjà l'isolement et dans lesquels le LLM doit s'intégrer, et postes dédiés à des dossiers d'une sensibilité exceptionnelle (un avocat, un chercheur). Pour les données personnelles ordinaires, y compris de santé ou financières, les textes demandent des mesures proportionnées au risque plutôt qu'un isolement total : un LLM local sur un poste chiffré, sans compte cloud, répond déjà à la plupart des besoins. Le guide sur l'IA locale en entreprise et la checklist de confidentialité couvrent ce niveau intermédiaire.
Avant de vous lancer, posez trois questions. Qui fera les transferts, et selon quelle fréquence ? Quels composants la pile exige-t-elle qu'on mette à jour (Ollama, llama.cpp, l'interface, les modèles) ? Et que se passe-t-il le jour où un modèle plus récent devient indispensable : le processus doit rester praticable sans exception, car une exception faite une fois devient la règle. Si vous ne pouvez pas répondre à ces trois questions, commencez par un poste hors ligne par usage avec pare-feu strict, et montez d'un niveau seulement quand le risque le justifie.
#Air-gap, quasi air-gap et pare-feu : ne pas les confondre
Déployer une IA locale au travail : RGPD, AI Act, architecture multi-utilisateurs, coûts, note pour la direction.
- Espace en ligne à vie
- PDF + fichiers
- Mises à jour à vie
| Niveau | Ce que c'est | Ce qui reste possible |
|---|---|---|
| Machine hors ligne par usage | Pas de connexion active, mais la carte réseau existe | Une reconnexion par erreur ou par un logiciel ; tout dépend de la discipline |
| Pare-feu strict (refus par défaut, sortant compris) | Configuration logicielle qui bloque le trafic sortant | Une règle ajoutée « pour essayer », une faille du système, un service qui contourne |
| Air-gap physique | Aucune interface réseau active : câble absent, Wi-Fi et Bluetooth coupés au firmware ou retirés | Les fuites par support amovible ; les canaux physiques (hors périmètre de ce guide) |
Ce guide couvre les trois : le pare-feu est la couche minimale que tout poste sensible devrait avoir, et l'air-gap physique la couche supérieure. Sur un Mac, les réglages propres à macOS relèvent du guide sur l'optimisation des Mac à puce Apple ; sous Windows, les principes sont les mêmes mais le contrôle des composants qui appellent dehors est moins fin qu'avec un Linux minimal, d'où la préférence donnée ici à Linux.
#Préparer la machine
- Système minimal
- Debian ou Ubuntu Server sans interface graphique pour un serveur d'inférence. Pas de navigateur, pas de gestionnaire de paquets connecté à un magasin d'applications.
- Services de mise à jour automatique
- Désactivez les minuteurs de mise à jour, par exemple sudo systemctl disable --now apt-daily.timer apt-daily-upgrade.timer, pour qu'aucune tentative de connexion ne parte en silence.
- Comptes
- Un compte dédié à l'usage du LLM, sudo restreint à l'administrateur.
- Radios et interfaces
- Wi-Fi et Bluetooth désactivés au BIOS ou au firmware, mieux : physiquement absents. Pas de câble réseau branché.
- Pas de double démarrage
- Une partition connectée à côté crée des voies indirectes (fichier d'échange, fichiers partagés).
- Heure
- Réglez l'horloge à la main ou depuis une source interne : une synchronisation avec un serveur de temps public est un trafic sortant.
- Disque chiffré
- Un poste isolé se vole ou se saisit : chiffrez le disque (voir le guide dédié).
#Les logiciels de la pile LLM qui appellent dehors par défaut
Pour une machine physiquement isolée, ces appels échouent sans dommage ; pour une machine en simple pare-feu, ou en attente de déconnexion, ils sont le vrai risque. Une pile locale type contient plusieurs composants qui contactent Internet si on ne les en empêche pas. Voici ceux que la documentation officielle permet de couper.
| Composant | Ce qu'il peut faire | Réglage documenté |
|---|---|---|
| Ollama | Modèles et recherche web hébergés (Ollama Cloud) | OLLAMA_NO_CLOUD=1 ou disable_ollama_cloud dans ~/.ollama/server.json ; les journaux affichent alors « Ollama cloud disabled: true » |
| Ollama (exposition réseau) | Serveur HTTP local | Écoute sur 127.0.0.1 par défaut ; ne changez OLLAMA_HOST que pour un réseau interne isolé |
| Open WebUI | Vérifications de mise à jour, téléchargement de modèles d'embeddings depuis Hugging Face | OFFLINE_MODE=true (désactive aussi ENABLE_VERSION_UPDATE_CHECK) ; téléchargez les modèles d'embeddings avant |
| Bibliothèques Hugging Face (transformers, sentence-transformers) | Appels au Hub pour vérifier ou télécharger | HF_HUB_OFFLINE=1 : aucun appel HTTP au Hub, seuls les fichiers en cache sont utilisés |
| Bases vectorielles | Télémétrie éventuelle | Weaviate : DISABLE_TELEMETRY=true ; vérifiez l'option équivalente pour chaque composant |
La documentation d'Ollama précise que, lorsqu'on utilise Ollama en local, l'éditeur ne voit ni les requêtes ni les données ; désactiver les fonctions cloud fait perdre l'accès aux modèles hébergés et à la recherche web, ce qui est exactement le but. Attention à Open WebUI : la documentation avertit que, si vous n'avez pas téléchargé un modèle d'embeddings avant d'activer OFFLINE_MODE, les fonctions de RAG, de recherche web et d'analyse de documents peuvent ne pas fonctionner. Téléchargez tout ce dont la machine aura besoin avant de la couper.
#Pare-feu strict : refuser par défaut, entrée comme sortie
Le pare-feu est la seconde ligne, derrière la déconnexion physique, et la seule protection sur un poste qui reste sur un réseau interne. Le principe est le refus par défaut dans les deux sens, avec quelques autorisations explicites vers le réseau interne isolé. Écrivez les règles d'autorisation avant d'activer le pare-feu, faute de quoi vous vous coupez vous-même d'une session SSH.
Le trafic sur l'interface locale (loopback) est nécessaire au fonctionnement d'Ollama et d'Open WebUI qui se parlent sur 127.0.0.1 ; vérifiez avec ufw status verbose que votre configuration ne le bloque pas. Si la machine est sur un LAN interne, doublez la protection côté routeur : un VLAN sans route vers Internet.
#Vérifier ce qu'écoute Ollama
#Transférer les modèles et les mises à jour par clé USB
Une machine isolée reçoit des modèles (de quelques Go à plusieurs dizaines), des mises à jour (Ollama, llama.cpp, Open WebUI), parfois des documents. Le point critique est la clé USB : c'est la seule porte, donc la seule voie d'entrée d'un logiciel malveillant. Utilisez toujours la même clé, dédiée, formatée régulièrement, et jamais une clé qui a servi ailleurs.
- 01Télécharger sur une machine connectéeRécupérez le fichier GGUF du modèle depuis Hugging Face ou le binaire de mise à jour depuis le site officiel. Notez l'empreinte SHA-256 affichée par la source quand elle existe.
- 02Calculer l'empreinte et analyserExécutez sha256sum sur le fichier, puis passez-le à un antivirus (par exemple ClamAV) sur cette machine de transit, qui n'est pas la machine isolée.
- 03Copier sur la cléCopiez le fichier et un fichier texte contenant son empreinte.
- 04Vérifier côté isolé avant usageSur la machine isolée, recalculez l'empreinte : elle doit être identique. Une différence signifie un fichier modifié ou corrompu : ne l'utilisez pas.
- 05Importer dans OllamaCréez un Modelfile avec FROM /chemin/vers/modele.gguf puis ollama create nom-du-modele -f Modelfile. Ollama ne quantifie pas un GGUF à l'import : le fichier doit déjà avoir la quantification voulue.
La méthode alternative consiste à copier tout le dossier des modèles d'une machine connectée (blobs et manifestes) vers la machine isolée. Elle fonctionne, mais le dossier n'est pas au même endroit selon l'installation : la FAQ d'Ollama donne ~/.ollama/models sous macOS, /usr/share/ollama/.ollama/models sous Linux avec l'installateur standard, et C:\Users\%username%\.ollama\models sous Windows. Le passage par un fichier GGUF isolé est plus simple à vérifier, car il n'y a qu'une empreinte à comparer. Le guide sur l'import GGUF détaille le Modelfile.
#Durcir le port USB
Une clé peut se faire passer pour un clavier ou un autre périphérique. Sur Linux, USBGuard se présente en une phrase comme un outil de liste blanche de périphériques USB : il définit quels types d'appareils sont autorisés et comment ils peuvent interagir avec le système. Désactivez aussi le montage automatique des supports, pour que rien ne s'exécute au branchement. Pour les contextes très sensibles, une diode de données (un dispositif qui ne laisse passer les données que dans un sens) remplace la clé, au prix d'une mise en place plus lourde.
#Tester l'étanchéité
Un test ne prouve l'étanchéité que sur la durée pendant laquelle il a observé : recommencez-le après chaque mise à jour et laissez la capture tourner pendant une session de travail complète. Le protocole minimal couvre le fonctionnement, l'absence de route, l'absence de résolution de noms et le trafic réel.
- Fonctionnement hors ligne
- Débranchez le câble et coupez toutes les radios, puis exécutez le flux complet (modèle, RAG, interface). Tout doit fonctionner : sinon, un composant dépendait d'Internet.
- Absence de route
- ping -c 1 8.8.8.8 doit échouer (« Network is unreachable » ou équivalent).
- Absence de DNS
- host exemple.org doit échouer ; vérifiez /etc/resolv.conf : aucun serveur externe.
- Connexions établies
- sudo ss -tunp state established : aucune connexion vers une adresse hors du réseau interne.
- Trafic réel
- Une capture avec tcpdump sur toutes les interfaces, en excluant le réseau interne, doit rester vide pendant toute une session d'usage.
#Audit régulier
| Fréquence | Contrôle | Objectif |
|---|---|---|
| Mensuelle | ufw status verbose et liste des règles ; ss -tlnp | Repérer une règle ajoutée « pour essayer » |
| À chaque transfert | Empreintes avant et après la clé ; analyse antivirus | Détecter un fichier modifié |
| À chaque mise à jour d'un composant | Relancer les tests d'étanchéité et relire les variables hors ligne | Un nouveau composant peut ajouter un appel sortant |
| Semestrielle ou annuelle | Réinstallation propre à partir d'images vérifiées ; revue de la menace | Éliminer une compromission accumulée |
#Questions fréquentes sur l'air-gap d'une machine LLM
Un pare-feu sortant suffit-il pour parler d'air-gap ?+
Comment mettre à jour Ollama sur une machine sans Internet ?+
Comment transférer un modèle vers la machine isolée ?+
Ollama envoie-t-il mes requêtes à l'extérieur ?+
La clé USB est-elle le maillon faible ?+
Faut-il chiffrer le disque d'une machine déjà isolée ?+
- Chiffrer le disque des modèles
- Checklist confidentialité
- IA locale en entreprise : RGPD, souveraineté et déploiement
- Importer un modèle GGUF de Hugging Face dans Ollama
- Tirer le max d'un Mac Apple Silicon
- Source : FAQ Ollama, cloud désactivable et emplacements
- Source : Ollama, import d'un modèle GGUF
- Source : Open WebUI, variables d'environnement
- Source : USBGuard
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.