Saltar a contenido

sniproxy: Proxy SNI basado en stream-lua-nginx-module

Instalación

Si aún no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.

CentOS/RHEL 7 o Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-sniproxy

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-sniproxy

Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.

Este documento describe lua-resty-sniproxy v0.22 lanzado el 31 de agosto de 2020.


Esta biblioteca es un proxy SNI escrito en Lua. La parte de análisis de TLS está reescrita de dlundquist/sniproxy.

Ten en cuenta que se requiere el módulo de flujo de nginx y ngx_stream_lua_module.

Probado en Openresty >= 1.9.15.1.

Sinopsis

stream {
    init_by_lua_block {
        local sni = require("resty.sniproxy")
        sni.rules = { 
            {"www.google.com", "www.google.com", 443},
            {"www.facebook.com", "9.8.7.6", 443},
            {"api.twitter.com", "1.2.3.4"},
            {".+.twitter.com", nil, 443},
            -- para activar esta regla, debes usar el proxy en el espacio de Lua
            -- {"some.service.svc", "unix:/var/run/nginx-proxy-proto.sock", nil, sni.SNI_PROXY_PROTOCOL_UPSTREAM},
            -- {"some2.service.svc", "unix:/var/run/nginx-proxy-proto.sock", nil,
            --                            sni.SNI_PROXY_PROTOCOL_UPSTREAM + sni.SNI_PROXY_PROTOCOL},
            {".", "unix:/var/run/nginx-default.sock"}
        }   
    }

    # para OpenResty >= 1.13.6.1, proxy nativo de Nginx
    lua_add_variable $sniproxy_upstream;
    server {
            error_log /var/log/nginx/sniproxy-error.log error;
            listen 443;

            resolver 8.8.8.8;

            prepread_by_lua_block {
                    local sni = require("resty.sniproxy")
                    local sp = sni:new()
                    sp:preread_by()
            }
            proxy_pass $sniproxy_upstream;
    }

    # para OpenResty < 1.13.6.1 o si se configuran `flags`, proxy en el espacio de Lua
    server {
            error_log /var/log/nginx/sniproxy-error.log error;
            listen 443;

            resolver 8.8.8.8;

            content_by_lua_block {
                    local sni = require("resty.sniproxy")
                    local sp = sni:new()
                    sp:content_by()
            }
    }
}

Una tabla de arreglo Lua sni_rules debe ser definida en la directiva init_worker_by_lua_block.

El primer valor puede ser ya sea el nombre completo del host o una expresión regular. Usa . para un nombre de host por defecto. Si no se encuentra ninguna entrada, la conexión se cerrará.

Los segundo y tercer valores son el nombre del host de destino y el puerto. Un host puede ser un nombre DNS, una dirección IP o una ruta de socket de dominio UNIX. Si el host no está definido o se establece en nil, se usará server_name en SNI. Si el puerto no está definido o se establece en nil, se usará 443.

El cuarto valor son las banderas a usar. Las banderas disponibles son:

    sni.SNI_PROXY_PROTOCOL -- usar la dirección del cliente recibida del protocolo proxy para enviar al upstream
    sni.SNI_PROXY_PROTOCOL_UPSTREAM -- enviar el apretón de manos del protocolo proxy v1 al upstream

Para usar las banderas, el servidor debe estar configurado para hacer proxy en el espacio de Lua (ver ejemplo anterior).

Las reglas se aplican con la prioridad según su secuencia de ocurrencia en la tabla. En el ejemplo anterior, api.twitter.com coincidirá con la tercera regla api.twitter.com en lugar de la cuarta .+.twitter.com.

Si la versión del protocolo es inferior a TLSv1 (por ejemplo, SSLv3, SSLv2), la conexión se cerrará, ya que la extensión SNI no es compatible en estas versiones.

Ver También

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-sniproxy.