Skip to main content

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:

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

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.