Proxy nginx: Redirigir las IPs reales

Me encuentro con una aplicación la cual tengo detrás de un frontal de nginx. La cuestión es que la petición al servidor llega con la IP interna del frontal de nginx en lugar de la IP real del cliente.

Para ello tendremos que realizar una configuración en el frontal de nginx para pasar la IP real del usuario y otra en el nginx de la aplicación para que interprete correctamente la IP.

Frontal nginx

root@frontal1-nginx:~# vi /etc/nginx/sites-enabled/app.capa8.net
server {
    listen 80;

    server_name app.capa8.net;
    return 301 https://app.capa8.net$request_uri;
    #root /var/www/html/;
}

server {
        server_name app.capa8.net;

        listen 443 ssl;
        ssl_certificate /etc/letsencrypt/live/app.capa8.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/app.capa8.net/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_trusted_certificate /etc/letsencrypt/live/app.capa8.net/chain.pem;

        location / {
                proxy_set_header  Host $host;
                proxy_set_header  X-Real-IP $remote_addr;
                proxy_set_header  X-Forwarded-Proto https;
                proxy_set_header  X-Forwarded-For $remote_addr;
                proxy_set_header  X-Forwarded-Host $remote_addr;
                proxy_pass http://192.168.100.15:80;
        }
}

nginx Aplicación

Siendo set_real_ip_from la subred por donde pueden venir las peticiones de proxy

root@app:~# vi /etc/nginx/sites-enabled/app
server {
    listen 80;
    server_name app.capa8.net;

    set_real_ip_from 192.168.100.0/24;
    real_ip_header X-Real-IP;
    real_ip_recursive on;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/uwsgi-app.sock;
    }

    # /static
    location /static/ {
        autoindex off;
        root /var/www/app/web/;
    }

    location /static/admin {
        autoindex off;
        root /var/www/app/venv/lib/python3.5/site-packages/django/contrib/admin/;
    }
}

Reiniciamos ambos nginx y comprobamos en los logs que la ip pasa correctamente.

Fuente: Forward IP Addresses with NGINX Proxy

Redirección de puertos con iptables + contrack

Pues seguimos con éstos pequeños errores que hemos cometido siempre y que ahora en un momento de cambios y con mucho mas entendimiento llegan mejores soluciones para que las cosas funcionen mejor (tanto a nivel técnico como personal). Hoy estoy tiernecilla y quiero agradecer con éste post todas éstas personas que seguís los posts que publico y tenéis al igual que yo éste blog como una herramienta de consulta, un lugar claro, sin muchas complicaciones donde encontrar justo aquello que necesito en cada momento o me da la pista para poder seguir avanzando con algo mas grande que estoy construyendo con el paso de los días.

Ésta vez me encuentro solucionando un problema que inicialmente parecía de nginx pero ha resultado ser de iptables, y es que las cosas nunca son lo que parecen a primera vista y es necesario tener un gran conocimiento del sistema para entender como poder solucionar los problemas de base y encontrar una solución definitiva que evita fallos futuros, para casos como hoy que ya en producción me encuentro con un problema grave de base. Para que un sistema funcione bien, las capas inferiores (base) deben estar bien.

Me dejo ya de palabrerías y comentarios dobles y me pongo en materia. El post que rectifico es éste: Proxmox + nat + iptables.

Gracias a las configuraciones de las antenas en los supernodos entiendo que se deben marcar los paquetes tanto de entrada (prerouting) como de salida (postrouting). En TCP hay una llamada de un …

Proxy apache con https

Cuando tienes pocas IPs y muchas maquinas una de las opciones que tienes para preservar IPs es usar proxy_http de apache, pero ¿qué ocurre cuando quieres proxyear conexiones https?

Lo lógico ha sido crear el certificado en la máquina que contiene el servicio bajo ssl, hasta aquí todo OK, pero se complicaba la cosa al tratar de hacerlo pasar por el servidor que hace de proxy apache.

Vamos a ver como lo he hecho, no es exactamente como quería, pero la cosa es que funciona :P

Para recopilar un poco y como ha habido cambios en la web startssl voy a poner el paso a paso, además que el post que tengo es un poco viejuno ya!…

Generar certificados válidos startssl en apache

Es importante que ciertas comunicaciones estén cifradas, para ello vamos a generar un certificado y lo vamos a verificar con la entidad certificadora startssl que nos permite validar certificados SSL. También podríamos hacer este paso sin validarlo en startssl, pero luego nos saldría cuando navegamos en el servidor que el certificado no es válido, pero la navegación sería segura igualmente.

Lo primero es generar los ficheros de certificado, el .csr, el .key y el .crt en nuestro servidor. Vamos a generar las claves para admin.sip.polaris.capa8.cat.

Verificaremos que tenemos instalado el paquete openssl, si no es así, lo instalamos:

root@polaris-pbx:~# apt-get install openssl

Nos iremos al directorio /etc/ssl/private y ahí generamos las claves…

Limitar el ancho de banda de apache

Cuando tienes un datacenter montado en casa, probablemente tengas una conexión con un ancho de banda de subida de mierda (hablando en claro hehe), así que cuando algún usuario se dedica a descargar algún vídeo o imagen un poco grande te encuentras que una sola instancia de apache hace que la red no funcione en absoluto, ya que para descargar, necesitas mandar datos a internet, pero como tienes la subida colapsada, la descarga no funciona.

Así que limitaremos el ancho de banda de subida para que así las peticiones de apache no causen problemas en nuestra conexión :)

Instalamos el módulo de apache libapache2-mod-bw

# apt-get install libapache2-mod-bw

Lo activamos

# a2enmod bw

Modificamos el virtualhost



#... el resto de cosas de este virtualhost

BandWidthModule On
ForceBandWidthModule On
BandWidth 192.168.1.0/24 0
BandWidth all 32000

32000 = 4Mbps, Mbps*100/8

Y reiniciamos apache

# service apache2 restart