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 虚拟卡⚡️FB BM不限额,短id账单户
BINOM TRACKER 60% OFF!比Adplexity还好用的Spy工具ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理
虚拟信用卡+独立站收款全球虚拟卡, 支持U充值Facebook 批量上广告尤里改 - FB 稳定投放
免费黑五教程(持续更新、欢迎交流)FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)⚡️TikTok企业户,bm户,账单户
IPCola原生住宅IP⚡️$1.8/条双ISP提供TK企业新户老户、谷歌新户老户PTM虚拟卡[全新卡BIN+高返点]FB虚拟卡⚡️消费越多返现越多
最大欧洲Nutra网盟BA找量FB稳定代理/住宅IP/ADV50打五折 FB个号1块一个寻找顶级电商?AdsBranded等你!
TK老户/国内外端口/预审/加白SX.ORG 高质量代理⚡235+ 地区GG,FB,TK, 欧美源头, 欢迎合作广告位出租
8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构  
查看: 6217|回复: 0

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

[复制链接]

122

主题

199

广告币

291

积分

初级会员

888888888888888

Rank: 2

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

' Z5 F% o5 r0 ?' h& n6 z  @0 Y* l( E
proxy_set_header remote-user-ip $remote_addr;% E* H3 |: z; w. V4 \
$ c' j4 ?% y4 ~0 N3 B8 H+ D
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,; T3 P, o. `& c# a
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

4 d+ b9 g5 m* c
2

" n0 l" T- l8 ]+ e; {% R! z1 @
3

3 k& {8 l, ~8 B' q! ^
4
4 @: a7 K" Y' {3 d8 J5 I. k8 J
<?php; J) z2 ^& g0 W$ H; @, H
    $ip = getenv("HTTP_REMOTE_USER_IP");: T5 n2 u3 a+ X9 s
    echo $ip;   
* i  O( e2 M0 n2 i5 W?>7 D" n  F$ q6 I2 H7 V6 r* U& w

9 h$ K* P7 _- q# A, [  k9 A- k  z

# ~) J* x5 p! S. E3 @2 C+ F
访问getRemoteUserIP.php,结果如下:
3 }1 h% K3 u" V% ^$ N0 P$ A# P
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
. i9 f0 ]4 f  H9 H9 \; d& A
' b4 ]2 P' R8 U/ e$ _' J" q! \
二.通过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
( l+ _. c3 C2 N; O; K
2
& ^* D% l; Q( _6 I; M1 r0 y3 @$ y
3

/ s  E" }% l& D; e* P
4

7 p2 k( }& }/ B4 I/ b, x8 N
5

  ]' v5 R0 ~1 q+ U: F
getFor.php
' w# K% o. |5 v3 b8 J/ h0 B<?php& U' {9 Z/ k. c: u9 |0 c0 S
    $ip = getenv("HTTP_X_FORWARDED_FOR");
- L3 Z( c; A- d5 G    echo $ip;6 C6 a* A2 W. Q+ F
?>
5 F& _7 i! _4 R" X* d: y
$ B* Q' I. m+ j% L) ]
4 X' v4 Y, Y  N8 v
访问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.

9 m" w9 T% Z) u8 F7 u  A

" W; p! X/ D7 w
三.使用nginx自带模块realip获取用户IP地址: \5 ]7 E; l, S' w: e6 A1 g
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
( e& H" v5 v% l7 q8 h2 }

' R4 u9 ~# Y9 p) a6 v8 o# n9 l
真实服务器nginx配置
1

) a: w& o6 e( U" A- }' x' U+ Y
2

5 T! p7 L' f3 T3 m
3

, |( \( l' q7 _8 r' P
4
5 D" E2 t5 F7 b/ M
5

; \2 B/ [- @7 l2 g" W
6
- I" ?* b4 N. Q3 I
7

% [+ i) V' ^! P; ^$ ?. v
8
3 g4 G) Y9 R8 Q3 X% Q4 `5 B
9
! C, P. ~9 s" Q4 ^* I
10
  r( R! N/ h+ m- b7 f) l" O
11
" ~; ?8 H' P6 S# N& O0 ^1 q
12
$ J" L$ N7 U: r/ `
13

) X% p/ Z1 r+ ?$ h# Q; E* X4 M6 z
14

  o8 N  L( E8 N4 C6 w0 B
15
2 Y0 O8 j, G& M8 `! b
16
& c5 K1 g# B( Q; g8 Q- `
17

# F3 n5 v# ^# \4 |+ V$ M; c; C
18
  t# O& H! Z( d. Z
19
9 O3 m7 Q+ z) V: s( g
20
0 o% o5 M& s& X7 _5 ^  D" p
21

6 k/ W+ h: D/ z/ S/ x: G
22

+ j, R* n# S* W* h4 A9 M: Y9 R
23
6 C0 h, ]' a' c  _8 ~& |
24
! ]1 D1 O: h" y
25

$ S* q. o- c" l/ T) @+ o
26
0 A1 J4 N! K, }2 c! t) \" g
27

. W$ W% n* l  B. o, U
28
# J; A+ s$ B: A# u# d. T
29
9 c) w# n4 H* S
30
8 R- {& f  a  O; P) T
31
  m9 q8 m  r/ ], F+ r: D
server {/ v9 {! h7 t$ {
        listen       80;' j# q* d& f4 H' x: F
        server_name  www.ttlsa.com;
7 {7 ]" J  e. _9 ~5 v- c+ m        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
' G5 P4 D) a9 f' }- T4 {3 p  
* t$ U1 U: p5 U        index index.php index.html index.html;
! U9 E3 u9 v! [, I# ^3 }) u" R        root /data/site/www.ttlsa.com;
' t1 Y5 y! n+ y7 g  
! f" N# n3 W' |" l: P        location /
- u$ J/ Q8 J, x2 k( Q7 B; T        {
! L: S. h5 H! T2 U1 Y         root /data/site/www.ttlsa.com;2 g/ J/ ]( L* r, d3 b' S% y
        }5 R7 Z1 h: x  B2 `) p
        location = /getRealip.php( [* p% l( U; }' K, f* x
        {% _$ r6 n: O: p" C. i
                set_real_ip_from  192.168.50.0/24;
) B0 ~9 c' \' }" V! C+ Y                set_real_ip_from  61.22.22.22;
0 n" c$ W* _$ ~; |" F8 v                set_real_ip_from  121.207.33.33;
% S% M5 z9 o% s% f% g! c3 d7 ~; r                set_real_ip_from 127.0.0.1;* w+ W0 o( x5 g7 ^% t( z" l4 C
                real_ip_header    X-Forwarded-For;
$ B3 P' D! C/ r; j1 |7 K( T                real_ip_recursive on;
" j; x7 h9 B( M4 k6 H. Q                             fastcgi_pass  unix:/var/run/phpfpm.sock;4 K# V( p& l- I5 A6 F
                fastcgi_index index.php;
0 [9 Q9 R- h$ `6 _. n1 H( `                include fastcgi.conf;
+ z* F$ y) y4 p/ J        }0 Y( q5 t# h7 P! O3 F
    }
, k, h7 V+ o# S  F/ W+ Z) J
% V0 P( [; ]- E/ Z1 ~& ?4 i5 QgetRealip.php内容( M- H9 L/ |& X+ r5 \3 N) A
   <?php  5 [- x7 A' I# w0 U4 t
         $ip =  $_SERVER['REMOTE_ADDR'];
- c/ I9 L3 K$ G9 \) a( V' J6 d        echo $ip;   
. [+ X4 ?7 j1 L7 t0 a( Q    ?>
; j1 x/ b3 @: b# R( {
# V6 _  e* W2 [
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
2 ?5 \: H8 ]7 I# m% W访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行' G; F9 @- n( }
real_ip_header:从哪个header头检索出要的IP地址
: a+ D% e, [$ b! J' o) V) O; U" K4 vreal_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
( r2 w; l+ {+ P6 a120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
/ C& D# A# S& q: I- _' ]8 N在real_ip_recursive on的情况下
, ^0 G6 ?; O3 u4 {( L61.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或者不设置的情况下" A. _. {: j6 ^  p7 r4 y% @" e
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 A0 ?# b% Z5 [! \: j0 ^
访问结果如下: 121.207.33.33

( H. V, e. ]' C
6 Z& O9 t" ~  @6 K5 u$ S9 v! S3 J
四.三种在CDN环境下获取用户IP方法总结8 M) n$ `# y; I4 o2 [# p
4.1 CDN自定义header头
4 S$ y: T  V# _0 Y% O5 o0 \+ w优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
/ i, H% n- h; @' _' Q缺点:需要CDN厂商提供

/ ]) X$ r5 N! v$ P% k1 |% l0 K# ~
4.2 获取forwarded-for头# [5 R5 v* e, O( F: Q3 _1 o. ~( ]' G& [+ d
优点:可以获取到用户的IP地址. P: n6 W! k. v. C
缺点:程序需要改动,以及用户IP有可能是伪装的

: G# u# B, S8 H1 D  M
4.3 使用realip获取' n8 g) |2 H& c8 o
优点:程序不需要改动,直接使用remote_addr即可获取IP地址, `7 ?6 u/ M4 y' r4 T! d
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
  \2 m# `. `  n0 t' p
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-29 01:29 , Processed in 0.045882 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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