Guide de migration : Groupes, Politiques et Routes
Ce guide vous aide à migrer depuis le système ACL et de flags de peers hérité vers la nouvelle architecture de groupes, politiques et routes.
Vue d'ensemble
Le système de gestion de réseaux WireGuard a fait l'objet d'une refonte architecturale majeure. Il s'agit d'un changement non rétrocompatible.
Nouveautés
- Groupes : Organiser les peers en collections logiques
- Politiques : Définir des règles iptables pour le filtrage du trafic sur les jump peers
- Routes : Configurer l'accès aux réseaux externes via les jump peers
- Correspondances DNS : Résoudre des domaines personnalisés pour les réseaux de routes
- Groupes par défaut : Assigner automatiquement des groupes aux peers créés par des non-admins
Ce qui a été supprimé
- Système ACL : Complètement supprimé (tables :
acls,acl_rules) - Flags de peers : Les champs
is_isolatedetfull_encapsulationont été supprimés - Contrôle d'accès hérité : Tout le contrôle d'accès passe maintenant par les politiques
Changements non rétrocompatibles
1. Suppression du système ACL
Ce qui a changé :
- Les tables de base de données
aclsetacl_rulesont été supprimées - Les endpoints API liés aux ACL n'existent plus
- La configuration ACL dans les objets peer et réseau est supprimée
Chemin de migration : Les ACL doivent être recréées manuellement comme politiques. Voir Conversion des ACL en politiques ci-dessous.
2. Suppression des flags de peers
Ce qui a changé :
- Le champ
is_isolatedsupprimé des peers - Le champ
full_encapsulationsupprimé des peers - Ces champs ne sont plus acceptés dans les requêtes API
Chemin de migration : Utiliser les templates de politiques pour obtenir le même comportement :
is_isolated: true→ Utiliser le template de politique "isolated"full_encapsulation: true→ Utiliser le template de politique "fully-encapsulated"
Voir Conversion des flags de peers en politiques ci-dessous.
3. Changements d'API
Endpoints supprimés :
DELETE /api/v1/networks/:networkId/acls/:aclId
POST /api/v1/networks/:networkId/acls
GET /api/v1/networks/:networkId/acls
Nouveaux endpoints :
# Groupes
POST /api/v1/networks/:networkId/groups
GET /api/v1/networks/:networkId/groups
PUT /api/v1/networks/:networkId/groups/:groupId
DELETE /api/v1/networks/:networkId/groups/:groupId
# Politiques
POST /api/v1/networks/:networkId/policies
GET /api/v1/networks/:networkId/policies
PUT /api/v1/networks/:networkId/policies/:policyId
DELETE /api/v1/networks/:networkId/policies/:policyId
# Routes
POST /api/v1/networks/:networkId/routes
GET /api/v1/networks/:networkId/routes
PUT /api/v1/networks/:networkId/routes/:routeId
DELETE /api/v1/networks/:networkId/routes/:routeId
# Correspondances DNS
POST /api/v1/networks/:networkId/routes/:routeId/dns
GET /api/v1/networks/:networkId/routes/:routeId/dns
Consultez la Référence API pour la documentation complète.
4. Changements du modèle Peer
Avant :
{
"id": "peer-1",
"name": "laptop-1",
"is_isolated": true,
"full_encapsulation": false,
...
}
Après :
{
"id": "peer-1",
"name": "laptop-1",
"group_ids": ["group-1"],
...
}
Impact :
- Les requêtes API contenant
is_isolatedoufull_encapsulationretourneront HTTP 400 - Les réponses API n'incluent plus ces champs
- Le comportement des peers est maintenant contrôlé par l'appartenance aux groupes et les politiques attachées
5. Changements du modèle Réseau
Nouveaux champs :
{
"domain_suffix": "internal",
"default_group_ids": ["group-1", "group-2"]
}
Impact :
- Les réseaux peuvent maintenant spécifier des suffixes de domaine DNS personnalisés
- Les groupes par défaut sont automatiquement assignés aux peers créés par des non-admins
Étapes de migration
Étape 1 : Sauvegarder les données
Avant la mise à niveau, sauvegarder la base de données :
# Sauvegarde PostgreSQL
pg_dump -h localhost -U postgres -d wireguard > backup_$(date +%Y%m%d).sql
# Ou via Docker
docker exec postgres pg_dump -U postgres wireguard > backup_$(date +%Y%m%d).sql
Étape 2 : Documenter la configuration actuelle
Exporter les configurations ACL et peer actuelles :
# Exporter les ACL
curl -H "Authorization: Bearer $TOKEN" \
https://votre-serveur/api/v1/networks/$NETWORK_ID/acls > acls_backup.json
# Exporter les peers avec leurs flags
curl -H "Authorization: Bearer $TOKEN" \
https://votre-serveur/api/v1/networks/$NETWORK_ID/peers > peers_backup.json
Étape 3 : Mettre à niveau le serveur
Déployer la nouvelle version du serveur :
# Via Docker
docker pull votre-registry/wireguard-server:latest
docker-compose up -d
# Via Kubernetes
kubectl apply -f deployment.yaml
La migration de base de données s'exécute automatiquement au démarrage.
Étape 4 : Recréer le contrôle d'accès
Suivre les guides de conversion ci-dessous pour recréer la configuration de contrôle d'accès avec le nouveau système.
Étape 5 : Mettre à jour les agents
Mettre à niveau tous les agents de jump peers pour supporter les nouvelles fonctionnalités DNS :
# Sur chaque jump peer
systemctl stop wireguard-agent
wget https://votre-serveur/downloads/agent-latest
chmod +x agent-latest
mv agent-latest /usr/local/bin/wireguard-agent
systemctl start wireguard-agent
Étape 6 : Vérifier la configuration
Tester la connectivité et vérifier que les politiques fonctionnent correctement :
# Vérifier la connectivité des peers
ping <peer-ip>
# Vérifier la résolution DNS
nslookup server.route.internal
# Vérifier les règles iptables sur les jump peers
iptables -L -n -v
Conversion des ACL en politiques
Comprendre la correspondance
ACL héritée :
- Appliquée au niveau réseau
- Contrôlait la communication peer-à-peer
- Règles allow/deny simples
Nouvelles politiques :
- Appliquées aux groupes
- Génèrent des règles iptables sur les jump peers
- Support de la direction input/output
- Support des cibles CIDR, peer et groupe
Exemple de conversion
ACL héritée :
{
"name": "allow-internal",
"rules": [
{
"action": "allow",
"source": "10.0.0.0/24",
"destination": "10.0.0.0/24"
}
]
}
Nouvelle politique :
{
"name": "allow-internal",
"description": "Autoriser le trafic dans le réseau interne",
"rules": [
{
"direction": "input",
"action": "allow",
"target": "10.0.0.0/24",
"target_type": "cidr",
"description": "Autoriser entrant depuis le réseau interne"
},
{
"direction": "output",
"action": "allow",
"target": "10.0.0.0/24",
"target_type": "cidr",
"description": "Autoriser sortant vers le réseau interne"
}
]
}
Script de conversion
Utiliser ce script pour faciliter la conversion des ACL en politiques :
#!/bin/bash
NETWORK_ID="votre-network-id"
TOKEN="votre-admin-token"
API_URL="https://votre-serveur/api/v1"
# Créer une politique depuis une ACL
create_policy() {
local acl_name=$1
local rules=$2
curl -X POST "$API_URL/networks/$NETWORK_ID/policies" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"$acl_name\",
\"description\": \"Converti depuis l'ACL héritée\",
\"rules\": $rules
}"
}
# Exemple : Convertir une ACL allow-all
create_policy "allow-all" '[
{
"direction": "input",
"action": "allow",
"target": "0.0.0.0/0",
"target_type": "cidr",
"description": "Autoriser tout entrant"
},
{
"direction": "output",
"action": "allow",
"target": "0.0.0.0/0",
"target_type": "cidr",
"description": "Autoriser tout sortant"
}
]'
Conversion des flags de peers en politiques
Utiliser les templates de politiques
Le système fournit trois templates de politiques intégrés qui remplacent les anciens flags de peers :
1. Peers isolés
Héritage :
{
"is_isolated": true
}
Nouvelle approche :
- Obtenir le template "isolated" :
curl -H "Authorization: Bearer $TOKEN" \
"$API_URL/networks/$NETWORK_ID/policies/templates"
- Créer une politique depuis le template :
curl -X POST "$API_URL/networks/$NETWORK_ID/policies" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "isolated-policy",
"description": "Refuser tout le trafic",
"rules": [
{
"direction": "input",
"action": "deny",
"target": "0.0.0.0/0",
"target_type": "cidr",
"description": "Refuser tout entrant"
},
{
"direction": "output",
"action": "deny",
"target": "0.0.0.0/0",
"target_type": "cidr",
"description": "Refuser tout sortant"
}
]
}'
- Créer un groupe et attacher la politique :
# Créer le groupe
GROUP_ID=$(curl -X POST "$API_URL/networks/$NETWORK_ID/groups" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "isolated-peers"}' | jq -r '.id')
# Attacher la politique au groupe
curl -X POST "$API_URL/networks/$NETWORK_ID/groups/$GROUP_ID/policies/$POLICY_ID" \
-H "Authorization: Bearer $TOKEN"
# Ajouter le peer au groupe
curl -X POST "$API_URL/networks/$NETWORK_ID/groups/$GROUP_ID/peers/$PEER_ID" \
-H "Authorization: Bearer $TOKEN"
2. Peers en encapsulation complète
Héritage :
{
"full_encapsulation": true
}
Nouvelle approche : Utiliser le template "fully-encapsulated" :
curl -X POST "$API_URL/networks/$NETWORK_ID/policies" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "fully-encapsulated",
"description": "Autoriser sortant, refuser entrant",
"rules": [
{
"direction": "output",
"action": "allow",
"target": "0.0.0.0/0",
"target_type": "cidr",
"description": "Autoriser tout sortant"
},
{
"direction": "input",
"action": "deny",
"target": "0.0.0.0/0",
"target_type": "cidr",
"description": "Refuser tout entrant"
}
]
}'
3. Accès réseau par défaut
Héritage :
{
"is_isolated": false,
"full_encapsulation": false
}
Nouvelle approche : Utiliser le template "default-network" :
curl -X POST "$API_URL/networks/$NETWORK_ID/policies" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "default-network",
"description": "Autoriser le trafic dans le réseau",
"rules": [
{
"direction": "input",
"action": "allow",
"target": "10.0.0.0/24",
"target_type": "cidr",
"description": "Autoriser entrant depuis le réseau"
},
{
"direction": "output",
"action": "allow",
"target": "10.0.0.0/24",
"target_type": "cidr",
"description": "Autoriser sortant vers le réseau"
}
]
}'
Script de conversion en masse
Convertir tous les peers avec des flags en groupes et politiques :
#!/bin/bash
NETWORK_ID="votre-network-id"
TOKEN="votre-admin-token"
API_URL="https://votre-serveur/api/v1"
# Créer les politiques depuis les templates
ISOLATED_POLICY_ID=$(curl -X POST "$API_URL/networks/$NETWORK_ID/policies" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "isolated", "rules": [...]}' | jq -r '.id')
ENCAPSULATED_POLICY_ID=$(curl -X POST "$API_URL/networks/$NETWORK_ID/policies" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "fully-encapsulated", "rules": [...]}' | jq -r '.id')
# Créer les groupes
ISOLATED_GROUP_ID=$(curl -X POST "$API_URL/networks/$NETWORK_ID/groups" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "isolated-peers"}' | jq -r '.id')
ENCAPSULATED_GROUP_ID=$(curl -X POST "$API_URL/networks/$NETWORK_ID/groups" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "encapsulated-peers"}' | jq -r '.id')
# Attacher les politiques aux groupes
curl -X POST "$API_URL/networks/$NETWORK_ID/groups/$ISOLATED_GROUP_ID/policies/$ISOLATED_POLICY_ID" \
-H "Authorization: Bearer $TOKEN"
curl -X POST "$API_URL/networks/$NETWORK_ID/groups/$ENCAPSULATED_GROUP_ID/policies/$ENCAPSULATED_POLICY_ID" \
-H "Authorization: Bearer $TOKEN"
# Traiter chaque peer depuis la sauvegarde
jq -c '.[]' peers_backup.json | while read peer; do
PEER_ID=$(echo $peer | jq -r '.id')
IS_ISOLATED=$(echo $peer | jq -r '.is_isolated')
FULL_ENCAP=$(echo $peer | jq -r '.full_encapsulation')
if [ "$IS_ISOLATED" = "true" ]; then
echo "Ajout de $PEER_ID au groupe isolé"
curl -X POST "$API_URL/networks/$NETWORK_ID/groups/$ISOLATED_GROUP_ID/peers/$PEER_ID" \
-H "Authorization: Bearer $TOKEN"
elif [ "$FULL_ENCAP" = "true" ]; then
echo "Ajout de $PEER_ID au groupe encapsulé"
curl -X POST "$API_URL/networks/$NETWORK_ID/groups/$ENCAPSULATED_GROUP_ID/peers/$PEER_ID" \
-H "Authorization: Bearer $TOKEN"
fi
done
Scénarios de migration courants
Scénario 1 : Réseau simple avec peers isolés
Avant :
- Réseau avec 10 peers
- 3 peers avec
is_isolated: true - 7 peers avec les paramètres par défaut
Après :
- Créer une politique "isolated" depuis le template
- Créer un groupe "isolated-peers"
- Attacher la politique au groupe
- Ajouter les 3 peers isolés au groupe
Scénario 2 : Réseau avec règles ACL
Avant :
- Réseau avec ACL autorisant le trafic interne
- ACL refusant le trafic externe
Après :
- Créer une politique "internal-only" avec les règles :
- Autoriser entrant depuis le CIDR réseau
- Autoriser sortant vers le CIDR réseau
- Refuser tout autre trafic
- Créer un groupe "internal-users"
- Attacher la politique au groupe
- Ajouter tous les peers au groupe
Scénario 3 : Jump peer avec accès externe
Avant :
- Jump peer fournissant un accès internet
- Peers regular avec
full_encapsulation: true
Après :
- Créer une route pour l'accès internet (0.0.0.0/0)
- Créer une politique "fully-encapsulated"
- Créer un groupe "internet-users"
- Attacher la politique et la route au groupe
- Ajouter les peers regular au groupe
Scénario 4 : Application multi-niveaux
Avant :
- Niveau web : 3 peers
- Niveau app : 5 peers
- Niveau DB : 2 peers (isolés)
- ACL contrôlant la communication entre niveaux
Après :
- Créer des groupes : "web-tier", "app-tier", "db-tier"
- Créer des politiques :
- "web-policy" : Autoriser depuis internet, autoriser vers app tier
- "app-policy" : Autoriser depuis web tier, autoriser vers db tier
- "db-policy" : Autoriser depuis app tier uniquement
- Attacher les politiques aux groupes correspondants
- Ajouter les peers à leurs groupes de niveau
Dépannage
Problème : Les peers ne peuvent pas communiquer après la migration
Cause : Aucune politique attachée aux groupes, comportement de refus par défaut.
Solution :
- Vérifier si les peers sont dans des groupes :
GET /api/v1/networks/:networkId/peers/:peerId - Vérifier si les groupes ont des politiques :
GET /api/v1/networks/:networkId/groups/:groupId/policies - Créer et attacher les politiques appropriées
Problème : Les domaines de routes ne se résolvent pas
Cause : Agent du jump peer non mis à jour ou correspondances DNS non créées.
Solution :
- Vérifier la version de l'agent :
wireguard-agent --version - Vérifier les correspondances DNS :
GET /api/v1/networks/:networkId/routes/:routeId/dns - Vérifier le serveur DNS sur le jump peer :
systemctl status wireguard-agent
Problème : Les routes ne fonctionnent pas
Cause : Route non attachée au groupe ou jump peer non configuré.
Solution :
- Vérifier l'attachement de la route :
GET /api/v1/networks/:networkId/groups/:groupId/routes - Vérifier la configuration du jump peer :
wg show - Vérifier que AllowedIPs inclut le CIDR de la route
Problème : L'API retourne 403 Forbidden
Cause : Utilisateur non administrateur tentant une opération réservée aux admins.
Solution :
- Vérifier le rôle de l'utilisateur :
GET /api/v1/users/me - Utiliser un compte administrateur pour les opérations sur les groupes/politiques/routes
- Contacter un administrateur pour effectuer l'opération
Procédure de rollback
Si vous devez revenir à la version précédente :
Étape 1 : Arrêter le nouveau serveur
docker-compose down
# ou
kubectl delete deployment wireguard-server
Étape 2 : Restaurer la base de données
# Restaurer depuis la sauvegarde
psql -h localhost -U postgres -d wireguard < backup_YYYYMMDD.sql
# Ou via Docker
docker exec -i postgres psql -U postgres wireguard < backup_YYYYMMDD.sql
Étape 3 : Déployer la version précédente
# Via Docker
docker pull votre-registry/wireguard-server:previous-version
docker-compose up -d
# Via Kubernetes
kubectl apply -f deployment-previous.yaml
Étape 4 : Vérifier le fonctionnement
Tester que la version précédente fonctionne correctement avec la base de données restaurée.
Support
En cas de problèmes lors de la migration :
- Consulter le guide de dépannage (voir barre latérale)
- Examiner les logs serveur :
docker logs wireguard-server - Vérifier les logs agent sur les jump peers :
journalctl -u wireguard-agent - Ouvrir une issue sur GitHub avec :
- Version du serveur
- Logs de migration de la base de données
- Messages d'erreur
- Étapes pour reproduire
Ressources supplémentaires
- Référence API — Documentation complète de l'API
- Guide utilisateur — Guides étape par étape pour les tâches courantes
- Architecture — Vue d'ensemble de l'architecture système
- Dépannage — Problèmes courants et solutions