找回密码
 立即注册

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充值
各种主页、账单户、BM户(优势)IPCola原生住宅IP⚡️$1.8/条双ISPTK加白户/二解户/FB海外户/GG老户最大欧洲Nutra网盟BA找量
FB高权重耐操个号⚡️稳定过审FB企业户海外户,授信户,TK加白户联盟收款/海外资金下发/服贸结汇✔Taboola海外户源头
广告位出租虚拟卡返佣1%,国内持牌机构  
查看: 6562|回复: 0

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

[复制链接]

127

主题

227

广告币

321

积分

初级会员

888888888888888

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

  L; D! y2 u% M6 o$ j
proxy_set_header remote-user-ip $remote_addr;
' `7 ~' {. {2 v8 }: q, a3 U% X$ ]" f& J/ v* B' p7 i7 a/ a# Z
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
0 `; K8 l( [2 E- f: U5 f9 y) P7 Y怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
/ t1 R+ X! H3 g9 R) {3 i! ^
2

3 F* ]) c/ E6 i5 ?$ l0 j
3

* p4 ~3 l4 N, }. w4 w) x& I3 p) T! L* {
4

& S0 w7 P" T* `3 R7 w0 X3 A6 a
<?php! |/ N/ {0 V) @, P: U/ p! x
    $ip = getenv("HTTP_REMOTE_USER_IP");3 k( |4 B) r4 S/ ?0 B: N: q5 W
    echo $ip;    ! t' O; N+ J5 I
?>" C( C4 P: i  R9 i  f( S
' K( B; y: J# T& t* Y) U! ~# S

4 N( e- J0 i7 Z# V3 X5 j2 E- n
访问getRemoteUserIP.php,结果如下:
5 p5 k# ]1 [1 l; Y7 c0 t2 s  x7 o6 z
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

5 p8 z% B9 c* Z: {! d$ C5 V+ |9 N) p7 z( [5 w
二.通过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

4 \1 h5 \9 c% y! r' F. a6 ~3 h0 }
2

( M% ]9 Z  t& ^% F' T! i
3
& u( L$ C; y. `0 X4 e( U5 G# \+ Z0 i
4

* Z" p5 }$ _4 B" b; @, l+ @$ m
5
: b- O' @0 b6 k. I; l
getFor.php
- x' L0 u4 z5 b3 D( O- Z- U9 m<?php
' [9 Z  M6 ~- N. U: F    $ip = getenv("HTTP_X_FORWARDED_FOR");6 x: P" r0 e/ `! F6 e9 E
    echo $ip;0 @+ ]6 k4 ^% q6 }% w& i% Z
?>" I, N8 ^9 ]; |* }+ r
8 \1 D; F; a: r5 D, E' z0 J

0 c" g( m) a& I
访问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.

& O( P: K) r" j) d

4 h1 }" F% u. b+ B
三.使用nginx自带模块realip获取用户IP地址9 U7 a  T. Y/ A, F9 m* v1 t
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
6 {  k5 U  x0 H; U8 h# U9 A" P: m* I

' Y3 J% A, B' Z( V% A9 M
真实服务器nginx配置
1

) z1 f9 B8 O4 \- ]
2
+ p0 Z+ \, `6 |/ ^" g. G1 j* j3 D
3
* p! Z* t2 Y/ g5 |- j2 m( {
4
( a  u& i% ]# e; [$ Q' y
5

8 D; d8 ]. H+ A' \
6

5 I4 m! {: J; n" C
7

1 s- _2 H( P  u9 m
8
' Z' Y1 v# l; t: y; S( R
9

) L8 c0 |' C6 S; ]
10
( g; s$ S; n, e5 h/ U+ `% f
11
! s2 F) I, e1 }) b& t" J  d
12

& s0 k, O! T7 \: b" J4 v
13

3 t2 ]- y* L, u
14

: F) |3 [; q. ^$ u. E. W+ ^
15
1 y& V/ n5 k8 F9 _: W: G
16

8 y' y# M/ ?* ?5 l" y& e2 B
17

9 }) ]0 R1 B6 D9 D/ d' D, x
18

0 W+ S' D* f. B0 B  i
19

% e" B+ Y" g4 i" M9 }8 V. H4 u+ {
20
) O1 `# y; l3 K% A$ G  A
21
/ Z- U) W. Q7 e: J) D  y0 X
22

% A6 X" }7 E1 _( e; B
23

8 ~+ O: o' r4 e, y* w( P" B
24
" H& G' O  B/ S9 m7 f2 a
25
2 K* ^& h+ T' u, ]
26
4 m" v5 g( v, h# F8 f
27
' G6 T: X2 }' R8 K8 O7 T
28
4 }+ y5 I& A& L% E% f* `! z
29

/ w& h/ m% o' M3 q
30
2 c3 R7 ~4 m6 U8 I0 E
31

% B. A2 ]  M! ?( y/ s) e+ V7 n
server {. }3 T8 v7 _$ S  J* a
        listen       80;6 R( p0 B, r8 w9 S
        server_name  www.ttlsa.com;; S9 X0 e! P0 a2 Z4 U6 a
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;: K$ `: F% Y: R' B. R
  + H# I. H' n+ B: q) N; t
        index index.php index.html index.html;
( F2 c) x. ^; g* @        root /data/site/www.ttlsa.com;
) t5 V2 {& j4 b7 Y0 u2 c$ f# G! X* S  
9 n$ F: I1 _) E8 a% }9 U        location /# `% q. N5 T: I- w* q3 r9 x
        {- N' [* A( F( S% d, o- a. k" j: B
         root /data/site/www.ttlsa.com;
+ i! k' D, ?5 S5 j# l7 X        }
) u# H- F3 M7 h+ o        location = /getRealip.php
9 w6 d4 y  `- ^! Q7 U; T        {
9 v4 J) X$ v1 ^0 ~* w                set_real_ip_from  192.168.50.0/24;7 k4 k' j  q: n1 D6 a
                set_real_ip_from  61.22.22.22;
1 s. {, {) j( T5 t% Y, n; ^( Y' c2 Q                set_real_ip_from  121.207.33.33;
8 f5 E# ?1 X: l1 \: ~                set_real_ip_from 127.0.0.1;
% d% ~3 ^1 P- l2 N5 v6 j! ]" U/ r( ?                real_ip_header    X-Forwarded-For;  R- Y, B: w9 {/ [/ e0 u
                real_ip_recursive on;
( Y, G8 b8 {. f9 t4 V                             fastcgi_pass  unix:/var/run/phpfpm.sock;, z2 ^: H  ^9 E$ |0 V* @4 O
                fastcgi_index index.php;
" A% F4 X- E, Z6 p0 c$ V/ ^) \                include fastcgi.conf;) d) d7 ?% i4 w# m8 l5 R( L
        }( N& U5 M! s$ Z1 q, D  _  e/ b/ M8 {
    }
- e7 H6 l$ K; r( A
5 z9 |2 }: w6 K$ v: SgetRealip.php内容9 Y, s* i) I0 T' H0 c. @3 v# ]
   <?php  
; b" ?4 f/ j/ J9 l4 {         $ip =  $_SERVER['REMOTE_ADDR'];
+ Z$ ^9 ^, E- u/ z9 o! P+ O5 b        echo $ip;    1 t  W; F+ v7 h) K6 `
    ?>
- ^# @) b6 Y1 _8 e  z+ H1 F" v
; V! |, }6 N, c0 V, Y* C
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
' d) V3 H( k% R访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行4 o! M# C* `# x
real_ip_header:从哪个header头检索出要的IP地址- `5 \4 I) h3 x
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
5 A. V0 ?# f& E; k2 R# e120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
' @) m. o1 v& D* ?* Z& y在real_ip_recursive on的情况下+ y1 _7 u9 E0 e( C9 a/ Q1 u# Z  k( {
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或者不设置的情况下5 y- v& Q( {! ]) B+ y* L& h6 e
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;
8 C  W3 F! b5 w$ e6 s! Z, b/ J& w" L; t
访问结果如下: 121.207.33.33
8 _+ ^! {. }, e' T* H  H4 i
3 G' a. P7 g; d* E  ~
四.三种在CDN环境下获取用户IP方法总结
. x+ ^% T5 G7 Z. V! [1 Z
4.1 CDN自定义header头
( h. G# h" q5 ~8 d9 @优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
2 U4 c3 r% h% z( k) ^! t% p8 R9 N缺点:需要CDN厂商提供

: g' F, d& \0 I8 L; H3 v
4.2 获取forwarded-for头
8 u2 F5 `& Y. u# }9 P! m优点:可以获取到用户的IP地址
/ @. B5 U8 w1 W; I: Z* f, s缺点:程序需要改动,以及用户IP有可能是伪装的

  R1 G; s5 e; q
4.3 使用realip获取
+ x; J! i, b" R* k3 D4 \优点:程序不需要改动,直接使用remote_addr即可获取IP地址  d2 v8 k2 ^9 K5 v/ P& @% L
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
" {4 p! a8 T% J4 g9 `) Z7 r
相关帖子
vpsjq.com   
surveypayoutwatch.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-16 11:50 , Processed in 0.073252 second(s), 22 queries , Gzip On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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