Linux/Python学习论坛-京峰教育

 找回密码
 立即注册

一键登录:

搜索
热搜: 活动 交友 discuz
查看: 524|回复: 0

load balance 看到client的IP信息

[复制链接]

238

主题

288

帖子

1925

积分

超级版主

Rank: 8Rank: 8

积分
1925
QQ
发表于 2015-3-20 18:57:34 | 显示全部楼层 |阅读模式
1. NS-Client-IP的概念

在client用户在访问我们的webserver时,需要记录下client 客户端信息,比如client的IP、浏览器、访问时间等信息;

但我们的webserver一般有很多台机器,需要在webserver上面添加一层load balance;这时要设置一些配置才能让LB看到client 的信息;

现在常用的LB有两种:硬件的LB 和 开源的LVS

  • 硬件LB设备:这样的如果需要获取client的IP ,需要网工配置NS-Client-IP,否则我们的webserver就不能获取client的IP地址。
  • 开源的LVS:开源的LVS ,如果像获取client的信息,需要升级系统的kernel 内核到32位,然后要加载toa模块;然后必须reboot机器
2. LVS 和硬件LB NS-Client-IP

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);具体的原理看下面

3. IP 数据报的格式(1). IP 数据报的格式图

(2).IP  数据报的含义:
  • 4位版本号:现在是IPV4   1000
  • 4位首部长度:设置IP数据报首部的最大长度(60个字节): 指的是IP数据报首部占32个bit【4个byte】的数目;应首部长度是4个bit位,所以最多有  1111 = 15(10进制)个 【4字节】;所以IP数据报最大是15 x 4 =60个字节(byte);包括选项【选项可以有多个】
  • 8位服务类型(TOS):设置IP数据报服务的类型:包含3bit的优先权子字段【现在已经忽略】,4bit的TOS子字段和1bit的未用位但必须设置为0。4bit的TOS分别代表:最小延迟、最大吞吐量、最高可靠性和最小费用;在不同的应用场景设置不同的TOS值;比如: Tlenet/Rlogin 传输少量的交互数据  -->最小延迟   1000   任意块数据 -->最大吞吐量 0100  ICPM包 -->一般的服务  0000   用户网络新闻NNTP -->最小费用  0001     【4bit 最多只能设置一个1    不能同时满足多个最小】
  • 16位总长度:设置整个IP数据报的总长度【首部 + 数据】;这样只要知道总长度和IP数据报的长度 可以计算出IP数据报中数据内容的起始位置和长度;因为是16个bit位,最多是2的16次方=65535 个字节;所以IP数据报的最大长度是65535个字节
  • 16位标识:唯一标识主机发送的每一份数据报 16bit 共 65535 最大值?通常每发送一个IP数据报,其值就会加1; 因为应用发送的数据比较大需要分成很多个IP数据报;这样就用到下面的3位标识和13位片偏移。
  • 8bit的TTL:设置IP数据报最多经过的路由器的个数  TTL 的值一般由源主机设置(通常为32或64);但最大是2的8次方 =256
  • 16bit 首部检验和:用来检验的
  • 32bit【4个字节】的源IP地址:这个肯定是一个session的两端的IP地址       必须有
  • 32bit【4个字节】的目的IP地址:这个肯达是一个session的两端的IP地址   必须有
  • 选项根据IP数据报的是否需要而设置
  • 数据:  IP数据包的数据内容  最大是 65535个字节
(3).  LB 设备如果分发到realserver上面 如果需要看到用户的client IP的原理:

        LB设备的IP报传输采用7层协议;当用户client 【IPc】 把IP 数据报1 ---->域名【解析到LB设备 VIP= IPv】 ----> IP数据报2 ---->realserver 【IPs】

IP数据报src IPdst IP选项数据
IP数据报1IPcIPvnull数据c
IP数据报2IPvIPsnullIPc +数据c
IP数据报3

     因为LB是7层协议;所以可以获取IP数据报里面的数据内容 ;进而把IPc封装到数据里面;这样realserver获取IP数据报可以从数据里面解析到IPc;

     这是硬件LB设备的一个配置:NS-Client-IP


(4). LVS 设备看到client IP的基本原理 【FULL NAT 模式】

       LVS设备采用4层协议进行传输IP 数据报;当用户client 【IPc】 把IP 数据报1 ---->域名【解析到LB设备 VIP= IPv】 ----> IP数据报2 ---->realserver 【IPs】

IP数据报src IPdst IP选项数据
IP数据报1IPcIPvnull数据c
IP数据报2IPvIPsIPc数据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的功能。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|京峰教育,只为有梦想的人 ( 京ICP备15013173号 )

GMT+8, 2019-7-18 10:05 , Processed in 0.044245 second(s), 12 queries , Apc On.

快速回复 返回顶部 返回列表