AdvertCN - 广告中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5G广告专用虚拟卡/U充值/高返点皇家代理IP⚡️#1性价比⚡️
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
⚡️AdsPower:安全不封号,高效自动化⚡️E.PN 虚拟卡⚡️FB BM不限额,短id账单户BINOM TRACKER 60% OFF!
比Adplexity还好用的Spy工具ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理虚拟信用卡+独立站收款
全球虚拟卡, 支持U充值Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)
FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)⚡️TikTok企业户,bm户,账单户提供TK企业新户老户、谷歌新户老户
FB虚拟卡⚡️消费越多返现越多最大欧洲Nutra网盟BA找量优质住宅/移动代理/高匿名/高性能TK白名单老户|兼职广告可投
⚡比特指纹浏览器+云手机, 4.5折起T3NZU:定义应用网盟新时代FB个人号源头服务商寻找顶级电商?AdsBranded等你!
TK老户/国内外端口/预审/加白广告位出租8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构
查看: 6182|回复: 0

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

[复制链接]

122

主题

199

广告币

291

积分

初级会员

888888888888888

Rank: 2

积分
291
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
HuiTong虚拟卡
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
* g, `4 u, S8 t
proxy_set_header remote-user-ip $remote_addr;: F8 [5 M0 d* k2 ~
+ w" \$ P" `6 a/ s6 D. Z, Y4 q
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,) P9 d6 \8 W+ m+ [  l. a. X* J' }
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

6 |5 H7 G& q! z0 L8 T4 w% E
2
) h# C0 O" f* A: [6 n% \# s- a
3
0 c6 h- G. a0 D+ s9 [" ^3 W3 w
4
0 X0 _' t; `8 t, ?
<?php. N0 \6 l4 ]* I: h; l/ Y0 _3 ~
    $ip = getenv("HTTP_REMOTE_USER_IP");
3 V5 e$ x1 r$ P& Q' P, X  E- I/ ^    echo $ip;   
% G4 F4 E* i: q- N0 @/ Y, ?0 b?>6 B  i: K- e8 l% r" l

5 F% I' {  n3 T* |

+ R+ D/ s! R; Q! t2 s
访问getRemoteUserIP.php,结果如下:- p. s+ |# l5 p; n) ~& ^7 }+ d
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

3 j6 t- I, @6 I3 n
* I6 c; u- h& C+ |0 c8 u/ [7 s
二.通过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
0 \) K% n# _1 ^# h3 d% {0 c
2
0 j3 ?  M5 l# {) p# _* z
3
  P0 t6 m, ~, v% `
4

3 B; |& R+ O% c7 K. _) V( v3 c" |! M
5

- v- [6 E4 |% I; i- w
getFor.php
: @4 e, |* V! P8 o# q<?php5 _7 v1 w. }8 @. Q% X! d
    $ip = getenv("HTTP_X_FORWARDED_FOR");
1 ]# @. A% y, q* ^: ^4 z7 @: B    echo $ip;" S3 h$ G2 x8 ?
?>
7 X. V% u+ O* X, C! C
* J% g$ E8 y4 j+ Z: K/ A5 x
* c3 n: n8 y1 h* F) }  Z2 W
访问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.

2 t  m- B: q1 Y! v7 A$ a
! V$ O2 s  v; T0 T3 A( \$ r
三.使用nginx自带模块realip获取用户IP地址0 k0 E9 |0 h+ V+ }  _. u, O% D
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
+ I2 p8 q/ [8 Q

) y1 b6 }$ [5 k$ \' e
真实服务器nginx配置
1

8 M/ T' b0 [, K5 n
2

; n/ k0 _+ C8 d9 A8 o& f2 a- \9 @
3

; Z8 x# |9 y9 V# R
4
) `. L7 g) s% I' L% x
5

/ A) R& ]8 I$ h- b
6

8 ?+ |1 |- t4 ]
7
4 j+ c4 J) \6 s! K" ?
8
# ?0 _" K. z! Q$ X, D% P
9

4 j% s. I3 J  J
10
3 @7 ?' [9 E  D. \
11

* o8 n2 j0 u3 c8 P
12
9 I8 f/ N$ f! U6 ]+ ~: `
13
8 u4 z% g( F3 O
14
* @4 y4 c" U0 |7 [7 R8 f- ~
15
9 |; ~  _  y0 A6 I" N3 N5 c  L+ B
16
) H! J# C" G8 Y7 _1 p
17

' K8 k0 S. W+ _7 f  q  W; }5 P& e, Q
18

( D0 r  J; v. y! s# q. x% w% W& i
19

5 x$ x; x( N# g: m, P+ ^
20

6 `4 X7 u, g- D4 ^
21
+ Q7 f1 l4 u  T1 D- \# H3 P, U
22
9 a  p) ]4 p7 A9 N2 }0 t
23
# d! a" z. N) M- s
24
. Y- ?# l% P$ I1 ^+ X' Y
25

8 x( k2 a; H( B6 D0 J
26

/ F6 u+ g$ e6 ^; P  E
27

$ C( t* q( e3 Q7 L( @; R. F! `) o
28

: o5 `- g" ^7 b' y' t0 @
29

; N: q. H- b" I; y* u( H& _( n6 f) N
30
/ I+ ]) ]. V, d. g" W
31
; ~+ E# F  r- A% L9 f1 x
server {
8 {6 S( G& x: J3 [        listen       80;
0 ]6 b- G9 N9 M2 ~( v& `: {        server_name  www.ttlsa.com;9 J2 u% a. {3 L2 D
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;* |7 \* @0 Z6 e1 h8 e! G0 N
  , F" \) `7 z. @9 ]
        index index.php index.html index.html;- _( U/ P, ?! s- a5 c; J2 w! B
        root /data/site/www.ttlsa.com;8 s+ S# t+ D2 W7 J* K& g9 m
  
5 X% H, A7 j' |+ m* ~        location /
( E* i: H  B4 S+ A+ j        {
0 P9 |" q( ^) A$ ~         root /data/site/www.ttlsa.com;! ?9 H  c1 O1 @& f  O
        }
6 I/ n+ o' [0 M$ ?+ J        location = /getRealip.php
2 |/ U1 Z: R, d! u1 A        {! {& Y( E) e% Q7 [  C# H
                set_real_ip_from  192.168.50.0/24;- `7 {+ b* g6 _; E8 }3 }
                set_real_ip_from  61.22.22.22;
1 t1 d% G3 q5 e/ A$ ]                set_real_ip_from  121.207.33.33;7 r, Q# X# F, I) T6 z
                set_real_ip_from 127.0.0.1;
' N7 t5 A8 f3 T0 T0 d) g( q. V# Y! a                real_ip_header    X-Forwarded-For;
) q' q* l) Z' f% _; w6 Y* r                real_ip_recursive on;
7 y6 t' ?$ L* x4 h3 e/ Q- U$ ]                             fastcgi_pass  unix:/var/run/phpfpm.sock;  k2 E4 U+ O  }# J
                fastcgi_index index.php;
; s6 n# t3 }, I6 h! C* j                include fastcgi.conf;! ~/ i) p, F4 {0 {, w. x
        }# M+ p  ^. e" B3 c' d
    }; g+ R. s( b' J  J

+ @+ I- L7 o& p6 M- s+ e2 |) Q/ ?getRealip.php内容& x6 ^4 J( N6 W1 Z" e" j( x- [
   <?php  
4 |, Q, @7 N; W8 X" F" R         $ip =  $_SERVER['REMOTE_ADDR'];8 w5 W$ F7 ^+ W( ]" b
        echo $ip;    ) d* W- o7 [' J; J) g" m+ E
    ?>7 @: ^1 n$ _9 m% ~

( c" {) @% k6 o1 e
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off; A6 ?$ R! \8 G  x' a9 c5 H" }6 M
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行5 e! }% c, t* p2 f- u: E2 |
real_ip_header:从哪个header头检索出要的IP地址  q$ S% s* C2 H* s
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:# h1 B) Z8 e; ~" X. U3 l0 d
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
7 y" Z' \2 W, \; c7 I6 Y* g% A5 }在real_ip_recursive on的情况下
3 W, L7 T( V, x7 V4 Z4 K+ D61.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或者不设置的情况下
! B. G& T/ C9 }% Q192.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;

4 d) \- o. k* r% S6 ]. _& i+ a4 o
访问结果如下: 121.207.33.33
# ~/ s. p; I- y
9 F# }  A9 @3 j& H: v
四.三种在CDN环境下获取用户IP方法总结" B# Z9 {) p$ B' p3 I, n4 I# }" c
4.1 CDN自定义header头% J2 u5 \! K8 w5 r( _3 T
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
  B* Y/ r# [3 m8 h6 X$ X缺点:需要CDN厂商提供
6 ~5 G6 m4 e0 D; \. I% t  V
4.2 获取forwarded-for头9 P. f6 G4 L% s
优点:可以获取到用户的IP地址; H2 t: a1 t7 @) X% ?: t
缺点:程序需要改动,以及用户IP有可能是伪装的

- M! u. g8 \. w
4.3 使用realip获取
" P1 |3 j$ w* C% E. e5 ^- O' ]优点:程序不需要改动,直接使用remote_addr即可获取IP地址$ w0 u  H! g- W/ @
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

7 d# ~8 [- |' w9 `
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 19:39 , Processed in 0.044055 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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