AdvertCN - 广告中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Binom
 谷歌+Bing+TT+MSN官方代理 
⚡️按条S5代理⚡️静态⚡️独享⚡️5G⚡️最干净<Wifi住宅+5G移动>IP代理泰国仓储,本土仓发货2-3元/单
指纹浏览器,就用AdsPower谷歌/FB/Bing/Yahoo代理商开户7200W全球动态不重复住宅IP代理BINOM TRACKER 60% OFF!
【广户】
⚡️我们很有钱这些广告位都是我买的FB/Google/TK点我开户⚡️
FB/TT/KW 加白开户ADPLEXITY + ADVERTCN比Adplexity还好用的Spy工具MediaGo+Taboola+Ob开户
百度国际MediaGo⚡️让产品狂奔全球百度国际,高点击转化,快速放量百度国际MediaGo,独家原生流量虚拟信用卡+独立站收款
行业首创新型指纹Cloak, 谷歌奇效!Kookeey⚡️100%独享⚡️原生住宅IP全球虚拟卡, 支持U充值免账户投放 FB 广告(送项目)
2024做什么 - Media buy 项目库免费黑五教程(持续更新、欢迎交流)Facebook 批量上广告Bridgeway - 联盟营销网络
各种主页、账单户、BM户(优势)⚡️个人户,bm户不限额,账单户Adsterra 的CPA/CPM/CPC 网站流量在线注册美国/英国/香港等海外公司
EU KETO/CBD - JumbleberryFB二三解1元/个9Proxy ⚡️ $0.04/IP, 无限带宽 cloak斗篷/ss/nutra/cpa/Dating
FB号商直销-24小时自动发货Facebook个号0.01一个FB个号1块一个FB账号0.1一个
FB顶级服务商「Facebook广告账号/批量采购」IPCola原生住宅IP⚡️$2.1/条双ISP广告位出租
全球低价纯净住宅/移动IP-免费试用广告代投, 东南亚物流, 虚拟信用卡VMLogin指纹浏览器+多账号防关联 
查看: 4762|回复: 0

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

[复制链接]

121

主题

184

广告币

274

积分

初级会员

888888888888888

Rank: 2

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

% l$ E7 v, t5 N* \  w# L& o* p8 \
proxy_set_header remote-user-ip $remote_addr;- F5 j/ D; R% \' a3 P
5 n, A1 m5 b$ h6 F+ p
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
! h9 r. _2 q+ |7 f5 E& }怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

4 Y# _. m- B4 s4 E0 g+ B# z
2
# x1 O+ x% k& r0 w+ F3 N1 }$ i7 r
3
2 L) _6 `) H% S9 S9 ~9 x+ D
4

2 A# ?: ]3 i. p# J( f
<?php/ a* P& S- H! M5 w7 L* b8 h
    $ip = getenv("HTTP_REMOTE_USER_IP");
( L, e9 a9 @, Y0 y, d  W. I+ D9 U& d    echo $ip;    9 M0 p5 K9 m" \  f1 g3 _0 D, Y& {2 d
?>
. q+ E5 @# g; q8 u8 S9 g& V+ w+ a+ o) F6 M4 n4 f4 U- _
) o+ f8 r" `+ m# ]
访问getRemoteUserIP.php,结果如下:9 K- A5 Y' \1 D  q# b" S0 S. z
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
- g! O% k2 B  l+ Y) e. Q
9 r2 p) ]& y. C# P% z  Q$ ?
二.通过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

6 {3 E4 R. M' }# i; V
2
% f3 M+ s& r8 S1 v9 X. y: C" X) q
3
$ C( H9 A# d/ G$ L( k7 g, o% Z
4

" M& |; H+ y: k3 o" k
5

) h% M6 o, _8 M! Y
getFor.php  D) [& ]- z, W& m/ L( p, ~- d
<?php5 X& p% P! X5 p; q1 l8 ~, r+ I
    $ip = getenv("HTTP_X_FORWARDED_FOR");
6 ]  C  U+ u+ a, i7 l5 A    echo $ip;
0 Q- q8 c5 l' W# r8 z, p: ^$ D?>
% ~) _' ]( }6 l2 _& x: _! c7 r6 x+ Y; f  z& r
( ^& A, `! ~, ?7 A: J* E& n3 X
访问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.

( E& }" `6 A8 G" K& [
3 r* l9 e* S  n* g$ ^) @7 A  I9 j4 E
三.使用nginx自带模块realip获取用户IP地址! C1 W% A+ o6 O6 |. o' `4 K
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
! O% r0 Y: k+ R5 }4 B' A& L& u

/ F: v3 L3 ?) H' E2 W. u7 q
真实服务器nginx配置
1
" f2 ?" Z  h, b" p" z
2

. A. u6 V2 ~& q( u4 U" Q( U
3
( ^) H( h) p3 f
4

6 C/ S8 l# d/ H. y0 O, a% X4 B; x( W8 A
5
- u: X1 I+ g9 O% X7 z
6

6 R: l2 `  T9 U8 R
7
$ T& l5 P9 I* B8 V" h
8
8 x6 k9 _) i7 d, f
9
/ _, H" M( G/ j# \& u6 f
10
3 ~6 w1 g' m' D8 b
11
) e9 z( a7 @. j
12

4 o8 S1 U0 z. S( |
13

1 X5 G9 H$ [+ G* v' X& `
14

+ G1 B5 K6 s" u3 h+ C  |0 s* w. O
15
1 y( j8 q  O2 Q1 W) r6 E
16
0 R) m' e' e+ h$ q, }% _8 S5 g0 i
17

9 v5 R/ B2 E% t8 I0 d
18

3 R; M* G5 I* H' Z, ?, O
19

7 m# [. P( s9 C4 Y1 V4 f7 T; K- p
20

! O2 Q0 V% Q1 F/ I
21

3 G0 w9 O% a2 T0 m- x! Z1 |. l
22

, v! T. w* f1 ~: t
23

) j, X* v5 r9 R
24
2 T) D$ J: P5 |5 m- @, _# K
25

) f3 ^1 t/ Q5 d& D! Z# ^; X
26
" g0 w' p6 m" ?7 p* J6 {
27
5 m# N8 E& V2 w# l
28
) P9 M' |* U& Z$ r  a# E
29

& |: V: u* f% M' Y% W: A
30

$ _8 P# I3 @6 m. S1 w3 J. ?
31
2 T; A% U. P/ C9 \
server {( [9 Z/ u" _. k, q) R
        listen       80;
  r& ^: g7 H; K- g) q5 T        server_name  www.ttlsa.com;2 \6 J, v* \1 r4 f% R+ t
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
9 j5 u: k" q4 Q' z* ~7 x  
9 T/ p+ m4 s% y) y. Y        index index.php index.html index.html;
* r% A& a; j' ~! C  O3 [        root /data/site/www.ttlsa.com;
3 _6 v$ r# U0 f' E' b1 n  
& M4 d  X% l: ?        location /1 L. B( X( t8 ]
        {& t2 r) H. p# i. J7 O' a& d- |
         root /data/site/www.ttlsa.com;/ k" X  T9 n4 o) X( A5 d
        }/ k. C1 x0 q0 f' O% S3 J# W4 i
        location = /getRealip.php  Q& t! @% d3 o( {
        {
7 x5 M8 b! Y5 Y6 j& F, m) g' ?                set_real_ip_from  192.168.50.0/24;
, [( `3 a- L. ^1 R6 f* z                set_real_ip_from  61.22.22.22;
" C$ _7 l( W' D6 h% j- j5 ~. ^7 l; F                set_real_ip_from  121.207.33.33;
( |) Q3 h! @, S- h" J                set_real_ip_from 127.0.0.1;
: q2 H- Y! X! e# ~                real_ip_header    X-Forwarded-For;
! H, n9 S8 U! A* R  z3 ]                real_ip_recursive on;
/ \* h/ `) E  r- R9 e4 n4 C                             fastcgi_pass  unix:/var/run/phpfpm.sock;( J3 e3 }9 H% t
                fastcgi_index index.php;
1 R; s8 t( F% S* o6 v2 Y+ l9 _                include fastcgi.conf;7 X- P: m) y" w/ k/ `; ^
        }
  x" u8 _; ?1 g7 L    }
2 ~; {9 x4 `4 e+ C
2 Z3 d3 K$ k. l$ u2 UgetRealip.php内容  r& G8 E; W. b( A
   <?php    m# z; m( I" l/ m( c3 A" O
         $ip =  $_SERVER['REMOTE_ADDR'];: N  k7 {. k+ @  r" h# Q0 n* P
        echo $ip;   
+ h8 l% @/ @! a; z; C    ?>
& i/ y& D# m, M6 h# ~7 _
) ^" _) ^* k' K  e& z. f
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off6 v* J0 ^: k) L1 d7 M$ }; [
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
$ O6 |$ T5 w# Q/ ]+ t$ kreal_ip_header:从哪个header头检索出要的IP地址9 @8 E9 I- ~3 X" {2 K8 F
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:0 c! @3 P( U5 H7 p7 U
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.1213 r  `% S0 A$ C6 r  a- G1 K
在real_ip_recursive on的情况下) h; _9 G: |8 h/ x! J3 N
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 z3 g7 k# d0 Z4 d7 w
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;
( J3 X% _* j0 B" m
访问结果如下: 121.207.33.33
; z0 Q$ h' g$ O; P  F* e

. D+ b( f) c# P/ k3 \& K
四.三种在CDN环境下获取用户IP方法总结
) p! b, O* _7 U6 {0 Y
4.1 CDN自定义header头6 D# a, h- k8 v$ l* e
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP8 q/ ~9 N7 I1 L$ Q. D0 t- e
缺点:需要CDN厂商提供

  O4 g; X3 H/ P8 u- L. S; s- f7 S
4.2 获取forwarded-for头8 Z( w, G* i' V" s. E" S4 e
优点:可以获取到用户的IP地址7 u3 B' z+ O  Y' V) s
缺点:程序需要改动,以及用户IP有可能是伪装的

7 `6 A- B: s" k1 g
4.3 使用realip获取' U) f6 ?; `5 e) E
优点:程序不需要改动,直接使用remote_addr即可获取IP地址' t9 J* L# ^; M2 S1 I& N
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
  u  L, i0 _  ?6 j1 k. Y8 b' Z* S
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

Binom

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

GMT+8, 2024-6-2 03:06 , Processed in 0.044353 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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