Puncte:0

Obțineți IP-ul solicitant real în proxy invers NGINX containerizat

drapel ro

Am stiva Docker Swarm cu nginx ca proxy invers configurat pe vps-ul OVH. Încercam să folosesc directivele allow/deny în locație, dar dacă setez deny all; nu ar funcționa nici măcar pentru ip-ul adăugat cu directiva allow. După ce m-am uitat la jurnalele de acces, am aflat că toate cererile ar fi venit de la IP 10.0.0.2. Acum am încercat să fac ca IP-ul real să fie afișat cel puțin în jurnale, dar fără succes. Există nginx.conf-ul meu:

evenimente{}

http {

  harta $http_upgrade $connection_upgrade {
    upgrade implicit;
    ''      închide;
  }
  error_log /dev/stdout info;
  log_format json_combined escape=json
    '{'
      '"time":"$time_local",'
      „"httpRequest":{'
        '"requestMethod":"$request_method",'
        '"requestUrl":"$scheme://$host$request_uri",'
        '"requestSize":$request_length,'
        '"status":"$status",'
        '"responseSize":$bytes_sent,'
        '"userAgent":"$http_user_agent",'
        '"remoteIp":"$remote_addr",'
        '"serverIp":"$server_addr",'
        '"referer":"$http_referer",'
        '"latency":"${request_time}s",'
        '"protocol":"$server_protocol"'
      '}'
    '}';

  resolver 127.0.0.11 valid=30s;

  includ /etc/nginx/mime.types;
  includ /etc/nginx/sites-enabled/*.*;
}

proxy.conf:

set_real_ip_de la 10.0.0.0/8;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
proxy_set_header X-Real-IP $adresă_la distanță;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Gazdă $http_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $schema;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Actualizare $http_upgrade;
proxy_set_header Conexiune $connection_upgrade;
proxy_set_header X-NginX-Proxy true;
proxy_cache_bypass $http_upgrade;
proxy_http_versiunea 1.1;
proxy_read_timeout 20d;
proxy_buffering dezactivat;
proxy_request_buffering dezactivat;
proxy_intercept_errors activat;
http2_push_preload activat;

si locatia mea:

  locație /api/ {
     permiteți XXX.XX.XX.X;
     nega totul;
     includ /etc/nginx/proxy-options/proxy.conf;
     set $ocelot ocelot-service;
     proxy_pass http://$ocelot$uri$is_args$args;
     proxy_ssl_session_reuse dezactivat;
     proxy_redirect dezactivat;
     client_max_body_size 5M;
  }

Ce pot face pentru ca nginx să înregistreze IP-ul real al solicitantului și, dacă este posibil, să folosesc IP-ul pentru a compara cu directiva allow?

drapel us
Ați verificat dacă serverul de conectare setează corect antetul „X-Forwarded-For”?
Pepsko avatar
drapel ro
Sincer, nu știu cum pot verifica asta
drapel us
Trebuie să afli asta atunci. Verificați care este software-ul care se conectează la acest nginx și verificați configurația acestuia.
Pepsko avatar
drapel ro
Doar pentru a fi sigur - te referi la software care trimite cerere la proxy, nu la serverul ascuns în spatele proxy-ului, nu?
Pepsko avatar
drapel ro
Cu cercetări suplimentare, am aflat că problema este conectată la nginx care rulează în interiorul containerului în docker swarm. Bănuiesc că echilibrul de încărcare Docker Swarm este cel care setează IP-ul 10.0.0.2. Încă nu am aflat cum să remediați această problemă, deoarece se pare că echilibrul de încărcare a roiului nu setează antetul X-Forwarded-For.
drapel us
Adresa IP nu este „setată”. Când conexiunea TCP este deschisă, adresa IP sursă este cea pe care o are entitatea care se conectează. În acest caz, trebuie să vedeți dacă Docker Swarm poate seta antetul.
Pepsko avatar
drapel ro
Da, a fost doar o scurtătură mentală. Oricum, am reușit să remediez problema - sa datorat rețelei suprapuse de la Docker Swarm, trebuia să rulez serviciul nginx în modul gazdă pentru a rezolva problema. Oricum, multumesc pentru timpul acordat
Puncte:0
drapel ro

Problema a fost cauzată din cauza rețelei suplimentare de „suprapunere” în docker roi; Am ocolit acest lucru folosind rețeaua „gazdă”.

Servicii:
  nginx:
    ...
    porturi:
      - tinta: 80
        publicat: 80
        protocol: tcp
        mod: gazdă
      - tinta: 443
        publicat: 443
        protocol: tcp
        mod: gazdă

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.