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充值各种主页、账单户、BM户(优势)⚡️TikTok企业户,bm户,账单户IPCola原生住宅IP⚡️$1.8/条双ISP
提供TK企业新户老户、谷歌新户老户海外CL企业户源头PTM虚拟卡[全新卡BIN+高返点]FB虚拟卡⚡️消费越多返现越多
最大欧洲Nutra网盟BA找量 FB个号1块一个寻找顶级电商?AdsBranded等你!TK老户/国内外端口/预审/加白
SX.ORG 高质量代理⚡235+ 地区GG,FB,TK, 欧美源头, 欢迎合作广告位出租8500万高质量住宅IP,助力各种需求
虚拟卡返佣1%,国内持牌机构   
查看: 6249|回复: 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
: d! Y" B: f  d$ M: l/ N8 N
proxy_set_header remote-user-ip $remote_addr;
, W1 v! ^$ J3 S1 p7 L' k# m6 G
9 K1 }3 l* m) F" l$ B9 t
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,% h% A, p/ ?- s; r- s: H$ e" K
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

( f+ P* W7 g; X6 K
2
+ J0 e- W' i$ Y9 o9 K( L! D( n# ]
3

  _9 h6 ~. H; m, Q1 r, {. H# b
4

8 n! n) U' x6 b; A6 v
<?php) P: S- R# t2 u' ]. l$ m( b' Y: m
    $ip = getenv("HTTP_REMOTE_USER_IP");
% @! i; O; g: _# n6 b    echo $ip;    ; R0 H. N) A! M' T; E
?>
9 }, y% p# ~# Z* s
/ a9 B8 S2 Z3 O8 p) m/ p$ Y, V) Z
. J/ l1 F8 G' G2 R/ Y
访问getRemoteUserIP.php,结果如下:
: \- v$ l- H8 q! E- L+ u/ U: J+ c
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

: N+ R) Z; O3 Y; t  T$ K; o4 l
3 v- S: e) k; Y8 w- q5 L
二.通过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
4 w( K5 V, A' P0 c1 l/ v6 m
2
/ [! S9 p2 r( K: A7 O- ^
3
9 ~' X6 Z3 Z% h, V$ ?1 N
4
; [5 A2 b. g4 o& J5 \: l, f
5
9 @; e" g- l8 D' F
getFor.php
* N$ b3 N1 w6 m- l/ X" |( u# t<?php3 t8 |6 U6 E. F+ v4 t' p
    $ip = getenv("HTTP_X_FORWARDED_FOR");
7 L( ~5 r2 B% a$ K& I    echo $ip;
. }: _2 q, D' w* Z, u?>% }) X. v3 r/ n. {3 R

/ S& j* K# f: [0 p
/ `( ?% i! b4 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.

3 {# f8 j3 u2 y' }' D  `& m

4 H% `( O' w$ W8 g
三.使用nginx自带模块realip获取用户IP地址
: e. j& y, ~, T% e  Q7 w
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
0 n  x+ ~3 O# p6 Q8 U: F! V. U) L
2 _0 d  i' E- h, x; z2 p9 i
真实服务器nginx配置
1
' r" h4 n2 F+ P3 V
2

; m& ?2 B, }; t1 ]& A5 z; a# W
3
; s1 {- N* V! w
4
, Y2 F8 P" U: U
5

& M0 x' @0 S5 C
6

7 c& v8 W+ b8 Y5 G6 c5 [
7
, M" m; V' }  {
8
6 Z9 _6 ^0 l* ^2 a0 j
9

: x9 r" S8 Z8 k# B8 ~( V3 u! L
10
! J6 V$ s/ R, r) r2 S  \
11

  |# d. A5 X' Q1 E6 {. m( @
12
; q5 ?+ g  r+ F) v; B
13
% L6 u* _7 M6 G4 j
14
; P/ G( k% n! T% k
15
/ D' H! `9 y3 e8 G7 E/ z: p
16
9 j( B2 D2 T" x: T6 G" L
17

* ]8 t/ B3 _0 c' m0 A) R
18
& o( q  ]0 x9 r- u" `# W. q6 t9 x
19
0 A! L& Z  B4 e: D2 F
20

6 X1 ^7 T9 q3 f# v: ?' W
21

/ l+ s$ i# x0 u, h6 W0 H
22

2 O/ `) B% f5 W
23

2 i- ~3 d3 v( D3 y
24
+ s: `  s8 e- D/ Q6 v* Q3 _4 t
25

$ C& C% t# v  T' k8 R/ ]
26
+ z4 `, h  p! T. s; {/ @8 T
27
& D: Y6 \& ~/ F
28

) T) Q5 v/ e. M4 g5 N+ y, h& K, d8 X( t
29

4 m( E1 k5 ?& {8 n5 E1 q
30
& r) [& m% |8 d/ B0 D) [
31
: q* l5 J2 ^4 {! i8 x0 ^
server {
: L& I5 e# a5 e  [5 r        listen       80;
7 A& X2 g, N# O; t        server_name  www.ttlsa.com;
9 N  a! v. p! B( X& A        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;& V2 [0 |2 t$ q0 H
  8 h- C9 i7 F6 j3 P, i
        index index.php index.html index.html;
8 H* S8 s3 f/ H" m1 J: M; G& d        root /data/site/www.ttlsa.com;9 {, R% U& `: t1 N2 @
  
, h# N, B# C% I! _6 d3 r% R        location /
" a0 N2 }5 f! ?4 S* G9 v7 ^        {; I$ `8 v4 j4 y- E& \
         root /data/site/www.ttlsa.com;
! `& f# R6 ~- A. L        }
- U. L; p9 J; l' N* r7 E        location = /getRealip.php
9 h" V2 P* _0 T, O        {
5 a6 Z  b7 U9 s" I% o                set_real_ip_from  192.168.50.0/24;8 ?! G" E  c, i
                set_real_ip_from  61.22.22.22;: {* p3 [; x/ e" Q
                set_real_ip_from  121.207.33.33;
$ `! W( F% h9 m0 s) J                set_real_ip_from 127.0.0.1;4 G; S' Q2 y2 J. R
                real_ip_header    X-Forwarded-For;
1 x0 g* Y6 G) g# w' Q                real_ip_recursive on;
1 z; k5 Z  \  p! R3 @: v1 w' k                             fastcgi_pass  unix:/var/run/phpfpm.sock;
5 \5 R( j5 v+ G! m                fastcgi_index index.php;
9 m7 u% i9 R4 W/ L" ]  b                include fastcgi.conf;, t. ~1 @% [4 d9 H& [
        }
9 \5 ~. @$ m( t. W" [4 V    }
4 n' o5 A' v# J! ?* w
: x6 H9 M% i5 `2 F9 f0 CgetRealip.php内容! c: @  }: H3 _5 x# N
   <?php  
& h" U- u, g4 |! E, [0 f- Q         $ip =  $_SERVER['REMOTE_ADDR'];+ L& T# h* j) Z. t0 g) Z
        echo $ip;    1 w: K* o; @! Z  e
    ?>+ Q0 x! Y* ?% r7 C+ O' E0 {& R1 e
, s! z2 }8 q1 w- ^* r: F# `
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off) M5 Q& J7 i  b' R; r- ^! }; A9 i% a
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
9 w% m' [3 r/ @- p! t9 L; kreal_ip_header:从哪个header头检索出要的IP地址) ]% J$ d& @& h, @( y; s; f3 \
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:7 _) j- k/ B/ Q( M3 J& L
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121, @! ~  {( F7 {/ v- \& y4 i& o0 u
在real_ip_recursive on的情况下5 F" ?0 `" Y; k4 `
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或者不设置的情况下  C5 |% O( W/ \, j& P  l  A8 w
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;
. b; L2 U( {; J& p4 U8 \
访问结果如下: 121.207.33.33

/ x( I" k# [7 L# A+ P

9 ~- a( M5 A1 i7 S2 s
四.三种在CDN环境下获取用户IP方法总结
+ Q7 s# Y* j, {- X+ v# h9 C" B
4.1 CDN自定义header头6 n! ^) y# k1 |$ H6 g
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
6 r& q" w. g8 o. p缺点:需要CDN厂商提供

# b6 S8 C( ~- t- u* n
4.2 获取forwarded-for头& ]+ f" T8 b6 l$ E# b/ I
优点:可以获取到用户的IP地址! z; K' U0 P# ]' q' m' D% A
缺点:程序需要改动,以及用户IP有可能是伪装的

  `) @$ t0 d6 R. ~5 z1 E
4.3 使用realip获取2 s' _' Z, _9 F2 F+ ]8 H
优点:程序不需要改动,直接使用remote_addr即可获取IP地址" p: _7 U1 ^% O& t9 F& I7 c4 `
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

5 Y0 {  L( {4 [+ K0 s' l1 a3 C
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-27 07:23 , Processed in 0.045896 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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