找回密码
 立即注册

QQ登录

只需一步,快速开始

PropellerAds
Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5G广告专用虚拟卡/U充值/高返点皇家代理IP⚡️#1性价比⚡️
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
Google FB TK游戏代投⚡️AdsPower:安全不封号,高效自动化⚡️E.PN 虚拟卡⚡️BINOM TRACKER 60% OFF!
比Adplexity还好用的Spy工具ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理虚拟信用卡+独立站收款
全球虚拟卡, 支持U充值Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)
FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)IPCola原生住宅IP⚡️$1.8/条双ISPFB资源,账单户,分享户,国内一手
TK加白户/二解户/FB海外户/GG老户最大欧洲Nutra网盟BA找量 FB高权重耐操个号⚡️稳定过审GG,FB,TK, 欧美源头, 欢迎合作❤️
FB企业户海外户,授信户,TK加白户联盟收款/海外资金下发/服贸结汇域名防红⚠斗篷工具/可试用3天⚡️Spend.net — 美元卡仅需$0⚡️
比特浏览器+云手机 |防关联防封号Facebook截流, 1 次点击 2 次曝光广告位出租8500万高质量住宅IP,助力各种需求
虚拟卡返佣1%,国内持牌机构   
查看: 6445|回复: 0

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

[复制链接]

122

主题

199

广告币

291

积分

初级会员

888888888888888

积分
291
发表于 2018-1-25 21:27:47 | 显示全部楼层 |阅读模式
Deepclick
一.使用CDN自定义IP头来获取
  假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
1
; K8 h! H7 }+ h' S6 ^# L, S5 k
proxy_set_header remote-user-ip $remote_addr;
* p& w- U+ B: J" `7 Q/ T4 @) n1 b* ^; I; F9 u" Q
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,- B4 Z' j& n% d4 y, i
怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
7 X4 \6 @4 u& a6 q5 P
2

+ K7 x8 w5 o+ X2 q
3
' k" S/ W3 P9 K7 h. {& m
4
/ x  f0 A% b, N% J! ~' I  K2 r- c
<?php
* C' k: ?3 i0 p- k1 J8 r    $ip = getenv("HTTP_REMOTE_USER_IP");. g2 v$ ^9 s% @* J# D2 O2 I) W0 e
    echo $ip;    3 O6 @, V0 B0 J4 b
?>
! m. \$ e4 q. M4 [, X) r6 }( X9 n1 u
) O, ~, t, n) g8 U6 a
访问getRemoteUserIP.php,结果如下:
' Q, k; Q, s- Q9 f" g
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳

  L5 o$ J7 D6 i; G
/ I9 I* j5 s" e! W' Z  g
二.通过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
9 Q% O+ z6 s0 k6 ]" g0 U& Q
2
# Z& [$ A2 O% _, M! R
3

9 x$ ^$ A: S) u( V
4

1 t* U+ Y6 r  f4 D
5
! ~  c0 E, Z! W  ~$ R2 f; I0 B+ _
getFor.php, {; [; {6 _; Y8 ~# a/ }5 r/ {7 b" B: X
<?php
& R. i1 ~% L( A4 B/ U; v    $ip = getenv("HTTP_X_FORWARDED_FOR");
  ^, p1 u- R1 s7 @) P$ ^    echo $ip;2 v; R7 R" C2 a- |/ E
?>7 Y8 x6 z7 f, r" |* _! T
, X$ x! U2 \6 x
* \9 L" h' {% `
访问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.

+ V( ~" v4 {. b4 i7 e' e) ]) m
/ S3 i0 E  {  ]& S
三.使用nginx自带模块realip获取用户IP地址
2 F6 n" e8 N9 V/ @/ R0 e
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module; q! A+ ?* g+ Q- A, S' {3 \
- g8 }6 U$ y. \: ]$ [
真实服务器nginx配置
1
1 ~! I2 d) p4 y" Q  O, N) P8 F$ N
2
+ q) ~2 A4 p+ {
3

4 {9 F  N* R4 A0 G
4
4 A/ j5 q. F9 r$ I
5
2 J8 H/ T4 P3 K+ `
6
; Q8 ~! m, c) k& ?! r
7

$ \# Z& Z5 G/ }3 s8 x$ h& k" }
8

. f; J& y: d( P$ e! b
9

% C, L1 P0 u( n  c: ]
10
, F) A6 A, o/ U+ t- S& t# [4 E/ p
11

% B0 Y: v! q5 M' ~
12
$ b9 q4 Z# g6 `( P* |% u
13
7 O+ q3 H% @: z
14

. z* M5 N) o8 x& j2 G% K, b! e8 N
15
" @9 Z2 c  p6 R3 s1 }
16

$ F& x" {6 O& U% @  i
17

2 X. s3 d. M# Y9 W$ c8 [! D' [
18
9 M9 ~! w. i  B3 V
19

0 X7 t7 t- X3 s7 g0 c* d
20
% v5 ~3 \" Z% \  y) D
21
4 j- e& X. @( @7 R* q% v: D
22

4 \+ j3 H% Y5 a7 b( Q
23
6 B. K( N/ k" Z+ F; H# o* x/ p
24
# @4 q- Y; i. I5 {
25

9 }, H/ x+ A& B/ i6 c
26
/ H. b- h. i$ S+ {" h8 _4 |
27

: J4 l( u6 K8 G% n: ~+ H
28
" @6 x2 {8 f; i2 W
29

3 l7 X& e' v6 @7 X, D2 D4 B
30
! J: o5 @; \! X: X
31

7 B/ p: U. g. i
server {
# [2 h2 l/ f+ r        listen       80;0 R* ?& T1 r3 T
        server_name  www.ttlsa.com;9 @9 ~4 S  @) Y: O7 \4 L2 V
        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;: t8 Y3 p2 T( I& L- g  R4 L
  : R) v% K" |& A/ [. U- z$ N
        index index.php index.html index.html;
  O4 x$ P/ r2 c; D        root /data/site/www.ttlsa.com;
$ a9 a  X7 o/ R6 u+ c5 G% @" U' J  
6 Y5 d) b- B2 V: F4 T& f$ U        location /. x/ c9 A# z. V
        {9 ]! i3 i1 y6 J: i! r, `+ w% a
         root /data/site/www.ttlsa.com;
- R+ U3 l  e/ A: B' k$ t        }$ o' b7 J8 ^# o3 H: S5 i
        location = /getRealip.php6 e( ?2 j$ j9 e1 P: `" F! U0 A
        {% n2 Z$ t- p3 K$ C
                set_real_ip_from  192.168.50.0/24;5 Q0 V$ r/ j. i' N  X8 i* g
                set_real_ip_from  61.22.22.22;# Q0 \- A' E, N; M
                set_real_ip_from  121.207.33.33;2 E8 a" q2 H2 J' |; m- r
                set_real_ip_from 127.0.0.1;
* b) ~) i( U# s4 @8 Y                real_ip_header    X-Forwarded-For;
$ w0 [: O: F, {                real_ip_recursive on;# i& u8 y" H) U) ~4 |  P
                             fastcgi_pass  unix:/var/run/phpfpm.sock;3 p; l& H" @# {. W6 X& ]
                fastcgi_index index.php;+ I% q+ {; F2 g
                include fastcgi.conf;
& ?2 F+ M4 S/ S1 p: h9 W) G        }
3 _/ T/ _; S! R; w    }2 J0 u2 B0 E" z: M) \

) W8 G% ?2 p4 X+ @  z1 w; SgetRealip.php内容6 C3 G! [$ d* B) z
   <?php  5 h+ i; h3 j# T# M# V2 P+ @
         $ip =  $_SERVER['REMOTE_ADDR'];. g' x1 J$ M5 c5 N% N0 X$ Y
        echo $ip;    1 G4 O" l1 ?+ l1 s% ]
    ?>3 }1 G/ W) ?. \1 t0 v1 c5 H! R
" l* X, z0 E- n
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
2 u& F+ X2 O" C0 H% m: J# ]访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
4 Z3 b1 x( S' O0 J5 A: }$ Jreal_ip_header:从哪个header头检索出要的IP地址
" y) P5 R( y. z) O3 c+ Qreal_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:5 o* B5 H1 P# _( R' Q
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
' Q9 L% F( c* b$ }3 |在real_ip_recursive on的情况下! s8 C4 `8 ]4 {, Q/ h+ }
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" h/ B1 b3 D/ A
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;

; p7 v# p' C* Y" k0 y  ~# G
访问结果如下: 121.207.33.33
& `1 w- @! `0 Z: d1 K8 R, s& K
/ B5 ]- Y& [  O5 q* J. G
四.三种在CDN环境下获取用户IP方法总结
6 y! B* I  _8 o
4.1 CDN自定义header头
! K/ ?2 Q9 h( g4 I1 e3 _# `$ b优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP& x3 {0 {6 g) C' {# S
缺点:需要CDN厂商提供

: x) Q& G3 y3 o1 j
4.2 获取forwarded-for头$ b" C" h! H% m2 f4 i1 Z
优点:可以获取到用户的IP地址
) \" Q. ~- I5 f缺点:程序需要改动,以及用户IP有可能是伪装的
2 I# K% Y6 D0 z& P* ]) N; w+ B
4.3 使用realip获取3 N# e9 s  U4 t6 J2 E0 L( K% g0 V
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
& v; a* C) x$ }# z) k- t缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
9 t( @- e) ?4 [+ ~: E
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-13 22:34 , Processed in 0.045467 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2026, AdvertCN

Proudly Operating in Hong Kong.

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