AdvertCN - 广告中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Google-Bing-Mediago-Criteo开户
⚡️按条S5代理⚡️静态⚡️独享⚡️5G广告专用虚拟卡/U充值/高返点皇家代理IP⚡️#1性价比⚡️
Mediabuy⚡️玩家开户首选【鲁班跨境通-自助充值转账】FB/GG/TT❤️官方免费开户Affiliate 全媒体流量资源⚡️
Taboola/Outbrain /Bing⚡️一级代理开户投流-7*24h❤️人工在线【官方】❤️搜索套利买量投流开户独立站⚡️开户投放
⚡️AdsPower:安全不封号,高效自动化⚡️E.PN 虚拟卡⚡️FB BM不限额,短id账单户BINOM TRACKER 60% OFF!
比Adplexity还好用的Spy工具ADPLEXITY + ADVERTCN7200W全球动态不重复住宅IP代理虚拟信用卡+独立站收款
全球虚拟卡, 支持U充值Facebook 批量上广告尤里改 - FB 稳定投放免费黑五教程(持续更新、欢迎交流)
FB 三不限源头 - 自助下户充值转款各种主页、账单户、BM户(优势)⚡️TikTok企业户,bm户,账单户IPCola原生住宅IP⚡️$1.8/条双ISP
提供TK企业新户老户、谷歌新户老户PTM虚拟卡[全新卡BIN+高返点]FB虚拟卡⚡️消费越多返现越多最大欧洲Nutra网盟BA找量
优质住宅/移动代理/高匿名/高性能 FB个号1块一个TK老户/国内外端口/预审/加白广告位出租
8500万高质量住宅IP,助力各种需求虚拟卡返佣1%,国内持牌机构  
查看: 6204|回复: 0

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

[复制链接]

122

主题

199

广告币

291

积分

初级会员

888888888888888

Rank: 2

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

+ \% z! N1 O! O; t, w9 [6 M
proxy_set_header remote-user-ip $remote_addr;
2 l  \# C$ A0 t+ W  |5 Z* `, t2 [+ J7 ]4 \# l
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,
5 l& C5 _: l+ w怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
1
% p& |7 J6 m# K8 z
2

9 [" K' b# S; F" k1 F
3
7 e. T, \- J  s$ v0 G- M
4

7 x  {, C" l/ Y! \; _
<?php9 t% }% B  F% ?& N0 j; f) l. |: s
    $ip = getenv("HTTP_REMOTE_USER_IP");1 k+ B- L0 u3 w' ^) u
    echo $ip;   
3 H- ~. Y- b% i' B* D4 @$ y- z?>
; i- C4 H# A% k9 }) W# \$ W, Y" h# b0 g( _7 O
& a, n# G" x! L
访问getRemoteUserIP.php,结果如下:. T( q2 m: j& m1 ]
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳
4 t( D; U$ r; d/ D% d# |( q

  O2 o" `. D5 z
二.通过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 \) I. O% U) C' W
2
% `% y" \5 h- O! _
3

; p- h' P( Y1 i" N
4

* X" |' A  A, c* V6 m5 V! K
5
7 y' {  U1 \4 X; B
getFor.php! L# m0 m8 ?' }& Y8 N
<?php. l6 j1 v" F! T. }6 l6 x
    $ip = getenv("HTTP_X_FORWARDED_FOR");
6 H9 Z, D9 P) V; ~. X    echo $ip;
& c; {! [1 p% ^. \# F2 V?>" u% a6 d3 e3 [" r4 t9 V7 J! G
; _0 B2 U! r+ J) V  p! R
: P$ H5 j7 ?* c( F4 K
访问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.

5 a# H6 n, L( A# d+ S

( y0 c0 H1 L1 \$ t% ]
三.使用nginx自带模块realip获取用户IP地址; N; Z) r' {# V0 E" t3 ~
安装nginx之时加上realip模块,我的参数如下:
  ./configure –prefix=/usr/local/nginx-1.4.1 –with-http_realip_module
, ]: ^* j7 t- H# d$ R/ `6 z

7 c, I5 K& l* N, q5 b
真实服务器nginx配置
1

/ O7 e" }- g: O: [
2

+ d+ X& p# ^- Z6 ?* e: B
3

; d  |0 g& f* J, C; s4 z9 i6 d
4

8 G' Q) p. p; `* T1 A
5

6 j  x' e) [- m& u4 I; @" y
6
# f5 z* h; A. f5 u, P1 z5 X
7

, D+ f  o0 v2 d- {
8

" U! e/ ], v- e
9

9 J4 L+ \/ j8 r0 m& w$ j
10
0 t' b5 a% {. }: Y0 x! L
11
* `4 @+ q6 Y% M, D% ^
12

' }9 T! {8 z+ E' o; d$ a) C+ `
13

1 C0 ^: b( Z0 m
14
) |# B9 ]8 l' B. H3 `: W
15

, J" y" C2 M0 }8 ^8 H
16

/ b+ G. U% Q( |( x( X/ [$ O# F
17
" C1 f3 H8 u- K/ Q; j$ W4 z" H
18

; n( z6 I5 R% C  Z3 e" w
19

5 c1 G4 S. }; B7 n
20
# G% d# a0 c4 K: M" f
21
+ s' d5 ?4 C7 D$ |2 J7 h  E; q* n
22
8 a( B7 O( p$ s. D. u5 e+ `2 o
23

$ p3 H; [; a1 J5 D/ W; b7 v
24
! w! n* x# ~! j# e+ d! f
25

% ]; K( [( [: F9 G/ R! g
26

& r# [  K- e* m. M/ V
27
( c, M1 {4 `! X5 a( P! ^# n
28
3 t5 \( u! O, A1 }& o) U7 Q" S
29

+ ~7 Y; S6 S4 A5 T" e' A' W- }! D
30

4 s& ~7 N  A$ h
31

; A' _" V6 |3 o0 ~, K
server {
/ q0 H4 f( m7 A9 Z' i        listen       80;- F9 l7 y; \1 w# a  K  `# m, s, F
        server_name  www.ttlsa.com;
4 \3 r) }& |* t: q: Q        access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;
  Y: j9 p0 a, S0 n  4 H# w6 B, Q1 r
        index index.php index.html index.html;
2 L0 O; [1 @6 M        root /data/site/www.ttlsa.com;
6 X" j5 p8 b& W* D  
, k! {/ C. h6 p# \7 m- }& X        location /
6 t9 T! n+ `! ~- \        {
3 D0 ^) t* D! s* Q. q. z1 y         root /data/site/www.ttlsa.com;" v0 O% P  Y9 R# X. n9 z
        }& i! z7 }6 ^: M
        location = /getRealip.php
* Z& I( q; y; D5 w+ g) D        {
  M9 M# \6 H3 B5 N8 n/ r, z( F6 p                set_real_ip_from  192.168.50.0/24;
! x) Q# ~+ D0 N; O6 J1 ?! g4 f( V  C7 Z                set_real_ip_from  61.22.22.22;
( H- V* x: u0 r                set_real_ip_from  121.207.33.33;# _) i, e/ G1 U8 ]* U
                set_real_ip_from 127.0.0.1;
5 @1 a' n$ z1 ~( M                real_ip_header    X-Forwarded-For;3 \7 I; |. D  R, v* J
                real_ip_recursive on;& i. @4 E0 B7 i/ b: T' D" F% z
                             fastcgi_pass  unix:/var/run/phpfpm.sock;
, U4 ]1 R' J7 m9 \% v) O                fastcgi_index index.php;
- t: |" n. I$ `* {$ L9 A9 e                include fastcgi.conf;
. S8 x' b' j3 c1 u7 f9 G0 m        }
6 g. A( x/ H* V    }
$ b) p! B* l7 q3 M: O$ x: t
4 ]' a8 I' G- J7 }8 E' ZgetRealip.php内容
% i# c8 }, i8 v8 B   <?php  
/ {2 _+ U4 F6 I  s         $ip =  $_SERVER['REMOTE_ADDR'];
; D& V3 H  o) V; b        echo $ip;   
# \# H, y' U8 w# {* `9 S4 e    ?>7 J* L0 r0 d- \, |; h9 V; l0 c; h! W

4 ~/ C: N  r8 c7 J9 k$ P7 |) c
            
访问www.ttlsa.com/getRealip.php,返回:  120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off! y% F  W/ K, M( P% ^+ b" T* a8 X
访问www.ttlsa.com/getRealip.php,返回:121.207.33.33
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
  M: p1 _5 H& Y' W1 Oreal_ip_header:从哪个header头检索出要的IP地址9 |. k4 [" H! X. f' S" x
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:% A: j' N: L' L: e. I
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
1 P1 y. o7 a; O0 ]在real_ip_recursive on的情况下$ f& {- y7 w9 o" J& ~
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或者不设置的情况下
: e8 ^) t- y2 z+ h" Z1 U1 n' [5 W192.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;

* a: r9 R% L- s3 G5 ]+ D8 c  F
访问结果如下: 121.207.33.33

8 F" L  t0 |3 ^: C) z% j& U0 r

) D8 d" ?+ i& b0 U' p
四.三种在CDN环境下获取用户IP方法总结
3 U: g' ~! a" Z
4.1 CDN自定义header头
! O& Z( B$ g& [! O1 z# `7 c优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP) c* L- ]3 c0 v" W: `0 R
缺点:需要CDN厂商提供

1 \6 e% g* f0 r# L( c( O& y  m- R. m
4.2 获取forwarded-for头7 O1 ^* a* o# O; }3 o0 G
优点:可以获取到用户的IP地址, P) o4 R. p6 c* c# X  v8 D
缺点:程序需要改动,以及用户IP有可能是伪装的
! Z9 a9 S' w- M2 O0 z
4.3 使用realip获取+ E8 G6 v# @2 u' `4 L
优点:程序不需要改动,直接使用remote_addr即可获取IP地址8 ?& h/ a' }( V
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
( N' j& b7 _1 s2 j7 i
相关帖子
wzdh1973.com     mywz999.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-10 16:05 , Processed in 0.171184 second(s), 14 queries , Gzip On, MemCache On.

Copyright © 2001-2023, AdvertCN

Proudly Operating in Hong Kong.

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