在client用户在访问我们的webserver时,需要记录下client 客户端信息,比如client的IP、浏览器、访问时间等信息;
但我们的webserver一般有很多台机器,需要在webserver上面添加一层load balance;这时要设置一些配置才能让LB看到client 的信息;
现在常用的LB有两种:硬件的LB 和 开源的LVS
LB 我们在转发client的 query时,采用的是7层协议;在数据[data] 层里面有client的IP【src IP】,LB是7层的可以读取data 来获取src IP地址;所以只要在LB上面设置一下
NS-Client-Ip 参数;既可以实现获取Client IP的功能;对 LB下面的realserver 的内核没有要求。
LVS 才用的4层协议,所以只能看到IP数据包的IP首部,看不到IP数据报的数据部分;所以如果需要获取client的IP 我们需要自己处理一下;在cient发请求给LVS时,lvs需要
把用户的IP写到选项中;LVS 把这个IP数据报发送给webserver后;程序从header(IP数据报的选项中获取client的IP);具体的原理看下面
LB设备的IP报传输采用7层协议;当用户client 【IPc】 把IP 数据报1 ---->域名【解析到LB设备 VIP= IPv】 ----> IP数据报2 ---->realserver 【IPs】
IP数据报 | src IP | dst IP | 选项 | 数据 |
IP数据报1 | IPc | IPv | null | 数据c |
IP数据报2 | IPv | IPs | null | IPc +数据c |
IP数据报3 |
因为LB是7层协议;所以可以获取IP数据报里面的数据内容 ;进而把IPc封装到数据里面;这样realserver获取IP数据报可以从数据里面解析到IPc;
这是硬件LB设备的一个配置:NS-Client-IP
LVS设备采用4层协议进行传输IP 数据报;当用户client 【IPc】 把IP 数据报1 ---->域名【解析到LB设备 VIP= IPv】 ----> IP数据报2 ---->realserver 【IPs】
IP数据报 | src IP | dst IP | 选项 | 数据 |
IP数据报1 | IPc | IPv | null | 数据c |
IP数据报2 | IPv | IPs | IPc | 数据c |
IP数据报3 |
因为LVS是4层协议传输IP数据报;所以在LVS ---->realserver 过程中LVS 无法获取IP数据报里面的数据内容;所以上面硬件LB的方式是不可以的;此时如果想在realserver上面获取 IPc;必须把IPc想办法写到IP数据报里面传输给realserver;此时单纯的LVS 是不能完成的;需要自己开发一个模块;把IPc的地址写到IP数据报里面的选项的【32个字节】;这样realserver在收到LVS发送的IP数据报2时可以从Header里面获取IPc;
而这个开发的模块;可能依赖内核版本之类的 限制;这个受开发的环境的限制;所以可能会涉及到对应的内核版本的升级调整和开发模块的加载;才能实现LVS 获取 clientIP的功能。