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
- das ngx_stream_lua_module: https://github.com/openresty/stream-lua-nginx-module
- dlundquist/sniproxy
- ngx_stream_ssl_preread_module ist seit Nginx 1.11.5 als Alternative zu diesem Modul verfügbar.
GitHub
Sie finden zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-sniproxy.