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户(优势)⚡️TikTok企业户,bm户,账单户IPCola原生住宅IP⚡️$1.8/条双ISP
FB海外户、GG老户、TK加白老户PTM虚拟卡[全新卡BIN+高返点]FB虚拟卡⚡️消费越多返现越多最大欧洲Nutra网盟BA找量
FB个号1块一个TikTok2审户/老户/国内外端口/加白SX.ORG 高质量代理⚡235+ 地区GG,FB,TK, 欧美源头, 欢迎合作❤️
跨境债务催收/风险代理DataImpulse⚡️纯净住宅代理仅 $1FB企业户海外户,授信户,TK加白户广告位出租
8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构  
查看: 6334|回复: 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
) G4 c2 G, S, O. L
proxy_set_header remote-user-ip $remote_addr;
( V: Q2 @; R2 X& M  k) G6 V# m, |
0 p' d* q5 Z6 `" Q5 J  h6 _3 h- ^
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
$ x* w( c: g# X  k& |0 ?怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
; K  l# x7 O2 j9 e2 C# c1 {) L- W$ \5 I
2

9 T' m4 l' I/ f- `9 j) Y% K
3

0 g- e# T; }) b) r
4

0 z+ ?4 c9 |4 V* ^
<?php
& h5 B# w3 N8 r* z. D+ V( r& S# i    $ip = getenv("HTTP_REMOTE_USER_IP");
* U7 W0 O$ @! J" p/ K2 [( K- W% R    echo $ip;   
: O# G8 ?: Y3 h  t/ r( m$ r4 L?>
' ]5 d& L1 j8 X$ H% |& G# b# |" M7 e* u6 P
; w. `/ S6 \3 _3 B
访问getRemoteUserIP.php,结果如下:
* \) z# P# m1 u0 U
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
. o6 S3 o( x- U

9 |" j" U9 i0 s; J7 U$ U- }' S
二.通过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
" `2 m* P7 Y4 C3 `, r  L* T
2
5 F) q$ m( q+ |1 `" t3 x
3

" e! |8 ]5 n; j" Q
4

# r1 n; [; T0 L# R# ?
5
6 I% T# ^! y, b, `" {
getFor.php
6 I- k2 s. j3 T/ p<?php+ e1 V7 t* f* t3 ~! q: ?( g
    $ip = getenv("HTTP_X_FORWARDED_FOR");
2 z  y# H' M+ B2 @6 y9 R; \* F    echo $ip;
8 ~  \' u1 H+ `& @$ A?>4 T+ r' ^$ R' o/ F$ i) S5 {
3 w% ~3 X8 u3 R+ W2 i: B, H
! ^+ e* ^1 t6 T% f! 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.

* S; Q1 T' M3 P. m
5 v$ F1 k: T' [! A$ }
三.使用nginx自带模块realip获取用户IP地址+ F! p2 R% S& v" G0 k% @( M' @
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module' k& {2 Y" Z' t) I
/ f' d3 Y! c3 Z/ k, S" \: q& v7 l& B
真实服务器nginx配置
1
; J7 @0 l7 _$ \/ l% V
2
# J& @$ n$ L! Y! \
3
0 v/ G7 S% k( L* g; B* A* {
4
. s. ^- T8 X- X/ P, p$ d
5

6 V& i' W  B* w- Q$ }4 M6 M2 n; d
6
* \! r$ N4 r. x
7
& Y, D+ j7 r# F; O
8
/ Z+ W) G; g# @& c; \! y
9
. o, @  U; S+ I( A% o0 b
10

7 K' [7 X* C1 D4 X
11
7 w. A) W3 ?" C) a1 H
12
: g0 G; V7 [% y/ z" B
13

7 s' @- S7 o- J: R! H( C
14
+ @- ]5 z; {$ |2 i) Y" ]& t
15
" l1 f0 L' S& w  w+ \7 p
16

' P/ v0 K0 L& v& R0 o/ W
17
* Q* K/ L5 L$ \- f% U  x' G. y
18
% {: c" ~& `: x; L2 S, K: b, Q  S1 l
19
3 A5 m# M0 u% J1 w7 H
20
  i3 r; N9 n: J1 R6 A2 ^  F; e; a
21

1 u; K; {7 b% v3 ^
22

8 V1 k7 a% T$ Z' R$ t* i6 B
23

, W! E$ s) `3 ^# w; t6 N
24
7 u: u- Q4 c2 O; g% ^/ Q! y2 d
25
2 N, s, t7 N" R$ n* e. T2 w7 T
26
9 u7 R/ k/ B: t% V6 O+ P5 q
27
/ }' N6 X$ K7 {0 v8 g
28

. y4 k7 k7 M: _; `8 R& `
29

! z! ~) v# T/ f, Y/ t+ t; T- X
30
1 O! K; ~6 P! }
31
+ w/ K: Q: H1 D/ i. W
server {1 z- D" o- j. B2 u6 X) E5 a
        listen       80;$ ^  l* Y5 K6 K- r6 U$ X8 l
        server_name  www.ttlsa.com;
5 `3 h0 @! F( ?4 m, v        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;$ g+ R8 S0 Q/ w# g
  # n, E4 ?- W9 Q0 E% v$ F
        index index.php index.html index.html;& ]: E* J* a( J" o
        root /data/site/www.ttlsa.com;# _+ [$ T5 H' @, ?9 K( F1 a
  
/ ^9 ?; P$ u/ p* {8 l3 q: Q, O        location /
* C8 b8 ~, X% ~6 U! _4 X        {
% k! [1 O' S0 p) O( q( B1 ?         root /data/site/www.ttlsa.com;
5 ^& P4 F1 U% R9 {' ]8 |, K& V        }8 \* c1 h# h" U
        location = /getRealip.php! G, d2 Y! k# a% C- B2 n' S( h& ^
        {  Q. U0 c# W6 u5 r, b
                set_real_ip_from  192.168.50.0/24;
' z6 X3 }6 M1 S3 [% O                set_real_ip_from  61.22.22.22;
  j+ i$ }5 b! @, F/ {                set_real_ip_from  121.207.33.33;) @4 k6 Z) J, I7 c
                set_real_ip_from 127.0.0.1;
" K# |3 P7 V; M) c4 ]5 B                real_ip_header    X-Forwarded-For;
. k% q: w5 [( f                real_ip_recursive on;
9 a5 |& _) U0 O3 v                             fastcgi_pass  unix:/var/run/phpfpm.sock;# v& l0 \6 E% b, a! W" B5 U5 }6 J
                fastcgi_index index.php;
$ K2 E* ~& J# ^' z                include fastcgi.conf;! H; ~1 l/ v( W: c
        }" M/ k9 |+ S" _% }2 h/ K; R
    }
' d6 J- {4 @0 q3 ~% s) N- E0 }/ @& _
getRealip.php内容) `, ]6 _6 H4 C4 @2 T1 w
   <?php  
2 c  [/ O8 J6 m' R         $ip =  $_SERVER['REMOTE_ADDR'];
, {3 [1 U! z; h        echo $ip;    , O/ @% q4 j; w- ^* c( a$ C
    ?>
" \$ ^3 V: J& S& R7 {5 ?" f' E6 q5 {& V9 s2 ]
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
1 X, G9 a2 D  Y) O1 w" X( H0 Y8 ?" o访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
) t4 B, q, R# X  Creal_ip_header:从哪个header头检索出要的IP地址% p/ J1 e! |4 E6 ^5 c& {5 J
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:3 k# H& ?, D7 A% b  G7 W+ S
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121- z) f/ W% Z4 |3 Z) }4 Q
在real_ip_recursive on的情况下
/ f. A2 y" b5 h/ W61.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或者不设置的情况下" ~, V2 n8 G# J6 l& K5 v) k9 x
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;
+ O$ Y7 [9 H6 o, f: X8 v1 L
访问结果如下: 121.207.33.33
) r+ U+ |' O* {, u

2 i$ J, s7 A1 Q1 c/ R
四.三种在CDN环境下获取用户IP方法总结, Z' A& B' C' x, z3 p
4.1 CDN自定义header头! P) L2 x. \! V% |1 b9 |% _
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
0 _6 y, w  \. ^: _4 [9 E缺点:需要CDN厂商提供
" f# z+ N8 T  C! `0 e1 K( \3 f4 @
4.2 获取forwarded-for头$ T8 P0 o% F5 u
优点:可以获取到用户的IP地址
3 r. j. o4 j$ u4 f# d+ `缺点:程序需要改动,以及用户IP有可能是伪装的

4 G* D4 X) d* N( k  Z# K
4.3 使用realip获取
+ P0 O, Z: w3 T' ?  Z  i' j2 G优点:程序不需要改动,直接使用remote_addr即可获取IP地址
6 p- m# Q5 c  e" `+ X' S: ]缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
$ ]5 n  D4 _0 s+ w' I
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-13 19:55 , Processed in 0.046085 second(s), 15 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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