sniproxy: Proxy SNI baseado no stream-lua-nginx-module
Instalação
Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.
CentOS/RHEL 7 ou 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 com o NGINX, certifique-se de que o nginx-module-lua esteja instalado.
Este documento descreve lua-resty-sniproxy v0.22 lançado em 31 de agosto de 2020.
Esta biblioteca é um proxy SNI escrito em Lua. A parte de análise TLS foi reescrita de dlundquist/sniproxy.
Observe que o módulo de stream do nginx e o ngx_stream_lua_module são necessários.
Testado no Openresty >= 1.9.15.1.
Sinopse
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 ativar esta regra, você deve usar proxying em 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, proxying nativo do 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 ou se `flags` estiverem configurados, proxying em 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()
}
}
}
Uma tabela de array Lua sni_rules deve ser definida na diretiva init_worker_by_lua_block.
O primeiro valor pode ser um nome de host completo ou uma expressão regular. Use . para um nome de host padrão. Se nenhuma entrada for correspondente, a conexão será fechada.
Os segundo e terceiro valores são o nome do host de destino e a porta. Um host pode ser um nome DNS, endereço IP ou caminho de socket de domínio UNIX. Se o host não estiver definido ou estiver definido como nil, server_name no SNI será usado. Se a porta não estiver definida ou estiver definida como nil, 443 será usada.
O quarto valor são as flags a serem usadas. As flags disponíveis são:
sni.SNI_PROXY_PROTOCOL -- usa o endereço do cliente recebido do protocolo proxy para enviar ao upstream
sni.SNI_PROXY_PROTOCOL_UPSTREAM -- envia o handshake do protocolo proxy v1 para o upstream
Para usar as flags, o servidor deve ser configurado para fazer proxying em Lua (veja o exemplo acima).
As regras são aplicadas com a prioridade de acordo com a sequência de ocorrência na tabela. No exemplo acima, api.twitter.com corresponderá à terceira regra api.twitter.com em vez da quarta .+.twitter.com.
Se a versão do protocolo for inferior a TLSv1 (por exemplo, SSLv3, SSLv2), a conexão será fechada, pois a extensão SNI não é suportada nessas versões.
Veja Também
- o ngx_stream_lua_module: https://github.com/openresty/stream-lua-nginx-module
- dlundquist/sniproxy
- ngx_stream_ssl_preread_module está disponível desde o Nginx 1.11.5 como uma alternativa a este módulo.
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-sniproxy.