Utiliser un proxy Apache pour Proxmox

De Adadov.net wiki
Révision datée du 8 février 2023 à 07:38 par Adadov (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Ecrit Par : Adadov

Notre serveur de test proxmox se trouve à l'intérieur d'un réseau privé.

N'ayant malheureusement pas toujours une connexion supportant IPv6 à l'extérieur on ne peut pas se reposer sur son IPv6 publique pour l'accès et une simple redirection dans le NAT IPv4 ne me convenait pas les ports 80 et 443 étant déjà utilisés sur une autre machine.

Il a donc été nécessaire de créer un reverse proxy dans le serveur Apache existant afin de servir l'interface web de proxmox malgré tout.

Mais c'était sans compter sur les spécificités de ce genre d'interfaces ...

Problèmes rencontrés

Pour créer un proxy c'est relativement rapide dans les cas simple.

En effet si votre serveur possède déjà de nombreux VirtualHost il suffit de lui en ajouter un et de lui configurer les options ProxyPass et ProxyPassReverse.

Proxmox force les connexions SSL

Le premier soucis que j'ai eu, c'est que proxmox force la connexion SSL. En plus de ça les certificats étant ceux par défaut (donc self-signed) mon serveur Apache n'en voulait pas.

Donc on commence par activer le support SSL pour les proxy et on demande à ne pas valider le certificat (on est en interne je rappel, les risques sont limités)

SSLProxyEngine on

SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

Les connexions aux consoles

Les connexions aux consoles se font via des websocket et ne me demandez pas pourquoi mais Apache n'aime pas qu'on mélange tout ...

Il faut donc ajouter des règles de proxy spécifiques pour les destinations de ces connexion WebSocket.

<LocationMatch ^/(api2/json/nodes/[^\/]+/[^\/]+/[^\/]+/vncwebsocket.*)$>
    ProxyPass wss://IP.DU.SERVEUR.PROXMOX:8006/$1 retry=0
</LocationMatch>

<Location /websockify>
    ProxyPass ws://IP.DU.SERVEUR.PROXMOX:8006
    #ProxyPassReverse ws://IP.DU.SERVEUR.PROXMOX:8006
</Location>

Le proxy renvoi une page blanche

Après toutes ces misères, il a fallu encore chercher ...

Le proxy renvoyait une page blanche depuis l'extérieur du réseau.

En supprimant les options ProxyPassReverse le problème semble corrigé ... A suivre ...

Fichier de configuration complet

Le reste du fichier est standard pour un VirtualHost qui fait office de proxy.

Je vous mets ici ma version pour référence si besoin

# Ce VirtualHost est là uniquement pour forcer la connexion SSL
<VirtualHost *:80>
	ServerName FQDN_DU_SERVEUR
	Redirect / https://FQDN_DU_SERVEUR/
</VirtualHost>

# VirtualHost Proxy pour Proxmox
<VirtualHost *:443>
	ServerName FQDN_DU_SERVEUR

	CustomLog logs/access_log combined

    <Location />
        ProxyPass https://IP.DU.SERVEUR.PROXMOX:8006/
        #ProxyPassReverse https://IP.DU.SERVEUR.PROXMOX:8006/
    </Location>
 
    <LocationMatch ^/(api2/json/nodes/[^\/]+/[^\/]+/[^\/]+/vncwebsocket.*)$>
        ProxyPass wss://IP.DU.SERVEUR.PROXMOX:8006/$1 retry=0
    </LocationMatch>
 
    <Location /websockify>
        ProxyPass ws://IP.DU.SERVEUR.PROXMOX:8006
        #ProxyPassReverse ws://IP.DU.SERVEUR.PROXMOX:8006
    </Location>

	SSLEngine on
	SSLProtocol all -SSLv2
	SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
	SSLCertificateFile    fullchain.pem
	SSLCertificateKeyFile privkey.pem

	SSLProxyEngine on
	SSLProxyVerify none

	SSLProxyCheckPeerCN off
	SSLProxyCheckPeerName off
	SSLProxyCheckPeerExpire off

	ProxyRequests off
	ProxyPreserveHost on
	RequestHeader unset Accept-Encoding

    # On force l'accès via SSL
	Header always add Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"

	<Files ~ "\.(cgi|shtml|phtml|php3?)$">
		SSLOptions +StdEnvVars
	</Files>

	SetEnvIf User-Agent ".*MSIE.*" \
		nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

</VirtualHost>