Proxy inverso con Nginx
En esta ocasión veremos como podemos usar nuestro servidor Nginx como un proxy inverso para acceder a diferentes servicios de una red.
La principal funcionalidad de un proxy reverso es recibir las solicitudes web de clientes desde una red DMZ y reenviar las solicitudes a un servidor ubicado en internet.
Con nginx como proxy reverso se puede:
- Mitigar riesgos de seguridad.
- Implementar medidas de seguridad.
- Limitar el numero de conexiones para evitar ataques DDoS.
LABORATORIO
Preparación
Vamos a crear diferentes contenedores LXC con los siguientes servicios:
- Ct-01
- Os: Debian 11
- Blog: Nuestro blog en WordPress.
- Dominio: blog.virtualab.ml
- Ct-02
- Os: Debian 11
- Cloud: Una nube privada con NextCloud.
- Dominio: cloud.virtualab.ml
- Ct-03
- Os: Debian 11
- panel: Panel de administración para nuestro VPS con HestiaCP.
- Dominio: panel.virtualab.ml
Registro del dominio gratuito
Personalmente recomiendo los servicios de freenom.com como registrador de dominios gratuitos.
Una vez que hemos registrado nuestro nuevo dominio (virtualab.ml), crearemos las entradas de DNS de tipo CNAME que harán referencia a cada uno de los servicios que tengamos corriendo en nuestro servidor.
Instalar y activar nuestro proxy inverso
Una vez que tengamos los contenedores LXC iniciados y configurados con los servicios.
Ahora vamos a preparar nuestro servidor proxy, esta máquina debe tener acceso a la red donde se encuentran los contenedores LXC.
Instalamos Nginx en el servidor
apt-get install nginx -yEditamos el archivo /etc/nginx/sites-enabled/default y reemplazamos todo su contenido por el siguiente:
nano /etc/nginx/sites-enabled/default
# Blog en WordPress
server {
listen 80;
server_name blog.virtualab.ml;
location / {
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_set_header X-Forwarded-Proto $scheme;
proxy_pass http://10.131.67.24;
}
}
# Nube privada con NextCloud
server {
listen 80;
server_name cloud.virtualab.ml;
location / {
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_set_header X-Forwarded-Proto $scheme;
proxy_pass http://10.131.67.180;
}
}
# Cpanel con VestaCP
server {
listen 80;
server_name panel.virtualab.ml;
location / {
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_set_header X-Forwarded-Proto $scheme;
proxy_pass http://10.131.67.252;
}
}
Verificamos que la configuración esta correcta.
nginx -tPor ultimo reiniciamos nuestro servidor
service nginx restart
Opciones de seguridad
A continuación veremos opciones que refuerzan la seguridad de nuestro proxy.
server {
listen 80;
server_name _;
client_body_timeout 20s;
client_header_timeout 20s;
# Log de acceso
access_log /var/log/nginx/prueba.access.log;
location / {
limit_conn addr 20;
proxy_pass http://10.0.0.2:9090;
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_set_header X-Forwarded-Proto $scheme;
#deny 87.256.23.145
}
}
Explicación:
- client_body_timeout 20s Máximo de conexiones a body 20 segundos para luego cerrar la sesión.
- client_header_timeout 20s Máximo de conexiones a header 20 segundos para luego cerrar la sesión.
- limit_conn addr 20 Limitar el numero de conexiones simultaneas desde una IP a 20.
- deny 8.8.8.8 Si queremos denegar el acceso de IPs a nuestro servidor.
Fortificación de cabeceras de seguridad
En la seguridad de una web además de servir el contenido cifrado (https), las cabeceras que se envían en las peticiones juegan un papel importante.
- Content-Security-Policy
- Proteger tu sitio de ataques XSS.
- add_header Content-Security-Policy “default-src ‘self’";
- X-Frame-Options
- Proteger tu sitio de ataques Clickjacking, indicando al navegador si las páginas de tu sitio pueden estar dentro de iframe o no.
- add_header X-Frame-Options “SAMEORIGIN” always;
- add_header X-Frame-Options “DENY”;
- X-Content-Type-Options
- Fuerza al navegador a utilizar el tipo de contenido de los ficheros que tu sitio le indica.
- add_header X-Content-Type-Options “nosniff” always;
- Strict-Transport-Security
- Fuerza al navegador a usar https.
- add_header Strict-Transport-Security “max-age=31557600; includeSubDomains”;
- X-Xss-Protection
- Habilita el filtro anti-XSS.
- add_header X-Xss-Protection “1”