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
enforcingparapermissive.
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/hostscom o IP e hostname correto da VM. No meu caso o IP é10.10.10.10e domíniomeudominio.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.
Screenshot 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!