AdvertCN - 广告中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
 谷歌+Bing+TT+MSN官方代理 
⚡️按条S5代理⚡️静态⚡️独享⚡️5G需要代理IP?⚡️Proxysites.ai⚡️指纹浏览器,就用AdsPower
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
DuoPlus专注打造跨境电商云手机E.PN 虚拟卡BINOM TRACKER 60% OFF!比Adplexity还好用的Spy工具
ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理虚拟信用卡+独立站收款全球虚拟卡, 支持U充值
Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)FB 三不限源头 - 自助下户充值转款
各种主页、账单户、BM户(优势)⚡️个人户,bm户不限额,账单户9Proxy ⚡️ $0.04/IP, 无限带宽 IPCola原生住宅IP⚡️$2.1/条双ISP
虚拟卡|PTM星际卡FB专用虚拟卡Google、Bing官方总代  联盟流量开户fb耐用号0.01一个
fb账号官方合作商FB资源,账单户,分享户,国内一手FB企业户BM户账单户源头广告位出租
查看: 5717|回复: 0

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

[复制链接]

121

主题

188

广告币

278

积分

初级会员

888888888888888

Rank: 2

积分
278
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
: l1 [" v: T) N0 q4 N; v
proxy_set_header remote-user-ip $remote_addr;; \+ Q% `0 l4 n7 r- S) B

! E* m( H3 E& p, c
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,( `1 Q' a! q- c! \
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1

, p+ q3 J. j% t) W' }6 {/ J/ x$ u. q* n
2

0 U% K: V# q: H4 q
3
! C2 W' Z, z: h
4

$ ^, ^( I' ]7 P: j9 ]: [* i) B# e; }
<?php
8 I5 n; n# A$ M/ N: j$ K7 Q. }    $ip = getenv("HTTP_REMOTE_USER_IP");1 h+ s! b1 `' h3 x7 Q8 ^3 h! i
    echo $ip;   
6 \6 r0 J3 l, s9 ]/ l) N?>- D- M/ ?: @* e' j5 ?5 A3 N
/ S# z( l0 Z- U% W

4 C; B% U8 e9 C/ ^/ q6 U) _6 R9 G
访问getRemoteUserIP.php,结果如下:8 _" I" {3 A7 ]7 P5 N# b& v7 F
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
7 Y  \) u. Z; _! i& J7 T; m

! f+ Y8 R: W+ c; M0 O' ]" r
二.通过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
+ r8 K# `0 i0 U! X+ G3 t1 I* w
2
/ ~: m, E/ l+ @: S
3
. U# U* P' ?# S4 T$ X
4
: R; R/ V! o0 `) i1 W/ F& G
5

  y/ O  w6 o" _- u, j5 C$ X
getFor.php
& r) n6 _: [. p/ a4 D4 A<?php4 ]# E% l( ]. Z0 Q4 P7 `8 }
    $ip = getenv("HTTP_X_FORWARDED_FOR");" M: n( c$ n: r
    echo $ip;8 y- z) P* j3 Q2 F, G. Z
?>
0 ^  a- p6 W% j
  p: t4 U  F( e7 S4 \3 t: X
) L. r' q+ ?) u; g0 y' P
访问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.

. a' |: N4 Q$ v2 v9 u6 c

8 [) i+ \, c2 G7 Y. E5 K$ M2 t
三.使用nginx自带模块realip获取用户IP地址
" c0 c% f. n7 i& g$ Z+ a* S
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module" k2 @$ p: C0 I1 C; U

" \/ @! i8 _- \- S& l. F
真实服务器nginx配置
1

! K  \5 d+ C- Y
2
0 J; m0 I$ F: K' P* E1 ^
3

: F' P0 k* S/ }1 U" q
4
5 m9 p: \5 x4 v7 |
5
4 \9 G5 [, {; g* o/ p4 f; @! Y% n
6

2 P) V. z, L: t+ ?4 _( r' V
7
4 X! d; Q* l9 o, Y1 i
8
  i4 L3 A7 v2 J$ F8 U9 @) U
9

) ?9 r( G! F& N3 G* y5 W% i9 A
10

+ D' [/ Z9 Q7 K: a3 f0 f# ]
11
$ s/ A0 Z0 L8 s: F
12
. P4 v! S# c, J( r) T5 E
13

9 P4 T: O9 q4 t( U# G
14
6 i+ J8 U: E8 l" a% h
15
- q: e: Z9 R4 T4 `
16

! w& N2 s2 J) ?3 _
17
* N- {& D. s& J8 s  B, D: |
18
$ B- U! H! ^% K) a4 F: I
19

5 W" z5 V$ [6 i3 E7 k& p7 w8 k/ [
20
, R% t6 v1 R" b; v( u
21
0 ~! {* w! j3 `
22

6 F2 ?( @* u" X! f
23
9 [8 C/ `( h! M6 l
24

! n2 R& t% m* T- Q% g
25

" h( ?( r$ B9 B6 @9 L
26

% f9 H2 o! V) T+ m6 D
27
# i" Y: \# M8 H3 C( i8 q
28

) o6 _; [2 w1 y" h" t
29

/ m" i' Y9 w  K; W& c5 f  _
30
  p! ^- Z. j6 B. [$ S( a% P
31
- k1 Z1 e' e( w/ k1 e* ]& m5 ]. A5 O% n
server {0 ~6 @  {+ k9 m+ ]+ K
        listen       80;5 j( ]. R- o( Y3 _
        server_name  www.ttlsa.com;8 Y5 A6 i3 ^2 Q% I+ t! k
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;9 g) P% |  K5 o! ^. Z! s4 I
  5 g+ Q) k8 u; W( k4 N- c
        index index.php index.html index.html;. L2 B) s) a# a$ R  s
        root /data/site/www.ttlsa.com;
  ?5 Y5 S8 ?/ I) C4 O* I- N  & ~8 c! g1 f0 T. S9 G; \5 C7 D6 P
        location /* n  [; |$ m9 g7 L' V9 V
        {
+ ~4 e2 _% E! @- l) g- v+ ]         root /data/site/www.ttlsa.com;/ B& B' p! i! U3 Y- ]" o' p
        }
# R* z' G  y- |/ p  v        location = /getRealip.php
8 k; {9 v1 T+ t) u5 q        {8 k, u, _% m& q! J. n$ T1 G
                set_real_ip_from  192.168.50.0/24;% ~$ E0 u1 h% d4 R- p
                set_real_ip_from  61.22.22.22;
# Y. H7 c2 v* W) O: P                set_real_ip_from  121.207.33.33;
5 X9 `0 R7 t! ?2 N, P: M                set_real_ip_from 127.0.0.1;/ @: Q+ g) _' e7 U) ?
                real_ip_header    X-Forwarded-For;" z# Q, ]6 E7 U( F) q6 d
                real_ip_recursive on;4 Y) b5 d" H5 ?
                             fastcgi_pass  unix:/var/run/phpfpm.sock;' ?- P/ [# ^. V( j5 K* S; j: R
                fastcgi_index index.php;3 \$ c; n9 q) R0 g4 k7 o9 q
                include fastcgi.conf;
; r1 f) O% Q# [  x6 T        }
4 {) ^, T9 w# P" ?  u1 ?    }. E* l1 n+ f3 X5 R

& ~- Y  G/ C# g6 n) }getRealip.php内容  _5 `: u! s# E& G- y0 }
   <?php  
- `, I; W% P  x5 a7 Q; O. B2 R         $ip =  $_SERVER['REMOTE_ADDR'];
$ E0 q$ X4 Z$ ^        echo $ip;   
/ }0 |4 P: a. ^9 C    ?>
3 g& P. R2 k& \2 y* p$ S
0 c& x+ }6 c4 M/ B5 f( k; ^* p/ _
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
9 n& F1 ^; x' z2 i访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行- a* z5 l8 q0 \) `
real_ip_header:从哪个header头检索出要的IP地址% G5 a+ [2 i, ~" m
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
0 y! D# P" \/ c5 |2 }7 j& F120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
7 i  o. t( i+ |: H! x0 F在real_ip_recursive on的情况下4 r! m) T( s7 T  c; X2 L1 E) a! i0 G
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或者不设置的情况下
+ [# ]0 [- R2 c! `4 p192.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;
) _3 I6 f1 X6 {/ C9 ~
访问结果如下: 121.207.33.33
' W6 m1 ]6 n/ ]6 k, }
5 L! `4 O- |. U; M. [
四.三种在CDN环境下获取用户IP方法总结1 M& S: }  r# r
4.1 CDN自定义header头# q; \3 x2 W' P4 i7 p4 u6 J* }
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP% G) h( r  K9 s: v% P
缺点:需要CDN厂商提供

: c! @5 L) S1 u5 ?9 F; _8 O- u' ]
4.2 获取forwarded-for头
. M3 ?* Q# k8 M优点:可以获取到用户的IP地址) o- H% H2 z. F% z/ Z2 @- i/ ?
缺点:程序需要改动,以及用户IP有可能是伪装的
2 I' O( S/ `" x; p  u- f6 l$ h
4.3 使用realip获取# Q' V7 A7 l, B* u# q) j
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
1 {6 c& z8 y0 f! a3 |7 j0 P缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

4 m& `3 s# }; e; I: ]( Z  L7 R8 ?
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-2 04:34 , Processed in 0.043390 second(s), 13 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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