AdvertCN - 广告中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5G广告专用虚拟卡/U充值/高返点皇家代理IP⚡️#1性价比⚡️
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
⚡️AdsPower:安全不封号,高效自动化Google FB TK游戏代投⚡️E.PN 虚拟卡⚡️BINOM TRACKER 60% OFF!
比Adplexity还好用的Spy工具ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理虚拟信用卡+独立站收款
全球虚拟卡, 支持U充值Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)
FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)⚡️TikTok企业户,bm户,账单户IPCola原生住宅IP⚡️$1.8/条双ISP
FB海外户、GG老户、TK加白老户海外CL企业户源头PTM虚拟卡[全新卡BIN+高返点]FB虚拟卡⚡️消费越多返现越多
最大欧洲Nutra网盟BA找量 FB个号1块一个TikTok2审户/老户/国内外端口/加白SX.ORG 高质量代理⚡235+ 地区
GG,FB,TK, 欧美源头, 欢迎合作❤️跨境债务催收/风险代理FB企业户海外户,授信户,TK加白户Proxy4Free独家住宅IP池❤️免费测试
联盟收款/海外资金下发/服贸结汇域名防红⚠斗篷工具/可试用3天广告位出租8500万高质量住宅IP,助力各种需求
虚拟卡返佣1%,国内持牌机构   
查看: 6356|回复: 0

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

[复制链接]

122

主题

199

广告币

291

积分

初级会员

888888888888888

Rank: 2

积分
291
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
PTMLink
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
" ]/ U0 L& \. h/ G
proxy_set_header remote-user-ip $remote_addr;7 i3 k( e, [  ]& ?2 P- O: C

9 v; S0 q/ O4 d8 m# K% p, O
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,9 O6 ^: g, a3 D
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

2 C3 N3 C" z0 A& h, ~6 q: h8 j5 z. B% r
2
" g7 U! S$ O  B7 m, Y. M" S
3

) }0 `' c1 H: V  _( ^" I2 m
4

3 t$ M& |. X- F+ x8 w
<?php+ z3 M% q' y. w7 j( ~4 K. @
    $ip = getenv("HTTP_REMOTE_USER_IP");: o) _0 a7 ?8 v1 q
    echo $ip;   
* H7 x7 W* d$ A3 ^% z& |5 d: o5 H?>; |$ h! D( U- V$ q9 O

. L; _4 y0 C9 u9 i) X" m

: J( `& K/ ^, J; ?
访问getRemoteUserIP.php,结果如下:
: q0 L& z  q" k3 O8 \) W  K0 s, h, n
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
, o/ ^0 u. m( X* [

- ^! K# h: x' v4 @
二.通过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

+ x& W4 ]1 t) h) {. S# Y5 i( Z
2

* t) s, `, f  I& t
3

" z' h9 |+ D* B. A) C) r$ W
4

1 N% F7 ~8 B. b! |$ ~  T
5

3 U- U4 D8 B4 Q1 K7 S! M
getFor.php
) `; _- T7 B% @' X; I<?php
3 {  {( P- F4 r    $ip = getenv("HTTP_X_FORWARDED_FOR");2 j/ }/ F& g9 ~) M5 n
    echo $ip;
% [. m7 E! p9 e3 e* E?>
- Z+ N0 f8 Z8 ?6 `2 k! E( L# u7 m. |) D/ t; d2 t7 ~
" N1 {; A9 I- J8 D
访问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.

) j) z! h, A4 j- B+ U

* C' [# L4 p, S
三.使用nginx自带模块realip获取用户IP地址5 B4 T. g) b6 j; q* b' w+ s; t$ [
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module) P! e% B8 V1 I& o# v

$ z" N9 V0 s! K- b. I7 q
真实服务器nginx配置
1

4 L/ L; g$ v5 n! c# i- Z, P
2
  I0 x9 l! ^( |3 W5 f' D. R3 a
3

2 t% P& J% @6 O8 f5 o$ q
4
. [  V+ P2 w, _
5
5 c' ?1 s+ k, L& G0 r
6

7 s0 W$ N  C) A: M
7

0 |  ~5 H7 i' G' {6 C: V( j: U
8
3 t; f2 w/ s& i6 m" [5 G$ l) C
9

, U% m, n# v+ F7 f
10
1 `' @. a: N* o$ e4 h" B
11

2 u( J( U. ~/ G3 |5 r
12
, m& n9 t3 H# N; j4 T
13
; v; e% ~. q, p( v7 t. O$ A
14
; w! s5 n* T* ]4 y  U  J
15
; y" J0 f% n: g) N, c; U+ @- g. n
16
$ d! r3 x" g3 v" [# q5 p" |1 m
17
& c5 U  i& H% j: x* o, Q/ w3 r
18

- r( A& d- M4 j; C# Z' w5 k& g6 F
19
* N( N. Q  `/ L1 `$ m* n, g% G
20

. D1 C0 v/ F  [: ]! k: Q- h
21

3 @8 P7 L4 s8 L" g' L/ ~4 n! U
22

" s) P( Z  E; b. ]4 f
23
) a" g2 N) Q0 h: \" e0 ]
24

" v( c1 \, w2 E  y- H, T8 O
25

9 b5 y* K/ m  c% E
26
) _9 j: t' s7 r
27

% c  ?, x  z0 [3 o1 h# e  v( v
28
( s1 q: n. m* c. r' @# v# D1 R
29
: I- c( H$ E; H2 e( B
30

, w# F$ t5 h' n- ^# V" U0 r2 @, _. K; T
31

3 t  L9 @; j: z9 l/ z( Y9 r7 _
server {! n% y& y! J0 ]" h
        listen       80;$ f/ V) a; g0 \4 M1 z
        server_name  www.ttlsa.com;
1 ~1 g. c: d' H/ H; x9 F5 X$ Y# U. d        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;4 B% b0 U1 p$ `1 k5 `0 C
  7 y) A' d% E7 b. l
        index index.php index.html index.html;
/ W5 P" h: B& J        root /data/site/www.ttlsa.com;- T& I$ H& _7 V
  ) v3 c& P6 x2 c6 x) v: I
        location /
: {$ n1 v" `; U; f: s1 d" G/ B        {% p7 Y3 K  }- _1 `1 k( K) f
         root /data/site/www.ttlsa.com;
. n) A/ s5 x; Q! B9 @7 h% k3 {        }1 F# @, b; S5 r: q- V
        location = /getRealip.php
+ o7 b2 y  ~$ G        {
1 R7 G' I" C. u: w& i& T7 f! [                set_real_ip_from  192.168.50.0/24;
/ q9 R0 T7 A# h+ _8 s+ r0 a                set_real_ip_from  61.22.22.22;  x* Y$ _; n8 d$ A/ V
                set_real_ip_from  121.207.33.33;
1 E( O- }! a1 w5 ^/ s  s                set_real_ip_from 127.0.0.1;3 }8 \' U# {/ t; i& H# Z! C) S
                real_ip_header    X-Forwarded-For;" d  J! L% a, ]( @: S( N, y
                real_ip_recursive on;4 y! Z3 C6 `% ]8 j$ O, t$ ~; a# y5 B
                             fastcgi_pass  unix:/var/run/phpfpm.sock;# u- a- V! r; V
                fastcgi_index index.php;4 C: _$ |3 r3 k) w; ~: d* m1 @
                include fastcgi.conf;
8 s' c7 ~2 O1 e8 j: \        }8 C; T. g) S1 F$ Q8 G0 \. Y7 C. F
    }
$ @) U- B4 b  \* d- J3 ^& e. K6 {1 g" c: z1 J; b
getRealip.php内容9 u8 x" m2 \: b$ ~: L0 M
   <?php  
% f; m" t# ?( p, H8 w) S3 d$ q) [2 \% O         $ip =  $_SERVER['REMOTE_ADDR'];
5 ~/ |) \1 D  e+ B( G        echo $ip;    7 @. [* U  h5 g! D: V% _7 G/ g3 |
    ?>
1 ~4 i. J. p; H9 H7 a4 ~; u3 T+ s" ~3 T
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off% @9 e* R3 x5 F% W
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行' t# c- n$ P* K9 w. k& o2 m6 K" O
real_ip_header:从哪个header头检索出要的IP地址6 e3 P/ K( E% |1 q# S
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:- M- N7 `0 C$ A* _' I' r# y
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121& m& W& k' S4 z6 h
在real_ip_recursive on的情况下7 b  o" y. a$ H- I9 E4 H3 C
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或者不设置的情况下
. O/ i6 X* @! Y192.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 I5 H- Q/ u% N
访问结果如下: 121.207.33.33
2 z: \6 X/ N+ ^
$ E1 G6 {' Z. G3 d6 p2 d, c
四.三种在CDN环境下获取用户IP方法总结- t" U7 N; c! E9 S: h
4.1 CDN自定义header头
6 }+ H/ s, R2 a8 S优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP2 ?7 N/ r! [+ G6 S. P
缺点:需要CDN厂商提供
* y8 \+ v, A( [* K9 `
4.2 获取forwarded-for头
! A- y8 g8 J) _$ V, s  c优点:可以获取到用户的IP地址
# c4 A, l6 O, s* o8 r$ e, [缺点:程序需要改动,以及用户IP有可能是伪装的

# ]! Q' x! i' ~% i) @8 l4 g
4.3 使用realip获取
! k3 o1 T) [, f+ x' k/ r& X优点:程序不需要改动,直接使用remote_addr即可获取IP地址- s% F4 T. d- X7 \
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

. W2 T4 y2 b2 G
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-29 05:05 , Processed in 0.047200 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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