Zum Inhalt

sniproxy: SNI-Proxy basierend auf dem stream-lua-nginx-module

Installation

Wenn Sie noch kein RPM-Repository-Abonnement eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.

CentOS/RHEL 7 oder 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

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-sniproxy v0.22, das am 31. August 2020 veröffentlicht wurde.


Diese Bibliothek ist ein SNI-Proxy, der in Lua geschrieben ist. Der Teil zur TLS-Analyse wurde von dlundquist/sniproxy umgeschrieben.

Beachten Sie, dass das nginx Stream-Modul und das ngx_stream_lua_module erforderlich sind.

Getestet auf 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},
            -- um diese Regel zu aktivieren, müssen Sie Lua-Land-Proxying verwenden
            -- {"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"}
        }   
    }

    # für OpenResty >= 1.13.6.1, natives Nginx-Proxying
    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;
    }

    # für OpenResty < 1.13.6.1 oder wenn `flags` konfiguriert sind, Lua-Land-Proxying
    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()
            }
    }
}

Eine Lua-Array-Tabelle sni_rules sollte in der init_worker_by_lua_block-Direktive definiert werden.

Der erste Wert kann entweder der vollständige Hostname oder ein regulärer Ausdruck sein. Verwenden Sie . für einen Standard-Hostname. Wenn kein Eintrag übereinstimmt, wird die Verbindung geschlossen.

Die zweiten und dritten Werte sind der Ziel-Hostname und der Port. Ein Host kann ein DNS-Name, eine IP-Adresse oder ein UNIX-Domain-Socket-Pfad sein. Wenn der Host nicht definiert oder auf nil gesetzt ist, wird server_name im SNI verwendet. Wenn der Port nicht definiert oder auf nil gesetzt ist, wird 443 verwendet.

Der vierte Wert sind die zu verwendenden Flags. Verfügbare Flags sind:

    sni.SNI_PROXY_PROTOCOL -- Verwenden Sie die vom Proxy-Protokoll empfangene Client-Adresse, um an den Upstream zu senden
    sni.SNI_PROXY_PROTOCOL_UPSTREAM -- Senden Sie den Proxy-Protokoll v1-Handshake an den Upstream

Um Flags zu verwenden, muss der Server für Lua-Land-Proxying konfiguriert sein (siehe obiges Beispiel).

Regeln werden mit der Priorität entsprechend ihrer Auftretensfolge in der Tabelle angewendet. Im obigen Beispiel wird api.twitter.com die dritte Regel api.twitter.com anstelle der vierten .+.twitter.com entsprechen.

Wenn die Protokollversion kleiner als TLSv1 ist (z. B. SSLv3, SSLv2), wird die Verbindung geschlossen, da die SNI-Erweiterung in diesen Versionen nicht unterstützt wird.

Siehe auch

GitHub

Sie finden zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-sniproxy.