Pular para conteúdo

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

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.