it-swarm.com.de

Nginx: Reverse Proxy, der die Client-IP an den Server übergibt

Auf einem vorhandenen Nginx-Reverse-Proxy muss ich die Client-IP an einen Server übergeben (von Nginx an das in NG-Engine bereitgestellte Frontend und von diesem an das Backend). Ich habe viele Websites ausprobiert, aber der Server empfängt nur 127.0.0.1. Zusätzliche Informationen (hinzugefügt nach der Frage von Michael Hampton), unsere Infrastruktur für virtuelle Maschinen:

  1. Client-Browser (ein anderer VM oder Remotedesktop)
  2. (VM1) Nginx Reverse Proxy (es funktioniert, HTTPS-Schicht habe ich mindestens hinzugefügt)
  3. (VM1) NgEngine serviert das hausgemachte Frontend
  4. (VM1) RESTful-API, die von einem hausgemachten Java/Spring-Backend bereitgestellt wird (läuft in IntelliJ-Idee)
  5. (VM2..x) andere Server, die das Backend mit Daten versorgen (außer Frage)

Ich habe das Dokument überprüft und hier versucht (einschließlich des Entfernens des X-Real-IP-Headers, wie vorgeschlagen in dieser anderen Frage ). Ich habe auch versucht hinzuzufügen:

set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For

Mein nginx hat ein real_ip-Modul (Ausgabe von nginx -V unten), und dies ist meine nginx.conf ... Was mache ich falsch?

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
  worker_connections 768;
  # multi_accept on;
}

http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  # server_tokens off;

  server_names_hash_bucket_size 64;
  # server_name_in_redirect off;

  include /etc/nginx/mime.types;
  default_type application/octet-stream;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
  ssl_prefer_server_ciphers on;

  gzip on;
  gzip_disable "msie6";

  server {
    listen 443 ssl;
    server_name          test-server;
    ssl_certificate      /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key  /etc/nginx/ssl/nginx.key;

    add_header              Strict-Transport-Security  "max-age=63072000; includeSubdomains; preload" always;
    add_header              X-Frame-Options            SAMEORIGIN;
    add_header              X-Content-Type-Options     nosniff;

    # allow nginx to start regardless of upstream endpoint state by using intermediary variable
    set                     $UPSTREAM_SERVICE          10.10.10.15:8080;

    location  / {
      proxy_pass               http://localhost:6789
      proxy_http_version       1.1;

      proxy_buffering          off;
      proxy_buffer_size        128k;
      proxy_busy_buffers_size  256k;
      proxy_buffers            4                   256k;
      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;
      proxy_set_header         Upgrade             $http_upgrade;
      proxy_set_header         Connection          $http_connection;

    }
  }
}

Ausgabe von nginx -V:

nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.0g  2 Nov 2017
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-mcUg8N/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_flv_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_Perl_module=dynamic --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-headers-more-filter --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-auth-pam --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-cache-purge --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-dav-ext --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-ndk --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-echo --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-fancyindex --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/nchan --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-lua --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/rtmp --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-uploadprogress --add-dy
namic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-upstream-fair --add-dynamic-module=/build/nginx-mcUg8N/nginx-1.14.0/debian/modules/http-subs-filter

Vielen Dank und beste Grüße

4
xCovelus

Auf einem vorhandenen Nginx-Reverse-Proxy muss ich die Client-IP an einen Server übergeben (beide laufen unter demselben Betriebssystem). Ich habe viele Websites ausprobiert, aber der Server empfängt nur 127.0.0.1.

Als Reverse-Proxy erhält Ihr Back-End-Server immer eine Verbindung von Ihrem Nginx-Prozess, der abhängig von Ihrer *_pass - Direktive die IP-Adresse Ihres Nginx enthält (in Ihrem Fall 127.0.0.1).

Daher können Sie die Client-IP möglicherweise nicht abrufen, indem Sie die Client-Adresse überprüfen. Sie erhalten nur Ihre Front-End-Server-IP-Adresse.

Im Reverse-Proxy- und Load-Balancing-Bereich haben wir verschiedene Möglichkeiten, die Client-IP aus dem Reverse-Proxy im Backend zu extrahieren:

  1. Nicht standardmäßiger De-facto X-Forwarded-For HTTP-Anforderung Header, enthält alle übergebenen Proxys und fordert die Client-IP an Adresse (n).
  2. Forwarded HTTP-Anfrage Header, ist eine neue standardisierte Methode zum Ersetzen von X-Forwarded-For, enthält auch IP-Adressen für alle übergebenen Proxys und anfordernden Clients.
  3. X-Real-IP HTTP-Anforderungsheader oder ein beliebiger benutzerdefinierter HTTP-Anforderungsheader, der die Client-IP-Adresse willkürlich enthält.

Überprüfen Sie Ihre Back-End-Anwendung, ob sie einen dieser Header unterstützt.


Mein Nginx hat das Modul real_ip

ngx_http_realip_module wird in diesem Fall nicht verwendet. Es wird verwendet, wenn sich nginx hinter einem Proxy befindet, damit es die echte Client-IP-Adresse validieren, abrufen und in einer angegebenen Variablen speichern kann.

2
mforsetti

Dank beider Kommentare hatte ich eine klarere Vorstellung davon, wie ich die Lösung herausfinden kann. Besonders hilfreich war mir der Kommentar von mforsetti:

Überprüfen Sie Ihre Back-End-Anwendung, ob sie einen dieser Header unterstützt.

Und auch:

[..] haben wir verschiedene Möglichkeiten, um die Client-IP vom Reverse-Proxy im Backend zu extrahieren: [..]

Verwenden von HttpServletRequest (Anfrage):

request.getRemoteAddr();

war (und ist) gibt mir die Proxy-IP. Also habe ich beschlossen, manuell zu versuchen, um den richtigen Header zu erhalten:

request.getHeader("X-Forwarded-For");

Und das gab mir genau die Client-IP.

Vielen Dank für Ihre Hilfe, ohne sie wäre ich nicht in der Lage, dies zu lösen.

0
xCovelus