Ubuntu - Reverse Proxy com Nginx
Para configurarmos um servidor Ubuntu 22.04 como Reverse Proxy com Nginx.
Nota Importante: Esta é uma excelente forma de ultrapassar o limite waf 60 web servers publicados imposto pela Sophos XGS.
(Limite waf sophos 60 rules workaround).
Instalação
Depois de OS instalado, atualizado e seguro, instalamos o Nginx:
sudo apt -y install nginx
Adicionamos regra de firewall a permitir acesso ao Nginx:
sudo ufw allow 'Nginx Full'
Verificamos se o Nginx está a correr:
systemctl status nginx
Desabilitamos virtualhost predefinido com:
sudo unlink /etc/nginx/sites-enabled/default
Certificados SSL
Certificados adquiridos
Colocamo-los nas pastas abaixo, em subpasta com NomeDoProjeto criada mais à frente).
Nota: imaginando que o website que estamos a fazer reverse é o projetox.pt, o nome da pasta é projetox
/etc/ssl/certs
/etc/ssl/private
e para que o user que estamos a usar tenha direitos de escrita nas mesmas corremos:
sudo chown -R UserQueEstamosAUsar:UserQueEstamosAUsar /etc/ssl/certs
sudo chown -R UserQueEstamosAUsar:UserQueEstamosAUsar /etc/ssl/private
Criamos dentro de cada uma a pasta "projetox" (exemplo) e damos direitos de escrita ao user UserQueEstamosAUsar:
sudo chown -R UserQueEstamosAUsar:UserQueEstamosAUsar /etc/ssl/certs/projetox
sudo chown -R UserQueEstamosAUsar:UserQueEstamosAUsar /etc/ssl/private/projetox
Com LetsEncrypt
Para fazer a instalação e renovação de certificado usando CertBot e LetsEncrypt ou SSLForFree.
VirtualHosts
Para cada serviço web redirecionado, criamos um bloco de configuração.
Cenário: projetox.pt, servido pelo servidor com o nome Ex.: ServidorQueTemOServico, na porta 443
Criamos ficheiro de configuração com:
sudo nano /etc/nginx/sites-available/projetox.pt.conf
E colocamos o seguinte código no mesmo:
Nota:
Nestas duas linhas:
ssl_certificate /etc/ssl/certs/projetox/projetox.pt/projetox_pt_cert.cer;
ssl_certificate_key /etc/ssl/private/projetox/projetox.pt/projetox.pt_key.pem;
Alterem o nome do certificado e da chave privada para o respetivo.
e se o certificado usado é LetsEncrypt, usarão muito provavelmente as abaixo:
/etc/letsencrypt/live/projetox/fullchain.pem
/etc/letsencrypt/live/projetox/privkey.pem
server {
listen 80;
server_name projetox.pt;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name projetox.pt;
ssl_certificate /etc/ssl/certs/projetox/projetox.pt/projetox_pt_cert.cer;
ssl_certificate_key /etc/ssl/private/projetox/projetox.pt/projetox.pt_key.pem;
location / {
proxy_pass https://IPdoServidorQueTemOServico;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ssl_protocols TLSv1.2;
proxy_ssl_server_name on;
}
}
Habilitamos a configuração acima com a criação de symlink na pasta sites-enabled:
cd sites-enabled
sudo ln -s ../sites-available/projetox.pt.conf .
ls -l
Testamos se existem erros de configuração no Nginx:
sudo nginx -t
Se tudo ok, reiniciamos o Nginx:
sudo systemctl restart nginx
No DNS interno alteramos os registos A para que deixem de apontar ao IP dos respetivos web servers e passem a apontar para o do Reverse Proxy.
Na publicação externa (Appliance Sophos, etc) , apontamos para o IP do Reverse Proxy;
Nos DNS Externos, apontamos para o IP externo da Appliance Sophos (se for o caso).
Boa publicações.
Doação
Se o acima te trouxe valor, aceito com gratidão uma doação