AdvertCN - 广告中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
 谷歌+Bing+TT+MSN官方代理 
⚡️按条S5代理⚡️静态⚡️独享⚡️5G需要代理IP?⚡️Proxysites.ai⚡️指纹浏览器,就用AdsPower
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
FB BM不限额,短id账单户E.PN 虚拟卡DuoPlus专注打造跨境电商云手机BINOM TRACKER 60% OFF!
比Adplexity还好用的Spy工具ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理虚拟信用卡+独立站收款
全球虚拟卡, 支持U充值Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)
FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)⚡️个人户,bm户不限额,账单户9Proxy ⚡️ $0.04/IP, 无限带宽
IPCola原生住宅IP⚡️$2.1/条双ISPGoogle、Bing官方总代  联盟流量开户fb耐用号0.01一个fb账号官方合作商
FB资源,账单户,分享户,国内一手FB企业户BM户账单户源头试试Mybid的顶级广告模式Mybid让你的流量赚更多的钱
全球超2亿的动/静态纯净住宅IPGeeLark 最强云手机+指纹浏览器Facebook/TikTok24h免费开户服务招exoclick/TJ等国际联盟代投运维 
火云指纹浏览器⚡️10个环境免费⚡️IPWO全球住宅代理⚡️免费测试⚡️FB海外三不限-户源多 费率低谷歌+Bing+TT+MSN官方代理
广告位出租   
查看: 5802|回复: 0

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

[复制链接]

121

主题

188

广告币

278

积分

初级会员

888888888888888

Rank: 2

积分
278
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
SimplyNode
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
: _6 q2 ~& ~7 k
proxy_set_header remote-user-ip $remote_addr;7 k% W. k9 M3 T: g3 _! k6 v

- k- s4 G5 \6 B; i' j* p) o5 j
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,. p# U8 G) |: a  y7 d9 s% H' y0 }
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

4 A8 o7 l9 Z- Z2 K8 y' ^
2

/ O$ B- U% a8 L* B; G- v7 N
3
9 u% J  H# N# M9 o" ^
4

; E$ u& Q) Q' r* O
<?php
+ f' ~1 O" |3 v2 I5 l- P    $ip = getenv("HTTP_REMOTE_USER_IP");
" o5 a) `- i$ y    echo $ip;    9 i/ [$ Z! h6 r
?>' N. M& Z- w) ^) ^

& k" `2 m" G" i8 ^; z
3 ~* ^4 {# R' c) S: f! x9 y+ C* {
访问getRemoteUserIP.php,结果如下:/ a! q1 n/ Y/ a$ U) B
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

% |1 |3 m5 {# H; t8 k0 C6 W/ i% \' H8 {4 D, F5 n4 f
二.通过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
& t! Y3 ~: [# B( H" K% _
2
# M- |( T$ ~% u# A% b
3

& o8 x4 @  [# ^5 a4 X$ a
4
+ L8 P" X* @' i+ @9 M
5

* r* ~4 n1 y; \' a# u5 Z7 A+ Y
getFor.php
6 z1 G' H, ?% g<?php* v( y# }2 F" t+ N* C2 W
    $ip = getenv("HTTP_X_FORWARDED_FOR");8 Q7 h8 w( F* ~* k  P7 s. k
    echo $ip;
1 p& I/ v/ D1 D+ p4 S?>
1 o1 C# O5 _+ h. m$ }( i+ q% j1 e- o) i6 K
; H! t3 ?/ H9 \) n; E2 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.

& X) P) \1 r( D
4 E; E3 O+ s+ ^. ~0 ]
三.使用nginx自带模块realip获取用户IP地址
6 O7 l! [( A4 J4 [
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
' u- O" q* w+ d% U4 [2 @
: Q4 l+ m* A/ b
真实服务器nginx配置
1
% `2 ^- f: z% q+ f) o
2

; q. Y- D3 i1 v, _# f
3

; j* e' B. \7 r( a7 D# ~
4
& M( X  j+ V* W: r. l
5

4 x2 ~) n" {6 S0 M0 _2 \
6
( p9 r1 @2 h1 b2 T% K! x
7

2 Y1 w  D0 e7 g8 G1 S
8
% W9 S0 F4 A8 X* Z+ g" `
9
( Q" b- |9 D5 v* [6 F
10

+ S: V3 n6 O, b$ _4 y7 W
11
- w3 e9 Q" q9 e& N2 `! i' c, b% Y
12

/ w. q9 o; C& m2 |' v
13

6 I+ W6 ^5 J4 B% r  R$ ?* z' R1 k
14
$ k  k" b, M6 p$ j- v) B
15
0 S, C* s/ H! i8 I+ C8 ^! ]
16

+ G5 Z$ W2 ^; J7 x9 U/ G$ D
17
2 i5 o3 o0 K' N& ~+ |
18

  t5 O$ e( Z8 m# ]
19

, U1 e4 k' M0 c* ?0 R# z% S
20

! v  K: b, B. H' C" m
21
/ ^) F# R9 n% P  {$ c6 Q
22

, ^+ i% ?0 U* o# y7 B; E8 i
23

# p* T  k" h: x$ r$ t
24

& k& O$ ?; }' e) r3 D9 q+ T
25
# R6 B" W5 s. s
26

# y$ {/ f/ w) a/ {# d
27
# T- {2 o: A+ D, t8 k
28

# Y; n) b$ W2 n- y
29
: N# C& h3 t: b% V& L3 M# A8 y
30
$ B  P! o" z$ m
31
4 O% T6 }$ e5 W+ m
server {- d; z# Q8 c% d; j+ x4 f
        listen       80;8 `0 q' w# G; m& N$ H
        server_name  www.ttlsa.com;
4 f( J# f5 r2 c0 c        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;$ [7 ?& ]5 X6 z/ y/ |, n2 k. X
  
- }4 }7 ^; e/ G' k& v        index index.php index.html index.html;
( T7 W( D, B, c- V+ B" c        root /data/site/www.ttlsa.com;
+ f0 |& X6 _, a9 t$ g  / n* }7 d& \# N3 ]5 }7 z
        location /
1 M% a& C) I2 I( p! f        {
! u) F6 [" o0 [3 F         root /data/site/www.ttlsa.com;# K" @; N. J$ E5 }
        }' d0 E5 [0 _# P1 q6 g
        location = /getRealip.php
+ ~7 N- C. S  \! u& [8 N9 ?; J$ o! R        {
0 l% C3 R& q8 }6 O- k                set_real_ip_from  192.168.50.0/24;
- X8 d$ s$ b; Z$ m1 N                set_real_ip_from  61.22.22.22;# P( T* D9 r6 V3 V. L2 D& }' P% L1 |6 f
                set_real_ip_from  121.207.33.33;
, b( s$ ?- z$ G% P: ^                set_real_ip_from 127.0.0.1;
% X( V( R5 V' g2 C2 i* t  b# X                real_ip_header    X-Forwarded-For;
2 d5 I9 @& A* G                real_ip_recursive on;
5 d& i' {8 Z; h6 i( m% F3 G7 T                             fastcgi_pass  unix:/var/run/phpfpm.sock;& N# C+ V( i3 P+ K  N
                fastcgi_index index.php;
" Q4 D. T. M* G7 K/ R- }* A% `0 j                include fastcgi.conf;
0 D- C$ z( _: \. C( r# S        }6 Z) N, W9 J4 K' i( l1 T. i
    }0 d+ B. n  A  z0 z- U- h& S
, p: @0 r: ?0 h( |' X) m. i
getRealip.php内容! B- ]* X' \% y
   <?php  
& F: d' \8 \/ x5 `. ]( K; _         $ip =  $_SERVER['REMOTE_ADDR'];7 x6 l: f- L* U& N2 r+ `% l$ ]
        echo $ip;   
7 d* Y7 {# q0 N/ L) T. C( B    ?>
& m' L/ Z9 @- i8 n; w9 y
3 |) W. ~/ l' F2 d; O
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
+ V# b# Z! P4 D" A; c% s! a! x2 B访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行7 O. ]0 {+ N( ?
real_ip_header:从哪个header头检索出要的IP地址
3 }# u. T; y8 r  B' f0 lreal_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:5 M4 m3 P4 t1 n9 n( M9 q( Y9 W! ^
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
4 N  i1 ~. h5 p8 Q9 w3 a  [, b- B在real_ip_recursive on的情况下3 E$ l4 b: k+ A* @
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或者不设置的情况下8 ~1 m( h2 b# g4 F4 U+ w, Y# N1 W
192.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;

  E& o- W. q  _2 k5 m' I, U& {9 g; D6 _
访问结果如下: 121.207.33.33
9 Y/ A: R+ E5 i( D' m; s- n0 G

, u! v; H. H/ v4 s" r
四.三种在CDN环境下获取用户IP方法总结; O* c& b2 c3 [! t4 R) W6 b' d
4.1 CDN自定义header头5 u- Y- f) ~. [8 y0 N
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP& h$ p; b. {2 O4 a' h
缺点:需要CDN厂商提供
. A; K4 h- O( j7 y6 y
4.2 获取forwarded-for头+ Q/ C! A6 j5 d" u$ W
优点:可以获取到用户的IP地址
- A; r. c6 ]! [+ i缺点:程序需要改动,以及用户IP有可能是伪装的

, `. e% F8 a9 ?* Q$ u
4.3 使用realip获取6 t' h! g. j( j: C( I/ B7 L$ @
优点:程序不需要改动,直接使用remote_addr即可获取IP地址( H" H- U4 T! e6 {9 v
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
) c8 Q9 D2 g& q8 q: }: f; K
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-14 19:44 , Processed in 0.044266 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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