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充值Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)
FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)IPCola原生住宅IP⚡️$1.8/条双ISPFB资源,账单户,分享户,国内一手
TK加白户/二解户/FB海外户/GG老户海外CL企业户源头FB虚拟卡⚡️消费越多返现越多最大欧洲Nutra网盟BA找量
FB广告Spy工具⚡免费试用✅ FB个号1块一个TikTok2审户/老户/国内外端口/加白GG,FB,TK, 欧美源头, 欢迎合作❤️
FB企业户海外户,授信户,TK加白户联盟收款/海外资金下发/服贸结汇域名防红⚠斗篷工具/可试用3天广告位出租
8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构  
查看: 6401|回复: 0

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

[复制链接]

122

主题

199

广告币

291

积分

初级会员

888888888888888

Rank: 2

积分
291
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
/ }  N0 ^7 f# e; p9 D8 S
proxy_set_header remote-user-ip $remote_addr;3 \! l5 ~0 H& q' Z/ d* M
; T% K! a" H/ f0 U, L; M9 r  V$ |
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
# j) c; s, s# j# @怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
8 D' ~0 d" A2 D: o
2
$ p8 v& q$ M- k& i& X. `8 k+ U3 L
3
$ m& k9 ~1 N9 }$ f2 r3 _
4

5 |' w- g& o1 N+ t9 G! q: m# ?
<?php- O8 L  `- N  t* a, G
    $ip = getenv("HTTP_REMOTE_USER_IP");; I5 O" R) e) A- P$ E
    echo $ip;   
2 a4 Z" z: Z+ |4 {?>
( h, g# |  b/ x$ W7 }+ e) D) ^3 S; b5 ^7 `* L2 z2 k

/ \+ N5 u1 K" L0 C
访问getRemoteUserIP.php,结果如下:4 P3 @% g6 a+ U  q1 X
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
8 U/ n6 N0 E/ A8 b- W. h  ]. n

. P. Y- e7 r; E4 l' W) D
二.通过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

- \# p8 N* O6 D
2

5 M0 @, N* o! e; p# f
3

- J" H1 w1 V. i1 ]7 X: n
4

: ^7 O3 ~! m  Q$ M; j6 c" ?
5

. B* L5 I8 l. e# B
getFor.php/ W# \& t3 b/ u+ L
<?php. D7 q/ r! v; I8 X' f/ ~
    $ip = getenv("HTTP_X_FORWARDED_FOR");( _: C- o. A- i6 s' |, Z
    echo $ip;
  z8 u6 j/ l! Z7 Q0 U, c  S?>
2 T1 X/ w% [' t9 G9 q+ N
" @8 U- [+ A) o" D7 s2 _
) C" t: F$ q9 W
访问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.
  {* s2 p* \- K, @3 D6 ^; P
, T( @! |: @0 a' X/ i5 d' c
三.使用nginx自带模块realip获取用户IP地址! i% I( k8 N* Y0 F) O
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
/ n" O+ t- i( k! q5 p% f% \. g

5 E' n8 l- b  h' s+ u" H4 ~' P$ Z
真实服务器nginx配置
1

. `9 m! i. Y: x2 U6 g
2
. P: ~& c% L, Z; j9 Y; `8 T
3

9 ?, Q3 A6 t/ }+ j7 Q* ^+ ?+ N
4
# W  A! T" z7 I! A& `: U9 L
5
3 y) Z# y2 j. b
6

5 h3 |* v( z, m: E6 R9 B. B
7

& v% y+ d. X0 J9 \0 N: o
8

" l# |) R# C: n  U6 U! N
9

2 E4 R+ {2 Z9 F' t. f" W# X
10
+ ]% O; K$ D! c$ i
11
  L. f  k7 v0 ?4 o$ Y7 a, E/ i
12
' d. P- ~% F* `6 k# o8 K7 r! f
13
/ R7 C4 x, d; M
14
& k9 O1 q* N/ N8 J) ~
15

& Z. r. W+ `  `0 s/ r$ [8 k: r) @
16
! K" E) A+ N: h3 e# q0 p: h  \0 c
17

: @# K8 T% J9 ?2 U& K
18
9 }  y$ Q" \; i* R+ K9 \( _  ~
19

0 @3 a' U- d( t" f3 L" R4 `% v
20

3 c# e* M# K' w1 [- k( Q* X
21

% Q7 E; k+ i# i' ~- z- o
22

  |# G, f+ g- R+ i3 H+ I8 K
23
; `0 V- N) \: ?8 Z
24

6 e3 e( @2 k) ?  ]8 A4 |9 I
25

7 v3 |) f* `& F% Z9 ^$ \0 w! W6 ^
26

; L! h* Q8 S* \. J1 K
27

8 g% v/ H  v- g6 i3 Q
28
( ]7 q, X* s4 ~* H9 @+ A: ?
29
2 \, Y2 ~: V  D7 W
30

' m; z1 r, d0 N0 {5 K$ A
31

& l( K) d; F8 k  L+ e7 A% I
server {6 X$ b1 R8 v! m6 B1 P0 q: b) \- G$ C8 L
        listen       80;
/ @6 y( D& u& R& h2 E        server_name  www.ttlsa.com;
# X0 N1 m# P% h        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;1 q: V$ f7 D) d1 m. p3 h4 E- ]
  ! n% F5 g( i) T% f
        index index.php index.html index.html;8 c% F/ ^0 y; O, B0 `" d- Q9 L' J
        root /data/site/www.ttlsa.com;, t4 J; l( j& G9 ^1 v% e3 ~) d
  ; H5 O: a! Y! Z
        location /# k6 h7 \: D: [" H& r
        {
" V7 A- b: Y( D6 l% C$ G         root /data/site/www.ttlsa.com;% z) Y* V+ _0 `, W- J' P. E( h
        }
' ^$ q8 b# B! S* O4 o( V        location = /getRealip.php
! R+ o! H/ n7 J& I: z        {
; r6 ~( L, Z& u7 ]6 r* z                set_real_ip_from  192.168.50.0/24;7 x& @4 z. u1 a% f; c% l0 n; {9 w
                set_real_ip_from  61.22.22.22;
4 l! a. ^5 e( U, ]                set_real_ip_from  121.207.33.33;4 a9 h. o1 w! {3 W" P) `* E/ X
                set_real_ip_from 127.0.0.1;
0 m2 A1 H2 K7 G0 X* E; \/ @                real_ip_header    X-Forwarded-For;
' c0 r& H' e4 {. T4 D' L                real_ip_recursive on;* B' k! _) \, X+ {! G& R8 h$ ~! o" [
                             fastcgi_pass  unix:/var/run/phpfpm.sock;9 U; ^- r( Z8 m, H5 y1 k" `
                fastcgi_index index.php;. P( }, D! [$ s4 ~: h5 H
                include fastcgi.conf;
  H3 C  v! k9 h# A% K        }
( V; s5 E& \. B1 V6 s, ~    }
' U. M8 P- G0 P* r/ P& c9 @
4 [9 _) G1 w' g5 m& ngetRealip.php内容
( z) S5 e5 i% [8 J   <?php  
; n! }" F  ^+ e; W3 x2 k1 m: s( v         $ip =  $_SERVER['REMOTE_ADDR'];
. x5 X# U4 v" |4 |        echo $ip;    0 n/ p0 T4 I: f
    ?>4 V1 k# c$ e7 R$ S* W& H: ]% J2 ]3 P4 T
# C2 ^, ?- U( ?1 b& I
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
- n& T1 T! ^( p" l7 S访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
; I% t% O9 x* J' U1 n( \/ mreal_ip_header:从哪个header头检索出要的IP地址# k3 D2 s  l2 P( G" l
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:+ K# T- K2 W7 ^! s4 ?
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
$ _2 X" l: z9 m* M( z" f在real_ip_recursive on的情况下+ B- T- ~# g2 t* M
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或者不设置的情况下' W" L1 n! B6 J3 L9 d
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;

2 Y- H3 P- T$ n
访问结果如下: 121.207.33.33

2 B# A2 t3 H* ?0 w4 Q
1 e' I, w% A& S( s
四.三种在CDN环境下获取用户IP方法总结( N" _+ n. M, e% A* A! \) S' D
4.1 CDN自定义header头8 _: s1 i; `$ G
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP: H9 T/ ~7 _7 Y+ |* T
缺点:需要CDN厂商提供

7 n5 _7 `3 F7 z+ S# P! v# H) W
4.2 获取forwarded-for头/ `7 N/ z$ Q2 j
优点:可以获取到用户的IP地址) p8 i' n9 v- k2 f
缺点:程序需要改动,以及用户IP有可能是伪装的
, p  X# u, f! O6 b, h/ P
4.3 使用realip获取
1 B0 G8 S" v( O- ~4 Y9 p: M优点:程序不需要改动,直接使用remote_addr即可获取IP地址5 j4 k+ E. C! q" f+ u! r/ P( r0 S  R
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
) M5 G, M4 |( @! F- F4 Y: p
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-27 19:18 , Processed in 0.057010 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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