找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5G广告专用虚拟卡/U充值/高返点皇家代理IP⚡️#1性价比⚡️
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
Google FB TK游戏代投⚡️E.PN 虚拟卡⚡️BINOM TRACKER 60% OFF!比Adplexity还好用的Spy工具
ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理虚拟信用卡+独立站收款全球虚拟卡, 支持U充值
Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)FB 三不限源头 - 自助下户充值转款
各种主页、账单户、BM户(优势)IPCola原生住宅IP⚡️$1.8/条双ISPTK加白户/二解户/FB海外户/GG老户海外CL企业户源头
最大欧洲Nutra网盟BA找量 FB高权重耐操个号⚡️稳定过审GG,FB,TK, 欧美源头, 欢迎合作❤️FB企业户海外户,授信户,TK加白户
联盟收款/海外资金下发/服贸结汇✔Taboola海外户9千万住宅IP-低至$0.3/gb✅静态$4/ip广告位出租
虚拟卡返佣1%,国内持牌机构   
查看: 6521|回复: 0

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

[复制链接]

123

主题

215

广告币

307

积分

初级会员

888888888888888

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

0 E7 X' S: [/ r6 d( O
proxy_set_header remote-user-ip $remote_addr;
2 m/ \9 h  f  C0 o% H9 d% a
* o( x, t" C# E) i; ~* ?& X  P
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
; E! K' X! w0 I; v怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
7 M5 N& N: |: |
2
/ C7 p- t! |, S1 [
3

: Y3 L1 N, p1 A8 v
4

. h9 V" P2 K/ U, m: j
<?php7 \9 Y+ N# M8 Q* y: I
    $ip = getenv("HTTP_REMOTE_USER_IP");8 S8 L" p! l3 ]4 i+ X  N+ y
    echo $ip;   
3 _; Y1 b  k! G' L3 Y?>
& L2 w. q+ o% s# a: i) V+ S) \
1 U5 H8 O. a, e+ I; K2 ]

  U2 E! m6 M1 k5 _2 X& M( R6 \( c, O
访问getRemoteUserIP.php,结果如下:' p6 [+ I% X( y$ n& T
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
$ X5 N( }' l3 |6 p+ ^

; @. X7 h" a4 D! C
二.通过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

# `7 j3 R# g  z7 Q4 q& X7 l
2

% E4 o3 [4 y0 |6 P9 l, j; [" e0 H( _
3
  }6 Y  D* G( E9 Q
4
% x: y" D6 h) T' L/ _, u
5

3 E% q) r% n. t& s; ]) ?
getFor.php
/ _4 ~& Q. N' Q' q& X( V/ V# J<?php& M; p7 X; P: w
    $ip = getenv("HTTP_X_FORWARDED_FOR");
* e4 ]1 f" }, j- H+ _  ]2 O    echo $ip;
6 C+ r, u1 `2 f& f3 L0 R2 ]7 a?>
# C0 P/ v- z1 f3 n2 g$ m2 }- J
  O# o0 L' z& T) k' y
" @, E9 ~% G7 W6 S" m
访问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.

( f, [) m1 l  q8 `5 ~, j
$ z" Z- s# k2 O+ o* @( {% k8 A
三.使用nginx自带模块realip获取用户IP地址/ w% B4 T- Q6 S( D
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
  G: i0 k: g9 k' d+ c/ G6 g7 b. C

) q( S+ b9 x. k7 h% T3 F8 _
真实服务器nginx配置
1
- ^& X0 s. l  I4 d2 V
2

& I. F. q' n; ?% `
3

) Y- s( h6 d& r3 l  c4 G
4

; N1 w" T3 y" i
5
$ c4 ]  G& P  `; B
6
2 q4 k, v" q% V" F4 B
7
2 h: ?/ O& V% o" s7 ^. Q; @
8
: r' b/ s" \# c
9
5 j4 w+ r" S* L6 Q- w
10
2 G+ O9 A8 ^. v0 f! N/ R$ X+ J
11
5 {7 e/ Z) c. \$ ?: u
12

# z/ G/ V3 w; Z. G, v
13

. b2 V5 l! U' {/ S2 T
14
( o- Z8 n7 ~( ~6 O' D9 H( J# p
15
, D2 u7 G. M4 `: N9 {1 X; c
16
! y0 D% ]) q8 W
17
! S2 m. Q9 U9 x7 `; N
18

" Q6 Y# ]" S# f# `; |) W: q
19

2 p$ w' `0 Q' C5 v4 N! F* F
20

8 R% x" e7 P* A# a& \5 c
21

5 e4 R) o; [5 g- x& `0 Z/ A
22

4 ?# ?5 Y4 v1 k* b6 q9 f* Z- y' S
23
$ @0 O0 w6 u: z
24
% i  c' `0 e. Z- H) |
25
' ^1 p- k3 _( N3 U
26
+ C6 r0 |3 Q) J9 v4 T' V
27
7 X9 H/ k4 H$ P/ ]' |
28
1 c8 d0 _0 g( p
29

' J; A: R. W3 c
30

8 s* ?9 z( n* m
31

; R; t" v3 U; I
server {
! _8 {$ z- O4 s0 b        listen       80;
- M* [1 f, M. r8 X- b        server_name  www.ttlsa.com;
4 X& _% ^' H5 ?4 I7 U2 |        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
6 M& J1 R2 n$ _( g. z- @  5 a" L8 V4 A+ o" p1 \, J% \
        index index.php index.html index.html;! W1 j3 Q6 X8 t7 A) B+ K. A
        root /data/site/www.ttlsa.com;
) E( A1 @) n3 R: T" I  ' i# S; \" ~8 w4 @6 D7 }
        location /
" v( Q/ |, |. w5 B( u        {
3 t( m2 i3 I/ g1 Y* O9 K' n         root /data/site/www.ttlsa.com;
0 a4 y) ?$ }6 a0 m8 j- y        }/ E& |/ u! X* x
        location = /getRealip.php
) {6 B/ Z/ l) A' g) @4 E        {
5 U, |' s$ |+ e; s4 `8 @                set_real_ip_from  192.168.50.0/24;, n& n2 B) X( W) b( S
                set_real_ip_from  61.22.22.22;
/ G/ o7 d/ d, B( h' C( Q                set_real_ip_from  121.207.33.33;+ A2 _0 B: k' q  N3 X: t3 E9 c
                set_real_ip_from 127.0.0.1;6 E5 A+ F+ |$ O; d# `" j' p6 }# k4 U
                real_ip_header    X-Forwarded-For;: V) Q. k( @' K% M
                real_ip_recursive on;  l6 ^& \' k9 `2 e9 X+ _, r6 ]" f
                             fastcgi_pass  unix:/var/run/phpfpm.sock;) p& n, T+ S# [% ^- ]$ y4 T' S! o
                fastcgi_index index.php;
! T. I) V+ t. n6 C9 J) O                include fastcgi.conf;
# r4 l- U) S6 f. ?9 F) ~( L- j        }
4 T# l+ n3 \- f: D" n# z  t0 Z    }# O$ C. v( ]" ~$ c4 W
# V+ Q+ w1 H4 I$ F3 c+ M- h/ k
getRealip.php内容
7 I9 o6 y& w) e' J7 R! B   <?php  , f' t8 b4 h; \& h! t3 Z
         $ip =  $_SERVER['REMOTE_ADDR'];" X& A& o1 @* G3 [0 }+ d2 J
        echo $ip;    ( x' Z, Z( ?$ ~! u, ~
    ?>' h& a8 Y+ {2 S& \2 N& I! V' {

7 Z( e, E) _9 x, [& h' j  v' [! o  Z5 N
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
( h# g& E2 \8 J2 C/ \* E访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行- ?% L' P+ G; j4 P6 M* y
real_ip_header:从哪个header头检索出要的IP地址1 E% k0 |, F0 q: ]+ I
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:7 \$ h5 e: W8 ?0 M+ I0 w
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
7 N7 g2 c8 ]9 |" E- s4 |4 I在real_ip_recursive on的情况下6 {, K- ?2 m/ k' b
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 v9 N- E; r* |) j+ }3 V192.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;
, h( I8 z9 R+ \4 n" e
访问结果如下: 121.207.33.33
* `% D3 m3 V% Y9 U$ x- h
6 b9 K8 _) M; L- E1 O
四.三种在CDN环境下获取用户IP方法总结1 V+ H" a) h7 {4 D* K5 w; P4 ~
4.1 CDN自定义header头
  D7 y3 Q# t" ]/ Y" V2 Q8 v" }优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP7 {' R. K" e- m+ k0 J/ Z; J
缺点:需要CDN厂商提供

) D0 z9 o8 n' s6 i
4.2 获取forwarded-for头$ g7 h* A6 D1 J0 g& H9 ^6 F
优点:可以获取到用户的IP地址
$ g9 K+ N, ]4 `; Y缺点:程序需要改动,以及用户IP有可能是伪装的

% h8 s0 W0 W- B( R/ `
4.3 使用realip获取
3 h. P: L; ^  _- m5 i! A& L1 A优点:程序不需要改动,直接使用remote_addr即可获取IP地址4 C5 A1 r3 [3 h% r1 A3 l  ]6 Z+ F& t
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
; u6 ^7 {$ e) E" N  `' Z/ D0 l8 k
相关帖子
vpsjq.com   
surveypayoutwatch.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-4 08:30 , Processed in 0.072324 second(s), 22 queries , Gzip On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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