lvs三种模式
【文章出处】http://www.linuxvirtualserver.org/zh/lvs4.htmllvs的3种工作方式nat,dr,ip tuneling
nat:客 户通过Virtual IP Address虚拟服务的IP地址访问网络服务时请求报文到达调度器调度器根据连接调度算法从一组真实服务器中选出一台服务器将报文的目标地址 Virtual IP Address改写成选定服务器的地址报文的目标端口改写成选定服务器的相应端口最后将修改后的报文发送给选出的服务器。同时调度器在连接Hash 表中记录这个连接当这个连接的下一个报文到达时从连接Hash表中可以得到原选定服务器的地址和端口进行同样的改写操作并将报文传给原选定的服务 器。当来自真实服务器的响应报文经过调度器时调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口再把报文发给用户。
在连接上引入一个状态机不同的报文会使得连接处于不同的状态不同的状态有不同的超时值。在TCP 连接中根据标准的TCP有限状态机进行状态迁移这里我们不一一叙述在UDP中我们只设置一个UDP状态。不同状态的超时值是可以设置的在缺省情况下SYN状态的超时为1分钟ESTABLISHED状态的超 时为15分钟FIN状态的超时为1分钟UDP状态的超时为5分钟。当连接终止或超时调度器将这个连接从连接Hash表中删除。
http://top.oa.com/pictures/201202/1330479769_83.jpg
优点可以做一些集中式管理
缺点支撑机器少只能支持lan
dr:直接路由。VS/DR 的报文转发方法又有不同将报文直接路由给目标服务器。在VS/DR 中调度器根据各个服务器的负载情况动态地选择一台服务器不修改也不封装IP报文而是将数据帧的MAC地址改为选出服务器的MAC地址再将修改后 的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器所以服务器肯定可以收到这个数据帧从中可以获得该IP报文。当服务器发现 报文的目标地址VIP是在本地的网络设备上服务器处理这个报文然后根据路由表将响应报文直接返回给客户。
http://top.oa.com/pictures/201202/1330479971_5.jpg
优点
支撑机器多,实现简单, 侵入性小只需要rs改loopback
缺点
只能支持lan。
ip tuneling
Ip隧道IP隧道IP tunneling是将一个IP报文封装在另一个IP报文的技术这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术IP encapsulation。IP隧道主要用于虚拟私有网络Virtual Private Network在其中隧道都是静态建立的隧道一端有一个IP地址另一端也有唯一的IP地址。
http://top.oa.com/pictures/201202/1330480250_9.jpg
它的连接调度和管理与VS/NAT中的一样只是它的报文转发方法不同。调度器根据各个服务器的负载情况动态地选择一台服务器 将请求报文封装在另一个IP报文中再将封装后的IP报文转发给选出的服务器服务器收到报文后先将报文解封获得原来目标地址为VIP的报文服务器发 现VIP地址被配置在本地的IP隧道设备上所以就处理这个请求然后根据路由表将响应报文直接返回给客户。
http://top.oa.com/pictures/201202/1330480596_18.jpg
优点可以支持wan和lan能支撑的机器多。
缺点对服务器有要求即所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。
NETFILTER体系
通俗的说netfilter的架构就是在整个网络流程(ip层)的若干位置放置了一些检测点HOOK而在每个检测点上登记了一些处理函数进行处理如包过滤NAT等甚至可以是用户自定义的功能,lvs(ipvs),iptable都是基于这个体系来实现的。
http://top.oa.com/pictures/201202/1330480913_57.jpg
钩子函数由一个全局二维链表数组nf_hooks 保存其按照协议族归类存储在每个协议族中根据钩子点顺序排列在钩子点内则根据钩子函数的优先级依次排列。链表中的每个节点都是一个nf_hook_ops 结构nf_hook_ops 实际存储了钩子函数的内容其结构如下图 所示。在相应的钩子点调用钩子函数时则根据协议族和钩子点找到相应的链表入口然后依次调用该链中的每一个钩子函数对数据包进行操作。
http://top.oa.com/pictures/201202/1330481000_90.jpg
http://top.oa.com/pictures/201202/1330481026_12.jpg
相关代码
struct list_head list_head*next; list_head*pre;
struct list_head nf_hooks[NF_MAX_HOOKS
typedef unsigned int nf_hookfn(unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff));
struct nf_hook_ops
{
struct list_head list;
nf_hookfn *hook;
struct module *owner;
u_int8_t pf;
unsigned int hooknum;
int priority;
};
int nf_register_hook(struct nf_hook_ops *reg)//hook函数的注册
{ struct list_head *i;
br_write_lock_bh(BR_NETPROTO_LOCK);
for (i = nf_hooks.next;
i != &nf_hooks; i = i->next)
{
if (reg->priority < ((struct nf_hook_ops *)i)->priority)
break;
}
list_add(®->list, i->prev);
br_write_unlock_bh(BR_NETPROTO_LOCK);
return 0;
}
页:
[1]