NGINX como proxy transparente

Que es un proxy

Un proxy es un servidor o una aplicación que actúa como intermediario entre un dispositivo cliente (como un ordenador o un teléfono) y otro servidor o recurso. El objetivo principal de un proxy es proporcionar una conexión más segura y rápida al mismo tiempo.

Existen diferentes tipos de proxy, pero algunos de los más comunes son:

  • Proxy de acceso a Internet: Este tipo de proxy es utilizado para proporcionar acceso a Internet a los dispositivos de una red.
  • Proxy de cache: Este tipo de proxy almacena una copia de los recursos solicitados por los clientes para que puedan ser accedidos más rápidamente en el futuro.
  • Proxy de anonimato: Este tipo de proxy oculta la dirección IP del cliente y proporciona anonimato al navegar por Internet.
  • Proxy inverso: Este tipo de proxy actúa como intermediario entre los clientes y un servidor web.
  • Proxy transparente: Este tipo de proxy actúa como intermediario entre los clientes y los servidores de destino, pero los clientes no necesitan configurar ninguna información adicional en sus navegadores para conectarse a través del proxy.
  • En general, los proxies se utilizan para mejorar la seguridad, la velocidad y la privacidad de las conexiones de red.

Que es un proxy transparente

Un proxy transparente es un tipo de proxy que actúa como intermediario entre los clientes y los servidores de destino, pero los clientes no necesitan configurar ninguna información adicional en sus navegadores para conectarse a través del proxy. En lugar de eso, el proxy intercepta las conexiones entrantes y las redirige a los servidores de destino apropiados.

El objetivo principal de un proxy transparente es ocultar la existencia del proxy a los clientes y proporcionar una conexión más segura y rápida al mismo tiempo. Un ejemplo común de uso es cuando el proxy transparente es utilizado para filtrar el tráfico de internet en una red empresarial o para acelerar el acceso a ciertos sitios web.

Es importante mencionar que un proxy transparente no ofrece anonimato o privacidad ya que la información del cliente sigue siendo visible para el administrador del proxy.

Situación inicial

Tenemos un servidor apache2 en una máquina debian que resuelve el dominio enguillem.com, si lo visualizamos en nuestro navegador vemos una web de bienvenida:

vista de enguillem.com

Todo esto funciona ya que tenemos configurado un virtualhost, si miramos los sitios disponibles en la carpeta /etc/apache2/sites-avaliable

sitios disponibles

Vemos que tenemos un fichero de configuración para el sitio enguillem.conf, este fichero también existe en el directorio /etc/apache2/sites-enabled como un enlace simbólico.

El contenido de este fichero es el siguiente:

contendio fichero configuración

Como podéis ver el fichero escucha al puerto 80 y para el dominio enguillem.com y el alias www.enguillem.com sirve los ficheros del directorio /home/guillem/public_html/enguillem.com/www

Usar NGINX como proxy transparente

En esta situación si queremos usar NGINX como proxy transparente necesitaremos dos servidores web funcionando en la misma máquina, pero solo uno puede servir peticiones al puerto 80.

En este caso será NGNIX el que use el puerto 80, por tanto tendremos que modificar apache para que escuche peticiones en otro puerto, por ejemplo el puerto 8080

Para esto vamos al directorio /etc/apache2 y modificamos el fichero ports.conf de la siguiente manera

Apache escucha solo el puerto 8080

Si ahora reiniciamos apache

y visitamos nuestra web, vemos lo siguiente:

Esto pasa porqué todavía tenemos el virtualhost escuchando en el puerto 80, tenemos que modificar el fichero enguillem.conf de la siguiente forma:

y reiniciar apache

Ahora añadiendo el puerto en la url ya podemos ver nuestra pagina

Como podéis suponer no es nada interensante tener que poner los puertos en la url, deberíamos de seguir viendo nuestra web a través del puerto 80 y aquí es donde entra NGINX

Instalar NGINX en debian

para instalar nginx en debian unsamos el comando

sudo apt install nginx

Configurar NGINX como proxy transparente

Ahora vamos al directorio /etc/nginx/sites-available y creamos el fichero enguillem.com con el contenido siguiente:

server {
listen 80;
listen [::]:80;

    root /home/guillem/public_html/enguillem.com/www;
    index index.html index.htm index.nginx-debian.html;

    server_name enguillem.com www.enguillem.com;

    location / {
            proxy_pass http://localhost:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

En este bloque de configuración, estamos diciendo a NGINX que escuche en el puerto 80 y que sirva al host «enguillem.com». Luego establecemos una «location» que especifica que todas las solicitudes que lleguen a la raíz del sitio web deben ser redirigidas al puerto 8080 en el servidor local. Con las instrucciones «proxy_set_header» estamos pasando información adicional sobre la solicitud al servidor Apache para que este pueda tomar decisiones informadas.

Ahora hay que crear un enlace simbólico en la carpeta /etc/nginx/sites-enabled, para ello primero vamos al directorio /etc/nginx/sites-enables y creamos el enlace

reiniciamos nginx sudo /etc/init.d/nginx restart

y ya podemos acceder a apache a través de nginx