Meine Firewall funktioniert einwandfrei: Die Verbindung vom Internet wird an einen NGINX-Server weitergeleitet, der sie dann entsprechend verteilt, und der Anwendungsserver funktioniert mit Ausnahme der internen LOGs ordnungsgemäß.
Mein Problem betrifft die von unserem Anwendungsserver empfangene IP: Es handelt sich nicht um die „Client-IP“, sondern derzeit um die NGINX-IP.
Betrachten Sie dieses Netzwerk: Client-IP 1, Firewall-IP 2, NGINX-IP 3, Webserver-IP 4.
An der Firewall sehen wir, dass die Pakete an NGINX weitergeleitet werden, bei NGINX tcpdump
sehen wir jedoch eingehende Verbindungen von der eigenen NGINX-IP 3 statt der ursprünglichen Quell-IP 1.
Der Punkt ist, dass wir bei Webserver-LOGS unsere Eingangsverbindungen als IP 3 sehen, erwartet wird jedoch IP 1.
Handelt es sich um eine Fehlkonfiguration der Firewall oder von NGINX? Irgendwelche Ideen, wie man das Problem lösen kann?
Aktuelle Konfiguration ( /etc/nginx/sites-enabled/app.domain.com
):
...
location ^~ / {
proxy_pass http://10.0.0.11;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
...
Antwort1
Dies ist der normale Vorgang. Wenn nginx ein Reverse-Proxy ist, öffnet es eine Verbindung zum endgültigen Ziel und leitet den Proxy vom Client zum Anwendungsserver weiter. Die Quell-IP kann nichts anderes als die IP-Adresse von nginx sein, sonst würde die TCP-Verbindung nicht funktionieren.
Sie müssen den Anwendungsserver so einrichten, dass er die im X-Real-IP
Header angegebene IP-Adresse anstelle der IP-Adresse der TCP-Verbindung verwendet.
Antwort2
Die Lösung für diesen Fall bestand darin, den C#-Code wie unten beschrieben zu ändern. Es wurden keine Änderungen an der Firewall oder Nginx vorgenommen.
var userIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
Bisherige erfolglose Versuche:
var userIP = Request.ServerVariables["X_FORWARDED_FOR"];
var userIP = Request.ServerVariables["X-REAL-IP"];
var userIP = Request.ServerVariables["REMOTE_ADDR"];
var userIP = Request.UserHostAddress;
Vielen Dank an alle Mitwirkenden, die zur Klärung beigetragen haben, dass das Problem weder an der Firewall noch an der Nginx-Konfiguration lag.