找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5G广告专用虚拟卡/U充值/高返点皇家代理IP⚡️#1性价比⚡️
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
Google FB TK游戏代投⚡️AdsPower:安全不封号,高效自动化⚡️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加白户联盟收款/海外资金下发/服贸结汇域名防红⚠斗篷工具/可试用3天⚡️Spend.net — 美元卡仅需$0⚡️
比特浏览器+云手机 |防关联防封号Facebook截流, 1 次点击 2 次曝光广告位出租8500万高质量住宅IP,助力各种需求
虚拟卡返佣1%,国内持牌机构   
查看: 6444|回复: 0

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

[复制链接]

122

主题

199

广告币

291

积分

初级会员

888888888888888

积分
291
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
Deepclick
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1

6 B, ]! t% ^# s& ]
proxy_set_header remote-user-ip $remote_addr;. K  o& ?, I0 x6 ]

9 U" l( F1 a) H9 k" P/ a
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,4 a2 [* T* u. o- M
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

3 I4 i* j2 U; l7 w6 D: V
2
' g/ S9 m5 G- b- s
3

$ K2 H1 \8 |! y* o3 ~  A
4
2 @& S3 s8 n* M3 Z/ C% G6 U) l
<?php
4 D# K9 n% B4 W4 q% n* k    $ip = getenv("HTTP_REMOTE_USER_IP");& M* \. v! h0 ~3 q6 ]
    echo $ip;    # e8 h% t& M. S
?>
. n$ i$ j" E7 U" K5 S/ u# H; \5 {% d
9 k/ L5 {* l% X! n' V
访问getRemoteUserIP.php,结果如下:
! o: {$ U0 l9 A. Y9 V) R4 W
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

. q- y- V; m/ w, W9 |+ E1 j  L& V/ @) e
! Q- o  W4 m$ B& Y  Q  z6 L- g6 U
二.通过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
! P+ _$ X: J- F
2

0 E4 }. U; p' y
3
  s3 U8 [+ X6 Q) D' v
4
0 C& N6 N0 I* Q9 X2 W4 S* u7 |& R
5
8 x# i2 v2 j, M, U, z' l- r
getFor.php
2 O+ ~! C% Z4 r; ?, h+ M0 U<?php' y9 B9 ^, c% c* e
    $ip = getenv("HTTP_X_FORWARDED_FOR");
4 T8 h  M' b- E. u# |* c% @# i' o  m    echo $ip;& E- M' l0 S" Q. |+ m# P2 D
?>
7 m7 N. C" J5 J, h, h6 H3 l
0 I9 A( g8 _0 h- |$ \* k: S# _
4 w, t1 B+ t& 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.
- _/ y* M% e$ s6 C9 H% B

, Y9 I: v  q' _: n
三.使用nginx自带模块realip获取用户IP地址& W  N( d3 O* r4 g  Z
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module2 G7 \) W* O  o" }& f

5 _8 J, g/ ]' n* d% y3 X; K
真实服务器nginx配置
1
  L2 r2 d4 C- p
2
. f* p: U1 \6 ]  [0 c. `
3
8 K1 o( S% f: Y" G5 b' Y/ L
4
" {+ n+ q; g. w& C" Q4 ?# N/ t9 F
5

% N1 u# {( u+ ?% [4 J0 U/ L
6

% J2 U, m) C& x! G3 [
7
8 m( v( ?* t. P( X/ j+ Y& m! M
8

1 E0 e6 p' v8 V: s
9

4 w( U% D- J$ k) k/ J
10

9 r! V6 R# H  L! p' }: V0 c
11
* {% e$ [2 H0 c/ @2 }
12

, }$ v* P3 a  g8 m
13
/ {; q& F7 R/ X4 g; v! J  c
14
' Q4 D9 q( \/ a* [3 p, P: G
15

* d& R! h! W+ b
16

/ n# Q$ C/ z' d/ H7 M  g
17
9 v9 G0 I6 @- F5 C5 W
18

8 N5 g, A2 _7 b# i
19
. L$ a6 K& H) D% @! Y
20

! i& p1 H6 B4 S
21

7 g* o$ m/ i/ s) Q# ^
22

2 c- g. P* P" k5 z# \
23
+ L% u0 J: I& ]  ~: e% L" D! @
24

1 e' T( \* T+ Q+ A& ^# ?6 d
25

. \# {1 _; w& `6 z0 {( J
26
+ M, k0 A! U8 m3 _
27
- U' t% K7 P" U* {8 `. N! Y
28

. x3 U! q4 Q5 J7 B  ~
29
' a6 w& ~+ O4 p/ [
30

5 c. c$ I2 Q; r3 ?2 s) ~8 {8 k% Z
31
8 M% {5 b8 g3 {# B
server {: m, s$ I5 {4 U
        listen       80;
+ f# Z( {& w+ d        server_name  www.ttlsa.com;5 \0 n, N5 y5 J7 Y( ]6 d$ a
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;& j5 E5 X& x( w; O* F
  
( p; o6 X+ k: ~) S) Q6 ~8 Y! t5 G& m        index index.php index.html index.html;6 R# G0 [5 Q/ x
        root /data/site/www.ttlsa.com;. K1 R8 B. P- s$ H( z5 Z
  
6 Z: |6 i1 {: _& f, y$ ?" E        location /
6 R" |( y; I2 e3 K        {
5 R8 L1 M/ ?' h         root /data/site/www.ttlsa.com;) v; \5 K" x; t1 ?' P, B
        }) T7 p; R% J2 N( W. A  U
        location = /getRealip.php1 G) D, `$ m+ F1 `" L) R
        {0 M5 h3 }) G) v, s$ E0 h
                set_real_ip_from  192.168.50.0/24;8 @6 [' j: y7 n8 @
                set_real_ip_from  61.22.22.22;
" s/ o7 ?0 F$ K9 H2 l                set_real_ip_from  121.207.33.33;
3 \" I" V+ ^* q' X/ u8 B                set_real_ip_from 127.0.0.1;( ]% V9 l+ h! L  E, X3 Y* E  K
                real_ip_header    X-Forwarded-For;
% D& I  f; `* n: p; \" g                real_ip_recursive on;
* h. ^" b5 V! l9 N6 l6 D                             fastcgi_pass  unix:/var/run/phpfpm.sock;# L3 ?8 i5 G; v4 O6 F
                fastcgi_index index.php;
* x# g) j; X- Y3 n2 u4 g                include fastcgi.conf;
* W: J  K( Z4 J( y- S        }
* I3 w2 Z- m' {. U; M+ }) {    }$ F6 `" d! m1 F0 r5 I1 t

0 o. S: D* h- Y) J) _getRealip.php内容- ?5 X3 M4 [: {7 n
   <?php  5 M7 g" [$ O2 M
         $ip =  $_SERVER['REMOTE_ADDR'];( h0 ?. e) N9 e9 H9 G" y
        echo $ip;   
+ P/ H3 h- G. W. X" y2 Q    ?>
$ H$ p* z* M- o* c- f
6 V+ y5 e& y4 T+ B8 F
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
( u6 Z4 t  ~3 D/ j访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行* y  D* `6 j) D
real_ip_header:从哪个header头检索出要的IP地址; a3 \4 a) Z+ q. S" Q; j9 [. g
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
* }6 L4 Q# j- {120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121; u5 P" c2 s" z6 Z$ ]) P: D
在real_ip_recursive on的情况下
6 O6 T! `: @& ^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或者不设置的情况下
" I. B% @: c# n2 t192.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;

# T# a. V9 [, \$ v4 [
访问结果如下: 121.207.33.33

8 S+ U+ b- J' G; h+ j( U! {
% G# W8 K( ~" ^! v. ^" Z
四.三种在CDN环境下获取用户IP方法总结1 C) s8 W7 k5 L" B
4.1 CDN自定义header头
( w6 M- ^4 ^, V. `优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP9 K  y8 R& J. p# P2 y* k$ s4 C+ @
缺点:需要CDN厂商提供
5 W( v$ O& Z% Z0 F5 C' M
4.2 获取forwarded-for头' Y8 X/ r: v: i, `) _$ Z
优点:可以获取到用户的IP地址
* i$ F0 l! Z5 q缺点:程序需要改动,以及用户IP有可能是伪装的

1 A3 j' G- S% y) ?" e. C
4.3 使用realip获取
2 U0 [/ S6 g6 K& J& X2 O优点:程序不需要改动,直接使用remote_addr即可获取IP地址, e& B- C8 Y- E) e! F+ ?% K0 v. e
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
% ?8 b) J& H/ V( t
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-13 22:32 , Processed in 0.045154 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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