Proxy pour l’interface de Proxmox

modifié le : 24 octobre 2024,
par Guillaume Chéramy
 

L'interface de management de Proxmox VE est accessible via un port spécial : 8006 qui peut être bloqué sur certains réseaux, qui plus est le certificat SSL est auto-signé et donc génère des erreurs.

C'est donc pas la configuration la plus adéquate pour une utilisation régulière.

Il est bien sûr possible d'adapter tout cela, mais mon infrastructure repose sur 3 serveurs proxmox en cluster, je veux pouvoir arriver sur l'interface quel que soit l'état du serveur.

Pour cela il faut donc mettre en place un proxy qui load-balance les requêtes sur les différents serveurs.

Je rajoute en plus les besoins suivants

  • toutes les requêtes doivent passer par le port 443
  • certificat Let's Encrypt
  • noVNC doit fonctionner via ce proxy

Prérequis

3 serveurs Proxmox en cluster fonctionnel. Les miens sont en cluster HA avec du Ceph sur 3 datacentes OVH RBX / GRA / BHS

Proxy

Le proxy est une instance public cloud OVH avec un petit shorewall pour bloquer les ports non nécessaires.

Bien sur le proxy peut être directement sur un serveur Proxmox dans le cas ou il n'y a pas de cluster.

Installation des paquets

Installation des paquets sur une Debian 12 :

apt install nginx letsencrypt

Création du certificat SSL

letsencrypt certonly -d proxy.mondomaine.com 

Configuration du vhost

Cas d'un cluster

Je crée mon fichier de vhost nginx avec les paramètres suivants :

upstream proxmox {
  ip_hash; 
  server server1:8006;
  server server2:8006;
  server server2:8006;
}

server {
  listen 80 ; 
  server_name proxy.mondomaine.com;
  rewrite ^(.*) https://$host$1 permanent;
}

server {
  listen 443 ssl http2;
  server_name proxy.mondomaine.com;

  ssl_certificate /etc/letsencrypt/live/proxy.mondomaine.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/proxy.mondomaine.com/privkey.pem;
  proxy_redirect off;

  location / {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_pass https://proxmox;
    proxy_buffering off;
    client_max_body_size 0;
    proxy_connect_timeout  3600s;
    proxy_read_timeout  3600s;
    proxy_send_timeout  3600s;
    send_timeout  3600s;
  }
}

Quelques remarques :
ip_hash : important pour le fonctionnement de la console vnc

Cas d'un simple serveur Proxmox

Un vhost plus simple sur la partie location et ne pas mettre la partie upstream

location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass https://127.0.0.1:8006;
        proxy_buffering off;

        client_max_body_size 0;

        proxy_connect_timeout 3600s;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        send_timeout 3600s;
    }

Interdire l'utilisation du port 8006

Il faut créer le fichier /etc/default/pveproxy

ALLOW_FROM="127.0.0.1"
DENY_FROM="all"
POLICY="allow"

Et redémarrer le pveproxy

systemctl restart pveproxy.service 

Conclusion

On a ainsi une configuration de l'interface de Proxmox sur un port standard avec un certificat SSL reconnu.