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%,国内持牌机构   
查看: 6404|回复: 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

# Q6 k& m( i* y& R$ l! k$ N
proxy_set_header remote-user-ip $remote_addr;; m3 j# r: R5 ]' ~

+ b: l# R, Q5 z2 H' E0 J$ }2 o
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
3 L, u- b4 @! C- d! W& O+ ^怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
3 H9 h' X& F- n. M4 |1 [* S
2
* S5 Z! [/ H6 z7 f2 {0 E
3

) ^& z* I- }1 ]9 X
4

9 F5 u, X( z6 X1 j6 z4 a
<?php
1 A! v( P8 n' R5 S9 i  I    $ip = getenv("HTTP_REMOTE_USER_IP");
3 F1 x1 H6 H7 K1 z: N    echo $ip;    1 C4 A* l: ]7 B0 z( e
?>! n! N' D0 p2 S; e) G0 f
! C9 ]) R4 ^2 l  Q

8 k5 F0 a# y6 v  ?; A
访问getRemoteUserIP.php,结果如下:
) K  D& i: z7 R  `+ H! e  T' U
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
$ k/ O- i$ p# ^% [) p

5 f9 x4 X$ v& G2 R  W: W7 l5 I$ [* O: `" 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
2 b- ^, E5 O2 `3 n% U% Y
2

0 x* P/ m$ y) Q; I# R
3
& P9 q: x$ E" e( ?
4
+ ~, K4 `5 W8 z6 H+ w! G
5

% D; G# g& g  ]& z5 D6 s) d
getFor.php
- x1 v1 D& H9 ]- R% P9 F<?php! x8 d& \* }. N; @) X/ a1 `5 U
    $ip = getenv("HTTP_X_FORWARDED_FOR");, g" x1 x8 M; x4 U
    echo $ip;
, r. b# n& V& x$ C3 u2 O4 J?>
8 i  f3 ?6 j; a
& u$ |  d9 ~% B0 f0 A# }
  h- ~- |! j  u- g  }1 N
访问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.

! M( [$ N+ U+ F: d+ E4 }
/ l: k" G: c: p  U' Y* ?
三.使用nginx自带模块realip获取用户IP地址" c3 D$ Q1 M0 [' H1 X6 T
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module" }; W2 ?0 g$ Z* C) R4 t
( e; V5 g4 W9 ?! H% g* S+ F
真实服务器nginx配置
1

' N7 I* _; @7 x" H
2
3 K% Y8 ?9 I! F; x! g
3

, k6 D, Y/ P' F$ x
4

, R/ [- |  f2 c2 Z% S1 W& [8 ?
5
) h7 _/ E0 C3 K7 E
6
- @+ X( `% J+ H) b& x  V* s
7
& Y: `3 U3 a$ i6 l' l; T4 Z
8
/ D% l# j% B! {% P
9

% O; \, S, O* ]/ S
10

4 M5 m6 A( N" R4 F( n  T9 |" Z% \
11

9 q% {( X. ?8 M2 a' U1 {" i2 }
12

# j. b2 C% F6 p% R3 E
13
3 K$ ~, {7 B' M
14

2 K6 K; K% r$ x4 ~* {
15

+ V4 f9 A$ x1 U$ @3 `
16

' r: |* |8 w2 A! c, [" V) s5 V
17
. d8 o. p, {- G4 M# t+ T* r! {
18
& s+ t8 l; h2 h8 n( T, {/ A
19

3 R& ^. b' n: |8 U/ i7 K1 S2 P
20

% A$ f0 s1 u" g8 L& O5 U0 q
21
5 U6 m& l: V% u0 @; W! a" H
22
# x6 S! E* [) s0 d! z, [
23

. X: T2 W+ `- [" h2 }- U
24

6 p3 z  o, y9 `7 `+ b) [
25
* w; V9 S: k; ?1 n
26

3 d7 N0 i) n0 T
27
4 Y" {; q$ P  Y0 i6 O& @
28

( I& L& @( b5 p, i
29
) a4 D0 I' D+ s6 i( c- @* X; q
30
+ t  w0 n4 e* V( k) ^2 X
31
. y* Z8 d0 W3 D9 o
server {
% o3 Z3 k; ]/ K5 V. ?        listen       80;
3 J* v0 n) w7 Y' J/ E        server_name  www.ttlsa.com;% e: C/ P% D% L  B9 x2 ]
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
7 \) B+ j& m- @% Q# q" }3 W& V, G, ~  
0 L) ]  O& T# ~0 `* Y6 F" q" v3 z        index index.php index.html index.html;0 g$ s7 ~7 x3 M
        root /data/site/www.ttlsa.com;
2 m- i$ a8 c' g7 x  ' J* M0 |& F6 h/ i6 h, t3 Y
        location /
1 l3 e4 B; c1 e  L- F( H+ k* E        {4 \+ |' t; x  p/ I  D
         root /data/site/www.ttlsa.com;
0 [' `9 z' q" f- g  U# C; ~& V: f+ y  k        }. W, J, C: H! I
        location = /getRealip.php3 ]0 [& l! `( Q$ v4 }# i! c
        {
9 h; S; o/ X$ r6 E: K; i* [                set_real_ip_from  192.168.50.0/24;
* Q' [" E2 ]  }( f/ Y6 Z& Y                set_real_ip_from  61.22.22.22;% g. \1 C( j0 A8 B
                set_real_ip_from  121.207.33.33;5 {. ~& k' o" k
                set_real_ip_from 127.0.0.1;
; e- o' p$ V& A' m) F+ l5 s; `                real_ip_header    X-Forwarded-For;! i: Z/ c  i2 K4 g9 j, v6 H7 N9 w; x
                real_ip_recursive on;2 M7 a( ]: m. B! H
                             fastcgi_pass  unix:/var/run/phpfpm.sock;
7 c/ A: Y- Y, o4 M7 Y                fastcgi_index index.php;% H6 ~9 P. h) L5 P( I
                include fastcgi.conf;( E2 y$ R9 G0 B! B) i; q" g( ]2 `2 O
        }
. O) y: d0 ~2 f0 J    }
% K9 K+ w! P: X  G4 Z
. ]9 R2 }- u' o  u" _1 PgetRealip.php内容0 K1 F6 g& O' K! p! i( T, |
   <?php  " f8 k8 K6 c" x$ V' Q2 u! V
         $ip =  $_SERVER['REMOTE_ADDR'];0 p% c! A6 j  [4 d( a
        echo $ip;   
! }( s! g1 j9 ^% p1 _    ?>1 b4 R% d; Z, O( f) B2 B5 {2 Y1 x
4 F- z. \" [3 R, ?2 k3 Y+ r: r
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
+ j* U& {6 s( r& x  r3 H8 Q访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
4 d' \$ @; Q  q% @* _5 i* Wreal_ip_header:从哪个header头检索出要的IP地址
+ V1 ^7 [- }9 T' vreal_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
) a1 W7 Q1 D# T) a3 ?/ E& `1 c120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121$ s4 O. _8 N) {
在real_ip_recursive on的情况下3 e- r5 ?7 x5 U- B1 S' X
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或者不设置的情况下6 Y2 \# W6 o5 C6 h5 T! l
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;

) F& c2 G2 h1 U) }
访问结果如下: 121.207.33.33

& u1 ?1 E. x% x5 _% ~7 ?
& @! C0 W8 ?4 ?7 a% [1 o
四.三种在CDN环境下获取用户IP方法总结
% I: t% ~& y5 v# J, Y
4.1 CDN自定义header头
6 S, f6 k1 Y( }) O. Z; c优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
" a3 i: O' N' F缺点:需要CDN厂商提供

% f/ d7 j& U" {- D5 ]* L
4.2 获取forwarded-for头
% I, }( b% Z! S+ H5 U4 W1 |优点:可以获取到用户的IP地址
4 Z2 }! G0 r! z/ g3 W缺点:程序需要改动,以及用户IP有可能是伪装的
( N+ W* ~! G* l* e: U
4.3 使用realip获取1 r9 c. }1 n& U1 Z3 ?# P! Q
优点:程序不需要改动,直接使用remote_addr即可获取IP地址' S9 A" i0 Y8 H$ g+ h7 I4 C
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
+ g9 F' G. k& v6 P+ p# h. h. X/ W
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

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

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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