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虚拟卡⚡️消费越多返现越多FB广告Spy工具⚡免费试用✅
FB个号1块一个TikTok2审户/老户/国内外端口/加白GG,FB,TK, 欧美源头, 欢迎合作❤️FB企业户海外户,授信户,TK加白户
联盟收款/海外资金下发/服贸结汇域名防红⚠斗篷工具/可试用3天广告位出租8500万高质量住宅IP,助力各种需求
虚拟卡返佣1%,国内持牌机构   
查看: 6402|回复: 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
- a! e2 Y0 s4 J+ W  Z
proxy_set_header remote-user-ip $remote_addr;
. }, L. [# J  T. z6 }: }# B5 _& v1 t2 F" N
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
! A& S/ X6 d5 D' M, B! B6 X怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

( U/ [8 u+ w+ ?  i0 Q
2

, x3 w6 J5 a2 j/ x) w$ y
3
2 O, q, A- M/ o$ H1 x, H- `
4

" K- R/ V( l. }, e& T, ?. J
<?php
" L1 R8 J& }8 t    $ip = getenv("HTTP_REMOTE_USER_IP");
* ]  C1 q% R# B    echo $ip;    9 j* E7 H5 w+ C0 y  l
?>
! e1 p7 ]( b; J8 R  B( K/ Q" H; U7 e0 _- r2 {7 A

6 B/ L: C  j1 `, e9 [
访问getRemoteUserIP.php,结果如下:& w# ?2 T9 d+ e8 F$ K, }
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

! A) B1 A$ w% _3 `
4 b: u. _/ }  ?7 Y+ d! X4 v
二.通过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
& i9 A) U7 Z4 `8 h; P
2

  U! S- n4 x2 T0 C/ e7 Z
3
) X0 ^- W  J) W1 [2 t
4

5 p; A5 a( w$ O) y- ]4 M
5

! u# N9 E$ Y) C1 ^8 F
getFor.php
$ T2 p3 g. U% v- f3 u  i7 L<?php% R. h2 m8 l/ W2 S' q
    $ip = getenv("HTTP_X_FORWARDED_FOR");
3 W3 v0 u6 a5 K% T9 g/ J) f: f    echo $ip;
0 Z1 I- f3 s6 K) J1 F0 S1 t?>& Y# M) B4 A) @( ^

& |' m! u% A, s
. J/ ~( q1 N8 \* _/ E
访问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.
* z% J1 p- c- B1 L' x
: G/ y1 K0 n# f: o# d
三.使用nginx自带模块realip获取用户IP地址/ |! e' e5 l2 Z& k: P6 D) j
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
0 Z/ w. Y* H. @/ x) a

' E- t4 l6 W% L# J
真实服务器nginx配置
1

* B8 l( `6 j( j' E' D6 `. O
2

0 Y, ~4 @1 Y* U% N( o* Q
3

+ |/ W' k2 y$ L  x
4
& s. R+ P. q+ ?" l( v8 [
5

4 W& I" f- t. N5 F
6

* ^+ A& ^2 }! l) f2 ]* `
7
  C! D/ p: Q) z& }
8
) F1 h% D0 Z' R+ i% D* W' \
9

* _& X- {1 l2 a4 Y
10

4 q: w! S  q; q0 w2 M4 ~
11

' e$ M8 v. M% b6 O3 l
12

& C/ g' A* b$ q2 j+ S
13
7 s& K' {. ?0 L
14

6 h- O9 Y$ z% I; _& d/ N8 x
15

! |& v8 {$ o8 W& J
16

' t& y$ b# n( @- |6 t
17

* f! \; i9 @* \8 w" t$ M4 n2 `3 \
18

/ s1 i1 @. m% G$ s
19
$ r' g' \/ F/ C$ ~; z7 f
20
( O6 ~' M* T, P! N- a- \  k
21

4 y4 d: U1 e% ~/ {# \8 D
22
9 n9 z! A0 S, r5 \( K4 X
23

' F1 m. [- X8 x( b
24

! G0 A4 y. \4 s7 I
25

: W6 s  n; y( N& `5 c" z
26
* C6 W' B6 T5 J/ F" G1 x& i
27

3 o$ D5 B5 J2 J& t: B" @* R
28
  I. E7 C. F2 A% H
29

* ]% `4 P2 b6 p' \. J
30
. f7 K: [( H6 z  K6 F+ `
31
" V( K6 b9 [) H
server {8 B* z0 \: |; }4 J' h  \
        listen       80;
; i! C* v. Q* Q$ I2 N        server_name  www.ttlsa.com;
/ W! @- ^) h8 O+ b" C' J        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
$ u& C& N' L+ y  
' v) F! {$ X7 P0 q        index index.php index.html index.html;
9 M6 ~+ K% ~! h$ @. K        root /data/site/www.ttlsa.com;
$ I% }  h5 Y: t; \$ O5 ^0 v  
, Y" s4 |6 Y5 {! Y1 W0 a' i        location /
& u$ c* S4 t; E! F& ^; i5 t0 d% j        {
: l$ c* h+ ~/ n% U" a# y         root /data/site/www.ttlsa.com;1 u8 k" y9 L7 B) l9 c. k
        }( Z( K, k8 m' f! F9 Q' _
        location = /getRealip.php6 B) b9 u7 s: F6 t% m4 a) z+ q7 E
        {4 W; }9 E" v6 p8 d0 @) T. s2 E5 s+ q
                set_real_ip_from  192.168.50.0/24;
; Z; ~- {2 h2 l' |, U                set_real_ip_from  61.22.22.22;9 L( ]1 W# I& z0 q* L
                set_real_ip_from  121.207.33.33;
- Q  w7 ?% k0 S4 L- o. P                set_real_ip_from 127.0.0.1;
" E( H& J' i1 z; {- `1 [                real_ip_header    X-Forwarded-For;
, Q1 k+ \; p9 M/ e( j                real_ip_recursive on;3 l5 O1 B8 L  b7 m# X0 y  L
                             fastcgi_pass  unix:/var/run/phpfpm.sock;$ \7 o  J0 I+ B- u) X
                fastcgi_index index.php;  q- c7 r- D1 K- H0 W. R
                include fastcgi.conf;
8 a4 @" I6 \2 K0 n& u        }3 v2 _8 R( T8 c* w9 F
    }
! B; Z/ J1 S" A& y" U8 r, U6 k/ L. @. ?8 c1 l7 E  H0 L
getRealip.php内容/ i( D! T. W; Q. f- J; M6 x
   <?php  
; ?9 ?) \" h9 Y6 X2 G% \/ o/ }5 {         $ip =  $_SERVER['REMOTE_ADDR'];
& c3 [2 |( @/ b. T' C: E        echo $ip;    " C5 J& n2 f  V" Q* B: a( q) Q- k9 ^
    ?>
# `5 D0 M  p4 L( ~. v* ?. J! q6 L2 V. a
9 w; E' r  d6 v" |3 l
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
: s* N7 j8 x, e6 q访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行* \( t7 B3 p; T( V, b
real_ip_header:从哪个header头检索出要的IP地址$ s) l) a% H! t/ W
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:3 x" F+ l+ {* z8 S6 E0 S: k
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
/ n- s. \  |- x" \; N, n2 m. T在real_ip_recursive on的情况下
4 P4 I" ?; q6 L# d4 T61.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或者不设置的情况下5 G8 s- R7 N. ]) D  c* h+ ^
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;

) _9 a2 y; I2 T# `) N% Z$ d
访问结果如下: 121.207.33.33
- U  `% @/ G9 m+ r
( u3 _) d* w( L9 v. ^6 y: M. E
四.三种在CDN环境下获取用户IP方法总结; r4 a0 p! D" A) ?6 R8 A# f9 v
4.1 CDN自定义header头
1 J9 M) m! x+ Z: @+ U优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
% y0 H3 z2 o( a- [: g缺点:需要CDN厂商提供
* o0 \8 {/ |# }- Q/ e
4.2 获取forwarded-for头
  N: O: J* z0 v6 u; ]优点:可以获取到用户的IP地址6 O' ]3 A' g: _$ n& T, b/ A
缺点:程序需要改动,以及用户IP有可能是伪装的
; s) w. r3 H$ d* _2 w
4.3 使用realip获取
- G) m0 g1 i) @: W+ I2 F! p优点:程序不需要改动,直接使用remote_addr即可获取IP地址! n, _8 C& L) \' x+ @& A
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
. W) f; L% P) j) _! f8 ?5 K/ P
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-29 05:05 , Processed in 0.047180 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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