Puncte:3

Cum pot face ca nginx să nu suprascrie x-forwarded-for atunci când fac proxy?

drapel cn

Am un server nginx în spatele unui echilibrator de încărcare, serverul nginx transmite cereri către o varietate de servicii, dar în acest caz un container docker care rulează apache. Echilibratorul de încărcare setează corect un X-Forwarded-For, dar în momentul în care ajunge la containerul docker, X-Forwarded-For a fost setat la IP-ul LB.

Am asta în configurația nginx:

/etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{LB IP}};
real_ip_header X-Real-IP;
real_ip_recursive on;

și acesta este virtualhost:

Server {
    asculta 443 ssl;
    asculta [::]:443 ssl;
    nume_server *.domeniu domeniu;
    includ /etc/nginx/snippets/domain_ssl.conf;

  add_header X-Nginx-Debug „bună”;

  proxy_pass_request_headers activat;

  Locație    / {
    proxy_pass_request_headers activat;
    proxy_pass http://container-php;
    proxy_http_versiunea 1.1;
    proxy_set_header Actualizare $http_upgrade;
    proxy_set_header Conexiune „upgrade”;
    proxy_set_header Gazdă $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Remote-Addr $remote_addr;
    proxy_set_header X-Real-IP $http_x_real_ip;
    proxy_set_header X-Header-Test „Bună lume - $http_x_forwarded_for”;
    proxy_set_header X-Forwarded-Proto $schema;
  }
}

Dar ceea ce primesc din container este:

matrice(19) {
  ["Conexiune"] =>
  șir (7) „upgrade”
  [„Gazdă”] =>
  șir (19) „domeniu”
  ["X-Forwarded-For"] =>
  șir (12) „{{LB IP}}”
  ["X-Header-Test"] =>
  string(13) „Bună lume -”
  ["X-Forwarded-Proto"] =>
  șir (5) „https”
  ["cache-control"] =>
  șir (9) „max-age=0”
  ["sec-ch-ua"] =>
  string(64) "" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97""
  ["sec-ch-ua-mobile"] =>
  șir (2) „?0”
  ["sec-ch-ua-platform"] =>
  șir (9) „„Windows””
  ["upgrade-insecure-requests"] =>
  șir (1) „1”
  ["user-agent"] =>
  string(114) „Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/97.0.4692.71 Safari/537.36”
  ["accept"] =>
  string(135) „text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v =b3;q=0,9"
  ["sec-fetch-site"] =>
  șir (4) „niciunul”
  ["sec-fetch-mode"] =>
  șir (8) „navigați”
  ["sec-fetch-user"] =>
  șir (2) „?1”
  ["sec-fetch-dest"] =>
  șir (8) „document”
  ["accept-encoding"] =>
  șir (17) „gzip, deflate, br”
  ["accept-language"] =>
  string(26) „en-GB,en-US;q=0.9,en;q=0.8”
}

În special, X-Real-IP, X-Fowarded-For nu par să fie setate, nici remote_addr. Fișierele servite direct de la nginx au x-forwarded-for setat corect, astfel încât LB trimite în jos antetul din dreapta.

Am ratat vreun pas?

Puncte:2
drapel br

Cred că problema este în configurația ta reală a ip.

set_real_ip_from {{LB IP}};

real_ip_header X-Real-IP;

real_ip_recursive on;

Când real_ip_header ar trebui să fie (în cazul dvs.) setat la X-Forwarded-For. Voi presupune antetul tău X-Forwarded-For de la LB arată astfel:

X-Forwarded-For: {{Ip client original}}, {{Ip LB}}

Deci, atunci când setați real_ip_header (antetul folosit pentru a înlocui ip-ul clientului) la X-Forwarded-For se va potrivi cu ip-ul clientului original. Clientul original ar trebui să fie acum sub variabila $realip_remote_addr, pe care o puteți adresa la proxy_set_header X-Forwarded-For :

proxy_set_header X-Forwarded-For $realip_remote_addr

Vă rog să-mi spuneți dacă am fost de ajutor!

drapel cn
Asta e lucrul ciudat. Cu ```set_real_ip_from 49.12.23.194; real_ip_recursive on; ``` și ``` locație / { proxy_pass http://container-php; proxy_set_header X-Forwarded-For $realip_remote_addr; proxy_set_header X-Forwarded-Debug „Remotep $realip_remote_addr”; ``` Încă mai primesc ``` ["X-Forwarded-For"] => șir (26) ",49.12.23.194,49.12.23.194"``
Puncte:1
drapel my

Aceasta este declarația care suprascrie antetul X-Forwarded-For:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Presupunând că doriți să păstrați IP-ul clientului original în acel antet, ar trebui să scrieți:

proxy_set_header X-Forwarded-For $remote_addr;

drapel cn
Asta am avut inițial, dar $remote_addr în acel moment este IP-ul echilibratorului de încărcare.
Puncte:0
drapel cn

Din descrierea ta, problema ta nu este direct legată de nginx, ci de apache.

În funcție de configurația dvs., fluxul de trafic ar putea arăta așa:

exterior -> nginx -> apache -> php (rulează ca fpm)

sau

exterior -> nginx -> apache + modul php

Ar trebui să vă uitați în configurația apache pentru a vă asigura că apache nu renunță la x-redirecţionat-pentru și x-real-ip anteturi la transmiterea cererii către PHP.

Dacă fluxul dvs. de trafic este în conformitate cu primul exemplu, aveți apache care trimite cererea și către php, ceea ce ar putea duce la mult mai multe probleme dacă nginx și apache nu sunt „sincronizate”.

Dacă ați gestiona proxy-ul php numai cu nginx, ar trebui doar să adăugați următoarele la php-ul dvs. Locație config:

locație ~ \.php$ {
        #...alte reguli
        fastcgi_param REMOTE_ADDR $http_x_real_ip;
        #...alte reguli
}

În acest fel, PHP-urile REMOTE_ADDR ar fi setat corect.


În ceea ce privește configurația dvs. nginx, dacă dvs. nginx {{LB IP}} este static, îl puteți seta direct în config.

/etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{LB IP}};
real_ip_recursive on;

Nu ai nevoie real_ip_header X-Real-IP; în fișierul dvs. de configurare. Asta va trece peste set_real_ip_from directivă.

Rețineți că trebuie să aveți modulul real_ip activat în nginx pentru ca acest lucru să funcționeze.

drapel cn
Da, prima opțiune este cum funcționează. Un flux puțin mai precis ar fi ```outside -> load-balancer -> nginx -> [DOCKER; apache -> php-fpm]```
drapel cn
Nu m-am gândit la Apache să distrugă anteturile înainte de a ajunge la PHP. Este un lucru bun de verificat, o să arunc o privire la asta.
Puncte:0
drapel cn

Am rezolvat în cele din urmă acest lucru într-un mod care funcționează, dar de fapt nu rezolvă problema rădăcină. Din câte îmi pot da seama, LB-ul din amonte setează „X-Forwarded-For” la adresa de la distanță, iar încercarea magică a lui nginx a setat corect pentru proxy-ul invers a greșit întotdeauna și o setează la adresa LB sau un gol. şir.

În schimb, am trecut de la protocolul HTTP la PROXY pentru bitul LB->Server, setați următoarele în /etc/nginx/proxy_params:

proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;

si asta in conf.d:

 /etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{ LB_IP }};
real_ip_header proxy_protocol;

adaptat după aceasta:

https://www.x33u.org/docs/kubernetes-stuff/hetzner-loadbalancer-setup/

iar acum totul merge.

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.