找回密码
 立即注册

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%,国内持牌机构  
查看: 6557|回复: 0

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

[复制链接]

126

主题

226

广告币

319

积分

初级会员

888888888888888

积分
319
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
Binom_AdvertCN
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
8 w" R. m" \3 |: G" w
proxy_set_header remote-user-ip $remote_addr;
7 U2 b# N' S6 V: D; m
$ ~$ y) \4 v) j4 \
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
$ R: s4 ^9 Y0 t" o" F! a1 q4 Z1 N怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
; M7 B3 S/ O# c& r4 s5 A
2

# d, _; j. I/ u/ ]+ j* U; R
3

6 H& [/ O0 K$ d! e
4
% n; P& R8 ]  ^$ i; j
<?php
* m) E7 W7 Y% P, ]" E1 C, r9 @    $ip = getenv("HTTP_REMOTE_USER_IP");8 o  l6 K7 J4 l+ Z
    echo $ip;    ) B- E1 e% Q( n0 [+ T& ^. r
?>
, |# W) O- ?$ k2 U8 a# Z$ j; _0 R; i5 L1 U: m. g" c6 `

6 ]% [  }) z5 Y6 d, t) u
访问getRemoteUserIP.php,结果如下:" i5 b+ k- K! K
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

( F; K2 f$ ~! b; ]3 Q' ^
0 F/ C! B  X& ]4 f4 b3 _
二.通过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

: [8 x; F8 T( z6 V1 n3 I* i, i
2

- I; S( Q- t0 e9 M
3

$ U9 q& t1 t% t7 ~7 k  P
4
- w6 }: C6 U& A# w0 f! Y, m6 m! h
5

3 c0 z0 A# n, D
getFor.php/ _/ X5 _, ^7 L  j1 F
<?php
3 o- F/ g( ^1 h& D, T0 J, z    $ip = getenv("HTTP_X_FORWARDED_FOR");$ T5 j5 I, t! q
    echo $ip;
0 ]2 F1 H0 W& V5 G?>
- ?& N- @, V( e! F, J% o+ C7 H! J" l. y

! ^5 R8 e$ j" W" w* m; ]9 E3 B
访问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* E7 i  r* U. q, t4 b
& K4 ?' Y6 x7 S) V9 ^
三.使用nginx自带模块realip获取用户IP地址
2 f& N7 C8 L! ?; X" b" d
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module) M9 ~3 _! ~. i
: g) d- n0 F+ ~; g
真实服务器nginx配置
1

; D. M3 |. A0 W: T- S
2

( x  ?" N3 f. v: v
3
2 W5 X% e# ~" d. a
4
1 K; u0 J9 ^- [# M8 D: w
5
4 ^' v, f' M$ D: s1 Q
6
8 E5 S% ]9 G6 _
7

3 i+ o" i4 E. q& a$ _
8
$ x9 ~8 D' X/ `- U. u
9

. v4 j7 w' }4 p* w( R
10
" u* A" c5 C% e# Z  Z' o( y1 {, P
11
: _/ N& w' X9 K2 ^% _
12

+ L9 x- d6 t, h4 T# u
13

8 W! m5 |( c; R5 B/ u$ ~
14
7 x) ]1 J! ~8 [4 {$ d# Q
15
9 j/ }& Y! Q( V2 [  z6 K$ c
16

$ R  Q+ T+ J  Q- |
17

% Y" ~7 v4 _; ]6 W
18

! a- T" ^- F3 R$ ?, G% y& H+ w
19
& @: C* w& _. p( f2 B8 i
20
- F7 m1 @9 F& J6 f4 E7 H2 y
21

1 ^5 P5 l& ^* @
22

6 P' |3 p6 m  w4 f1 D) O7 q' t! h& g9 [+ S
23
/ n& T; A: S' v5 ?8 \: P0 v) y
24

2 U3 Y6 d/ j3 d- i" b9 N8 K4 Z
25

% C+ O: l! U" {. o7 ?  n1 N
26
. J  `6 h: Z3 U. a+ m0 M
27

  T$ S% {" M) N1 T
28

- I1 b! G$ n3 g/ l  E* C6 l
29

$ l, o' Z1 O; ^6 v9 D) M
30

% [; c% N: l  v; D9 n' [* o. w3 i- ?
31
2 l6 F* b, [! G8 }  ?" I% y
server {
) u4 C( w* @3 ^& S2 k7 x' C        listen       80;0 t6 U" V2 X* t0 o
        server_name  www.ttlsa.com;" E. L9 ?# c, t! z# X( A
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
' m4 R, e. `! [: N- p  * A$ B4 B' E0 f3 Z: B, j' c  Q& r0 P
        index index.php index.html index.html;: P: f" q* q3 Z( X5 c
        root /data/site/www.ttlsa.com;
, k# {0 J; A7 U8 L6 I5 N8 a  , j5 q1 C2 s. u& X0 |
        location /7 k/ S! ?' v! W3 \. i" c1 D# J  f
        {1 H  t$ p$ q, K; ?6 X4 Q
         root /data/site/www.ttlsa.com;
% [& M- y$ ~; m$ k        }
# o8 y: Q2 _: b1 _# `9 V4 B2 k        location = /getRealip.php( r4 q! s# |' j& @
        {
  ?7 V2 n( [: \6 C/ d0 ?0 ]                set_real_ip_from  192.168.50.0/24;
) C7 v! A) W8 n6 W) d, e( P) G; L  G                set_real_ip_from  61.22.22.22;5 r. P- p$ }; x0 }& [
                set_real_ip_from  121.207.33.33;
9 J7 x7 K8 M" j# _                set_real_ip_from 127.0.0.1;
( `; W& [1 I; E5 N                real_ip_header    X-Forwarded-For;- D5 R: o  @' k5 Z: {1 J
                real_ip_recursive on;8 Q6 W0 K. A6 _& k9 H0 V
                             fastcgi_pass  unix:/var/run/phpfpm.sock;
# s( E; }- ]# G/ d: W% R                fastcgi_index index.php;" C* T5 N& D6 U) u( ^9 y# `2 {  K
                include fastcgi.conf;
9 |9 v% r+ {* o( v' T1 c2 q) ]        }2 U8 c# E. Q1 C
    }
, p% r3 m" Y2 d' h( P3 d
. M  _2 s8 K) [# m% MgetRealip.php内容
/ O1 Y2 [, Q* w4 b1 q, z   <?php  
! k' h9 j& B8 S+ Z6 }6 D& ?- G: }         $ip =  $_SERVER['REMOTE_ADDR'];# }5 X: f/ _  o( Q# o
        echo $ip;   
+ \* I: E8 j4 b6 t9 A    ?>
7 z# i5 ~9 I! Q. `# d
8 o* T! J0 P, ]% q
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
8 S8 r8 O8 S& B, [- h4 J3 l- I访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行; n: T  y3 v& e5 ]* u
real_ip_header:从哪个header头检索出要的IP地址$ d: a" u: l! v  m" J/ ^, i6 \" N
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:. u0 z$ F+ [) s3 F% ^( i7 I4 ~
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121/ ~/ [7 i. \& H/ q6 z
在real_ip_recursive on的情况下3 f1 e- U( w( s4 l# ?
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或者不设置的情况下
4 t( v- H. t1 d7 B# f192.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;
* r, c; u3 \5 D1 v
访问结果如下: 121.207.33.33

. @* A! z) V3 L0 s1 i

3 |! Q$ ?% {  _( v  |" `$ z
四.三种在CDN环境下获取用户IP方法总结; z- N8 o. F6 O: ^. F/ z
4.1 CDN自定义header头1 }0 E5 y) |- U+ T7 w) j, Y
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
6 z* a7 g, u# @- [  y+ J& t" h缺点:需要CDN厂商提供

8 V" |5 W5 q9 p0 t: P# C
4.2 获取forwarded-for头
" @8 q5 G) O- J/ p# \/ l5 l# S( o% n优点:可以获取到用户的IP地址7 h* F5 G+ v1 B) l" O
缺点:程序需要改动,以及用户IP有可能是伪装的
' E* p& T; ~/ S- {0 f
4.3 使用realip获取
, {, O' a7 x0 c) W, |1 _优点:程序不需要改动,直接使用remote_addr即可获取IP地址
% v- U) l8 m+ \. y* P缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

4 V2 i1 t8 |$ T7 p7 W/ P- T
相关帖子
vpsjq.com   
surveypayoutwatch.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 06:03 , Processed in 0.060600 second(s), 22 queries , Gzip On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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