AdvertCN - 广告中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5G广告专用虚拟卡/U充值/高返点皇家代理IP⚡️#1性价比⚡️
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
⚡️AdsPower:安全不封号,高效自动化⚡️E.PN 虚拟卡⚡️FB BM不限额,短id账单户BINOM TRACKER 60% OFF!
比Adplexity还好用的Spy工具ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理虚拟信用卡+独立站收款
全球虚拟卡, 支持U充值Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)
FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)⚡️TikTok企业户,bm户,账单户提供TK企业新户老户、谷歌新户老户
FB虚拟卡⚡️消费越多返现越多最大欧洲Nutra网盟BA找量优质住宅/移动代理/高匿名/高性能TK白名单老户|兼职广告可投
⚡比特指纹浏览器+云手机, 4.5折起T3NZU:定义应用网盟新时代FB个人号源头服务商寻找顶级电商?AdsBranded等你!
TK老户/国内外端口/预审/加白广告位出租8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构
查看: 6184|回复: 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

3 N' C& h: H: g4 Z9 V
proxy_set_header remote-user-ip $remote_addr;; X9 r: S* X' W7 i6 ^* m& |

- A$ e! Z! K& I0 e  i! M  n
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
. ?1 I# V/ ^2 L' ?怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

) |8 x9 I6 y& t& J: ~
2
* `" U% Y# L8 ~
3

) x. J# g( L6 h; [6 q2 e$ m- p' u7 d
4

, s" B8 a6 I. d( y) p8 O0 l, }
<?php
, K! j1 l8 }  u. I* R9 H    $ip = getenv("HTTP_REMOTE_USER_IP");
0 x, y0 m6 V8 v; `( _    echo $ip;   
( p( e& S) z6 a7 [: `?>
( ]* ~& _6 K2 i" W+ u) M4 Z
) ^: y! F% P3 u2 g/ u

$ ^5 C2 c. Z6 i$ Y0 ?
访问getRemoteUserIP.php,结果如下:
' s* l! e: W4 @  v
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
8 j+ P7 }' `* f. B3 v. r

- |# y# X: \) N0 ?
二.通过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
. C( C+ O: X3 G2 C  Y( ~
2
2 h4 `) K- {: m; D
3
& P9 ~! [+ g7 z* c% K/ h5 O
4
6 a8 p( x) r( R2 d4 d0 g) ~; v, N. I4 }  r
5

. t" q/ K9 ?% n5 s0 q
getFor.php# k/ `8 \  G& l+ r4 e% c' }4 g
<?php6 f  q! Y1 m% E2 D* j. o; {: d
    $ip = getenv("HTTP_X_FORWARDED_FOR");
2 k& G( U  g5 P& j( E3 F, V% ^    echo $ip;
3 e9 z6 f4 u  u! C& F+ H?>6 U4 Y1 |  @( ^- T; s- i

3 \9 V# B* K* W/ J' ?
" W2 m, R" \/ w9 H: m0 q& k1 X
访问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.

0 ]1 w6 b* L( c# t
7 k+ @+ H3 S, r3 n+ B8 P
三.使用nginx自带模块realip获取用户IP地址
) ?+ H, S2 H) f3 u) o* \
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module6 f. `2 [8 x# @" p' W1 P& r5 D
1 J; T+ P/ a  H7 B) w) l7 \) ?
真实服务器nginx配置
1
4 {% d0 d2 c. t& ~. v# b
2
6 l# j$ L2 M, f8 G( w
3
  O7 C; i4 o) w  W; Q2 B; k3 M
4
, l3 ]7 S5 H! G9 Y. ?0 f
5
! |, a, o! F3 D" T' _
6

& W8 x* D" U2 R, t+ g  i$ `
7
! d5 _9 F- e5 |) M& f3 J! f
8

1 J2 _, X% y& z2 e  ?1 |+ S
9
, p/ B, }. @5 W/ E  j
10
" V' A% G: a% C. g& }
11

+ H# N7 D* t5 H: b) a
12
  g! f, l# z, V) K5 Y
13

& z3 @- N9 F; \
14

- G, P5 B$ |$ t& y
15

9 M) E/ y& G8 |; S; u* W. S
16

- V$ b0 Z; D% N
17

8 U8 q4 J$ h5 {6 R/ d0 J' d
18

9 c0 b" v, X0 z9 V/ ^
19
, `3 y: T6 l' L$ h5 G
20

2 Q" ~# W/ T6 o1 z) Z2 a) F
21
1 o5 O& R8 q: |0 E( A. G
22

$ _0 d# M7 k7 w) [
23

% m$ J, t: s  J  U# o4 Y
24
3 W3 F+ q5 \  T7 c  W" l
25

6 K8 Y) |% |2 I: j5 |& W8 J
26

7 K) c, T, z- F/ v( a
27
1 S5 W% e- j. T( l9 L
28

( a/ c5 u7 y; C2 `9 {
29
9 g/ ~$ h$ v0 b  Y, L4 |5 Z
30

) n* V# P, v  p: h0 n) K5 c2 T3 p
31

2 M, O; ?- J2 {: D) T2 V
server {
: z: A; H1 u1 M# g, ?. P9 t        listen       80;. n; @$ _5 z" I6 w  Y% B1 k! n% Y
        server_name  www.ttlsa.com;  e2 B7 u! n7 P
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
! ^1 L0 n) A) P  6 f8 U- A/ k& \7 t0 d: e4 s. R9 B
        index index.php index.html index.html;
- n/ a! K1 E# I* i. l        root /data/site/www.ttlsa.com;
: }7 W: K) ?8 f5 Y4 A5 S  
7 v0 W0 U2 j5 E- o7 D$ y        location /
/ K! v# U+ ]* w6 B1 f+ U        {
# j$ i- @2 P  J) e6 [& c         root /data/site/www.ttlsa.com;9 \: ^; N# X" x1 k8 Q4 h8 _' X, A
        }* I4 s% z) j5 m7 S
        location = /getRealip.php
! }5 ~7 p2 J; d* R' q# E        {, O$ i* G& r& t5 Y
                set_real_ip_from  192.168.50.0/24;
! i% d4 z4 a7 X  h                set_real_ip_from  61.22.22.22;
% X# Z: Q& Q& h                set_real_ip_from  121.207.33.33;
" F, h. q- h& T! y/ O7 }5 a2 p                set_real_ip_from 127.0.0.1;
% b* A* |0 |. _5 @                real_ip_header    X-Forwarded-For;7 ^3 z3 l% U0 c8 c& V+ Y' T
                real_ip_recursive on;# B; S" W* w) I( e2 o* ^
                             fastcgi_pass  unix:/var/run/phpfpm.sock;3 ]- ?# V  E, t
                fastcgi_index index.php;( {$ w9 J& r/ Q
                include fastcgi.conf;
- _$ B2 b  n; q; b        }
: A+ U  c" a/ y, F: q8 a+ J3 b    }, k, G6 i! S) Z' C& o+ P9 n/ l1 k
* F/ p1 P& J# D+ k3 i) u
getRealip.php内容/ W" |7 R, s' h$ o
   <?php  * j/ A) j2 h- b7 B; `
         $ip =  $_SERVER['REMOTE_ADDR'];' y0 S- N/ u8 W
        echo $ip;   
7 j: S( ]  i% F9 _- R/ N    ?>
8 Q  F1 Z+ j" {$ x2 b8 K/ b4 M1 m" a4 c7 y! d/ t4 `/ x
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off* g2 H) x( @& k0 t
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
9 N# w( ?( f7 J" R/ @real_ip_header:从哪个header头检索出要的IP地址: U/ R. C( i! S0 Z$ q
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:2 m: j8 H4 _6 L) ~" Y
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121  N* B: d7 y. ~/ I$ v
在real_ip_recursive on的情况下
5 a5 m. u# [8 o1 A61.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或者不设置的情况下
: d7 X1 L- I/ I2 [" N192.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;
% L; v( C" [( ?
访问结果如下: 121.207.33.33

& \  |; |; T8 q# Y* ?# R
; Y* a* P" K9 g: I5 P+ P  p! I1 d
四.三种在CDN环境下获取用户IP方法总结
9 O, e" l6 L6 }  [6 i" }
4.1 CDN自定义header头7 [# `) b# H* u/ S8 F" V
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP) @& [4 S% _1 ^' w5 M) R5 V3 S
缺点:需要CDN厂商提供

# p% g" A( ~% b+ {" g3 S: t& H
4.2 获取forwarded-for头& i, k% ~. Q6 O# d
优点:可以获取到用户的IP地址7 {4 H  Q+ W  K4 N2 g) R+ c" ]
缺点:程序需要改动,以及用户IP有可能是伪装的

# {; n" S& f: e9 x
4.3 使用realip获取
. u0 n) d5 c5 x/ u优点:程序不需要改动,直接使用remote_addr即可获取IP地址1 j$ y" }* z0 C$ v8 ~2 w
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
2 U) w* [) c+ E1 `% o" B  ]
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 22:16 , Processed in 0.044381 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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