本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。msn:yfydz_no1@hotmail.com来源:文档制作:SahuSoft。sahumail@sina.com1.前言ipvs是章文嵩先生主持的一个开源项目,早在2.2内核时就已经以内核补丁形式出现,RedHat6.1和6.0的一个重要区别就是增加了IPVS。从2.4.24后IPVS已经成为Linux官方标准内核的一部分,2.2时IPVS是完全独立的部分,2.4以后借用了netfilter的一些处理机制,但主体还是比较独立,但功能和netfilter有重复的地方。IPVS官方网站为:版本为1.2.1。2.IPVS的外部表现根据LVS官方网站的介绍,LVS支持三种负载均衡模式:NAT,tunnel和directrouting(DR)。NAT是通用模式,所有交互数据必须通过均衡器;后两种则是一种半连接处理方式,请求数据通过均衡器,而服务器的回应则是直接路由返回的,而这两种方法的区别是tunnel模式下由于进行了IP封装所以可路由,而DR方式是修改MAC地址来实现,所以必须同一网段。3.几个重要结构3.1协议这个结构用来描述IPVS支持的IP协议。IPVS的IP层协议支持TCP,UDP,AH和ESP这4种IP层协议structip_vs_protocol{//链表中的下一项structip_vs_protocol*next;//协议名称,TCP,UDP...char*name;//协议值:6,17,...__u16protocol;//不进行分配intdont_defrag;//协议应用计数器,也据是该协议的中多连接协议的数量atomic_tappcnt;/*counterofprotoappincs*///协议各状态的超时数组int*timeout_table;/*protocoltimeouttable*///协议初始化void(*init)(structip_vs_protocol*pp);//协议释放void(*exit)(structip_vs_protocol*pp);//协议调度int(*conn_schedule)(structsk_buff*skb,structip_vs_protocol*pp,int*verdict,structip_vs_conn**cpp);//查找in方向的IPVS连接structip_vs_conn*(*conn_in_get)(conststructsk_buff*skb,structip_vs_protocol*pp,conststructiphdr*iph,unsignedintproto_off,intinverse);//查找out方向的IPVS连接structip_vs_conn*(*conn_out_get)(conststructsk_buff*skb,structip_vs_protocol*pp,conststructiphdr*iph,unsignedintproto_off,intinverse);//源NAT操作int(*snat_handler)(structsk_buff**pskb,structip_vs_protocol*pp,structip_vs_conn*cp);//目的NAT操作int(*dnat_handler)(structsk_buff**pskb,structip_vs_protocol*pp,structip_vs_conn*cp);//协议校验和计算int(*csum_check)(structsk_buff*skb,structip_vs_protocol*pp);//当前协议状态名称:如LISTEN,ESTABLISH...constchar*(*state_name)(intstate);//协议状态迁移int(*state_transition)(structip_vs_conn*cp,intdirection,conststructsk_buff*skb,structip_vs_protocol*pp);//登记应用int(*register_app)(structip_vs_app*inc);//去除应用登记void(*unregister_app)(structip_vs_app*inc);int(*app_conn_bind)(structip_vs_conn*cp);//数据包打印void(*debug_packet)(structip_vs_protocol*pp,conststructsk_buff*skb,intoffset,constchar*msg);//调整超时void(*timeout_change)(structip_vs_protocol*pp,intflags);//设置各种状态下的协议超时int(*set_state_timeout)(structip_vs_protocol*pp,char*sname,intto);};3.2IPVS连接这个结构用来描述IPVS的连接。IPVS的连接和netfilter定义的连接类似/**IP_VSstructureallocatedforeachdynamicallyscheduledconnection*/structip_vs_conn{//HASH链表structlist_headc_list;/*hashedlistheads*//*Protocol,addressesandportnumbers*///客户机地址__u32caddr;/*clientaddress*///服务器对外的虚拟地址__u32vaddr;/*virtualaddress*///服务器实际地址__u32daddr;/*destinationaddress*///客户端的端口__u16cport;//服务器对外虚拟端口__u16vport;//服务器实际端口__u16dport;//协议类型__u16protocol;/*Whichprotocol(TCP/UDP)*//*counterandtimer*///连接引用计数atomic_trefcnt;/*referencecount*///定时器structtimer_listtimer;/*Expirationtimer*///超时时间volatileunsignedlongtimeout;/*timeout*//*Flagsandstatetransition*///状态转换锁spinlock_tlock;/*lockforstatetransition*/volatile__u16flags;/*statusflags*/volatile__u16state;/*stateinfo*//*Controlmembers*///主连接,如FTPstructip_vs_conn*control;/*Mastercontrolconnection*///子连接数atomic_tn_control;/*Numberofcontrolledones*///真正服务器structip_vs_dest*dest;/*realserver*///进入的数据统计atomic_tin_pkts;/*incomingpacketcounter*//*packettransmitterfordifferentforwardingmethods.Ifitmanglesthepacket,itmustreturnNF_DROPorbetterNF_STOLEN,otherwisethismustbechangedtoask_buff**.*///数据包发送int(*packet_xmit)(structsk_buff*skb,structip_vs_conn*cp,structip_vs_protocol*pp);/*Note:wecangroupthefollowingmembersintoastructure,inordertosavemorespace,andthefollowingmembersareonlyusedinVS/NATanyway*///IPVS应用structip_vs_app*app;/*boundip_vs_appobject*///应用的私有数据void*app_data;/*Applicationprivatedata*///进入数据的序列号structip_vs_seqin_seq;/*incomingseq.struct*///发出数据的序列号structip_vs_seqout_seq;/*outgoingseq.struct*/};3.3IPVS服务这个结构用来描述IPVS对外的虚拟服务器信息。/**Theinformationaboutthevirtualserviceofferedtothenet*andtheforwardingentries*/structip_vs_service{//按普通协议,地址,端口进行HASH的链表structlist_heads_list;/*fornormalservicetable*///按nfmark进行HASH的链表(感觉没必要)structlist_headf_list;/*forfwmark-basedservicetable*///引用计数atomic_trefcnt;/*referencecounter*///使用计数atomic_tusecnt;/*usecounter*///协议__u16protocol;/*whichprotocol(TCP/UDP)*///虚拟服务器地址__u32addr;/*IPaddressforvirtualservice*///虚拟端口__u16port;/*portnumberfortheservice*///就是skb中的nfmark__u32fwmark;/*firewallmarkoftheservice*///标志unsignedflags;/*servicestatusflags*///超时unsignedtimeout;/*persistenttimeoutinticks*///网络掩码__u32netmask;/*groupinggranularity*///真实服务器的地址链表structlist_headdestinations;/*realserverd-linkedlist*///真实服务器的数量__u32num_dests;/*numberofservers*///服务统计信息structip_vs_statsstats;/*statisticsfortheservice*///应用structip_vs_app*inc;/*bindconnstothisappinc*//*forscheduling*///调度指针structip_vs_scheduler*scheduler;/*boundschedulerobject*/rwlock_tsched_lock;/*locksched_data*/void*sched_data;/*schedulerapplicationdata*/};3.4IPVS目的服务器这个结构用来描述具体的真实服务器的信息/**Therealserverdestinationforwardingentry*withipaddress,portnumber,andsoon.*/structip_vs_dest{//structlist_headn_list;/*forthedestsintheservice*/structlist_headd_list;/*forta