阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 3514阅读
  • 0回复

[云安全技术和产品专区 ]如何获取客户端真实IP

级别: 论坛粉丝
发帖
2050
云币
4117
*#U+qgA;`  
u eb-2[=  
四层接入(非网站防护) )Di \_/G  
63WS7s"  
1eS_ nLFw~  
按照以下不同的场景,选择适合您的源站获取客户端IP方式。 {jKI^aC<[  
( <*e  
阿里云ECS" class="reference-link" style="box-sizing: border-box; color: rgb(0, 193, 224); background: 0px 0px; transition: color 0.2s; font-weight: inherit;">高防 -> 阿里云ECS BHFY%6J!  
1=}qBR#scY  
F _3:bX  
TCP端口无需做任何改动,源站服务上看到的IP就是真实客户端IP,包括ECS的安全组配置对象也是针对真实的客户端IP。 r{?Ta iK  
[backcolor=transparent]注意:如使用UDP端口转发,源站ECS无法获取真实IP。  UL@9W6  
A Io|TD5{~  
SLB -> ECS" class="reference-link" style="box-sizing: border-box; color: rgb(0, 193, 224); background: 0px 0px; transition: color 0.2s; font-weight: inherit;">高防 -> SLB -> ECS ShOX<Fb&  
0ZpFE&  
C#pZw[  
目前不支持。ECS看到的IP是高防的回源IP )~)*=u/  
 cgu~  
阿里云外服务器" class="reference-link" style="box-sizing: border-box; color: rgb(0, 193, 224); background: 0px 0px; transition: color 0.2s; font-weight: inherit;">高防 -> 阿里云外服务器 [V8fu qE>  
c"tJld5F_  
u+t$l^S  
部分支持,具体方法请参考高防如何支持云外主机获取客户端IP B@YyQ'  
1j-te-}"c  
七层接入(网站防护) 3riw1r;Q  
F^$led1/F  
_,74)l1  
当一个七层代理服务器(如高防IP)把用户的访问请求转到后端服务器时,源站默认看到的是这个七层代理服务器(如高防IP)的回源IP。而真实的客户端IP会被七层代理服务器放在HTTP头部的X-Forwareded-For字段,格式如下: IeX^4 rc(  
X-Forwarded-For: 用户真实IP, 高防代理IP -f1k0QwL  
如果中间经过不止一个代理服务器(如经过了WAF、CDN等等代理服务器),此时HTTP头部的X-Forwarded-For字段的格式如下: d%@~mcH>  
X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, … pv!oz2w1  
经过多层代理服务器,请求用户的真实IP处于第一个位置,而后面包含所有经过的中间代理服务器的IP。因此,只要获取HTTP头部的X-Forwarded-For字段的内容即可。 R8ONcG  
[backcolor=transparent]常用的获取X-Forwarded-For字段内容方式 Z#l%r0(o  
[backcolor=transparent]ASP: Request.ServerVariables(“HTTP_X_FORWARDED_FOR”) fU3`v\X  
[backcolor=transparent]ASP.NET(C#): Request.ServerVariables[“HTTP_X_FORWARDED_FOR”] :wqC8&V  
[backcolor=transparent]PHP: $_SERVER[“HTTP_X_FORWARDED_FOR”] pE.PX 8  
[backcolor=transparent]JSP: request.getHeader(“HTTP_X_FORWARDED_FOR”) Uggw-sRU  
获取到HTTP头部的X-Forwarded-For字段的相关内容后,以“,”作为区分符截取其中的第一个IP地址即可获取客户端真实IP。 3oZ=k]\  
2Se?J)MN  
附录: 常见Web服务器获取真实IP的方法 Pl=]Srw  
3-Dt[0%{  
r`S< A;  
aA`/E  
Nginx配置方案 x"P);su  
"<+ih0Ma  
  1. rx"s!y{!-  
    确认 http_realip_module 模块已安装。 IxR?'  
    Nginx作为负载均衡获取真实IP是使用http_realip_module模块。[backcolor=transparent]注意:通过一键安装包安装的Nginx默认不安装此模块,可以使用 # nginx -V | grep http_realip_module 查看此模块有无安装。 s^OO^%b  
    如 http_realip_module 模块未安装,需要重新编译Nginx并加装此模块。wget http://soft.phpwind.me/top/nginx-1.0.12.tar.gz
  2. tar zxvf nginx-1.0.12.tar.gz
  3. cd nginx-1.0.12
  4. ./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module
  5. make
  6. make install
  7. kill -USR2 `cat /alidata/server/nginx/logs/nginx.pid`
  8. kill -QUIT `cat /alidata/server/nginx/logs/ nginx.pid.oldbin`
YNrp}KQ  
h4pTq[4*  
修改Nginx对应server的配置。 FSuAjBl0-  
在location / {}中添加:
  1. set_real_ip_from ip_range1;
  2. set_real_ip_from ip_range2;
  3. ...
  4. set_real_ip_from ip_rangex;
  5. real_ip_header    X-Forwarded-For;
DD9?V}Yx  
+y2[msBs  
[backcolor=transparent]注意:这里的ip_range1,2,…指的是高防IP的回源IP地址(如果高防IP后还有WAF、CDN,则需要写WAF、CDN的回源IP地址,即需要写离源站最近的一层七层代理的回源IP段),需要添加多条。 X;F?:Iw\  
修改日志记录格式 log_format。 tGdf/aTjy  
log_format一般在nginx.conf中的HTTP配置中:
  1. log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" ';
F 09DV<j  
w6dFb6~R  
添加x-forwarded-for字段,替换原本的remote-address。 %ows BO+  
EVX{ 7%  
重启Nginx使配置生效 nginx -s reload。 8n BL\{'B[  
kPBV6+d~  
IIS 6 配置方案 9z;HsUv  
X2mREt9  
_qqr5NU  
IIS 6通过日志可获取来访者真实IP。
  1. <WXzh5D2  
    安装 F5XForwardedFor.dll 插件。
  2. :M{Y,~cP  
    根据您服务器的操作系统版本将x86\Release或者x64\Release目录下的F5XForwardedFor.dll拷贝到本地目录(例如C:\ISAPIFilters)。同时,确保IIS进程对该目录有读取权限。
  3. !J*,)kRN  
    打开IIS管理器,选择当前开启的网站右键,单击[backcolor=transparent]属性。
  4. H+}"q$  
    在[backcolor=transparent]属性对话框,单击[backcolor=transparent]ISAPI筛选器,单击[backcolor=transparent]添加。
  5. MaBYk?TR~  
    在添加对话框中,在[backcolor=transparent]筛选器名称处填写 [backcolor=transparent]F5XForwardedFor,在[backcolor=transparent]可执行文件处填写F5XForwardedFor.dll的完整路径,单击[backcolor=transparent]确定。
  6. UmnE@H"t$\  
    重启IIS服务器,配置生效。
jJ4qR:]  
w:Jrmx  
IIS 7 配置方案 3bqC\i^[\m  
^[Ua46/"m  
0U/K7sZ  
IIS 7可通过F5XForwardedFor模块获取来访者真实IP。
  1. H_!4>G@  
    下载并安装 F5XForwardedFor 插件模块。
  2. fW`&'!  
    根据您服务器的操作系统版本将x86\Release 或者x64\Release目录下的F5XFFHttpModule.dll 和 F5XFFHttpModule.ini 文件拷贝到本地目录(例如 C:\F5XForwardedFor\)。同时,确保对IIS进程对该目录有读取权限。
  3. 3QSZ ZJ  
    打开IIS管理器,选择[backcolor=transparent]IIS服务器选项。 =K&\E2kA4  
  4. "x941 }  
    双击打开[backcolor=transparent]模块功能,单击[backcolor=transparent]配置本机模块。 @cRZk`|1n  
  5. ;n=. {[,  
    在[backcolor=transparent]配置本机模块对话框中,单击[backcolor=transparent]注册。 :0K8h  
  6. k *R<,  
    添加已下载的 F5XFFHttpModule.dll 文件。 sG~<M"znV  
  7. Z=4{Vv*  
    添加完成后,选中刚才注册的模块,单击[backcolor=transparent]确定。 Sx*oo{Kk%  
  8. 4$/i%B#ad  
    在[backcolor=transparent]API 和CGI限制窗口添加 F5XFFHttpModule.dll 文件,并设置为[backcolor=transparent]允许。 sC00un%  
  9. B,z<%DAE  
    重启IIS服务器,配置生效。
}7{t^>;D  
.yT8NTu~0j  
Apache配置方案 #QvMVy  
4E8JT#&  
  1. PUQES(&  
    安装 Apache 的 mod_rpaf 第三方模块。  I~,G  
    wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
  2. tar zxvf mod_rpaf-0.6.tar.gz
  3. cd mod_rpaf-0.6
  4. /alidata/server/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
H7+X&#s%  
KucV3-I  
DlMe5=n -u  
修改Apache配置信息/alidata/server/httpd/conf/httpd.conf,在最末尾添加以下内容。 !KKT[28v  
  1. LoadModule rpaf_module modules/mod_rpaf-2.0.so
  2. RPAFenable On
  3. RPAFsethostname On
  4. RPAFproxy_ips ip地址
  5. RPAFheader X-Forwarded-For
m6eZ_ &+u  
FZd.L6q  
[backcolor=transparent]注意:RPAFproxy_ips ip地址,这个IP地址不是负载均衡提供的公网IP,具体IP需要查看Apache日志获得。通常会有2个IP,都需要写入。) ej&<GM|  
修改完成后,重启 Apache。 oHM ]  
/alidata/server/httpd/bin/apachectl restart 3QI?[R.  
[backcolor=transparent]样例
  1. LoadModule rpaf_module modules/mod_rpaf-2.0.so
  2. RPAFenable On
  3. RPAFsethostname On
  4. RPAFproxy_ips 1.1.1.1 2.2.2.2
  5. RPAFheader X-Forwarded-For
B) $c|dUV  
$d+DDm1o  
s6 ( z  
Tomcat配置方案 ~mV"i7VX  
oMcK`%ydm  
]U[X1W+@  
开启 Tomcat 的 X-Forwarded-For 功能可获取客户端真实IP。 eLwTaW !C  
在 tomcat/conf/server.xml 文件中,修改 AccessLogValve 日志记录功能:
  1. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  2. prefix="localhost_access_log." suffix=".txt"
  3. pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/>
r8xyd"Axy  
e73^#O&Xt  
nmlPX7!{$  
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)