Criar um Reverse Proxy (Debian 9)
10 Agosto 2017Devido à 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:
- reverse-proxy
- using-nginx-as-reverse-proxy
- how-to-configure-nginx-with-ssl-as-a-reverse-proxy-for-jenkins
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/