找回密码
 立即注册

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充值
Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)FB 三不限源头 - 自助下户充值转款
各种主页、账单户、BM户(优势)IPCola原生住宅IP⚡️$1.8/条双ISPFB资源,账单户,分享户,国内一手TK加白户/二解户/FB海外户/GG老户
最大欧洲Nutra网盟BA找量 FB高权重耐操个号⚡️稳定过审GG,FB,TK, 欧美源头, 欢迎合作❤️FB企业户海外户,授信户,TK加白户
联盟收款/海外资金下发/服贸结汇⚡️Spend.net — 美元卡仅需$0⚡️✔Taboola海外户广告位出租
虚拟卡返佣1%,国内持牌机构   
查看: 6486|回复: 0

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

[复制链接]

123

主题

212

广告币

304

积分

初级会员

888888888888888

积分
304
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
, l/ ^3 N/ D$ |6 S
proxy_set_header remote-user-ip $remote_addr;
% T( y2 q! i) h, Z: f8 p  Y; a9 Y" V1 [# V9 x
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
7 I, S9 Q: P9 p. m怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
% n, u. q* `: w. h7 t# k/ p$ x+ [# t
2
7 u' {  v% K3 I% {6 ^- A8 [
3

0 z7 ~% p3 ]7 P$ E
4
. N2 w3 A6 Y- I
<?php
- R: X; U1 R- B8 e    $ip = getenv("HTTP_REMOTE_USER_IP");3 L* q3 [- j8 d# @" a- D7 C
    echo $ip;    3 ^. t: N$ V3 L7 Z
?>
0 n" u& l: W' P9 O# l
& h$ x$ G4 [. ^
1 u' x/ k) a) `3 z  H
访问getRemoteUserIP.php,结果如下:
" }5 E. n, [3 u
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

$ K# R' D6 A9 T) i* U
1 }  l5 W% p  _0 c& K! W3 j; c+ i# W
二.通过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
: u0 ~0 C0 |  q9 M
2

2 W  G& r' D+ K& H
3

& \* m1 t& T5 [3 i. G9 ~& H9 i
4

, I2 m" w# k& P$ m
5

7 f- V7 D) p5 ^8 n- }
getFor.php
1 Y2 z! X# y5 m: `1 l; \8 w<?php
) p+ O9 u; C1 T& R  D( q    $ip = getenv("HTTP_X_FORWARDED_FOR");3 |6 M% R( A) V! W, n' G1 s# o# r& k
    echo $ip;& F& e9 t1 f* |
?>
) }& e" m( F3 [: _! N4 l# u( l: k4 ]7 Q' t" I
  \4 _- S! m. I
访问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.
) j8 s- I8 W) N0 |- j3 m

8 M# L7 z) L+ |. G" P" l
三.使用nginx自带模块realip获取用户IP地址
5 B, S0 d. f) a1 X  _8 m. d
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
3 R( g0 ]4 u7 e' P
0 Y5 u# o6 q" G& }: l1 f/ Q
真实服务器nginx配置
1

# B4 \/ k, t0 t+ D% p! m' f
2

% }) `+ F$ V  s% Z' x
3

! _3 j' u" [+ V8 ~/ \3 a
4

) e& P# f7 n* q7 d- t9 B
5
$ Z) x2 [; i, V1 f
6

7 S9 |( c1 z) l% x# O
7
  J& V! A, N/ S
8
. W- _% P; |7 F. p6 {0 S  s
9

9 m" N7 O7 |; \8 a5 i9 l
10

: q9 W  ?  M; ?2 U. K  Z) G
11

, @2 H- h/ p! l- o( g
12
7 H& Y% B; n5 T. m) d6 b2 f
13
( ?) c( j7 ]+ V0 P( D+ O) L
14

7 \  H  G/ y3 D7 V3 x
15
% N8 ~' n8 F8 k5 o1 E0 k$ ?
16
' M/ Z0 X' z6 ?1 \, A# t
17
, U" ?& a8 K5 C6 J- J" C
18
/ N) J9 i3 W) h3 _
19
  h6 F2 l$ K: v5 Z* }: U
20

5 R9 F: [2 n3 x
21
) G% @0 _# k1 v- d
22
6 M; g0 O9 y4 M+ C3 v) p
23

* [) j/ @  Q. _: [
24
& W4 m  c/ [+ ?+ q' J/ u
25

, v3 a2 c3 r2 ]3 X8 l; ~+ \
26

  T7 k& z& f% g* i) R* Z
27
( ]( o8 U( K+ s$ B6 q2 S& q3 m( T8 R
28

1 k. F, C2 k, B/ H! s# X0 L
29
, @: A$ ]  T- E/ t# @  p+ b
30

$ A& Y. o5 H+ Q0 ~3 S& f% i
31
3 ^5 W' O4 x+ \% }* ]1 d0 L
server {9 \/ e* ]. p, [, ~& s3 d" F* s
        listen       80;
6 C# M6 X& M2 d$ V        server_name  www.ttlsa.com;
7 b9 u/ j, d% B; G6 q* z0 v        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;" D) f1 ]4 _. J4 F9 T* i: W
  
4 L; T( c! e/ h. P        index index.php index.html index.html;
+ y* d  y  ]( C3 @$ y        root /data/site/www.ttlsa.com;9 X  s' h0 v& H* p
  
& W% F8 S  t$ D. s( [* u# B  Y        location /( G: p# {& H; O1 o8 Y
        {7 W/ |. Z1 V- c2 C- m$ P
         root /data/site/www.ttlsa.com;1 D4 ]0 `% }; x8 I  }
        }4 A, E5 N" E' H: }  [5 t! ?
        location = /getRealip.php
* n$ X: b; }4 i- w  S- }        {
; ]$ O/ V9 `) J7 X1 Q                set_real_ip_from  192.168.50.0/24;
6 u  u" M. |. Y7 m+ D, b                set_real_ip_from  61.22.22.22;
, A* \$ l- F1 F, [7 n/ e% Z                set_real_ip_from  121.207.33.33;
7 Z% J* s3 M' \: H8 @. U                set_real_ip_from 127.0.0.1;$ _) A- S  f: V. |9 w- P2 M- H
                real_ip_header    X-Forwarded-For;+ Q0 ^  Z) d  P% \9 e
                real_ip_recursive on;3 j: X; {1 u3 u
                             fastcgi_pass  unix:/var/run/phpfpm.sock;5 L3 \5 h8 Z* [$ L- c
                fastcgi_index index.php;
, U% f& y5 [" E9 R  p                include fastcgi.conf;& k3 O: q$ }6 w1 m# K% ~/ l
        }
& E4 H3 V( A" V$ t; |* i! e/ g    }1 y' @" [' N9 B* [- C
/ Q6 R5 X. B1 s7 A
getRealip.php内容! L) y7 g: L( j9 R  x9 i1 c
   <?php  
% {6 C( I, I5 p( ~         $ip =  $_SERVER['REMOTE_ADDR'];; [4 @. P& S% O$ y- Q0 g3 ^8 J
        echo $ip;   
+ n4 `* `4 Y# ?: P% a, Y    ?>
) D" X# r' }# d" \7 z& d2 G) O' S# j: R7 g( N0 N; f6 j5 z
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off6 J" n) G' D1 p4 ?: @% J
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
& l4 g3 H: {  T" H6 a' P: ~- Areal_ip_header:从哪个header头检索出要的IP地址
# z% o( y8 z1 X  M9 w1 U! f* {/ h4 u# creal_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
0 V" y- z7 X' [1 R5 M0 e! V2 l120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
) f  X; t( C2 X7 n3 v9 J在real_ip_recursive on的情况下5 d4 u/ J, s9 `/ q9 r7 ?4 F4 d
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或者不设置的情况下2 j& I4 `7 R/ y2 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;

" |5 c( p# ~; M, q
访问结果如下: 121.207.33.33
4 g* `, }- i6 b% C+ |3 X

! p/ U2 e2 r3 X/ n7 w0 u
四.三种在CDN环境下获取用户IP方法总结  }' f1 B2 a, ?0 f6 P
4.1 CDN自定义header头
+ ?8 `6 S# p; U* D  F1 y优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
1 ~4 ^8 t0 L; F缺点:需要CDN厂商提供

$ A7 X$ n" M* Z
4.2 获取forwarded-for头
* @! Z9 Z7 s1 o8 c8 y; R. A优点:可以获取到用户的IP地址: D! p, W: J4 B5 d) c0 X4 Y
缺点:程序需要改动,以及用户IP有可能是伪装的

' h1 o: o% N7 \# c9 |9 d1 x3 P
4.3 使用realip获取
/ D& ^& W. m; I: b优点:程序不需要改动,直接使用remote_addr即可获取IP地址
, T; z+ A/ C+ y3 b缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

* R/ \) T/ p7 H8 ~, n7 `
相关帖子
vpsjq.com   
surveypayoutwatch.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-21 08:48 , Processed in 0.086759 second(s), 22 queries , Gzip On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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