找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
⚡️按条S5代理⚡️静态⚡️独享⚡️5GMediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户
Affiliate 全媒体流量资源⚡️Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户
独立站⚡️开户投放Google FB TK游戏代投⚡️E.PN 虚拟卡⚡️BINOM TRACKER 60% OFF!
比Adplexity还好用的Spy工具ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理全球虚拟卡, 支持U充值
【15 年团队 - 广告自动化系统、定制开发】【ActionKey】Meta API 桥接令牌尤里改 - FB 稳定投放【神盾 AI】Meta 广告资产防护 永久免费
FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)IPCola原生住宅IP⚡️$1.8/条双ISPFB资源,账单户,分享户,国内一手
TK加白户/二解户/FB海外户/GG老户最大欧洲Nutra网盟BA找量 FB高权重耐操个号⚡️稳定过审FB企业户海外户,授信户,TK加白户
联盟收款/海外资金下发/服贸结汇✔Taboola海外户源头全球效果广告投放平台|Vertoz IngeniousPlexSX.ORG 住宅IP | 凭码ADVERT3免费领3GB
广告位出租   
查看: 6603|回复: 0

[其他] CDN下nginx如何获取用户真实IP地址

[复制链接]

128

主题

235

广告币

329

积分

初级会员

888888888888888

积分
329
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
Influxtec
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1

- T% ]1 U$ ^7 l% E, p0 A* F, C
proxy_set_header remote-user-ip $remote_addr;
$ c% `0 ~& w0 L7 x" J5 Y2 [) [' n% P
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,  a$ {  e: t! d! V+ M2 L+ m
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

4 e- y& O! D) O: o6 ^
2

, C- M# M. w0 C; I
3
8 ]+ g6 O( W: d) g- d% i# y* f
4
; m0 Z5 i+ k7 R/ n. V
<?php7 n! s  S, k) l: _* k. e) d
    $ip = getenv("HTTP_REMOTE_USER_IP");2 u- `: ?+ T5 B% S/ K& c
    echo $ip;    , S" \/ q0 D* W
?>/ u9 v* }. k# W6 A- A5 s4 w
' ^; ]8 n6 q: q$ A4 {7 ^8 N
( `" [* W3 W( d9 s' H
访问getRemoteUserIP.php,结果如下:
; k1 H, Y. Q. L6 Q
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

- W1 E) u6 r8 O+ _0 b0 a* k& w: W) n) b/ [
二.通过HTTP_X_FORWARDED_FOR获取IP地址
  一般情况下CDN服务器都会传送HTTP_X_FORWARDED_FOR头,这是一个ip串,后端的真实服务器获取HTTP_X_FORWARDED_FOR头,截取字符串第一个不为unkown的IP作为用户真实IP地址, 例如:
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121(用户IP,CDN前端IP,CDN中转,公司NGINX代理)
1
! n1 n% x& d* E! b  ?. @" @9 o0 m
2
& q/ C4 [9 U. V, _6 W$ Z
3

& s# \* _) ?; ?, `6 W. e% K
4

8 W, h4 k* O; l$ p
5
; L0 j) P$ g+ p5 ^  l  E
getFor.php
! p0 `, a- F' }) e8 k2 ]' y<?php
# O: R# [* C* x, t    $ip = getenv("HTTP_X_FORWARDED_FOR");
' n. R& g  u; h2 ?+ T! @" C    echo $ip;
' A& e! ~* P9 z3 [  }& m2 J- C?>0 G8 _; |0 P- B! L
! F, z! d: F2 p8 _" U0 ?

: i% w' d# h2 l4 J
访问getFor.php结果如下:120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
如果你是php程序员,你获取第一个不为unknow的ip地址,这边就是120.22.11.11.

1 S# G2 V! j2 Y7 s- U
5 M3 ~4 g9 X5 i8 M3 Z
三.使用nginx自带模块realip获取用户IP地址
/ Y( g, P) U3 x' `' ]+ @
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
7 W) X# i) C$ ^9 D1 r7 l

  B. E, O( o2 ^* s+ [2 K# p
真实服务器nginx配置
1

0 r5 Y" C3 A. i6 T
2

# c: ^7 i! @# K  s# B
3
( G1 w2 F4 U4 F6 t
4

" K5 w% [' N# U
5

' C, v+ u# y/ {) [1 \7 z5 M
6

, h' |' I( w7 H' ?
7
: e# i/ M0 h! I! `& T2 F
8
" S, \1 `* I/ @. t! V- F
9
8 l9 B0 O, C+ O% }+ q& r
10
8 {& V' p, E( Q/ n9 y" I1 A5 B
11

# N: k7 t1 T8 g9 q3 k. `$ d+ m
12
  L/ v  l& F* P8 g6 ?  d! Z
13
) M" z4 v6 [8 o0 g5 M- Q6 Q
14

% V2 E: X3 j/ [3 c/ _7 I7 `
15

" f- m$ S  _3 T
16
. Q1 O: L( p, N! Z* V9 Z
17
( R4 Q. N  u# m8 F' g* L$ O* z  M
18
0 m  p. F. \  K/ T
19

* d& c  J3 W  L8 y4 j/ o
20

2 B+ ?' D; K; x- S( [9 s; z
21

: N! Z: K! ?  O6 E
22
+ D. X1 \( ?/ h0 V0 h
23

( e$ M, n8 |6 i" o
24

! t* q7 ?! l( B) N6 @
25

. h9 X, ?+ l: |( i1 d2 Q
26

" T0 D4 @5 b- Q
27
( w5 ~1 W! y: a- Y) |* _& O
28
/ R+ ~& s  U3 K6 P/ ?, \; i. E# _$ i
29
& i& M3 ~$ A# C5 p. h; o
30
' }  D5 F6 }1 a; r6 X
31

  u" K3 `# t9 X6 R4 I2 q% t
server {" }. V/ P8 v: O$ k  ?& g+ ^
        listen       80;
; X. h+ D6 z* V) }        server_name  www.ttlsa.com;
4 j  I: |. ]) U" z' X        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;5 N- P4 Q7 {, k3 l% Y
  ) N5 g1 U  w/ O3 T# B
        index index.php index.html index.html;
5 e4 m1 V4 u9 v        root /data/site/www.ttlsa.com;
. D8 N/ f% v; I0 n+ U; Y7 q% s  ; q+ I5 T3 |6 q! k( E6 h
        location /2 T" E* N3 b  J( z  z$ V0 P
        {
: @% X) Q+ t+ k2 E" W8 O         root /data/site/www.ttlsa.com;' T5 y* {* P2 z: @) v
        }- O! `4 z, Y' s" r2 Y. ^5 u* B  t( A
        location = /getRealip.php
: C2 ]1 f2 i! u5 {; J' U        {3 q/ ^- [& z; @; @) D; z. b
                set_real_ip_from  192.168.50.0/24;
8 o5 x8 F( k8 \9 C                set_real_ip_from  61.22.22.22;
8 Y* X) q2 N8 a4 R2 `# K0 h                set_real_ip_from  121.207.33.33;
' X9 a0 a4 W( R9 W! }% I                set_real_ip_from 127.0.0.1;7 z% j! H; n4 x4 i) x, N
                real_ip_header    X-Forwarded-For;; v" x1 E- t* b/ p2 c6 P* x
                real_ip_recursive on;
. i& g4 k2 T7 f                             fastcgi_pass  unix:/var/run/phpfpm.sock;
% H0 f( ^+ m- m2 R+ m0 p                fastcgi_index index.php;
8 |! A$ z% u6 p7 m$ Y# ^+ M( e                include fastcgi.conf;
  g- S- f2 \+ {  I+ C  Z6 v        }6 E3 {1 ]) u/ U! w2 x. V8 B" s8 a
    }1 i* m( j5 [' y; h/ S

" t% b7 a% H% o4 ?! D1 ggetRealip.php内容
; t' [3 M9 A, Q. a& ^/ `5 X; I   <?php  
4 z4 b9 a) d# C7 C0 [7 W         $ip =  $_SERVER['REMOTE_ADDR'];7 C( _$ Y2 l* M3 Q
        echo $ip;    2 P* J1 Y1 d) Q4 D
    ?>; |* h& p; }9 x. C. a. Z* i. O

, m& ?* S) b4 C9 u* U6 R. R4 t
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
& ^1 g9 u" Z, d* M访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
' s8 y: M' Y+ @& lreal_ip_header:从哪个header头检索出要的IP地址  l, z& v% x4 b8 @0 G
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
: V+ D: w: B" N+ e+ i! f5 a9 w120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
# {$ \# N, f+ i: v: |: ]- V在real_ip_recursive on的情况下! f' I) i2 V/ l; O! C. C
61.22.22.22,121.207.33.33,192.168.50.121都出现在set_real_ip_from中,仅仅120.22.11.11没出现,那么他就被认为是用户的ip地址,并且赋值到remote_addr变量
在real_ip_recursive off或者不设置的情况下
0 c0 X. ^7 {+ ^- }. e$ O! ^192.168.50.121出现在set_real_ip_from中,排除掉,接下来的ip地址便认为是用户的ip地址
如果仅仅如下配置:
   set_real_ip_from   192.168.50.0/24;
   set_real_ip_from 127.0.0.1;
   real_ip_header    X-Forwarded-For;
   real_ip_recursive on;
7 R& G1 G/ Q$ I( e% A
访问结果如下: 121.207.33.33
( w& C2 T& m: Q; ]0 t" J- a
, v& T" _( b& H0 Z" J
四.三种在CDN环境下获取用户IP方法总结
2 ]8 R( |; g$ \9 F- V% V' F/ k7 G
4.1 CDN自定义header头& y, F. I3 C% \  X* ]! b
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
1 X1 h" F7 b7 c3 F0 S8 x4 f缺点:需要CDN厂商提供

* v: {& l1 q0 K) P8 ~
4.2 获取forwarded-for头
8 ]' g3 i% B3 b优点:可以获取到用户的IP地址
& E+ h& f" d0 }. B缺点:程序需要改动,以及用户IP有可能是伪装的
$ p. {3 q! G" v! n% C4 G+ B, `  x
4.3 使用realip获取* B1 E' K5 [& o1 e+ U3 O$ U5 V
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
; w9 X! v' `3 {6 e缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
, X% _' `7 W: E. R
相关帖子
vpsjq.com   
surveypayoutwatch.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们|联系我们|DMCA|广告服务|小黑屋|手机版|Archiver|Github|网站地图|AdvertCN

GMT+8, 2026-11-13 11:20 , Processed in 0.068649 second(s), 22 queries , Gzip On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

快速回复 返回顶部 返回列表