找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5GMediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】
FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线
【官方】❤️搜索套利买量投流开户独立站⚡️开户投放Google FB TK游戏代投⚡️E.PN 虚拟卡⚡️
BINOM TRACKER 60% OFF!比Adplexity还好用的Spy工具ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理
虚拟信用卡+独立站收款全球虚拟卡, 支持U充值【15 年团队 - 广告自动化系统、定制开发】【ActionKey】Meta API 桥接令牌
尤里改 - FB 稳定投放【神盾 AI】Meta 广告资产防护 永久免费FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)
IPCola原生住宅IP⚡️$1.8/条双ISPFB资源,账单户,分享户,国内一手TK加白户/二解户/FB海外户/GG老户 FB高权重耐操个号⚡️稳定过审
FB企业户海外户,授信户,TK加白户联盟收款/海外资金下发/服贸结汇✔Taboola海外户源头广告位出租
查看: 6578|回复: 0

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

[复制链接]

127

主题

230

广告币

325

积分

初级会员

888888888888888

积分
325
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
Influxtec
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
5 F; C4 n( n1 n1 G
proxy_set_header remote-user-ip $remote_addr;# d$ k5 V3 K8 M- x
; `4 }8 p8 Q% F4 `
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,$ q8 ^! a) w6 c) G- u5 V
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
" E; s8 I6 D) @9 r+ v) l% n
2

6 I: H: W; t: C9 l) L
3
; I, Q- m3 h! _
4
' |' t6 U4 U; x% Z+ @) B' _! [
<?php
9 M* E2 C$ z; I8 E: r/ W+ r    $ip = getenv("HTTP_REMOTE_USER_IP");7 ]/ o0 J5 m$ F9 E  X2 F5 R
    echo $ip;    0 e) S- [1 ]8 n- M9 P0 k( ^
?>
3 e# O8 H+ W$ s+ ?* l  p* W0 p& \5 {) ~% j- f7 Z+ ^
% F4 p! h- F& W
访问getRemoteUserIP.php,结果如下:
" ]! n" {( g9 _$ c/ U
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
" _; i# U1 D. M

' W. {7 y4 m7 q
二.通过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 {7 W2 V) V/ m" g# k5 A+ m/ w
2

# b9 Y0 `) X: M  }
3
6 v; u0 l) g* ~- K8 i
4
0 t& m" A5 ~: _% M5 I# v# B5 V5 _+ }
5
- I9 [! c" T6 v# x; R
getFor.php
, A. D* z& M, l5 m& |' |<?php
: N7 q; I6 w. E- }: Z( g; Y2 o    $ip = getenv("HTTP_X_FORWARDED_FOR");3 N# R: m' d% @* ]
    echo $ip;
2 \, @- f: ]: e) V8 i! O$ D?>7 S. a: P$ J! w7 B* ?- c
* \# d7 ], N, I- v# u  `
5 [4 F) m( w  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.

$ y) R9 F, ~9 L, S( V7 _) Y1 `

) `1 d, ?# m! r1 K' j. X
三.使用nginx自带模块realip获取用户IP地址
4 r1 n0 n4 z8 O0 |
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
9 S7 C# U  L) w- r, }/ Y( \
2 k1 R# w* J8 ~7 `
真实服务器nginx配置
1
0 f. t$ {* U# O4 ^
2
  U$ n* o7 Y" ^1 l& z0 Y
3
" A' F+ N* i: r' G8 q
4

  q. V3 y( h! u; {6 X2 M. z1 Z
5

, Q, _) b. v; Z/ D
6
- t8 z+ [/ T+ k+ K6 o; B6 b
7
8 I. H1 [8 i+ ^; C8 q/ E- [
8

/ x2 d$ U, K3 f2 |6 }5 @+ l
9

# K$ \% r. ~: p# y6 `3 [0 d1 ^9 q# Y
10
' W, u8 |, y+ X* {
11
* V7 n" Q% N2 a( c$ O
12
5 l4 K) x, R) L3 m: O2 e
13
: R  k, l. w. ?6 u4 B; r) q, E
14

: v$ a- U+ O9 w  q$ c$ n+ g
15

* X+ D8 Y- z/ r! \6 D, k
16

. x0 {1 k/ v) V
17
! Q0 _& w2 X/ {7 F! Z9 q: v2 F
18
% o8 x6 _0 M+ `* y* [" C- \7 \) S
19
; [* X& w% X8 q) ?
20
! o3 a8 q6 M! \, v$ m; c
21
7 N( F- D" S; u9 {% [
22

, m/ I, m0 p' F  i" C
23

9 K) g9 [  w3 Z5 `& f
24
' ^: [4 y6 ~  ~7 a! r
25

7 c5 L, y) V% r! r
26

& t7 ?" P, {& `9 g+ h2 [
27

/ Z( i8 o4 o+ S1 [' P1 s. }
28
' n0 `% v/ m, `7 I3 P/ [) c
29
; C2 u3 d9 L; F" _
30

/ y  J  j8 `. O3 ?3 A
31

! E/ R4 @- d- n6 z+ T8 B8 L
server {6 |7 G, M: U$ m) p* O6 j) b( ~
        listen       80;0 @9 k  D9 ]2 d7 P4 E
        server_name  www.ttlsa.com;
8 D: \& L0 j' l  C        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
9 M8 \$ v% T7 V4 y  
2 P" N1 U1 [: h! i        index index.php index.html index.html;2 `* a: A/ f/ k* q$ k4 b
        root /data/site/www.ttlsa.com;
- |7 B. U- x$ T  
" Y& Q' B; i- Y$ X, E        location /
5 A9 u! x5 J" `$ W6 S; B5 j9 o        {
! ]8 ]4 b- \  B         root /data/site/www.ttlsa.com;0 p0 ]8 d, o4 F  z! M, V' v# X% _0 D- t8 X
        }
. X5 h1 G5 ^0 }  n0 U        location = /getRealip.php( [$ |4 E) h9 K/ Z: q! l
        {& O% n6 N5 d4 o5 g3 {
                set_real_ip_from  192.168.50.0/24;- h" b/ F3 e+ z5 U
                set_real_ip_from  61.22.22.22;
% K+ L0 y/ s1 F& W                set_real_ip_from  121.207.33.33;: B1 J* g9 S$ ]+ t! o8 u  L
                set_real_ip_from 127.0.0.1;6 C  r% B. P1 _! W2 I/ ^
                real_ip_header    X-Forwarded-For;* W2 J4 O  y9 z* s0 N
                real_ip_recursive on;& D- Z0 R8 u, x' |
                             fastcgi_pass  unix:/var/run/phpfpm.sock;
' s# T4 y$ o  L$ d" I9 x! H* p: m                fastcgi_index index.php;
! ?/ U7 q8 m2 e                include fastcgi.conf;
3 Q/ d, I5 o/ N+ m0 p        }# X4 |7 }( L: j& q% h1 z* k
    }8 g) W- r6 d" V' P% A

% z. o6 I3 {: q" e3 x- u4 KgetRealip.php内容7 `2 f, g3 L* [( N# Q0 r; i
   <?php  8 P3 t# U$ }& B$ M5 @; v( V' x
         $ip =  $_SERVER['REMOTE_ADDR'];2 m. u& X( F- H
        echo $ip;    ' m' K1 b; W, A% H4 \' `
    ?>- F# `, b( `2 |6 u
! b& B; z: l6 U* C8 E* _, k: D4 `
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
* q5 M1 M- {5 Z访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
: O, `3 w  d& i& yreal_ip_header:从哪个header头检索出要的IP地址& N4 P: X; Q) h9 O" c$ L% P
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:2 |0 ]0 R' W" ]3 J' `
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
$ P/ V# O- f* U在real_ip_recursive on的情况下% G/ I) v9 W4 N: w) @( p) p
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或者不设置的情况下
$ N: I! g5 w6 P' E192.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;
8 ?6 d6 ?1 p* O
访问结果如下: 121.207.33.33
8 h  @! K$ g& b4 W

7 p. M* D' E( p
四.三种在CDN环境下获取用户IP方法总结" ?$ n- u, D; p3 R# X( V
4.1 CDN自定义header头
3 _" y9 |0 }5 A* \: P4 \. }优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
# Z6 n; }3 m9 O4 z1 }. `缺点:需要CDN厂商提供
; G. ]. @* G0 O: C; O7 c
4.2 获取forwarded-for头; b3 ~# T7 V6 r" |
优点:可以获取到用户的IP地址
5 ]& H) t# Q  k* {) j- k- d缺点:程序需要改动,以及用户IP有可能是伪装的
  M3 I) C2 C9 p8 b) P  ^
4.3 使用realip获取; y2 Q7 }" a4 L* i' ^
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
& ^  l9 c* h3 _- s9 K缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
# H1 A1 u4 z2 L9 O' Y
相关帖子
vpsjq.com   
surveypayoutwatch.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-30 11:28 , Processed in 0.061191 second(s), 22 queries , Gzip On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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