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企业新户老户、谷歌新户老户海外CL企业户源头
FB虚拟卡⚡️消费越多返现越多最大欧洲Nutra网盟BA找量高质量代理⚡️住宅⚡️移动原生住宅⚡️双isp⚡️适合跨境电商
TK白名单老户|兼职广告可投Miluproxy⚡️全球住宅IP代理Top 3联盟收款/海外资金下发/服贸结汇⚡比特指纹浏览器+云手机, 4.5折起
广告位出租8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构 
查看: 6157|回复: 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
, Y  q6 d1 J  j  _
proxy_set_header remote-user-ip $remote_addr;
7 U. J! X: m& J4 K% D' v
' r! D* \$ V" d
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
3 D# Y7 C0 |3 y怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

1 L. `2 i: ^' ^3 V+ t
2
$ q$ V9 M; j% F
3

# H2 M6 p8 i$ G; _. [% P
4
6 ^0 {. ]/ {0 V( u) E6 X' @
<?php6 `3 T  Y3 g& {
    $ip = getenv("HTTP_REMOTE_USER_IP");' \+ X/ D/ F7 u+ [+ J! l- z2 q* C: ^) F7 `
    echo $ip;   
; {5 g8 C4 h, y?>
; P3 o4 h) {9 A  \/ t( z+ i( x! R& P: s" j$ T4 Z
/ N( Y9 y# M& W% x, F: \$ o% f
访问getRemoteUserIP.php,结果如下:7 M3 I( _0 G0 C$ O
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
, F+ b' S$ c0 f
+ M2 T$ R+ t# q3 z! J( J: H
二.通过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

- Q# @. ^% _  Y0 y( a) q
2

3 [8 _1 Z8 F) n- `1 K- F, J
3

% w0 W4 c  L- U+ B2 r3 K' j% K
4
# Z: p9 C- ^3 ~' K6 |6 P
5

3 B8 C# E0 g4 z  V
getFor.php
! K0 |, M1 x( g" ~! e- N4 k, W: b<?php2 [5 j* P# N/ u' B5 K( ^& R5 g
    $ip = getenv("HTTP_X_FORWARDED_FOR");
# s3 `+ l5 X$ J" M    echo $ip;+ D( w& h( O% r3 U! }  x
?>
! R$ \% b0 D9 u& G2 |( q/ b5 y' m6 B3 z- q" P. f0 Q

$ R; J$ W" K  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.
8 J$ W6 m+ ?; H! S9 E; a# N
# L3 I& W) N* V4 u# Z" `
三.使用nginx自带模块realip获取用户IP地址, e5 @, P; G7 G& Z2 M* }
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module( @/ Y8 O5 X' [4 {: O
* v2 S" P& j. Q; @3 G& a
真实服务器nginx配置
1

& ?4 y4 E' j  f' s4 s' g
2

8 J% `3 i$ r8 P
3

. n1 w2 [: z: k& v5 U2 i% \, F/ L
4

- ?( A  B) M% }
5

# N9 W5 t# x" R' S- M
6
3 h8 r* x, I+ V
7

& `/ J9 K/ r+ R* M3 p
8

- f/ S$ ^' j! W8 n' B7 m3 w
9

( G& b/ l' E& K1 c, s# X0 F
10

7 }2 v8 j: e1 Z' o/ l1 ^* A) U
11

# Z2 U( L! {) `% _6 V
12

3 q3 l4 K; R7 t
13

# U( ?( G6 r/ k$ }% b* Q
14

+ G- A2 k7 ~2 q, K
15

% l$ B: k) l" Q# p  I
16

/ i) |/ l# M5 r5 m  w
17

2 V8 C2 {7 h8 _4 F
18
8 p3 Y0 C9 v/ C6 V: v* V# T6 _7 }
19
' w2 h+ m% h' ?8 i% I
20

5 X$ v2 K* F' M# d  o8 F
21

- M, C' c1 z+ T
22
7 ~6 D( ^8 Y0 A6 _* u6 j2 Q
23
( G$ c6 ?3 F7 Q, G8 ?3 M
24
! X4 j3 [4 l6 g6 b: \5 }% C; r
25

$ x0 o/ j; z! S, I* H
26
* H6 C$ F' J# b4 i
27
' ^5 s8 c+ ]/ |  N  Z! G
28
. S0 B& S6 A4 u2 M' g
29

# O" d7 N/ s: ?* i
30
" g8 {' ]( A5 P0 g; i8 ~* p
31
* f6 d, s) z* C: U6 D2 {
server {
% F- V- O3 u' `  Q7 g' Q: L6 C9 ]        listen       80;
7 ]+ y  P" e3 a        server_name  www.ttlsa.com;$ R) [2 z8 o1 G) ]
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
" i* P; v3 M3 L! ]9 H  6 j8 ~# K. q4 u" e" d/ N6 t6 Y) K
        index index.php index.html index.html;: f. M: F$ B1 G4 D1 ]/ K
        root /data/site/www.ttlsa.com;2 E8 V$ \$ U- o4 {
  
  @( g7 W0 _( H% R. t9 f5 H7 o9 Y        location /# R7 C0 D3 B$ D) W8 {+ k
        {
! n6 h$ P4 G7 e7 X  I         root /data/site/www.ttlsa.com;
7 k- L3 j2 M$ \7 B* a; U2 W4 A/ |        }
* O$ D. l3 W/ m5 p- x        location = /getRealip.php
/ A9 X2 Q2 t7 \& m/ e8 \4 o        {
2 R3 h: c  A4 Y7 z7 }                set_real_ip_from  192.168.50.0/24;
2 I3 H7 m7 }) _1 c                set_real_ip_from  61.22.22.22;4 b& h5 O6 ]7 Y* c; s2 E, G6 n7 O
                set_real_ip_from  121.207.33.33;
: w( Y5 M# p( O0 I" b                set_real_ip_from 127.0.0.1;
5 d+ U4 W5 x! T) N- g" ?* F                real_ip_header    X-Forwarded-For;
, F( S  k7 x! I2 T3 R                real_ip_recursive on;
, n( p' r* F  S                             fastcgi_pass  unix:/var/run/phpfpm.sock;
: @/ i) _5 L) O/ E) Q5 O: |! V                fastcgi_index index.php;
( I% o+ Q, T& I7 _: `% _2 V( ]" }                include fastcgi.conf;
$ X/ T0 r9 Z/ R  B/ ?# z        }
" q# x! l* ~" S( s* A9 c    }
# W9 S7 C7 i9 o. }/ m3 W; e+ f# [4 ~' i4 c8 b0 c
getRealip.php内容5 N( _3 A, J2 h. M$ d/ z) ?
   <?php  
3 m8 h/ z2 @4 f' s         $ip =  $_SERVER['REMOTE_ADDR'];  |/ |4 \' {) l+ Y, m. b
        echo $ip;   
  G* `2 [3 r+ D) {" O/ q    ?>
, r" S( x: V6 M% l# [8 D
- I/ I0 q2 G* j' ~7 r; b; ~6 x+ v+ e. X
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off; n4 o& J" b0 x3 m5 L5 P" \& \
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
! y. P# Y7 p; ]real_ip_header:从哪个header头检索出要的IP地址5 G: X0 S' Y1 M$ b' G$ R% F2 J
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:6 n$ b) E9 i* B+ W
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
0 F8 j5 p: O+ Y' m; k在real_ip_recursive on的情况下" n# h& x  o- c' S% z; T
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或者不设置的情况下
3 T: ~8 m3 G% S% w, L$ D192.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;
6 T, X/ D# l! G  O; u
访问结果如下: 121.207.33.33
2 f1 R+ i- F$ y. F2 `3 C
1 x7 l+ l: o! b+ p( O1 o4 U$ y1 \
四.三种在CDN环境下获取用户IP方法总结7 ^' u% V6 w& J' ~
4.1 CDN自定义header头
' a. Y9 d  d) P8 s1 z& R$ }优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP' |' o6 i& o, R) l0 Q! n8 {( {
缺点:需要CDN厂商提供
1 U' G2 u# F% M- [
4.2 获取forwarded-for头
) m6 v, p0 T$ o' c1 P- M优点:可以获取到用户的IP地址/ V- h, e% ~" A
缺点:程序需要改动,以及用户IP有可能是伪装的
0 @* X- B; a3 V% N6 w2 X6 N( t  j
4.3 使用realip获取# ^0 G4 g# T  b+ I/ @
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
9 w7 V' P6 t0 t* Q缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

8 n4 @2 b/ ?  U; ~3 {: H
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-26 05:45 , Processed in 0.045769 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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