找回密码
 立即注册

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/条双ISPFB资源,账单户,分享户,国内一手TK加白户/二解户/FB海外户/GG老户海外CL企业户源头
最大欧洲Nutra网盟BA找量 FB高权重耐操个号⚡️稳定过审GG,FB,TK, 欧美源头, 欢迎合作❤️FB企业户海外户,授信户,TK加白户
联盟收款/海外资金下发/服贸结汇⚡️Spend.net — 美元卡仅需$0⚡️✔Taboola海外户9千万住宅IP-低至$0.3/gb✅静态$4/ip
广告位出租虚拟卡返佣1%,国内持牌机构  
查看: 6500|回复: 0

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

[复制链接]

123

主题

213

广告币

305

积分

初级会员

888888888888888

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

( n$ U& t+ D8 |8 J
proxy_set_header remote-user-ip $remote_addr;& C. |7 p8 A6 g

+ i- y0 k$ f2 n: V8 ?* F
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
+ p6 g2 j; T( O5 q' ]# _! o怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
6 Q& Z2 t$ x' Q0 b
2

' b) H  q- }6 [$ Y/ E2 K
3

* \) q% |9 B( {: `- X9 \2 f
4
9 o; F. ?+ r. e
<?php  Q$ J- {- t9 I
    $ip = getenv("HTTP_REMOTE_USER_IP");
  }# ^: N- _2 D4 Z( g% [    echo $ip;   
7 g! R1 O  M" A' a?>( h* ]; Z- L4 {: ~5 M
6 {0 a- D# y) ^& T4 G# P6 [  E
) B5 a9 S! y9 R8 F, U- a+ s- y
访问getRemoteUserIP.php,结果如下:/ y: A& f" S9 G# n9 \$ Y! e$ k3 \2 w- w
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

4 |8 r4 q3 o3 t  X, r+ c
1 Y- ]0 }( ^( S( a. T# 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

' M/ i. L0 l! z
2
& m$ C! R6 J  i# @+ r0 Q
3

. X2 `2 @& k" s! W, f: p' Q
4

. R% i7 X# p2 s5 `% q, t
5

5 v& w$ k9 m! `& ]; c
getFor.php
/ D5 W% |7 a' l/ N9 L/ x<?php
6 k1 o- W2 Y$ K4 ?- K9 l" A    $ip = getenv("HTTP_X_FORWARDED_FOR");
  {, t5 Y: b0 e8 e8 Y8 D- Q    echo $ip;
, O7 A! [# ~6 w7 H?>
# h8 U/ M5 S. V: s, d, U# A; p  V: q" w% A! a
% Y4 m8 k5 p7 z. M0 J5 R
访问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, _! c, s* X9 d6 Q* w
$ Z& h% @- ^& E2 x
三.使用nginx自带模块realip获取用户IP地址7 ?  d* b, W0 b, h% L) J
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
" c1 Y% M0 h3 {5 s# ?7 h$ J
1 M1 C5 k5 g, o6 j' [- _
真实服务器nginx配置
1
# v1 h4 G4 Z- o9 `
2
) ]- b! l" Q2 A( n7 x
3
( I$ v2 n3 p9 n7 b6 }6 K
4

, u. T8 k$ h9 k$ |" U5 W
5

# G/ ^# `& X' P; e" `- I/ G8 x$ ?
6
/ a! w! e& t; X, |) G$ ]- H& F
7

& S  i* W' g- m8 f4 m9 d. U
8

3 o/ U4 w- h- F) Q1 b; B! V3 q4 \
9
$ ]9 z) O* d! k6 Z
10

8 F/ R, @% Q: ]$ ?
11
. _1 U' M- r) Y* p  x% @5 B. e
12
7 W$ |9 y, k& W4 t- ]
13
  q' f) D+ [% b3 }8 L( D
14
9 X! \* o; h9 @' C& D1 `* X2 M
15
0 Z" Q2 i& ?9 m7 E
16

$ e; r- E& u- S
17

! a( T2 Q, q1 e8 W( Y& o& g: V
18
" O4 }  a8 {6 _0 H' I( C# ~
19
+ B: x9 N. f/ ^; |) z7 a
20

% r- h6 _; _" H  F# T# ], D
21
- [  r4 _( [& Y0 f. B6 V) T3 a7 \
22

4 v, u* }1 C. M4 ^+ b
23

2 I/ B5 `% \6 J& {  A9 T0 r& F
24
$ J+ @% o( {+ y# `
25

, V" `& h7 |3 S2 Q
26
6 K# u, {# ?2 s. E9 t0 a' g9 p
27

' `1 A, v, ]$ Q* D+ Q: e" I
28

7 M$ p! X0 j% a4 _
29
" ?# f) w$ p# d/ K+ T$ m* u
30
, C9 e1 Y+ C9 S. {
31
4 [) i$ z/ A) I2 q6 v5 p$ M; M
server {5 g) r; E! s! n: s' x
        listen       80;9 t6 S  E0 v% a2 H; T* _3 X
        server_name  www.ttlsa.com;
6 s% W, W! c4 `7 J+ y5 h6 v% H0 T        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;5 P# @$ ~! e8 x- ~
  
& f; v. n$ u9 G        index index.php index.html index.html;+ b* \+ j6 B. Q) A
        root /data/site/www.ttlsa.com;
2 s) Z. x) ?& ~4 M5 g  3 _3 [% y  N: m
        location /0 ]1 T* D7 ]- a& J( P6 l
        {0 H: i4 d' S' ]* t2 l# n" t
         root /data/site/www.ttlsa.com;& J, H% G( C# h( ^2 W! [7 W
        }
5 L" m) g3 Y3 _! E5 t9 J        location = /getRealip.php3 W6 c* |6 N$ V2 r' b4 W0 \2 _6 d
        {
2 M3 i# A3 \, q  N' B                set_real_ip_from  192.168.50.0/24;
# Z. [3 i" v8 J                set_real_ip_from  61.22.22.22;
# H4 D: n; J% ~) T" p                set_real_ip_from  121.207.33.33;8 D' `! n7 ~- @8 N8 m/ T* |
                set_real_ip_from 127.0.0.1;2 ^# ?8 R7 ~+ w9 _! E
                real_ip_header    X-Forwarded-For;: Z0 Y) y# `6 O  W
                real_ip_recursive on;' A2 T" p4 g$ ~; F1 Z' e9 W& P
                             fastcgi_pass  unix:/var/run/phpfpm.sock;
% M# ]% }0 Q* |1 m                fastcgi_index index.php;" j; }8 w) B/ V" ]* _" V2 h0 C
                include fastcgi.conf;* F: C, X; Z) M
        }
' r6 i6 n+ |& w7 f3 Y+ p& b, d    }" t$ x8 F% U' R& j4 i
/ S: a, ?7 l9 F! j* g
getRealip.php内容9 s: m/ j0 d3 J* W* O5 K
   <?php  
1 |4 h$ ^: K) `         $ip =  $_SERVER['REMOTE_ADDR'];5 `. [) A/ x( S
        echo $ip;    6 W2 p* s( Z+ O: z7 g+ G% ?; l) }1 f
    ?>
2 }* ]! M& `% Q1 V! ^+ q6 B/ {; t- a7 t6 P8 S) m" F
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off" l$ q6 j" g- W1 c/ `& i
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行. b. V/ K+ _1 |4 e. q
real_ip_header:从哪个header头检索出要的IP地址- k# v9 q' D9 W( y& _
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
3 W) m- `% j2 G1 Z* \120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
8 g2 ^, y& U1 p% q1 {% J2 f7 |! B9 Q" {在real_ip_recursive on的情况下: h! Q4 R% [+ [- V6 O0 E
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或者不设置的情况下
  i; |* s, a' _# P192.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;

( M" d- N1 T: Q- s
访问结果如下: 121.207.33.33
/ @8 F. L2 K/ ^( M- ?
. b; H( a3 l% F
四.三种在CDN环境下获取用户IP方法总结% n; v  z3 m' f! A  k
4.1 CDN自定义header头
) |8 l7 H) |. D5 h优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
+ d9 I+ K- o! \& _缺点:需要CDN厂商提供

+ w, _$ o5 S4 y- P/ A% u
4.2 获取forwarded-for头
- V$ N3 Q- F- }; i2 L优点:可以获取到用户的IP地址
5 U2 n7 G' ]) s# g1 Z2 M5 R5 r3 Z缺点:程序需要改动,以及用户IP有可能是伪装的

5 f/ t# H" J+ W7 @& T2 s% J% O  q8 I2 |
4.3 使用realip获取
, f7 i8 d, D- c优点:程序不需要改动,直接使用remote_addr即可获取IP地址
+ ]9 z) A# I6 m, Q- i: l缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
* J$ C9 b. V, R# F
相关帖子
vpsjq.com   
surveypayoutwatch.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-28 03:18 , Processed in 0.061506 second(s), 22 queries , Gzip On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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