找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5G广告专用虚拟卡/U充值/高返点皇家代理IP⚡️#1性价比⚡️
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
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企业户源头最大欧洲Nutra网盟BA找量 FB高权重耐操个号⚡️稳定过审GG,FB,TK, 欧美源头, 欢迎合作❤️
FB企业户海外户,授信户,TK加白户联盟收款/海外资金下发/服贸结汇✔Taboola海外户源头9千万住宅IP-低至$0.3/gb✅静态$4/ip
广告位出租虚拟卡返佣1%,国内持牌机构  
查看: 6532|回复: 0

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

[复制链接]

124

主题

221

广告币

313

积分

初级会员

888888888888888

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

2 N" [& T" @$ {5 `  v% [- [
proxy_set_header remote-user-ip $remote_addr;: A2 |, M0 j: S2 m  z3 u. _- i" s) @
( e$ A; P" N# [4 j
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
  r2 D4 C* V1 y1 `怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

' ?, D" ^, \/ B5 g8 t7 T1 v
2

$ F0 R+ J6 Y! G2 X& e& i; t  f3 `" J
3

+ R! t2 Z+ C( R# V: D$ ]
4

& p4 ?# M$ V7 ], n! M$ F
<?php
2 o. s/ D; V+ k; r7 G    $ip = getenv("HTTP_REMOTE_USER_IP");
6 U* j* F" K4 _0 F- i: L    echo $ip;    1 y, D, }/ Y8 t" B1 H
?>! P1 @5 G( T' ^3 l* \, V2 u! v" m

6 O* }, S. F' ~( K7 _4 P
$ A+ l) o7 o  ^4 y7 ~
访问getRemoteUserIP.php,结果如下:9 z8 U7 r* z0 T/ R! ]3 X
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

) c+ C* R/ ?6 D$ k2 T* Z# l
  Q: T$ l. M( v$ C4 q& c( 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
: r+ j# W/ f' t0 K( J- G  E
2
: |# ^8 ^; ?. b1 V
3
: k0 S  R6 l$ j* t- e$ n
4

/ i7 z( Y. V" o9 h% Q% E, C
5
& B( |0 e6 A" \$ K9 J7 m% ^3 s( ]
getFor.php
  m, p7 Z0 d. y' w<?php
9 O/ w7 G' U; z& g: L0 R    $ip = getenv("HTTP_X_FORWARDED_FOR");" j2 b8 U$ i/ R# C. a
    echo $ip;( |, e- e# g9 a& D& l
?># a  K  t! ^) X, P! ]: _
! \- z4 {, p) e5 F

4 m* V9 [6 X' k; G
访问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.

& `* e- p0 k( i2 b* t9 _2 D: P
; l( w6 |- M4 ^* b$ W: h
三.使用nginx自带模块realip获取用户IP地址; a$ T) ^+ \8 ^; x6 k
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
% ^& P. p0 r" E; \. V3 m7 W* D

) K. c+ ^, c4 N; X1 C$ d
真实服务器nginx配置
1

! ?, c* X/ R% q2 b( ?, j7 k5 I7 O" x
2
0 i  v$ C% h8 q8 X7 ]& {% F% G
3

! a3 u5 b/ ]+ G
4
  d  b5 L( w. K% g
5
6 s2 q8 R' j4 _* X8 o% u
6

$ N0 p1 K- L# f
7
3 }+ |' ~  s: Z3 u/ ^6 H& W' \) b' ~
8

- d8 G( ?% V: W* n; O* B
9

* g( U: V0 n( a8 S
10
( S3 V* C( ^/ x7 `1 \
11
' e" W, G( @- g9 `% a
12
7 {% M2 }+ d6 s' r
13

$ t' f9 f& s8 i7 ^/ D6 h$ a
14

! V* k. Q  J" E: W- e
15

; S8 ?! P6 g( d. U" b* P: v7 r
16

' D9 c# h, n: }; t
17
9 E5 y+ ]+ M' k* A* Y
18

5 ^+ Q) }# D, R' d1 C$ P4 A
19

* R/ q. O0 z, g; o$ u. k' g3 s
20
* @# t6 N: A$ G+ v* ~) n* t! A! o; s7 \
21
- ~4 s* v  r! ^
22
! E+ g! N2 P+ K* g- t$ }1 w6 `
23

+ V8 A5 C# `) `% h7 g
24
# I/ h1 L, f. C" [1 K2 U! d
25

# F( a) S7 P4 U7 n/ v: v; N% j
26
1 h* L! G" ^, @9 W
27
4 ]9 X7 k5 _! M' J
28

/ D: t) Q0 f2 H4 U, c7 r
29
9 Z+ s: G8 ]# _8 ^& [0 X9 y5 v
30

& w+ V7 f8 l  F' U3 A9 V9 W8 n# K8 ^
31

% b$ w0 M: Z2 c; h$ G" z9 J) }
server {
+ p8 a- l  Y6 ^& }+ Q. Y2 z        listen       80;, a; y% e' e" a- H) l
        server_name  www.ttlsa.com;
) W1 Q* C3 ?. D3 T$ K        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
7 A% a+ [7 T$ K% e2 Q5 \5 N  ' \' n" }/ @  i' Z) o  A
        index index.php index.html index.html;
, w. O" Y0 F7 \" i5 A' Y2 N) a        root /data/site/www.ttlsa.com;* m! I. Y- _) h! d, x
  
) \1 r+ A- p' D- j5 W+ `9 [        location /; d6 l/ {; N# k  A/ W# i) Z
        {- q3 b; T& v, ?" P, j' \" I! E
         root /data/site/www.ttlsa.com;
- {. {+ f1 q( i        }
2 `- Y; B- t5 w" }* J        location = /getRealip.php
, j7 \# v" m6 p) ]( r        {" y) m5 J$ ]# O, Z- {1 ?
                set_real_ip_from  192.168.50.0/24;
9 m0 K% o2 v& c" w! p1 X                set_real_ip_from  61.22.22.22;
* a; o  O8 _# P3 g: n& H                set_real_ip_from  121.207.33.33;
/ n' ]& z; j0 r' p* x. D# e& y                set_real_ip_from 127.0.0.1;
, E1 i/ p7 c$ K. G                real_ip_header    X-Forwarded-For;
! Z7 ^# u. X& k( d. ?9 _                real_ip_recursive on;
* S1 _0 d' F! a5 E$ w: ^! R! g                             fastcgi_pass  unix:/var/run/phpfpm.sock;3 W. E1 u+ s6 j
                fastcgi_index index.php;
) Q$ V- t% E/ c; F, _+ y/ c                include fastcgi.conf;
3 k& n8 c( r5 N4 L' F- H: j9 a        }/ n  ~) a1 M1 j9 _* `4 [( t" `
    }! O) T3 e7 F, w/ `: ^1 |. {

- ?) c: n# I/ C7 qgetRealip.php内容
7 ^8 ~. o/ x9 z$ z7 r" D2 ?   <?php  
4 Z( N5 d0 v1 Z: N$ J, \         $ip =  $_SERVER['REMOTE_ADDR'];
0 h6 \6 H% B3 j% c9 a) M! K        echo $ip;    ) z/ {2 u/ |- h. i! I
    ?>0 V3 t6 C0 e- j. G/ V

" E& @/ @2 E$ B+ m9 g7 i0 ~* O3 _
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off. B3 j# H/ O4 z4 l$ s# ~/ y
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行% W) k, y# |9 R& I( r7 M
real_ip_header:从哪个header头检索出要的IP地址
5 i  }$ Q% a* n% ?& B# D1 A9 @real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
5 v8 {$ W0 |4 u: X  |- I- _& T120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
$ K5 j1 {  h* y* J/ v5 c+ \' k在real_ip_recursive on的情况下
6 k5 |% f" ]; Y6 [% [. p61.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或者不设置的情况下4 F7 B6 Y' @9 q
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;
' E$ D6 h$ q1 f/ c: e
访问结果如下: 121.207.33.33
  w8 R' F7 M' w4 r  x& b

% W, z2 N$ V1 b8 X& H8 z
四.三种在CDN环境下获取用户IP方法总结- M) ]8 A) o: P" H$ \' X
4.1 CDN自定义header头
6 r; z% I  l! g, r优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
: }/ r6 ~; E1 K1 P/ b缺点:需要CDN厂商提供
, q( @% B, e8 f! l$ p0 a- B4 |
4.2 获取forwarded-for头( e  e& V. p1 |& m
优点:可以获取到用户的IP地址' ~) I7 @$ b3 j$ K
缺点:程序需要改动,以及用户IP有可能是伪装的

8 p0 B& e$ i9 E; j" [/ O- G
4.3 使用realip获取
; O1 |& z" b1 I  p优点:程序不需要改动,直接使用remote_addr即可获取IP地址3 D$ A( z+ T! ?* }+ p8 ?; N
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

  z  J/ B2 L  O1 \0 y& }; F
相关帖子
vpsjq.com   
surveypayoutwatch.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 11:25 , Processed in 0.080170 second(s), 22 queries , Gzip On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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