Aller au contenu

sniproxy: Proxy SNI basé sur le module stream-lua-nginx-module

Installation

Si vous n'avez pas encore configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-sniproxy v0.22 publié le 31 août 2020.


Cette bibliothèque est un proxy SNI écrit en Lua. La partie de parsing TLS est réécrite à partir de dlundquist/sniproxy.

Notez que le module stream de nginx et le ngx_stream_lua_module sont requis.

Testé sur Openresty >= 1.9.15.1.

Synopsis

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},
            -- pour activer cette règle, vous devez utiliser le proxying en 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"}
        }   
    }

    # pour OpenResty >= 1.13.6.1, proxying Nginx natif
    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;
    }

    # pour OpenResty < 1.13.6.1 ou si les `flags` sont configurés, proxying en 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()
            }
    }
}

Un tableau de règles Lua sni_rules doit être défini dans la directive init_worker_by_lua_block.

La première valeur peut être soit un nom d'hôte complet, soit une expression régulière. Utilisez . pour un nom d'hôte par défaut. Si aucune entrée ne correspond, la connexion sera fermée.

Les deuxième et troisième valeurs sont le nom d'hôte cible et le port. Un hôte peut être un nom DNS, une adresse IP ou un chemin de socket de domaine UNIX. Si l'hôte n'est pas défini ou est défini sur nil, server_name dans SNI sera utilisé. Si le port n'est pas défini ou est défini sur nil, 443 sera utilisé.

La quatrième valeur est les flags à utiliser. Les flags disponibles sont :

    sni.SNI_PROXY_PROTOCOL -- utiliser l'adresse client reçue du protocole proxy pour envoyer à l'amont
    sni.SNI_PROXY_PROTOCOL_UPSTREAM -- envoyer la poignée de main du protocole proxy v1 à l'amont

Pour utiliser les flags, le serveur doit être configuré pour faire du proxying en Lua (voir l'exemple ci-dessus).

Les règles sont appliquées avec la priorité selon leur séquence d'occurrence dans le tableau. Dans l'exemple ci-dessus, api.twitter.com correspondra à la troisième règle api.twitter.com plutôt qu'à la quatrième .+.twitter.com.

Si la version du protocole est inférieure à TLSv1 (par exemple, SSLv3, SSLv2), la connexion sera fermée, car l'extension SNI n'est pas supportée dans ces versions.

Voir aussi

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-sniproxy.