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

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

级别: 论坛粉丝
发帖
2050
云币
4117
= P8~n2V  
L(Rorf~V  
四层接入(非网站防护) E#~2wqK  
^AH-+#5  
@>9A$w$H|a  
按照以下不同的场景,选择适合您的源站获取客户端IP方式。 Kk56/(_S  
'XME?H:q a  
阿里云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 K+t];(  
0<"tl0p_  
F_~6n]Sr  
TCP端口无需做任何改动,源站服务上看到的IP就是真实客户端IP,包括ECS的安全组配置对象也是针对真实的客户端IP。 nvwDx*[qN  
[backcolor=transparent]注意:如使用UDP端口转发,源站ECS无法获取真实IP。 K;kLQ2)  
i!ds{`d  
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 >T$7{ ~  
hG[4O3jo\  
d<)s@Ntgm  
目前不支持。ECS看到的IP是高防的回源IP xP{m9_Qj  
]qF<Zw7  
阿里云外服务器" class="reference-link" style="box-sizing: border-box; color: rgb(0, 193, 224); background: 0px 0px; transition: color 0.2s; font-weight: inherit;">高防 -> 阿里云外服务器 7a27^b  
>cSi/a,L  
aq$62>[  
部分支持,具体方法请参考高防如何支持云外主机获取客户端IP Y~}QJ+`?  
-y9Pn>~V  
七层接入(网站防护) .Lp Nm'=R  
YGi/]^Nba  
o4U]lK$  
当一个七层代理服务器(如高防IP)把用户的访问请求转到后端服务器时,源站默认看到的是这个七层代理服务器(如高防IP)的回源IP。而真实的客户端IP会被七层代理服务器放在HTTP头部的X-Forwareded-For字段,格式如下: u>j5`OXo  
X-Forwarded-For: 用户真实IP, 高防代理IP yDDghW'\WU  
如果中间经过不止一个代理服务器(如经过了WAF、CDN等等代理服务器),此时HTTP头部的X-Forwarded-For字段的格式如下: 9 #.<E5:  
X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, … +YkmLD  
经过多层代理服务器,请求用户的真实IP处于第一个位置,而后面包含所有经过的中间代理服务器的IP。因此,只要获取HTTP头部的X-Forwarded-For字段的内容即可。 ]Sk#a-^~  
[backcolor=transparent]常用的获取X-Forwarded-For字段内容方式 nA|gQibA  
[backcolor=transparent]ASP: Request.ServerVariables(“HTTP_X_FORWARDED_FOR”) A;b=E[i v  
[backcolor=transparent]ASP.NET(C#): Request.ServerVariables[“HTTP_X_FORWARDED_FOR”] Uv#>d}P  
[backcolor=transparent]PHP: $_SERVER[“HTTP_X_FORWARDED_FOR”] ~k"eE V p  
[backcolor=transparent]JSP: request.getHeader(“HTTP_X_FORWARDED_FOR”) 5? S{W  
获取到HTTP头部的X-Forwarded-For字段的相关内容后,以“,”作为区分符截取其中的第一个IP地址即可获取客户端真实IP。 ze-TBh/  
7/[TE  
附录: 常见Web服务器获取真实IP的方法 V7Vbl?*n  
OYQXi  
r|u6OF>  
8N</Yi|n  
Nginx配置方案 g!~-^_F  
tRpL0 =y  
  1. -PIA;#Gs  
    确认 http_realip_module 模块已安装。 }L{_xyi>#  
    Nginx作为负载均衡获取真实IP是使用http_realip_module模块。[backcolor=transparent]注意:通过一键安装包安装的Nginx默认不安装此模块,可以使用 # nginx -V | grep http_realip_module 查看此模块有无安装。 OtrXYiKB   
    如 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`
8ItCfbqa6  
^!-E`<jW8  
修改Nginx对应server的配置。 8YT_DM5iI  
在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;
2^k^"<h5j  
/ynKKJx<Y  
[backcolor=transparent]注意:这里的ip_range1,2,…指的是高防IP的回源IP地址(如果高防IP后还有WAF、CDN,则需要写WAF、CDN的回源IP地址,即需要写离源站最近的一层七层代理的回源IP段),需要添加多条。 -&f]X u  
修改日志记录格式 log_format。 ySPlyhGF  
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" ';
vfk7J5y  
o|Yn(xu-  
添加x-forwarded-for字段,替换原本的remote-address。 J,(U<%n  
?[NTw./'7A  
重启Nginx使配置生效 nginx -s reload。 Q0[CH~  
P|!/mu]  
IIS 6 配置方案 71}L# nQ  
9~Y)wz  
`CTkx?e[  
IIS 6通过日志可获取来访者真实IP。
  1. ouu-wQ|(mM  
    安装 F5XForwardedFor.dll 插件。
  2. Q T0IW(A  
    根据您服务器的操作系统版本将x86\Release或者x64\Release目录下的F5XForwardedFor.dll拷贝到本地目录(例如C:\ISAPIFilters)。同时,确保IIS进程对该目录有读取权限。
  3. 5KA FUR0  
    打开IIS管理器,选择当前开启的网站右键,单击[backcolor=transparent]属性。
  4. %Hl:nT2M  
    在[backcolor=transparent]属性对话框,单击[backcolor=transparent]ISAPI筛选器,单击[backcolor=transparent]添加。
  5. ^bY^x+d  
    在添加对话框中,在[backcolor=transparent]筛选器名称处填写 [backcolor=transparent]F5XForwardedFor,在[backcolor=transparent]可执行文件处填写F5XForwardedFor.dll的完整路径,单击[backcolor=transparent]确定。
  6. z_[ 3IAZ  
    重启IIS服务器,配置生效。
gpO_0U4lQ]  
/4f 5s#hR  
IIS 7 配置方案 -?2&5YB  
p8}5x 2F  
T[8"u<O96  
IIS 7可通过F5XForwardedFor模块获取来访者真实IP。
  1. y[ rB"  
    下载并安装 F5XForwardedFor 插件模块。
  2. ,sRrV $,"  
    根据您服务器的操作系统版本将x86\Release 或者x64\Release目录下的F5XFFHttpModule.dll 和 F5XFFHttpModule.ini 文件拷贝到本地目录(例如 C:\F5XForwardedFor\)。同时,确保对IIS进程对该目录有读取权限。
  3. 66Cj=n5  
    打开IIS管理器,选择[backcolor=transparent]IIS服务器选项。 g)zn.]  
  4. %+j]vP  
    双击打开[backcolor=transparent]模块功能,单击[backcolor=transparent]配置本机模块。 tp,mw24  
  5. >R'VY "\  
    在[backcolor=transparent]配置本机模块对话框中,单击[backcolor=transparent]注册。 A$9_aqbj  
  6. Pc\4 QvQ8  
    添加已下载的 F5XFFHttpModule.dll 文件。 >sl1 cC  
  7. #mz,HK0|aC  
    添加完成后,选中刚才注册的模块,单击[backcolor=transparent]确定。 :Jsz"vCg&s  
  8. MWd_ 6XM  
    在[backcolor=transparent]API 和CGI限制窗口添加 F5XFFHttpModule.dll 文件,并设置为[backcolor=transparent]允许。 WriJco<v  
  9. e>i8=U` ;  
    重启IIS服务器,配置生效。
J1v0 \  
0Ts_"p  
Apache配置方案 /{#_Um0.  
,h)T(  
  1. eABdy e  
    安装 Apache 的 mod_rpaf 第三方模块。 Xta>  
    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
dxhjPS~^Q  
Lq8Z!AIw>  
@x>$_:]  
修改Apache配置信息/alidata/server/httpd/conf/httpd.conf,在最末尾添加以下内容。 >|o9ggL`J5  
  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
AB|VO4-?  
R.WsC bU  
[backcolor=transparent]注意:RPAFproxy_ips ip地址,这个IP地址不是负载均衡提供的公网IP,具体IP需要查看Apache日志获得。通常会有2个IP,都需要写入。) c%,6L<[  
修改完成后,重启 Apache。 m^u&g&^  
/alidata/server/httpd/bin/apachectl restart CR8r|+(8  
[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
)k%drdY{J'  
@ke})0 `5  
nJ0eZBgB]  
Tomcat配置方案 x%?*]*W  
e.Q K%  
DP'Dg /D  
开启 Tomcat 的 X-Forwarded-For 功能可获取客户端真实IP。 ii] =C(e9  
在 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"/>
`m0Uj9)#  
YH+\rb_  
ydFhw}1>  
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)