AdvertCN - 广告中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5G广告专用虚拟卡/U充值/高返点皇家代理IP⚡️#1性价比⚡️
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
⚡️AdsPower:安全不封号,高效自动化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老户
海外CL企业户源头FB广告Spy工具⚡免费试用✅ FB个号1块一个TikTok2审户/老户/国内外端口/加白
GG,FB,TK, 欧美源头, 欢迎合作❤️FB企业户海外户,授信户,TK加白户联盟收款/海外资金下发/服贸结汇域名防红⚠斗篷工具/可试用3天
广告位出租8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构 
查看: 6411|回复: 0

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

[复制链接]

122

主题

199

广告币

291

积分

初级会员

888888888888888

Rank: 2

积分
291
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
3 I7 C7 Q2 J: w7 w" \2 j
proxy_set_header remote-user-ip $remote_addr;
9 s  a2 J5 |  e6 e; q) Y
1 z# d" B! j# u: W* y2 d/ X
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,. J2 I- [; W7 {" S5 n
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
2 n1 l( e( ?) p
2
, V$ T- \: m* X5 w* a
3
  z& w6 X- V; G9 Q
4
8 @% [  L* g+ ]9 z
<?php% `7 q8 n# f/ R- t* q0 R
    $ip = getenv("HTTP_REMOTE_USER_IP");! s' n" [5 i  {( ~9 P7 _
    echo $ip;    & }$ i$ B! a/ T3 ?/ L$ n" l2 [# z
?>8 n+ }0 Q' W! E7 N2 U
5 w/ L+ z3 T: I0 e; n
' H( N! n+ h4 [! }: b
访问getRemoteUserIP.php,结果如下:+ v5 U2 j0 k' c
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

9 D7 U7 _  L+ r. ]: B& j- y  S* l
二.通过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
; |$ i; |" W! h5 e% A/ F: a% R; a
2
6 {: _+ H" y" g# r0 O; [6 j7 w
3
4 U- K7 _1 H$ L9 L. J& N  w
4

. {& P  h8 y( Z
5

; C& q/ D. _8 y. X1 ~: w3 Z
getFor.php" [2 V6 o$ t5 g9 J
<?php" d+ m- R9 I7 j. \
    $ip = getenv("HTTP_X_FORWARDED_FOR");
! b6 X: f6 _  g6 M    echo $ip;
( k+ m1 T& n" ?* j, k1 m4 L6 E?>" i$ e0 m8 u$ E0 Q+ u; j# R% Y$ [4 v
- j  o2 R. n0 j; g/ k1 ^) c, N

! a4 V" @4 T5 Z+ r" ~! T
访问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 Y+ d( i/ p8 X7 P( R/ Y

& c3 D- f: T  f+ o
三.使用nginx自带模块realip获取用户IP地址) v5 u( r' J% L5 A
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module  H9 W0 E  [2 r- _( Z7 `- [' J2 H1 g

' @7 }; w$ J7 J
真实服务器nginx配置
1

( O  K# N) o6 L! ~
2
( o) K: x5 z& h1 m7 x' k+ r! E
3

) n2 \( m2 t. D# b8 M  p
4
. H0 z3 U! m) v( w. g
5

" Z+ K, F* d- G2 y4 ]! v6 _" e
6

" h) ~( H* I$ n
7

* a) c. B9 U, O
8
. ^- F' j' o  g4 f
9

$ V! }& r1 ?% ~& M8 U$ ?. d, x
10

6 _8 G) D7 f  R  _5 u7 W
11
9 m7 w+ k5 G) U( Q; U
12

7 s1 X' J5 H4 ?/ o  f! T. s
13
- \- y! ~" }- l9 D1 G. z" \, }1 |
14

8 k3 @2 x8 O& B" E3 {1 X1 d
15
5 d5 U8 S) A# q4 V: e% ]- ~
16
) [  O6 y( {: ?2 Z& i: l/ Q5 \. y4 c
17
# `6 Z5 k! e, T* k7 k
18

: x+ |  [' ~0 Q! o) U' V) u
19

7 |" d& V* q; q8 h& U  Z
20

' C; ?& r7 b& h2 b& W+ g; \
21

7 I4 B: J+ w5 {7 V0 j6 r9 s+ q
22

/ ?5 @6 E* }8 ~
23

: J1 a; i- I  H' A, S3 }
24
& ?/ a3 h/ K; l% A
25

  N' r& n8 b$ u  e! T7 B& j
26

1 ?* b+ d$ N; N  V* E
27
- W8 c  V: \: c/ q/ d; d! W- [
28

6 y- n  a  |& r$ i
29

5 P- ]- p( m1 D% U* g' p' O* ^
30

) x" q; ?* ?7 X
31
+ M' D4 y- z8 N: Y0 L4 r
server {& I8 Y1 a- T' m) y
        listen       80;9 o+ R, Z+ d  \1 e7 Y
        server_name  www.ttlsa.com;
3 ]2 \8 V6 B5 U* C, P& L0 O        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;9 u; R% X# M4 |0 x- q
  " ~5 y6 f  V! \* g$ p, r
        index index.php index.html index.html;% O; K/ B5 O" y/ ]
        root /data/site/www.ttlsa.com;* O' H* r1 N0 R- Z8 Z3 _
  ; d4 g  e- F, i, p
        location /7 {* P$ E! o2 D+ H
        {% B% `+ [- Y# Z$ j5 G6 b
         root /data/site/www.ttlsa.com;, ?. @' ^/ x4 z
        }
# O" K! G' j, M. y        location = /getRealip.php
* z; x! h3 c4 R3 d5 x7 @        {, X$ r. i+ b* c9 `: ?* B
                set_real_ip_from  192.168.50.0/24;
/ A  t1 ~1 w1 L0 v& S0 F9 b                set_real_ip_from  61.22.22.22;# ?0 q+ W; c; V$ ^+ b4 A$ ~
                set_real_ip_from  121.207.33.33;
" p: K2 \) K8 V4 ], }# l6 @; [8 S                set_real_ip_from 127.0.0.1;
1 }5 O6 A1 d& o+ d3 H                real_ip_header    X-Forwarded-For;
6 z. k2 F/ M+ D1 C- d: s$ x                real_ip_recursive on;: f1 ]% q# P8 k# f0 K. t" V
                             fastcgi_pass  unix:/var/run/phpfpm.sock;
: B9 d& y8 B1 K7 j0 y: x8 K, D                fastcgi_index index.php;
; v0 v  u  P9 h0 V, s! ^                include fastcgi.conf;
- l: S1 J0 G! r$ G1 d+ j5 K  r2 O        }. L5 c$ T! h7 D& a0 p( V4 @) _
    }, j( K8 `7 z) i0 f+ X* _8 f# J

% }7 R# T9 o& \1 S5 u. _4 egetRealip.php内容
, n7 g" v. N& D   <?php  5 k# }! U2 B1 F+ ]/ F  _
         $ip =  $_SERVER['REMOTE_ADDR'];) y/ \* d8 p1 T  n
        echo $ip;    $ x' n' x5 F3 d
    ?>7 Z7 d. F* E* u* C( l( s

  K/ t. z5 z1 b, F( X2 N/ J7 {
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off" z6 v1 }7 k5 }! W' t' `
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行5 |/ ^2 N. v* o+ M  h6 K
real_ip_header:从哪个header头检索出要的IP地址2 w3 h) z9 B5 {. i3 m
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
, L4 Z4 N* i# V4 O( D120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121" B/ R0 ]* a' A! O4 Y
在real_ip_recursive on的情况下
6 b9 c. E: ]/ z$ C61.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或者不设置的情况下3 R( `6 ]9 W$ q8 e/ c) L8 t( ]
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;
2 N9 _" P1 w3 u6 |. i
访问结果如下: 121.207.33.33

) m! H( f' c9 a) n1 @, \+ y# x& f) m

# o! ~( ]: [5 k) q# Q
四.三种在CDN环境下获取用户IP方法总结
6 n( M. G$ H7 H& w) T
4.1 CDN自定义header头
% j% k4 ]& E* n% r& A优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP9 o& y% N7 O1 k0 K
缺点:需要CDN厂商提供
4 b/ n( Y: ~% C$ c# p
4.2 获取forwarded-for头8 I% L# @: K7 G2 k
优点:可以获取到用户的IP地址& \! L) x' I( o& x- Q( K
缺点:程序需要改动,以及用户IP有可能是伪装的
! D* m8 C3 ]8 g3 T  `- [* ]
4.3 使用realip获取" Q" X& u# F2 d6 `( ^( b
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
- X5 q- e+ D- S" y: v缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
& ~& G1 t3 E( p
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-12 06:25 , Processed in 0.044847 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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