Apache HTTP Server como proxy reverso para o Proxmox VE e suporte ao noVNC

Tuesday, February 11, 2020

Quem me conhece sabe que gosto demais do Proxmox Virtual Environment (PVE para os íntimos), porque ele proporciona uma plataforma completa de virtualização de máquinas virtuais de forma simples, robusta e OpenSource, garantindo inclusive suporte para uma arquitetura de Virtualização Hiperconvergente. Clique aqui para saber mais sobre PVE.

Atualmente não o utilizo em produção, apenas em ambiente de estudos. Quem me dera, hein, brincar com esse cara em produção.

Conforme o título desse artigo, o meu objetivo é mostrar como configurar um proxy reverso afim de evitar ficar acessando o dashboard do Proxmox via IP + Porta ou Hostname + Porta. Chato demais acessar qualquer serviço dessa forma.

De momento irei utilizar o Apache HTTP Server, porque sim, porque eu gosto desse carinha. Num futuro próximo posso demonstrar utilizando o Nginx (pronuncia-se “enginex”).

Para este artigo utilizei uma VM bem simples com as seguintes especificações:

  • CentOS Linux release 7.7.1908 (Core)
  • 1 GB de memória RAM
  • 1 vCPU
  • 10 GB de espaço em disco

Pré-requesitos

Logado via SSH como root numa VM zerada, com o SO recém instalado, executo alguns pré-requesitos. Como:

  • Alterar o estado do SELinux, porque não quero trabalhar com esse cara habilitado. Nesse caso mudo de enforcing para permissive.
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
  • Criar regra no firewalld liberando as portas 80/HTTP e 443/HTTPS.
firewall-cmd --permanent --add-service={http,https}
firewall-cmd --reload
  • Adicionar um hostname adequado à função da VM. Pensei aqui em proxy-server. Combina.
hostnamectl set-hostname proxy-server && bash
  • Ajustar o arquivo /etc/hosts com o IP e hostname correto da VM. No meu caso o IP é 10.10.10.10 e domínio meudominio.local. O conteúdo do arquivo ficou da seguinte forma:
127.0.0.1	localhost
::1         localhost
10.10.10.10	proxy-server.meudominio.local proxy-server
  • Atualizar para a última versão os pacotes instalados.
yum update -y

Instalação e configuração do serviço httpd

Agora que executei os pré-requesitos acima, posso finalmente instalar os pacotes necessários.

yum install httpd mod_ssl -y

Inicializo o serviço httpd.

systemctl enable --now httpd

Vou criar o diretório /etc/httpd/ssl para armazenar os arquivos do certificado SSL. Isso porque irei utilizar um certificado auto-assinado. No seu caso, se for Let’s Encrypt já não precisa, pois o diretório por padrão será outro.

mkdir /etc/httpd/ssl

Criação do certificado auto-assinado

Execute o comando abaixo para gerar um certificado auto-assinado.

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/httpd/ssl/pve.key -out /etc/httpd/ssl/pve.crt

Preencha os campos solicitados, mas atenção na opção Common Name, pois ela precisa ser igual ao endereço que você pretende informar no browser. No meu caso, pve.meudominio.local.

Clique aqui caso você tenha dúvidas sobre o processo acima de gerar o certificado auto-assinado.

O resultado foi a criação de dois arquivos:

[root@proxy-server ~]# ls -l /etc/httpd/ssl/
total 8
-rw-r--r--. 1 root root 1505 Feb 11 23:57 pve.crt
-rw-r--r--. 1 root root 1704 Feb 11 23:57 pve.key

Sensacional. Agora temos tudo para criar o arquivo de Virtual Host.

Criando o arquivo de Virtual Host

Crie o arquivo /etc/httpd/conf.d/pve.conf com o conteúdo abaixo.

<VirtualHost *:80>
    ServerName pve.meudominio.local
    ServerAlias pve
    ServerAdmin sysadmin@meudominio.local
    
    Redirect Permanent / https://pve.meudominio.local/
</VirtualHost>

<VirtualHost *:443>
    Servername pve.meudominio.local
    ServerAlias pve
    ServerAdmin sysadmin@meudominio.local
    
    ErrorLog logs/pve.meudominio.local_error.log
    CustomLog logs/pve.meudominio.local_access.log combined

    SSLProxyEngine On
    SSLProxyVerify None
    SSLProxyCheckPeerCN Off
    SSLProxyCheckPeerName Off
    RequestHeader unset Accept-Encoding

    ProxyPreserveHost On
    ProxyRequests Off
    ProxyTimeout 600
    Timeout 600

    <Location />
           ProxyPass https://10.10.1.122:8006/
           ProxyPassReverse https://10.10.1.122:8006/
    </Location>

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

    <Location /websockify>
           ProxyPass ws://10.10.1.122:8006
           ProxyPassReverse ws://10.10.1.122:8006
    </Location>

    SSLEngine On
    SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
    SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLHonorCipherOrder On
    
    SSLCertificateKeyFile /etc/httpd/ssl/pve.key
    SSLCertificateFile /etc/httpd/ssl/pve.crt
</VirtualHost>

Execute o comando abaixo para verificar se o arquivo de Virtual Host criado está OK. Só pra garantir.

apachectl configtest

Retornando Syntax OK pode recarregar as cofigurações do apache com o comando abaixo.

systemctl reload httpd

Primeira Observação: No arquivo acima o IP 10.10.1.122 é o meu servidor Proxmox. Você precisa então substituir pelo IP do seu Proxmox.

Segunda Observação: O nome pve.meudominio.local está configurado no arquivo /etc/hosts do meu notebook. No seu caso o nome escolhido precisa estar em conformidade com o seu DNS público e/ou local.

Feito todos os passos acima, já posso abrir o meu browser e digitar http://pve.meudominio.local que terei acesso ao dashboard do Proxmox com tudo funcional, exceto o spiceproxy. Infelizmente.

O spiceproxy não funciona nesse modelo de Proxy Reverso que estamos trabalhando aqui, porque ele associa a porta 3128 ao host local. Exemplo: proxy=http://pve.meudominio.local:3128.

Nesse caso, o spiceproxy funciona muito bem quando o Apache está em execução no mesmo host que o Proxmox.

Terceira Observação: Por se tratar de um certificado auto-assinado, no primeiro acesso teremos aquela puxada de orelha do browser informando que o certificado do site não é confiável. Normal.

Olha só como ficou no browser. Bem melhor que digitar https://10.10.1.122:8006/, hein.

pve.meudominio.localScreenshot do dashboard do Proxmox VE

Aqui te mostrei o básico para criar um proxy reverso utilizando o Apache HTTP Server num servidor CentOS 7.x.

Se preciso for, o apache também pode ser instalado e configurado no próprio servidor do Proxmox, pois assim o spiceproxy funciona 100%, mas nesse caso mudam alguns dos passos acima, pois será trabalhado o pacote apache2 num sistema operacional Debian. Assunto para um próximo artigo.

Espero que aproveite todo esse conteúdo. Abraço!

proxmoxproxmoxapachedicas

Criando sua própria Vagrant Box para o VirtualBox

comments powered by Disqus