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企业户源头最大欧洲Nutra网盟BA找量 FB高权重耐操个号⚡️稳定过审
GG,FB,TK, 欧美源头, 欢迎合作❤️FB企业户海外户,授信户,TK加白户联盟收款/海外资金下发/服贸结汇域名防红⚠斗篷工具/可试用3天
广告位出租8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构 
查看: 6423|回复: 0

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

[复制链接]

122

主题

199

广告币

291

积分

初级会员

888888888888888

Rank: 2

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

: W- q: i; H+ g9 ^$ H6 {; m" u
proxy_set_header remote-user-ip $remote_addr;
- g& r0 S( {3 p$ |3 P. V6 m9 v4 `7 E3 c8 X/ P; J
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,; N6 U7 J$ v* B  y+ c
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
- |& k, {+ a3 @0 @' R
2

/ D* E! \: F2 {+ O4 e
3

6 D; |/ O* v) y& m- P
4

6 P5 ]5 [: K0 j5 d3 i9 O$ `
<?php0 c# h- E( y! I# {0 z4 [: j) G4 s
    $ip = getenv("HTTP_REMOTE_USER_IP");
' w7 t/ E4 W5 `. @: U  B    echo $ip;    1 m8 U3 ?5 G& u$ a* C# I- {, ?
?>+ j' ?% \4 O8 o8 ]% y
: Q0 |, R) |7 f4 R1 s
) [7 h7 Q: ^, L/ h+ o& p" R* q) Y" t
访问getRemoteUserIP.php,结果如下:
& n* |/ T1 I' J& U' {2 A
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

3 G6 S2 S6 I) @' c% R2 o3 s& I, l
# M1 _: x2 \( n* q- 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

# d  v" F1 @9 v3 Q' H
2

0 }+ V0 z2 X. R! S
3
( {! P! ]  H  B, t
4

0 M( }6 x- g4 ~- E9 |; g4 i
5
; p' k5 t3 n: M$ B  z$ J4 H
getFor.php
! T2 f' s! k3 G<?php  T* A. v8 @+ z7 y9 Y+ N
    $ip = getenv("HTTP_X_FORWARDED_FOR");
9 G3 p: Y# y! ?$ Q    echo $ip;8 H) i) W6 _  J8 `/ b; k7 f. w
?>
* J$ V% ], p6 `$ R+ e$ x$ u3 S  o- E" Q% O- U: u& c$ Z5 C+ M

. y7 U. g+ D6 q3 X! d' m
访问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.

% w+ A; X0 i; ~3 B" i* T

; E: m1 @3 D+ h2 f* I
三.使用nginx自带模块realip获取用户IP地址
+ X" S8 [% `4 d' B* U- D  G
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module% k  A! C& T7 _0 }2 F

$ a! @2 ]4 [( U$ t  d0 G  ]0 B
真实服务器nginx配置
1

8 G9 L- b& S- i- W0 M
2
0 s* h; F% M9 w; q
3
( I: Q( \+ x, D% ]* m" t! J6 c
4

. e5 }0 M3 W' i1 g# ^7 |
5

$ H4 x* F- Q" i% L/ r8 f$ }5 `+ p9 b
6
$ O# B5 k" v! \9 s! O; v  I
7

2 f- r' ^) J* m) N$ ?- R
8
7 G- S% l; q$ ~. m6 z. ^3 p* j* V% R
9
/ H- w" g5 E1 |6 I! X  |& |
10
* Q( C- F/ q+ S2 p2 {, ?" @$ `" N
11

" @& a6 R$ \; E9 K2 n7 y
12

# _7 L: h; v8 h5 m5 a6 y: h7 P
13
) k! R4 A1 I/ t: G$ Q/ v
14

0 E5 i. f7 }8 L  m& {% L
15

  K; M2 b3 o/ U0 b2 K
16

, P, y5 z9 ^! v
17

" h2 A+ G) H9 j- x
18

8 @/ C; y* Y( I5 V: u2 r6 X
19

* M# h0 R+ }0 v" \
20
7 ]( l+ O4 w0 z: E, s# d7 C) X6 c
21

* g: B' x, ~5 X' U+ i5 x2 N2 T8 W
22
3 l  k3 O6 g6 h) Q4 p
23
5 f- u  [8 Z2 X2 ?$ }) N* I4 A
24
; F5 \4 g, f! j& ^
25
3 B6 N- ~% \* a
26
6 V; g8 `% p) @$ Q8 X
27

/ @" t2 n% d# m  ^
28
! x8 a" F" s, ^( ]% G
29

. \7 I3 Z2 Z: w6 b4 e& w. E0 K, R7 k
30

" m- y$ [1 ?8 \% P2 R0 J
31
) S/ ?; b, A, }, B: ]
server {
: S% p- }" ?: y8 C        listen       80;4 H# q  v2 G( X4 B! a, k' ?
        server_name  www.ttlsa.com;, `1 o5 @6 `( R9 \9 Y& \
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
6 u( }$ b! l( @6 R: d: i  
# E0 n2 J! `( i$ C        index index.php index.html index.html;. \% h/ z2 ]: y. Y# N  g4 Y
        root /data/site/www.ttlsa.com;
3 k; g8 r" v8 `( W( C# p  
" d( n, h! g# o; ?9 U        location /
7 O% n0 t3 v5 `' v1 k        {- m2 Q1 {1 N3 G) O6 g. A% M5 `" H
         root /data/site/www.ttlsa.com;5 {  k2 W+ I+ |* ]+ U
        }
5 |. y+ ]/ s+ F# Q: g9 ~5 y        location = /getRealip.php  t) {, p6 N% R- z0 V
        {1 }( C- n8 A( N1 ^
                set_real_ip_from  192.168.50.0/24;
- d6 T1 g% i9 m                set_real_ip_from  61.22.22.22;
+ Q, i- d, L2 D                set_real_ip_from  121.207.33.33;4 h& k7 \. P. @5 [
                set_real_ip_from 127.0.0.1;# R/ I3 ?7 F: ^( y/ Q! A
                real_ip_header    X-Forwarded-For;
  o4 M' F  Y* B+ [4 H; l3 k                real_ip_recursive on;
0 e) U6 Z( m2 k6 B7 U6 @( f, V                             fastcgi_pass  unix:/var/run/phpfpm.sock;5 f9 k7 E0 Q2 ~9 [
                fastcgi_index index.php;7 L/ N% y5 J6 C4 k) w: `
                include fastcgi.conf;  S1 \! j; i& d8 B* ]7 I/ J, k( h
        }
, M9 x( e$ _3 b( y    }
& y2 V6 u$ d9 @, d$ X* }
0 u' L2 F% A1 c4 q$ G- G+ DgetRealip.php内容
# [% B) m% L" f" k( c   <?php  
9 u+ {. s7 r& S8 ?% \7 W" l, r1 A         $ip =  $_SERVER['REMOTE_ADDR'];" u  q  a+ S2 _1 ?! m# g
        echo $ip;    ; V; T8 |. k9 K7 V4 {
    ?>
9 ?, R' n* L. l4 q( O+ g7 u9 h9 R! Y7 c: u; y5 P
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
+ d6 @9 K- ^, ]: V3 F9 P8 v" g访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行$ w) e0 r: r- Z( P% h2 |9 T) |) _4 S
real_ip_header:从哪个header头检索出要的IP地址  h  j. J8 E) J3 ^
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:8 T9 u# V3 w! n; z0 X  D
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
& Z  J" \7 f  T* h5 G* c在real_ip_recursive on的情况下
# X) b& |' j0 e61.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或者不设置的情况下
! ]; D2 M# H2 a" ~: U192.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;
0 Y4 V8 F0 ~/ X' `+ D0 P/ s/ u
访问结果如下: 121.207.33.33
* _* a4 m# }+ `+ ?- k7 p5 C" C5 X

+ Z$ |' o# c) T  ?+ O, l$ y! u
四.三种在CDN环境下获取用户IP方法总结
8 S$ G# P" t4 Q. b
4.1 CDN自定义header头
8 R! u$ i; G. ^4 p4 v) ?, E3 Z" ^优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
; {; D2 q1 r) ~缺点:需要CDN厂商提供
+ z2 |. B( @2 c) o$ g/ }& W" _9 ^
4.2 获取forwarded-for头
; q6 h. n: F# M' l# [优点:可以获取到用户的IP地址1 e* P! ]' Y0 N2 h" j
缺点:程序需要改动,以及用户IP有可能是伪装的

& Y+ G* N9 w: U5 T
4.3 使用realip获取
0 o& [9 O9 E: t9 x' M5 F! k优点:程序不需要改动,直接使用remote_addr即可获取IP地址. ?0 G: W! W( [5 \  W' N; f) \
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
0 U/ A: l1 H" b  V
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-26 06:08 , Processed in 0.047783 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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