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
- el ngx_stream_lua_module: https://github.com/openresty/stream-lua-nginx-module
- dlundquist/sniproxy
- ngx_stream_ssl_preread_module está disponible desde Nginx 1.11.5 como una alternativa a este módulo.
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-sniproxy.