Proxmox Backup Server - Instances locale et distante sécurisées
Proxmox Backup Server (PBS) est la solution de sauvegarde dédiée pour les environnements Proxmox VE. L'infrastructure du homelab utilise une architecture 3-2-1 avec deux instances PBS :
- PBS local : Sauvegarde primaire des VMs sur stockage NFS
- PBS distant (VPS) : Sauvegarde secondaire offsite pour la redondance
Cette architecture garantit la disponibilité des sauvegardes même en cas de sinistre majeur affectant le homelab.
Architecture globale
Principe de fonctionnement
┌─────────────────────────────────────────────────────────────────┐
│ HOMELAB │
│ ┌──────────────┐ Backup ┌─────────────────┐ │
│ │ Proxmox VE │──────────────▶│ PBS Local │ │
│ │ (Hyperviseur)│ Toutes les │ (192.168.100.40)│ │
│ │ │ 6 heures │ │ │
│ └──────────────┘ │ Datastore: │ │
│ │ nfs-storage │ │
│ └────────┬────────┘ │
│ │ │
│ Sync │ Pull │
│ (Dimanche 1h) │
└──────────────────────────────────────────┼──────────────────────┘
│
WireGuard Tunnel
(10.200.0.0/24)
│
┌──────────────────────────────────────────┼──────────────────────┐
│ VPS │
│ ┌───────▼─────────┐ │
│ │ PBS Distant │ │
│ │ (TellPBS) │ │
│ │ │ │
│ │ Datastore: │ │
│ │ remote-backup │ │
│ │ │ │
│ │ Rétention: │ │
│ │ 26 semaines │ │
│ └─────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
Caractéristiques de sécurité
- Chiffrement end-to-end : Les sauvegardes sont chiffrées côté client (PVE) avant envoi au PBS
- Tunnel WireGuard : Toute communication inter-sites transite par un tunnel VPN chiffré
- Principe du moindre privilège : Le VPS peut uniquement accéder au port 8007 du PBS local pour tirer les sauvegardes
- Protection contre compromission : Le homelab ne peut pas accéder au PBS distant, empêchant un attaquant de modifier ou détruire les sauvegardes offsite
- Pare-feu strict : Seul le trafic nécessaire est autorisé sur le tunnel (port 8007 depuis VPS vers PBS local, ICMP bidirectionnel)
Instance locale PBS
Contexte
Le PBS local est la cible primaire des sauvegardes Proxmox VE. Il stocke les sauvegardes sur un datastore NFS monté, offrant capacité et performance adaptées à des sauvegardes fréquentes.
Création des utilisateurs
Le PBS local nécessite deux utilisateurs distincts avec des permissions différentes :

Utilisateur backup@pbs :
- User name :
backup - Realm :
Proxmox Backup authentication server - Rôle : Utilisé par Proxmox VE pour écrire les sauvegardes
Utilisateur remote@pbs :
- User name :
remote - Realm :
Proxmox Backup authentication server - Rôle : Utilisé par le PBS distant pour lire les sauvegardes
Attribution des permissions

Configuration des permissions :
| Utilisateur | Path | Rôle | Usage |
|---|---|---|---|
backup@pbs | /datastore/nfs-storage | DatastoreBackup | Écriture des sauvegardes depuis Proxmox VE |
backup@pbs | /datastore/nfs-storage | DatastoreReader | Lecture des sauvegardes |
remote@pbs | /datastore/nfs-storage | DatastoreReader | Lecture des sauvegardes par le PBS distant |
Cette séparation des privilèges garantit que :
- Proxmox VE peut écrire ses sauvegardes (
DatastoreBackup) et les lire (DatastoreReader) - Le PBS distant peut uniquement lire (
DatastoreReader), pas écrire, modifier ou supprimer
Configuration Proxmox VE
Ajout du backend de stockage PBS

Paramètres :
- ID :
PBS - Server :
192.168.100.40(IP du PBS local) - Username :
backup@pbs - Datastore :
nfs-storage
Proxmox VE peut maintenant sauvegarder directement vers le PBS local.
Activation du chiffrement
Option choisie : Auto-generate a client encryption key
Importance critique : Le chiffrement côté client garantit que :
- Les données sont chiffrées avant de quitter l'hyperviseur
- Le PBS local et distant ne peuvent pas déchiffrer les données sans la clé
- La clé de chiffrement reste uniquement sur Proxmox VE
Cette configuration est requise par la politique de sécurité du Sync Job distant (Encrypted Only).
Configuration du Backup Job

Paramètres :
- Storage :
PBS - Schedule :
00/6:00(toutes les 6 heures) - Mode :
Snapshot - Compression :
ZSTD
Les VMs sont sauvegardées automatiquement 4 fois par jour, garantissant un RPO (Recovery Point Objective) de 6 heures maximum.
Notifications PVE
Configuration des cibles

Proxmox VE envoie les notifications vers Gotify pour les notifications push mobiles.
Règle d'alerte backup

Matcher : Backup-Failures
Configuration :
- Match severity :
error - Match field :
type=vzdump
Une alerte est envoyée immédiatement en cas d'échec d'une tâche de sauvegarde vzdump.

Proxmox offre des types de notifications pour divers événements système : mises à jour, réplication, fencing, etc.
Instance distante PBS (VPS)
Prérequis
Un VPS Debian 13 (Trixie) avec :
- Accès root SSH par clé publique uniquement
- Au moins 100 GB d'espace disque pour les sauvegardes
- IP publique fixe
Installation de Proxmox Backup Server
Ajout du dépôt PBS
Créer le fichier /etc/apt/sources.list.d/pbs-no-subscription.sources :
Types: deb
URIs: http://download.proxmox.com/debian/pbs
Suites: trixie
Components: pbs-no-subscription
Signed-By: /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg
Installation
apt update
apt install proxmox-backup-server
Configuration initiale
# Changer le mot de passe root
passwd
À ce stade, PBS est accessible sur le port 8007 depuis n'importe quelle IP. Il faut sécuriser l'accès immédiatement.
Sécurisation du VPS
Installation du pare-feu
apt install iptables-persistent -y
Configuration des règles iptables
# Nettoyage
iptables -F
iptables -X
iptables -Z
# Politique par défaut (DROP tout ce qui veut rentrer)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Loopback (pour tunnel SSH :8007)
iptables -A INPUT -i lo -j ACCEPT
# Connexions établies
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Anti-bruteforce SSH
iptables -N SSH_CHECK
iptables -A INPUT -p tcp --dport 22 -j SSH_CHECK
iptables -A SSH_CHECK -m recent --set --name SSH
iptables -A SSH_CHECK -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
iptables -A SSH_CHECK -j ACCEPT
# WireGuard
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
# Trafic interne WireGuard (Accès PBS via 10.x.x.x)
iptables -A INPUT -i wg0 -j ACCEPT
# ICMP (ping et traceroute)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Sauvegarder
netfilter-persistent save
Explications :
- SSH_CHECK : Limite à 4 tentatives SSH par minute par IP
- WireGuard port 51820 : Requis pour le tunnel VPN
- wg0 accept : Règle temporaire, sera verrouillée plus tard
- Loopback : Permet l'accès à PBS via tunnel SSH
Redémarrer le VPS pour valider la configuration :
reboot
Accès via tunnel SSH
Maintenant que le port 8007 n'est plus exposé publiquement, l'accès se fait via tunnel SSH :
ssh -L 8007:localhost:8007 root@<IP_VPS>
L'interface PBS est accessible sur https://localhost:8007

Le dashboard montre l'instance PBS nommée TellPBS, accessible via le tunnel SSH.
Configuration WireGuard
WireGuard établit un tunnel VPN chiffré entre le PBS local et le VPS, permettant au VPS de tirer les sauvegardes de manière sécurisée.
Topologie réseau
- Réseau WireGuard :
10.200.0.0/24 - VPS (serveur) :
10.200.0.1/24 - PBS homelab (client) :
10.200.0.2/24
Le VPS est le serveur WireGuard, le PBS local est le client qui initie la connexion.
Installation
Sur les deux nœuds :
apt update
apt install wireguard -y
Configuration sur le VPS
Génération des clés :
cd /etc/wireguard
umask 077
wg genkey | tee vps-private.key | wg pubkey > vps-public.key
echo "Private key VPS:"
cat vps-private.key
echo "Public key VPS:"
cat vps-public.key
Créer /etc/wireguard/wg0.conf :
[Interface]
Address = 10.200.0.1/24
PrivateKey = <CLE_PRIVEE_VPS>
ListenPort = 51820
[Peer]
PublicKey = <CLE_PUBLIQUE_PBS_LOCAL>
AllowedIPs = 10.200.0.2/32
PersistentKeepalive = 10
Configuration sur le PBS local
Génération des clés :
cd /etc/wireguard
umask 077
wg genkey | tee pbs-private.key | wg pubkey > pbs-public.key
echo "Private key PBS:"
cat pbs-private.key
echo "Public key PBS:"
cat pbs-public.key
Créer /etc/wireguard/wg0.conf :
[Interface]
Address = 10.200.0.2/24
PrivateKey = <CLE_PRIVEE_PBS_LOCAL>
[Peer]
PublicKey = <CLE_PUBLIQUE_VPS>
Endpoint = <IP_PUBLIQUE_VPS>:51820
AllowedIPs = 10.200.0.1/32
PersistentKeepalive = 10
Activation du tunnel
Sur le VPS :
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0
wg show
Sur le PBS local :
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0
wg show
Tests de connectivité
Depuis le PBS local :
ping 10.200.0.1
curl -k https://10.200.0.1:8007
Résultat attendu : Ping réussi (~97ms de latence), réponse HTTP du PBS distant.
Depuis le VPS :
ping 10.200.0.2
curl -k https://10.200.0.2:8007
Résultat attendu : Ping réussi, réponse HTTP du PBS local.
Si les deux tests fonctionnent, le tunnel WireGuard est opérationnel.
Verrouillage du tunnel WireGuard
Par défaut, la règle iptables -A INPUT -i wg0 -j ACCEPT autorise tout le trafic sur le tunnel. Il faut appliquer le principe du moindre privilège.
Flux réseau nécessaires
C'est le PBS du VPS qui pull les sauvegardes, donc seul le trafic initié par le VPS est nécessaire :
- VPS → PBS local : Port 8007/TCP (pull des backups)
- Bidirectionnel : ICMP (ping/debug)
- Bidirectionnel : Connexions établies (réponses aux requêtes initiées)
Le PBS local ne doit pas pouvoir accéder au PBS distant : si le homelab est compromis, l'attaquant ne pourra pas modifier ou détruire les sauvegardes offsite.
Pare-feu sur le VPS
# Supprimer la règle générique wg0
iptables -D INPUT -i wg0 -j ACCEPT
# Connexions établies
iptables -A INPUT -i wg0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# ICMP ping uniquement
iptables -A INPUT -i wg0 -s 10.200.0.2 -p icmp --icmp-type echo-request -j ACCEPT
# Bloquer tout le reste sur wg0
iptables -A INPUT -i wg0 -j DROP
# Sauvegarder
netfilter-persistent save
Pare-feu sur le PBS local (nftables)
Créer /etc/nftables.conf :
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
# Loopback
iif lo accept
# Connexions établies
ct state established,related accept
# Rejeter paquets invalides
ct state invalid drop
# Administration depuis homelab
ip saddr { 192.168.100.0/24, 192.168.10.0/24 } tcp dport { 22, 8007 } accept
# WireGuard : VPS peut accéder au port 8007
iifname "wg0" ip saddr 10.200.0.1 tcp dport 8007 accept
iifname "wg0" ip saddr 10.200.0.1 icmp type echo-request accept
# Bloquer le reste sur wg0
iifname "wg0" drop
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
Appliquer la configuration :
systemctl enable nftables
systemctl start nftables
Validation de la sécurité
Test depuis le VPS (doit fonctionner) :
ping 10.200.0.2 # ✅ Succès
curl -k https://10.200.0.2:8007 # ✅ Succès
Test depuis le PBS local (doit échouer) :
ping 10.200.0.1 # ✅ Succès (ICMP autorisé)
curl -k https://10.200.0.1:8007 # ❌ Timeout (aucune réponse)
Résultat attendu : Le PBS local peut ping le VPS, mais ne peut pas accéder à l'interface web. C'est le comportement voulu : si le homelab est compromis, l'attaquant ne peut pas accéder au PBS distant.
Configuration PBS distant
Création de l'utilisateur local

Configuration :
- Utilisateur :
remote@pbs - Chemin :
/datastore/remote-backup - Rôle :
DatastoreBackup
Cet utilisateur gérera les sauvegardes synchronisées depuis le homelab.
Création du Datastore

Paramètres :
- Name :
remote-backup - Backing Path :
/mnt/hdd - GC Schedule :
Mon 03:00(Garbage Collection le lundi à 3h) - Prune Schedule :
none(géré par un Prune Job séparé)
Le datastore stocke les sauvegardes synchronisées.
Ajout du Remote

Menu : Configuration → Remote → Add
Paramètres :
- Remote ID :
homelab-pbs - Host :
10.200.0.2(IP WireGuard du PBS local) - Auth ID :
remote@pbs - Password : Mot de passe de
remote@pbs - Fingerprint : Fingerprint du certificat SSL du PBS local
Le Remote définit la source depuis laquelle tirer les sauvegardes. L'utilisateur remote@pbs a le rôle DatastoreReader sur le PBS local, suffisant pour lire les sauvegardes sans pouvoir les modifier.
Configuration du Sync Job

Menu : Configuration → Sync Jobs → Add
Paramètres obligatoires :
- Local Datastore :
remote-backup - Local Namespace :
Root - Local Owner :
remote@pbs - Source Remote :
homelab-pbs - Source Datastore :
nfs-storage - Source Namespace :
Root - Sync Schedule :
Sun 01:00(dimanche à 1h du matin) - Remove Vanished : ✅ Coché (supprime les backups supprimés sur la source)

Paramètres de sécurité (CRITIQUES) :
- Transfer Last :
1(ne transfère que la dernière sauvegarde par VM) - Encrypted Only : ✅ Coché (refuse les sauvegardes non chiffrées)
- Verified Only : ✅ Coché (refuse les sauvegardes non vérifiées)
- Re-sync Corrupt : ✅ Coché (re-synchronise automatiquement si corruption détectée)
Ces paramètres garantissent que :
- Seules les sauvegardes chiffrées sont acceptées (pas de confiance envers le VPS pour la confidentialité)
- Seules les sauvegardes vérifiées sont acceptées (garantie d'intégrité)
- La synchronisation est limitée à la dernière sauvegarde (économie de bande passante)
Configuration du Prune Job

Menu : Datastore → remote-backup → Prune & GC → Add
Paramètres :
- Schedule :
Mon 02:00(lundi à 2h, après le sync du dimanche) - Keep Weekly :
26(garde 26 sauvegardes hebdomadaires ≈ 6 mois) - Namespace :
/
Commentaire : "Garde une backup par semaine sur les 6 derniers mois"
Le Garbage Collector nettoie automatiquement l'espace à Mon 03:00.
Configuration du Verify Job

Menu : Datastore → remote-backup → Verify Jobs → Add
Paramètres :
- Datastore :
remote-backup - Schedule :
Tue 02:00(tous les mardis à 2h) - Skip Verified : ❌ Désactivé (vérifie toutes les sauvegardes à chaque fois)
Le Verify Job garantit l'intégrité des sauvegardes en recalculant les checksums.
Configuration des notifications
Notification échec Sync
Configuration :
- Match severity :
error - Match field :
type=sync
Alerte immédiate en cas d'échec de synchronisation.
Notification échec Verify

Configuration :
- Match severity :
error - Match field :
type=verify
Alerte immédiate en cas d'échec de vérification (corruption de données).
Test de la synchronisation

Menu : Configuration → Sync Jobs → Sélectionner le job → Run Now
Le premier sync prendra du temps (transfert complet), mais grâce à la déduplication de PBS, les prochaines synchronisations seront beaucoup plus rapides.
Le log indique une synchronisation réussie.
Supervision Zabbix

Pour surveiller le PBS distant, un agent Zabbix est configuré en mode actif.
Configuration de l'agent (/etc/zabbix/zabbix_agent2.conf) :
Hostname=PBS-remote
ServerActive=141.253.114.252:10051
ListenIP=127.0.0.1
# Server= est commenté (désactivé)
Configuration dans Zabbix :
- Host name :
PBS-remote - Template :
Linux by Zabbix agent active - IP :
127.0.0.1 - Port :
10050
L'agent contacte le serveur Zabbix via le tunnel WireGuard et remonte les métriques système (CPU, RAM, disque, etc.).
Flux de sauvegarde complet
Timeline hebdomadaire
Toutes les 6 heures :
- Proxmox VE sauvegarde les VMs vers PBS local (chiffrement client)
Dimanche 01:00 :
- PBS distant tire (pull) la dernière sauvegarde de chaque VM via WireGuard
Lundi 02:00 :
- Prune Job supprime les anciennes sauvegardes (garde 26 semaines)
Lundi 03:00 :
- Garbage Collector récupère l'espace disque libéré
Mardi 02:00 :
- Verify Job vérifie l'intégrité de toutes les sauvegardes
Chaîne de sécurité
- Chiffrement à la source : La clé de chiffrement ne quitte jamais Proxmox VE
- Transit sécurisé : WireGuard chiffre le tunnel entre PBS local et distant
- Lecture seule depuis le VPS : Le VPS peut uniquement lire les sauvegardes, jamais les modifier à la source
- Principe du moindre privilège : Seul le port 8007 du PBS local est accessible depuis le VPS
- Isolation réseau : Le homelab ne peut pas accéder au PBS distant
Avantages de cette architecture
Résilience
- Sauvegarde locale : Restauration rapide des VMs (haute disponibilité)
- Sauvegarde offsite : Protection contre sinistre majeur (incendie, vol, inondation)
- Rétention longue : 6 mois d'historique sur le VPS
Sécurité
- Chiffrement end-to-end : Aucune confiance envers le VPS pour la confidentialité
- Protection contre compromission : Le homelab ne peut pas accéder au PBS distant, empêchant la destruction des sauvegardes offsite
- Accès en lecture seule : Le VPS peut lire mais pas modifier les sauvegardes sources
- Pare-feu strict : Surface d'attaque minimale sur le tunnel WireGuard
- Vérification automatique : Détection précoce de la corruption
Automatisation
- Sauvegardes automatiques : 4 fois par jour
- Synchronisation hebdomadaire : Bande passante économisée
- Purge automatique : Gestion de l'espace disque
- Notifications : Alertes en cas de problème