Criar um Reverse Proxy (Debian 9)

10 Agosto 2017 Por Adriano Afonso

Devido à quantidade de servidores que montei numa das empresas para a qual presto serviços, senti a necessidade de criar um reverse-proxy (r-proxy) para poder fazer a gestão dos vários acessos. Isto torna-se realmente importante quanto temos vários acessos a várias máquinas que utilizam a mesma porta HTTP:80 ou mesmo a porta SSL/HTTPS:443.

Servidor/Maquina Virtual

Para a esta opção, usei a distribuição Debian, e fui buscar as versões mais mini, as netinstall disponíveis aqui, usado a versão amd64 compatível com a máquina que suporta as máquinas virtuais em VMware.

Aproveito para deixar já aqui uma dica, em muitas distribuições estão disponíveis os pacotes Open VM Tool que permitem a interacção do host directamente com o VMWare ESXi. Isto permite algumas funcionalidades extra de gestão, configuração e administração dos hosts. Em Debian, depois da instalação, basta fazer:

apt-get install open-vm-tools

Configuração de rede

IP Fixo

Esta máquina, impreterivelmente deverá ter IP fixo. Usei a ajuda da Debian para o fazer, disponível aqui. Esta configuração é aplicavel também em Ubuntu e todas as distros Debian based.

Para definir o IP fixo, editar:

nano /etc/network/interfaces

E depois definir à eth0 os seguintes valores (substituir pelos vossos):
PS: No Ubuntu14.x e Debian 8 é provável que encontrem algum texto novo, colocar a configuração estática debaixo de: “source-directory /etc/network/interfaces.d”. Em Ubuntu também vos indicam utilizar o nmtui, esqueçam…

auto eth0
iface eth0 inet static
        address 10.0.0.20
        netmask 255.255.255.0
        gateway 10.0.0.1
        network 10.0.0.0
        broadcast 10.0.0.255

Recordar que, podem incluir duas, ou mais, configurações de IP, especialmente quando estão a trabalhar em duas redes distintas. É só adicionar a partir de iface. A seguir convém sempre reiniciar a placa de rede para ela poder assumir o IP atribuído:

ifdown eth0
ifup eth0

DNS’s

Em alguns casos será também boa ideia definir os servidores de resolução de nomes:

nano /etc/resolv.conf

E adicionar os seguintes, OpenDNS e Google DNS, respectivamente alterado:

nameserver 208.67.222.222
nameserver 8.8.8.8
nameserver 208.67.220.220
nameserver 8.8.4.4

Hostname

Se também quiserem mudar o nome da máquina, para que fique mais apelativo dentro da rede (até porque no meu caso vou usar também partilhas Samba), basta editar os ficheiros:

nano /etc/hostname
nano /etc/hosts

No segundo deverá constar na mesma o localhost, e por baixo o nome da máquina:

127.0.0.1 localhost
127.0.0.1 R-Proxy

Atribuir a ambos o nome desejado e depois reiniciar o sistema (isto porque é a melhor maneira de garantir que o nome fique realmente atribuído).

Preparar o servidor SSH

Debian

Por defeito o servidor SSH também não vem instalado. Para continuarem a configuração no conforto do “sofá” basta seguir a help do Debian e:

apt-get install openssh-server

E em principio já podem aceder remotamente a partir da vossa rede interna. No entanto, no Debian 8 o acesso SSH remoto está desactivado por defeito. Para o activar, aceder a

nano /etc/ssh/sshd_config

e depois alterar a linha “PermitRootLogin without-password” para:

PermitRootLogin yes

E não esquecer depois de reiniciar o servidor de SSH

service ssh restart

Ubuntu

Se estiverem em Ubuntu, é muito provável que o sevidor SSH já esteja instalado, mas que não permita o acesso por root, para isso terão de primeiro efectuar os mesmos passos acima, depois mudar a pass de root e activar a mesma.

sudo passwd root

Aqui vai ser pedida a pass, e a respectiva confirmação, depois correr

sudo passwd -u root

Se ao correr o comando for dada a seguinte informação:

passwd: password expiry information changed

É porque tudo correu bem. Para voltar a fechar o acesso, basta rever a opção do servidor SSH, e correr o comando:

sudo passwd -l root

nginx

Em primeiro lugar vou deixar aqui uma série de recursos que utilizei para aprender a configurar o r-proxy:

Para a configuração do nginx, decidi começar pela configuração simples, e depois ir construindo em cima desta. Obviamente o primeiro passo é instala-lo:

apt-get install nginx

Assim que o nginx estiver instalado, devemos desligar a configuração por defeito:

unlink /etc/nginx/sites-enabled/default

e de seguida criar o ficheiro:

nano /etc/nginx/sites-enabled/reverse-proxy.conf

Onde deverão ser inseridas as configurações a seguir. Nota para o valor de client_max_body_size na configuração do servidor cloud. Este deve ser igual ao valor definido no upload_max_filesize do php.ini do servidor de destino. Se assim não for, os clientes ownCloud/Nextcloud não serão capazes de fazer upload dos ficheiros (maiores que 1mb).

## Basic reverse proxy server ##

## Nginx (localhost) para nginx.dominio.tld ##
upstream nginx {
server 192.168.10.25:80;
}

## Apache (apps) para apps.dominio.tld ##
upstream apps {
server 192.168.10.15:443;
}
## Apache (cloud) for cloud.dominio.tld ##
upstream cloud {
server 192.168.10.25:443;
}

## Start http://nginx.dominio.tld ##
server {
listen 80;
server_name nginx.dominio.tld;

root /var/www/html;

location / {
proxy_pass http://192.168.1o.25/testes/;
}
}

 

## Start https://apps.dominio.tld ##
server {
listen 443;
server_name apps.dominio.tld;

ssl on;
ssl_certificate /etc/ssl/certs/apps/apache.crt;
ssl_certificate_key /etc/ssl/certs/apps/apache.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # don’t use SSLv3 ref: POODLE

location / {
proxy_pass https://apps;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

## Start https://cloud.dominio.tld ##
server {
listen 443;
server_name cloud.dominio.tld;

ssl on;
ssl_certificate /etc/ssl/certs/cloud/fullchain.pem;
ssl_certificate_key /etc/ssl/certs/cloud/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # don’t use SSLv3 ref: POODLE

location / {
proxy_pass https://cloud;
client_max_body_size 512M;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

## /Basic reverse proxy server ##

Podemos de seguida realizar um teste à configuração, e reiniciar o nginx:

service nginx configtest
service nginx restart

Certificados SSL

Por necessidade, todos os sítios que tenho configurados estão acessíveis via https/ssl, e portanto, com utilização de certificados. Se, no vosso caso, apenas necessitarem de HTTP:80, não vão precisar de alguns passos aqui descritos. Alerto que todas as configurações que aqui vou deixar serão para HTTPS:443. Para que o r-proxy funcione devidamente, os certificados que antes estavam nas máquinas onde estavam alojados os sítios terão de ser copiados para o r-proxy. Portanto, vou lá busca-los e guardar dentro da pasta por defeito, mas em pastas respectivas:

scp -r root@192.168.10.15:/etc/apache2/ssl/ /etc/ssl/certs/apps/
scp -r root@192.168.10.25:/etc/letsencrypt/live/cloud/fullchain.pem /etc/ssl/certs/cloud/
scp -r root@192.168.10.25:/etc/letsencrypt/live/cloud/privkey.pem /etc/ssl/certs/cloud/