AdvertCN - 广告中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Binom
 谷歌+Bing+TT+MSN官方代理 
⚡️按条S5代理⚡️静态⚡️独享⚡️5G⚡️最干净<Wifi住宅+5G移动>IP代理指纹浏览器,就用AdsPower
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利广告开户独立站⚡️开户投放
DuoPlus专注打造跨境电商云手机E.PN 虚拟卡BINOM TRACKER 60% OFF!比Adplexity还好用的Spy工具
MediaGo+Taboola+Ob开户百度国际MediaGo⚡️让产品狂奔全球百度国际,高点击转化,快速放量百度国际MediaGo,独家原生流量
ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理虚拟信用卡+独立站收款全球虚拟卡, 支持U充值
Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)FB 三不限源头 - 自助下户充值转款
各种主页、账单户、BM户(优势)⚡️个人户,bm户不限额,账单户一手BM分享户不限额9Proxy ⚡️ $0.04/IP, 无限带宽
FB二三解0.1元一个虚拟卡|PTM星际卡FB专用虚拟卡Google、Bing官方总代  联盟流量开户
FB账号资源/稳定靠谱/运行5年啦FB开户代投/三不限/白名单fb耐用号0.01一个fb账号官方合作商
广告位出租   
查看: 5631|回复: 0

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

[复制链接]

121

主题

184

广告币

274

积分

初级会员

888888888888888

Rank: 2

积分
274
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
( x/ m' l+ D: {; J! u
proxy_set_header remote-user-ip $remote_addr;. T0 a  Z1 N: F. K4 O
7 N7 F( X) o+ l0 z; ]
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,+ G+ g3 l9 d" W& z0 I% g$ y$ q- t
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
2 L: |) l4 f6 k! ]4 |. l
2
' {  c/ w( V0 p+ B- b- R1 G
3
  s7 ?: W) G' G* L! n& w
4

* q. ]% E" v1 ]; \6 j; w6 D4 ]
<?php: B; f) J& N. k7 A; B; b* t9 L
    $ip = getenv("HTTP_REMOTE_USER_IP");
/ M3 B/ F( h" R% d& j0 d    echo $ip;    / S9 D* A4 N6 r- M/ K
?>
- v+ {4 M1 ]! l
# j2 t  g& }" m2 Z" n" l

# g0 o: o5 B+ M/ s% o/ l1 Q
访问getRemoteUserIP.php,结果如下:# J4 e6 r; p- _3 r4 X3 F, j
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

! U2 U  Y' N# Q5 n" a1 R: K
' \; Q$ i1 [  f7 N9 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

) z/ s# m- d/ _
2
& i( A$ p$ `; t' z
3
1 C0 A$ F( n" t% a/ L
4
1 T! {  n6 D9 ^7 J5 s
5

0 ?, S) m  E8 d+ v9 L- Y
getFor.php
3 V; Z8 z6 U3 ?: p<?php
( u; U9 D' |8 o5 M    $ip = getenv("HTTP_X_FORWARDED_FOR");  U- l$ Z( A7 E, D# G
    echo $ip;' M) S8 @# g3 L
?>5 p1 ?" z  m# T  ?
: w7 m( T: o( l' t
: k' j& M7 |  X$ L1 q0 `0 c, f
访问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.
7 P+ |9 S" H0 y+ n: ^5 y1 N
0 |4 R& X. h5 B2 s9 H
三.使用nginx自带模块realip获取用户IP地址
/ M8 o  [/ J8 w* ~& d5 @0 |) v
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
& |" l7 A& |' ^0 R2 U

, d6 m) y8 ]1 q6 D$ Q7 W6 n2 \
真实服务器nginx配置
1

, F( t( j. q6 E* u
2

! h- S- ~7 b2 Z$ U
3
. T) j( h+ z7 G
4

" l. Y' C4 f" y' i5 n7 @% u
5

4 q' F: K1 K) }
6
$ [  V6 H+ h- l' j
7

8 U- J4 C$ O/ R6 ?
8

9 g! [7 s) E  \: V% ?( W
9
+ V" y+ [$ v; Y6 @- D# p  [
10

9 @% o4 N: c% q
11
- y1 @5 P( [9 {3 s2 x* m
12
3 h: e5 U7 a4 P- T1 h: E
13
' W! H3 a) o8 A6 b% o; _2 o2 i8 r. B
14
9 M4 S: g- z0 F2 X7 D% U9 s
15
% B3 E# X! ~% P9 X" e2 Y
16
) k( O5 ?4 W5 r/ A  ]
17
! L" C) f# Q: J) q+ L
18

- c0 y8 C) F6 h
19
- M6 h& ]5 k/ ?! e
20
5 t$ \& g) [. v- l4 e& Z+ E& F
21

8 X$ O( ~8 H" P, O" C) c
22
5 P$ E- t+ G7 d; e& _4 C$ e  ~
23
% L9 n+ [: D$ ~5 @1 l
24

5 M, {- ]3 g$ E7 C
25
2 K+ t& B- q+ H! |8 C, a% `- |6 o. g) h# q
26

/ J; U7 h' S& i0 L6 {
27

+ ~  ^. ?5 }- e6 J$ m
28
. B. f! g% z# F2 W% m
29

' ]4 r0 p9 D. z( h
30

! f- b8 f0 o6 m2 }) i
31
) M- }$ d# ]9 I8 U5 L0 J+ B4 P
server {2 a# s! i  T( b$ s0 p8 x2 U( N
        listen       80;; m( F' d* }* H0 G/ }# U# \
        server_name  www.ttlsa.com;
0 e/ t, {$ ?/ e6 l) i        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
* `/ R$ O! K5 a3 w( |0 \' Z! V  
6 p! b$ _* d$ e5 G, O7 y2 J+ l! i        index index.php index.html index.html;% F' c3 Q, L- Y1 ?( Q
        root /data/site/www.ttlsa.com;
, ]: K5 N( y% p3 A9 [) I+ t+ L  : e3 R' ?, M0 C# R, {
        location /9 Y1 v9 [+ w$ W3 B6 h6 V
        {8 P0 g/ D& k7 F& |% [% Y5 |
         root /data/site/www.ttlsa.com;$ v- S( l, t* c7 M( ~
        }
: f- o; {# M+ ~6 q; j( l% q        location = /getRealip.php, E2 [9 `0 a0 G$ W: n- P) Q7 g. f
        {' v3 P: r' {5 j% ~6 ]
                set_real_ip_from  192.168.50.0/24;3 Y- c3 p9 E+ |; ^
                set_real_ip_from  61.22.22.22;/ G2 L# _' A' Z! H) I5 ?
                set_real_ip_from  121.207.33.33;" Y( |; C2 D8 h+ Y: H
                set_real_ip_from 127.0.0.1;- G6 y8 K; {# l1 D2 C3 D( h! Y
                real_ip_header    X-Forwarded-For;
$ k! I) Y$ I. Q' d- m* R1 R                real_ip_recursive on;
3 u& m- X  O6 Q/ S2 J  Q5 B                             fastcgi_pass  unix:/var/run/phpfpm.sock;
4 v) M9 K3 p9 `                fastcgi_index index.php;
: S" S2 d3 `- j6 B" ~$ d                include fastcgi.conf;
( s% L, [  `* l* Q: v        }
' r* X# g. P2 y4 @. T9 s    }
4 h" P3 e  x7 {( Y4 ^0 D* M( ^- [- y6 }
getRealip.php内容
9 c! N& D7 k/ i  ?4 c1 q, a+ d   <?php  
" ]  k6 ?% z+ ~9 j& t3 H' ^         $ip =  $_SERVER['REMOTE_ADDR'];$ g8 d9 B) C. _' W' O
        echo $ip;   
4 e9 c! O& y" @: _2 p  A    ?>
4 p1 F7 e0 y$ k2 L% _0 x2 ^; [/ o5 Y0 I/ B& _# C' I; e: v( H
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
. f+ N- C- M" D0 K访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行5 S; v3 ?2 n, R& P. p
real_ip_header:从哪个header头检索出要的IP地址
, z" B7 @, Y1 Ireal_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
. e6 t7 V& ~/ ?8 l' U% q0 I2 }120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
8 s, Y5 I& j% J7 y$ N& Z7 h在real_ip_recursive on的情况下
  Y) u, j5 M1 {9 p! c: q61.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或者不设置的情况下
- c# S7 j8 D: M/ N; H( H192.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;
3 d. x3 p+ i$ U+ a6 n3 k; {. i
访问结果如下: 121.207.33.33
8 @0 t( G2 r  X/ L- L
& j' b0 y% B: }% b; F+ A6 v
四.三种在CDN环境下获取用户IP方法总结
6 A% U  Q* h4 Q3 J
4.1 CDN自定义header头
. q( r3 P# o2 M' c$ B' ?优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP) ^6 @3 \- C7 P
缺点:需要CDN厂商提供
8 k! p$ a$ F: h& p& c
4.2 获取forwarded-for头6 B* K6 j0 \( O6 X2 W& P. C
优点:可以获取到用户的IP地址* ~. O1 c+ ~6 O5 G7 H
缺点:程序需要改动,以及用户IP有可能是伪装的

  S8 d5 E% ]1 s
4.3 使用realip获取
' u) A3 j/ _" A  g0 M4 T优点:程序不需要改动,直接使用remote_addr即可获取IP地址
& p$ |% P8 G( `, G缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

7 ^2 f  g* y# K) R: C
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 19:47 , Processed in 0.048612 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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