set_real_ip_from și real_ip_header în Nginx

Reverse proxy și load balancing Toate versiunile Nginx (modulul ngx_http_realip_module; $realip_remote_addr: 1.9.7+)

Când Nginx stă în spatele unui load balancer sau CDN, înlocuiește IP-ul proxy-ului cu IP-ul real al vizitatorului, din antetul trimis de proxy.

Sintaxă
set_real_ip_from adresa | CIDR | unix:;
real_ip_header X-Forwarded-For | X-Real-IP | proxy_protocol | nume_antet;
real_ip_recursive on | off;

Ce face set_real_ip_from și real_ip_header

În spatele unui load balancer, al lui Cloudflare sau al altui proxy, $remote_addr conține IP-ul proxy-ului, nu al vizitatorului. Jurnalele, limit_req, allow/deny și aplicația văd atunci același IP pentru toată lumea.

Modulul realip citește IP-ul real dintr-un antet (X-Forwarded-For, X-Real-IP, CF-Connecting-IP) și îl pune în $remote_addr. Antetul este crezut doar dacă cererea vine de la o adresă din set_real_ip_from; altfel oricine ar putea pretinde alt IP.

Cu real_ip_recursive on, Nginx parcurge lista din X-Forwarded-For de la dreapta la stânga și sare peste toate adresele de încredere, ca să ajungă la primul IP care nu este un proxy cunoscut. IP-ul original al conexiunii rămâne disponibil în $realip_remote_addr.

Parametri

Parametru Descriere
Context http, server, location.
set_real_ip_from Adresă sau rețea (CIDR) de încredere; se poate repeta.
real_ip_header Implicit X-Real-IP. Antetul din care se citește IP-ul.
real_ip_recursive Implicit off. on = sare peste toate adresele de încredere din X-Forwarded-For.

Ce returnează

Nimic direct; $remote_addr și $binary_remote_addr primesc IP-ul real.

Exemple

Exemplul 1: Nginx în spatele unui load balancer din rețeaua internă

# în blocul http
set_real_ip_from 10.0.0.0/8;
real_ip_header   X-Forwarded-For;
real_ip_recursive on;

Exemplul 2: Site în spatele Cloudflare

Lista de adrese Cloudflare se schimbă rar, dar se schimbă: actualizeaz-o periodic dintr-un script.

# fișier generat din https://www.cloudflare.com/ips-v4 și ips-v6
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
# ... restul rețelelor Cloudflare
set_real_ip_from 2400:cb00::/32;

real_ip_header CF-Connecting-IP;

Exemplul 3: Jurnalul înainte și după

Prima linie este înainte de configurare (IP-ul load balancer-ului), a doua după systemctl reload nginx (IP-ul vizitatorului).

tail -n 2 /var/log/nginx/access.log

Ieșire în terminal

10.0.3.17 - - [25/Oct/2026:11:02:41 +0200] "GET / HTTP/1.1" 200 5123 "-" "Mozilla/5.0"
86.120.14.7 - - [25/Oct/2026:11:03:05 +0200] "GET / HTTP/1.1" 200 5123 "-" "Mozilla/5.0"

Greșeli frecvente

  • Pui set_real_ip_from 0.0.0.0/0; ca să meargă „oricum”: orice client își poate alege IP-ul trimițând un antet X-Forwarded-For fals și poate ocoli allow/deny sau limitele.
  • Configurezi realip, dar modulul lipsește din Nginx-ul compilat de tine (--with-http_realip_module): nginx -t dă unknown directive "set_real_ip_from".