Dawan Proxmox VE — TSSR

Chapitre 5 — SDN, pare-feu et sauvegarde

2. Le pare-feu Proxmox

Jusqu'ici, tout peut parler à tout : une VM web atteint la base de données, un conteneur de test joint l'interface d'administration. Le pare-feu intégré décide qui a le droit de parler à qui. Ce chapitre en présente le modèle et les pièges ; l'atelier 1 le met en œuvre.

2.1 Un pare-feu distribué, organisé en zones

La configuration du pare-feu est rangée dans /etc/pve, donc répliquée sur tous les nœuds, mais chaque nœud applique lui-même les règles qui le concernent. Il le fait par iptables (service classique pve-firewall) ou par nftables (nouveau service proxmox-firewall). Trois zones, chacune avec ses règles :

Zone Ce qu'elle filtre Directions possibles Où se trouvent ses règles
Hôte Le trafic à destination ou en provenance du nœud lui-même IN, OUT (et FORWARD pour le trafic routé par l'hôte, moteur nftables uniquement) /etc/pve/firewall/cluster.fw (tous les nœuds) et /etc/pve/nodes/<nœud>/host.fw (un nœud, prioritaire)
VM / CT Le trafic de chaque carte réseau d'un invité IN, OUT /etc/pve/firewall/<VMID>.fw
VNet Tout le trafic qui traverse un VNet du SDN, d'invité à invité ou d'invité à hôte FORWARD uniquement /etc/pve/sdn/firewall/<vnet>.fw — moteur nftables uniquement
Trois zones du pare-feu Proxmox : l'hôte, chaque invité, le VNet SDN, avec leurs fichiers et leurs interrupteurs

Les règles du Datacenter ne filtrent pas les VM. On lit souvent « Datacenter, puis nœud, puis VM, en cascade ». Faux : les règles de cluster.fw sont celles des nœuds.

Vérifié sur le lab : avec IN Ping(DROP) au Datacenter, le nœud ne répond plus au ping, un conteneur si. Le Datacenter partage avec les invités des objets : alias, IP sets, groupes de sécurité (§2.4).

2.2 Ce qui doit être activé pour qu'une règle s'applique

Le pare-feu est désactivé à l'installation : pve-firewall status répond Status: disabled/running. Le service tourne mais n'applique rien. Pour qu'une règle agisse, plusieurs interrupteurs doivent être levés, différents selon la zone (chacun vérifié sur le lab en l'éteignant seul) :

Pour filtrer… Il faut Vérification sur le lab
Le nœud enable: 1 au Datacenter et l'option enable du nœud (vaut 1 par défaut) —
Un invité 1. enable: 1 au Datacenter Invité configuré, Datacenter désactivé → le ping et SSH passent
2. enable: 1 dans les options de l'invité —
3. La case Firewall de la carte (net0: …,firewall=1) Carte à firewall=0 → le trafic passe, règles ou pas
Un VNet Datacenter, options du VNet, et moteur nftables sur les nœuds Moteur classique → règles du VNet ignorées

Le pare-feu du nœud n'intervient pas dans le filtrage des invités, contrairement à ce que demandent beaucoup de supports.

Les politiques décident du sort de ce qu'aucune règle ne nomme : policy_in, policy_out (ACCEPT, DROP, REJECT) et policy_forward pour le transit. DROP jette sans réponse ; REJECT renvoie un refus, mais révèle la machine. La règle d'exploitation : politique DROP, puis une règle ACCEPT par flux nécessaire.

Où voir le pare-feu sur votre cluster :

Notion Où la voir
L'interrupteur général et les règles des nœuds Datacenter → Firewall (règles, Options) ; /etc/pve/firewall/cluster.fw
Le pare-feu d'un nœud Nœud → Firewall ; /etc/pve/nodes/<nœud>/host.fw
Le pare-feu d'un invité La VM ou le CT → Firewall (règles, Options) ; la case Firewall de sa carte dans Hardware / Network
L'état du service pve-firewall status
Les règles réellement appliquées iptables-save (moteur classique) ou nft list ruleset (nftables)

2.3 Écrire les règles : syntaxe, macros, ordre

Une règle s'écrit DIRECTION ACTION [OPTIONS], par exemple IN ACCEPT -p tcp -dport 8006 -source 10.44.1.0/24. Un | en tête la désactive.

Les macros regroupent protocole et ports sous un nom (une centaine, man pve-firewall) : IN SSH(ACCEPT). Quelques-unes :

Macro Équivalent
SSH tcp 22
Web tcp 80 et tcp 443
HTTPS tcp 443
Ping icmp echo-request
DNS udp 53 et tcp 53
PostgreSQL tcp 5432

Deux comportements doivent être connus, parce qu'ils trompent à coup sûr :

  • L'ordre compte, et les nouvelles règles arrivent en tête. Les règles sont évaluées de haut en bas, la première qui correspond décide. Une règle créée par l'API ou l'interface est insérée en position 0 : après deux créations successives, la seconde apparaît au-dessus de la première dans le fichier.
  • Une règle créée par pvesh sans --enable 1 est désactivée. Vérifié sur le lab : pvesh create /cluster/firewall/rules --type in --action DROP --macro Ping écrit |IN Ping(DROP) dans cluster.fw — le | initial signifie « désactivée », et la règle n'apparaît dans aucune chaîne. L'interface, elle, coche Enable par défaut.

Le pare-feu est à états (stateful) : accepter une connexion entrante accepte aussi ses réponses. Aucune journalisation par défaut : on l'active par zone (log_level_in) ou par règle (-log), et on la lit dans Firewall → Log.

2.4 Nommer les adresses et réutiliser les règles

Trois objets, définis au Datacenter (Datacenter → Firewall), évitent de répéter une adresse dans vingt règles :

Objet Contenu Utilisation dans une règle
Alias Une adresse ou un réseau, nommé -source poste_admin
IP set Une liste d'adresses, de réseaux ou d'alias -source +admins (le + désigne un IP set)
Groupe de sécurité Une liste de règles, nommée Dans un invité : GROUP web

Un groupe de sécurité se définit une fois dans cluster.fw et s'applique à autant d'invités qu'on veut ; le modifier modifie la protection de tous :

# /etc/pve/firewall/cluster.fw
[group web]
IN Web(ACCEPT)
IN Ping(ACCEPT) -source +admins

# /etc/pve/firewall/101.fw
[OPTIONS]
enable: 1
policy_in: DROP

[RULES]
GROUP web
IN SSH(ACCEPT) -source +admins

Le groupe web ouvre le web à tous et le ping aux seuls membres de l'IP set admins ; la VM 101 l'applique par une ligne, GROUP web. Si l'équipe d'administration change d'adresse, on modifie l'IP set : toutes les règles suivent.

Deux IP sets ont un rôle réservé. management regroupe les adresses autorisées à administrer les hôtes (le réseau local du nœud y est mis d'office, rien d'autre). blacklist regroupe les adresses jetées par chaque hôte et chaque invité.

2.5 Activer le pare-feu sans se couper l'accès

Avec une politique d'entrée DROP au Datacenter, Proxmox ouvre d'office certains ports, depuis l'IP set management seulement. Ce sont l'interface web (8006), SSH (22), SPICE (protocole de console à distance, 3128), les consoles (5900-5999), la migration (60000-60050), et Corosync sur le réseau du cluster.

Si vous administrez depuis un autre réseau (VPN — Virtual Private Network, réseau privé virtuel —, autre site), l'activation vous coupe. pve-firewall localnet affiche le réseau que Proxmox considère comme local : celui de votre vmbr0.

Ordre absolu : les règles d'accès d'abord, l'activation ensuite. Si votre poste n'est pas dans ce réseau, ajoutez son adresse à l'IP set management, ou créez les règles ACCEPT correspondantes, avant de cocher Firewall.

Gardez une session ouverte pendant l'activation. En cas d'erreur, la récupération se fait par la console (IPMI, iDRAC, ou l'écran du serveur) : enable: 0 dans /etc/pve/firewall/cluster.fw, ou pve-firewall stop.

L'IP set management ne couvre pas Ceph, ni le VXLAN. Vu sur le lab : pare-feu activé sans règle pour les réseaux Ceph, le cluster est passé en HEALTH_WARN (8 pgs inactive, 8 pgs peering) et les écritures se sont figées.

Deux règles IN Ceph(ACCEPT), une par réseau Ceph, l'ont rétabli en trois minutes.

Une zone VXLAN demande de même IN ACCEPT -p udp -dport 4789 depuis le réseau de vmbr0. Posez ces règles avant d'activer.

Via l'interface : Datacenter → Firewall → Options → Firewall → Yes, après avoir vérifié Datacenter → Firewall → IPSet → management.

Équivalent CLI (Dans le Shell du nœud) :

# Une ouverture explicite d'abord — toujours --enable 1, sinon la règle est créée désactivée
pvesh create /cluster/firewall/rules --type in --action ACCEPT --macro SSH \
  --source 10.99.0.0/24 --enable 1 --comment "SSH depuis le VPN d'administration"
pvesh set /cluster/firewall/options --enable 1   # puis seulement : activer
pve-firewall status   # l'état du pare-feu

Résultat attendu : aucune sortie pour les deux premières commandes, puis Status: enabled/running.

Pour un invité, même principe dans son propre fichier, et le troisième interrupteur : la case Firewall de sa carte.

# /etc/pve/firewall/101.fw — un serveur web, administré depuis un seul réseau
[OPTIONS]
enable: 1
policy_in: DROP

[RULES]
IN Web(ACCEPT)
IN SSH(ACCEPT) -source 10.44.1.0/24

2.6 Diagnostiquer

pve-firewall status (actif ? configuration valide ?), pve-firewall localnet (réseau local), pve-firewall simulate (tel flux passerait-il ?, sans envoyer de paquet), et Firewall → Log.

Une règle « ne fait rien ». Elle est désactivée (`.

Règle posée au Datacenter pour protéger une VM, sans effet. Les règles du Datacenter filtrent les nœuds : la règle doit aller dans le pare-feu de l'invité, ou dans un groupe de sécurité.

Règles de VNet sans effet. Moteur nftables non activé sur le nœud, ou invités non redémarrés depuis.

Plus d'accès à l'interface après activation. Poste hors du réseau local et absent de l'IP set management → console, enable: 0.

Un service répond « refusé » au lieu de ne pas répondre. Ce n'est pas le pare-feu : le paquet est passé et rien n'écoute. Un silence (délai dépassé) signe un DROP.

Vous ajoutez au Datacenter une règle qui refuse le SSH vers la VM 300, mais la VM répond toujours sur le port 22. Le pare-feu du Datacenter est pourtant activé. Qu'est-ce qui manque ?
Réponse **La règle n'est pas au bon endroit, et les interrupteurs de la VM ne sont pas levés.** Les règles du Datacenter protègent les hôtes, pas les invités. Pour filtrer une VM, la règle se pose dans le pare-feu **de la VM**. Trois conditions doivent être réunies : le pare-feu du Datacenter activé, celui de la VM activé dans ses options, et la case `firewall=1` sur sa carte réseau.

À retenir : le pare-feu Proxmox est distribué (configuration dans /etc/pve) et désactivé à l'installation. Il agit par zones : l'hôte, les invités, les VNets.

Une règle ne s'applique que si tous ses interrupteurs sont levés (Datacenter, invité, case firewall=1 sur la carte). On écrit les règles d'accès avant d'activer une politique DROP, et on nomme les adresses (alias, IP sets, groupes de sécurité).


▶ À pratiquer maintenant — Atelier 1

D'abord activer le pare-feu sans se couper l'accès. Puis protéger trois machines web, applicative et base de données, avec un groupe de sécurité par rôle.