存档

‘network’ 分类的存档

[架构][安全]动态CDN的防篡改IP地址

2015年1月21日 谭俊青 没有评论

WEB开发当中获取用户的真实IP地址用的是REMOTE_ADDR (以下简称RA),而服务器上层往往会存在代理,比如Nginx,Netscaler,F5等设备,用户侧还可能有配置代理服务器,这样要获取用户的IP地址,业内通常的做法是使用HTTP_X_FORWARDED_FOR(以下简称XFF)来跟踪用户的IP地址。

然而带来方便的同时,给攻击者留下了可利用的漏洞,因为Header头是可以随意修改伪造的,也就是说攻击者可以随意伪造XFF,这也是很多网站在对IP进行限制(比如下单,注册,登录等)失效的原因。

为了安全,获取用户的IP地址只能使用RA,如果用户使用代理,那么RA就是代理服务器的IP地址,宁可错杀。上面提到的Nginx,Netscaler,F5等因为IP地址有限,可以在WEB服务器的插件中配置,比如Apache的RPAF,将用户的的“真实”IP地址,设置到RA地址中,从而让WEB程序跳过各级代理,获取到用户的IP地址。

到上面为止可以解决大部分场景的问题,但是因为中国的特殊情况,南北互通,各种网路问题,动态CDN有了市场。然后在使用动态CDN的过程中问题又来了,WEB程序获取的RA地址是CDN的IP地址,导致各种防刷机制失效,所以要想办法获取到用户的RA,而又不能引入新的安全问题,思考之后采取了下面的解决方案加以解决。

动态CDN供应商将用户的RA地址设置到XFF中(不管是多少层代理),服务端Proxy正常逐级增加,通过Apache的RPAF将白名单中的所有Proxy IP去掉,取最后一个IP地址,即位用户的RA地址。

OK,这里问题来了,如何判断用户的请求是通过CDN过来的,还是直接过来的请求,因为直接过来的请求有可能会伪造XFF,进而导致WEB程序获取到的RA是伪造的,进一步会规避防御策略。

所以为了区分,CDN过来的Header头加入特定指纹,在最上层代理配置,遇到特定指纹,XFF直接复制CDN传过来的XFF即可,如果没有指纹,那么将请求方的XFF+RA作为XFF传递下去,这样WEB应用程序拿到的RA即是没法伪造的用户“真实”IP地址(也可能是客户端的代理IP)。

分类: network 标签:

TCP keep-alive & connection pool

2010年7月9日 谭俊青 没有评论

作者:谭俊青@MySQL实验室,转载请注明链接和出处。

要理解TCP keep-alive/persistent connection, 得从TCP协议说起。

TCP flow:

    _____                                                     _____
   |     |                                                   |     |
   |  A  |                                                   |  B  |
   |_____|                                                   |_____|
      ^                                                         ^
      |--->--->--->-------------- SYN -------------->--->--->---|
      |---<---<---<------------ SYN/ACK ------------<---<---<---|
      |--->--->--->-------------- ACK -------------->--->--->---|
      |--->--->--->-------------- ... -------------->--->--->---|
      |---<---<---<-------------- ... --------------<---<---M---|

建立TCP链接需要经过3步,SYN、SYN/ACK、ACK,关闭则需要4步

约定:

当用户通过浏览器打开一个页面的时候,最小情况下,只需要2个packet,一次是请求(http get request),一次是回应(response from server)。但是这里没有计入TCP链接的建立(3 packets)和关闭(4packets),当然每个packet都需要ACK,但是ACK信息一般直接包含在回应的packet里,为了量化方便,这里忽略掉。 … 【阅读全文·MySQL实验室】