找回密码
 立即注册

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海外户
广告位出租8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构 
查看: 6475|回复: 0

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

[复制链接]

122

主题

203

广告币

294

积分

初级会员

888888888888888

积分
294
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
) o1 t! e" w& j6 D0 ~0 {8 ~
proxy_set_header remote-user-ip $remote_addr;
0 ~0 A% P8 b3 G8 `! `  Z, O( k; [7 e8 x& D* I) @7 K' Q* n
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
, H2 \9 F, E8 b. G( a1 _3 T怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

1 w% g: j( r5 q( B
2

  A' l6 n& L8 |) b/ G' b  l. h! }
3

& F1 D; }: Z; L! s9 Y/ l4 G
4

) E$ B( b- v; A6 ?5 ]8 Z
<?php
5 ^! G! t; A% R" s+ N) S! E$ T    $ip = getenv("HTTP_REMOTE_USER_IP");8 q( T  y# P/ J" x0 O* V
    echo $ip;   
) d" f* I/ q, s+ A7 }?>
' y9 \0 P7 [# o- p3 ^9 V  x" Z5 z2 f' q

. t# i7 P/ }" o; Y9 w
访问getRemoteUserIP.php,结果如下:
+ z) @3 e9 g8 F. O' U+ @
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

  [) t( e  A. U- k# |. w# X5 b/ R* c5 F; g  a5 T: V; ?
二.通过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( }2 L; E% R5 t
2

8 v; V2 t: K' M! x' x, Z# s
3

+ [# @2 M& s* t- q) i1 R
4
9 B3 [6 @" O1 d' a3 e) D
5

: ^" U% K) I. X7 ^/ c
getFor.php% |6 T) @' |* h  I& v  e: p; p
<?php
9 p# s0 Z) ]/ {' N    $ip = getenv("HTTP_X_FORWARDED_FOR");
) a; @2 c2 [- \8 G* b+ f2 T    echo $ip;' N: @6 ^. W# z' N2 I
?>1 U0 p) p- d. ?) ~6 b2 z  ]

, ?* _* ], V2 O4 Q* x7 e
8 p: c( R( J0 N; Y
访问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.

: U$ I" Q1 P* r/ l
( S4 u" t. b" ~7 T: Y
三.使用nginx自带模块realip获取用户IP地址
) m! t: \: E; y1 X* s* S# {7 @" ?  q+ X
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
* h1 o# j' k" R& F$ z" R, O

9 c5 K$ B: T& k% P
真实服务器nginx配置
1

$ \( n5 c# }% D' [. ]
2

" i$ I4 y1 n: f; X; x4 c) {4 u
3
% s+ ]6 D* O. q* \: t& N
4
$ Z; r* r+ Y! `& r
5

) f/ L0 t; D% g  r0 U7 {
6
4 O, U% y+ H& s( T+ R
7

. t/ _" `$ l' v! B; h0 m
8
" v& ], G: N: D' ?6 g- b# S1 n- h
9
7 t) q* U! b) m1 v
10

6 x: _% x2 _5 u! d5 K1 h
11
+ |3 Y1 m6 e' L& p' I- V# l
12

3 B  a- K4 w' e
13
* R0 {, A) K) w; g5 M
14

/ x( w* d& u4 D2 H
15
" Z% X$ ~; m% G* m1 P1 A$ K9 t
16

) B% ?* t5 ~2 z/ G" X
17

2 w- d) {1 L* {. X1 D
18

, O% W# I6 O* A8 y2 p% M. ?
19

, O* x. A  ~3 O: }; Q3 J" E
20
  j/ E6 M5 v& h
21
& G" A. ?# k: L
22
# K' ?$ h9 t: N" D
23
# U0 q, ]' z1 u: f
24

' W4 Y7 H/ q, R8 M4 J1 T5 A
25
  t3 \9 [& W; E( Y
26
1 k1 Z8 ~. @6 v5 Z' A/ a5 T
27
  }6 y4 ]6 b/ ^" X* h' T8 S( @
28

0 z- _2 S, T% i9 Z! Y; H& @) C/ M: l
29

, O/ ^1 P" K; K, o; i9 C) k$ S
30
$ m& @2 j/ R0 T" ?
31
8 y& o3 X6 Y* m* ]3 s0 q
server {
* }1 n( [' O' u0 ^        listen       80;) G8 F3 d& j( D4 X) d2 s
        server_name  www.ttlsa.com;+ Q+ }0 c% S$ E9 v# O( U" P
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
2 D# g% }) W& m7 {2 ^  
5 C6 j! S  n% A( _( F$ D' h        index index.php index.html index.html;0 B4 D( y6 w/ \4 S, Z" ~0 \
        root /data/site/www.ttlsa.com;
4 Z$ Z2 a8 _$ U6 ~: k8 ^& N  , [8 i  e1 |1 l, N
        location /
% |5 s% w, T6 \3 k& ~8 g0 q' s        {9 _7 {5 f& E5 d% b
         root /data/site/www.ttlsa.com;# m4 j& {5 }% J+ Y& A
        }
+ N. P  _# m" N        location = /getRealip.php" x# t* {& ?+ h9 y, v% @5 }
        {1 r7 R5 |! ^, K$ H" z
                set_real_ip_from  192.168.50.0/24;' ~& Z: ~7 G) d
                set_real_ip_from  61.22.22.22;9 L  X$ b+ i1 l
                set_real_ip_from  121.207.33.33;0 Y1 t9 c0 @* @/ u6 C! f
                set_real_ip_from 127.0.0.1;0 [2 q( Q  t/ |$ ?" c+ E+ d- Z
                real_ip_header    X-Forwarded-For;3 y% e  C* B  k
                real_ip_recursive on;
) H* K/ A( @( N* p: Q$ _                             fastcgi_pass  unix:/var/run/phpfpm.sock;
" N4 P$ g7 m1 i$ J' @1 `* |                fastcgi_index index.php;/ B$ H4 g$ G2 m# m
                include fastcgi.conf;
, m1 n# n# f9 R( e, O  ]        }
" }- U" h% |( |) `    }. R+ n* k7 ]4 ^4 u/ e3 O7 E6 b+ M
2 v6 E; X1 x# |# N, r0 D% z
getRealip.php内容
9 _, k  Y, d! ~6 E/ S' _" P# w   <?php  
+ Z6 _4 g1 T! j7 ^" Y         $ip =  $_SERVER['REMOTE_ADDR'];" C1 T% X  O- d: ]/ R- j/ |
        echo $ip;   
+ o8 U) P# t/ Z, S6 [    ?>7 L# y9 c0 y$ C; I
  M5 Q' e( a& [
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off2 M& L- y/ G: f* q' f4 c1 F7 ^4 E
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
! a* j" t8 W/ W: \5 [/ Y/ r* j; s, Ereal_ip_header:从哪个header头检索出要的IP地址1 O5 @- Y8 \* t5 z
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
) I+ z4 }. ^9 B" c120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.1212 v2 b0 ?) c! b
在real_ip_recursive on的情况下
4 B2 b% z8 b+ E* I" K61.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或者不设置的情况下
" L: D8 W  a- q" W( v4 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;

9 R: ?* v9 a$ D* W9 A5 A
访问结果如下: 121.207.33.33

( D* ^% G# u& x6 |5 I0 p' R# l
. j) ^. Y& \+ J9 ]7 p
四.三种在CDN环境下获取用户IP方法总结
9 z/ q' J3 W. i& J
4.1 CDN自定义header头1 f, ^( Y0 W9 y! L) d
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
. H( s$ [( E" {0 ]1 ]/ a缺点:需要CDN厂商提供

8 K3 w1 B0 A& T- ^. H- H
4.2 获取forwarded-for头
- t! d! g# C' R* `优点:可以获取到用户的IP地址4 x+ D- V3 ~9 c% X; r/ M; a( w
缺点:程序需要改动,以及用户IP有可能是伪装的

# w4 z2 K# y( Q
4.3 使用realip获取, W, E, U) [( ~! K& d$ e4 i4 S" Q
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
: c, p% o& F  c$ c) X缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
0 z. e% {: \" V) }( M8 y2 ?: I5 Y
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-7 08:18 , Processed in 0.065667 second(s), 22 queries , Gzip On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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