赞
踩
ip地址是按地域分布的,服务器获取到客户端ip后可以做流量统计和分析,服务器也可以针对客户端ip做一些定制化的功能,比如限流和黑白名单。
网络环境十分复杂,客户端发出的一个请求至少要经过cdn和负载均衡后才可以到达服务器。报文经过负载均衡的时候往往会做FNAT(lvs的一种转发模式,被普遍用于各种厂商的lb,该转发模式会对所有报文做源地址转换和目的地址转换),所以报文经过lb后,源地址就被删除了,这样服务器看到的源地址都是lb的地址,无法获取到客户端的真实ip了。
各大lb厂商都有自己的办法来实现这个功能,具体的实现方式需要区分四层lb和七层lb。
四层负载均衡支持的协议一般是tcp和udp,四层负载均衡实现获取客户端真实ip功能的方法一般是toa/uoa和proxy protocol。
我们知道tcp报文头部有个扩展字段tcp option,这个字段非常常用,比如mss、sack、timestamps、窗口扩大系数等都是放在这个字段里的。lb本身是可以获取到源ip和源端口的,所以lb可以把客户端ip和端口封装到tcp option里面,然后将报文转发给后端。后端需要安装特殊的toa模块,并将toa模块加载到内核,后端可以依靠toa内核模块获取到客户端的真实ip。toa的特点主要有以下几点:
proxy protocol是HAProxy的作者Willy Tarreau于2010年开发和设计的一个Internet协议,通过为tcp添加一个很小的头信息,来方便的传递客户端信息(协议栈、源IP、目的IP、源端口、目的端口等)。其本质就是在三次握手后的第一个数据包中的tcp头部后面的payload添加了proxy protocol协议规定的内容,来向服务端传送客户端信息。udp当然也可以支持proxy protocol,只需将同一条流的第一个udp报文进行改造即可。proxy protocol的特点如下:
七层负载均衡支持的主要服务是http,七层负载均衡支持获取客户端真实ip的方法就比较简单且灵活,一般是通过插入一个http头部来实现,比如X-Forwarded-For字段,服务端可以直接通过这个http头部获取到客户端真实ip。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。