
负载均衡
redwingz
这个作者很懒,什么都没留下…
展开
-
Netfilter之IPVS匹配扩展
以下iptables命令查看ipvs匹配扩展的帮助信息。可匹配的字段分别为:虚拟服务的协议号、地址、端口、数据流的方向、转发模式以及控制连接的端口号。对于类似FTP的服务,其控制连接的端口为21,数据端口为20。$ iptables -m ipvs --help iptables v1.6.0IPVS match options:[!] --ipvs ...原创 2019-10-24 21:21:43 · 944 阅读 · 0 评论 -
IPVS之安全防御
初始化IPVS在初始化时,使用内核delayed work机制启动一个处理任务。每1秒钟(DEFENSE_TIMER_PERIOD)执行一次。/* Timer for checking the defense */#define DEFENSE_TIMER_PERIOD 1*HZstatic int __net_init ip_vs_control_net_init_sysctl(...原创 2019-10-21 19:58:28 · 489 阅读 · 0 评论 -
IPVS的OPS调度
如下ipvsadm配置命令:# ipvsadm -A -t 207.175.44.110:80 -s rr --opsOPS是One-Packet Scheduling的缩写,即单一报文调度。仅应用于UDP协议的虚拟服务,或者是标记UDP报文的防火墙fwmark配置,每个连接仅执行一次报文调度。以下为ipvsadm代码中对–ops参数的解析部分,可见为虚拟服务置位了标志IP_VS_SVC_...原创 2019-10-19 21:14:03 · 648 阅读 · 0 评论 -
IPVS的Persistent持续调度
如下ipvsadm配置命令,开启persistent选项之后,ipvs将来之同一个客户端的请求全部调度到一个固定的真实服务器上。对于SSL和FTP这类,其多个报文之间是相互关联的协议,需要开启此功能。但是对于NAT转发模式,由于NAT将对端口号进行修改,FTP服务需要使用ip_vs_ftp模块才能正常工作。命令行选项netmask默认为255.255.255.255,即仅对一个客户端执行持续调度...原创 2019-10-16 17:44:21 · 1055 阅读 · 0 评论 -
IPVS之Bypass转发模式
不同于NAT/DR/Tunnel转发模式,bypass模式不能够通过ipvsadm命令行显示的指定,而是在调度失败之后,可能进入的一种转发模式,由内核自动决定。对于UDP、TCP和SCTP协议,在调度过程中,如果连接创建失败,例如由于未找到合适的目的调度服务器、内存不足等原因,ignored变量小于等于零的情况发生。其中ignored小于零,表明内存分配失败导致的连接创建失败,此时verdict...原创 2019-10-16 17:43:37 · 1164 阅读 · 0 评论 -
IPVS系统的连接同步 - MASTER同步线程
在内核IPVS中存在两个同步点:函数ip_vs_in和ip_vs_conn_expire。前者用于同步连接信息更新,后者用于超时连接的同步。static unsigned int ip_vs_in(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, int af){ struct ip_vs_conn ...原创 2019-09-19 21:09:01 · 908 阅读 · 0 评论 -
IPVS系统的连接同步 - 准备阶段
以下命令启动和停止ipvs系统的连接同步功能,master和backup表示主同步进程;backup表示备份进程,接收master同步的连接信息:# ipvsadm --start-daemon master --mcast-interface ens39 --syncid 2# ipvsadm --start-daemon backup --mcast-interface ens39 --s...原创 2019-09-18 21:11:12 · 872 阅读 · 0 评论 -
IPVS调度算法之LBLCR
LBLCR(Locality-Based Least-Connection with Replication)调度算法,与LBLC调度算法类似,只是加入了真实目的服务器集合的概念,调度器注册LBLCR调度器的定义结构为ip_vs_lblcr_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。static struct ip_vs_sch...原创 2019-09-15 22:10:22 · 769 阅读 · 0 评论 -
IPVS调度算法之LBLC
LBLC(Locality-Based Least-Connection)调度算法,是基于LC算法的一个变种, 对LC算法调度的目的服务器进行缓存, 对于后续的连接如果其目的IP可在缓存中找到目的服务器, 使用其处理新连接。调度器注册LBLC调度器的定义结构为ip_vs_lblc_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。sta...原创 2019-09-15 22:09:10 · 1267 阅读 · 0 评论 -
IPVS调度算法之NQ
NQ(Never Queue)调度算法,即当真实服务器中有空闲的时,先调度到空闲服务器,否则依据SED算法调度。调度器注册NQ调度器的定义结构为ip_vs_nq_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。static struct ip_vs_scheduler ip_vs_nq_scheduler ={ .n...原创 2019-09-10 19:52:38 · 990 阅读 · 0 评论 -
IPVS调度算法之FO
FO(Weighted Fail Over)调度算法。调度器注册FO调度器的定义结构为ip_vs_fo_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。static struct ip_vs_scheduler ip_vs_fo_scheduler = { .name = "fo", ....原创 2019-09-09 19:53:47 · 558 阅读 · 0 评论 -
IPVS系统的连接同步 - SLAVE同步线程
Slave同步线程函数sync_thread_backup如下,其处理多播同步报文的接收。如下可见,其检测监听套接口的sk_receive_queue队列,一旦队列中有值,使用ip_vs_receive函数将报文接收到线程的缓存中。之后调用函数ip_vs_process_message进行实际的处理。static int sync_thread_backup(void *data){ ...原创 2019-09-19 21:09:43 · 463 阅读 · 0 评论 -
IPVS使用的Netfilter Hook点
IPVS的实现利用了Netfilter的三个Hook点,分别是:NF_INET_LOCAL_IN、NF_INET_LOCAL_OUT和NF_INET_FORWARD。在每个Hook点,IPVS注册了两个钩子函数。如下所示:static const struct nf_hook_ops ip_vs_ops[] = { /* After packet filtering, change so...原创 2019-09-24 10:57:12 · 2142 阅读 · 0 评论 -
IPVS的连接结构
在连接结构的初始化函数ip_vs_conn_init中,可见IPVS为连接结构ip_vs_conn分配了专用的slab缓存,全局连接数据结构ip_vs_conn_tab的大小默认为4K(CONFIG_IP_VS_TAB_BITS)。#ifndef CONFIG_IP_VS_TAB_BITS#define CONFIG_IP_VS_TAB_BITS 12#endifstatic int...原创 2019-09-25 21:20:31 · 1373 阅读 · 0 评论 -
IPVS系统的路由和发送
IPVS不管是配置的NAT/Masq、Direct Route或者隧道Tunnel转发模式,在执行发送时,都需要进行出口路由的查找。路由查找在出口路由查找函数__ip_vs_get_out_rt中,通常根据目的服务器的地址信息进行查找。如下,首先检查此目的服务器结构中是否缓存了路由信息,以及是否还是有效的,如果成立,直接使用缓存的路由表项。否则,就需要进行路由的查找。路由查找函数do_outp...原创 2019-10-08 20:41:24 · 1312 阅读 · 0 评论 -
IPVS中的ICMP报文处理-由内到外
这里主要明与NAT/Masq转发模式相关的ICMP报文处理,但也会提及由于出错引发的IPVS系统主动发送的ICMP报文。ICMP由内到外处理流程入口入口函数ip_vs_out实质上挂载在netfilter的3个hook点上,分别为:NF_INET_FORWARD、NF_INET_LOCAL_IN和NF_INET_LOCAL_OUT。第一个hook点作用于转发的报文;后两个作用于到本机的报文。此...原创 2019-10-08 20:42:30 · 754 阅读 · 0 评论 -
IPVS中的ICMP报文处理-由外到内
这里主要明与NAT/Masq转发模式相关的ICMP报文处理,但也会提及由于出错引发的IPVS系统主动发送的ICMP报文。ICMP由外到内处理流程入口入口函数ip_vs_in实质上挂载在netfilter的2个hook点上,分别为:NF_INET_LOCAL_IN和NF_INET_LOCAL_OUT。第一个hook点作用于目的地址为本机的报文;后者作用于由本机发送的报文。此函数用于处理IPVS由...原创 2019-10-08 20:43:22 · 1397 阅读 · 0 评论 -
IPVS之NAT转发模式
如下ipvsadm配置命令:$ ipvsadm -A -t 207.175.44.110:80 -s rr$ ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m选项-m(–masquerading)即指定使用NAT/Masq转发模式。由ipvsadm-1.29源码中的选项解析函数parse_options可知,-m对应着NAT/Mas...原创 2019-10-08 20:45:48 · 3102 阅读 · 0 评论 -
IPVS之路由转发模式
如下ipvsadm配置命令:$ ipvsadm -A -t 207.175.44.110:80 -s rr$ ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -g选项-g(–gatewaying)即指定使用Direct-routing转发模式。由ipvsadm-1.29源码中的选项解析函数parse_options可知,-g对应着Dir...原创 2019-10-09 21:19:20 · 1721 阅读 · 0 评论 -
IPVS之隧道转发模式
如下ipvsadm配置命令:$ ipvsadm -A -t 207.175.44.110:80 -s rr$ ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -i选项-i(–ipip)即指定使用IPIP隧道转发模式。由ipvsadm-1.29源码中的选项解析函数parse_options可知,-i对应着隧道Tunnel模式,使用标志IP...原创 2019-10-10 20:33:45 · 1310 阅读 · 0 评论 -
IPVS调度算法之OVF
OVF(Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值位置,之后调度到下一个权重值最高的真实服务器。调度器注册OVF调度器的定义结构为ip_vs_ovf_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。static stru...原创 2019-09-09 19:44:14 · 374 阅读 · 0 评论 -
IPVS调度算法之SED
SED(Shortest Expected Delay)调度算法,将新连接调度到延迟最小的真实服务器。调度器注册SED调度器的定义结构为ip_vs_sed_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。static struct ip_vs_scheduler ip_vs_sed_scheduler = { .name =...原创 2019-09-06 20:20:38 · 750 阅读 · 0 评论 -
IPVS支持的协议
IPVS协议初始化函数ip_vs_protocol_init,通过函数register_ip_vs_protocol完成。目前注册的协议结构体有:ip_vs_protocol_tcp/ip_vs_protocol_udp/ip_vs_protocol_sctp/ip_vs_protocol_ah/ip_vs_protocol_esp等五个,根据内核的具体配置进行注册。int __init ip_...原创 2019-08-15 20:28:07 · 590 阅读 · 0 评论 -
IPVS中的TCP连接状态转换
TCP状态初始化在函数__ip_vs_tcp_init中完成,此函数在ipvs网络命名空间初始化时执行,其将全局TCP状态数组tcp_states的地址赋值给TCP协议数据结构的成员tcp_state_table指针。static int __ip_vs_tcp_init(struct netns_ipvs *ipvs, struct ip_vs_proto_data *pd){ ip...原创 2019-08-15 20:25:01 · 1118 阅读 · 0 评论 -
IPVS支持协议的超时时间
以下ipvsadm命令用于显示和设置ipvs连接的超时时间,单位为秒(seconds)。$ sudo ipvsadm -l --timeoutTimeout (tcp tcpfin udp): 900 120 300$ $ sudo ipvsadm --set 3600 120 300$ $ sudo ipvsadm -l --timeout Timeout (tcp tc...原创 2019-08-15 20:23:09 · 3144 阅读 · 0 评论 -
IPVS系统的FTP应用模块
FTP应用模块没有全局初始化操作,仅是注册了网络命名空间操作ip_vs_ftp_ops,初始化init函数为__ip_vs_ftp_init。static struct pernet_operations ip_vs_ftp_ops = { .init = __ip_vs_ftp_init, .exit = __ip_vs_ftp_exit,}; sta...原创 2019-08-20 19:12:00 · 587 阅读 · 0 评论 -
IPVS的NAT转发模式下对TCP序号的修正
由于在NAT转发模式下,ipvs的app模块对报文的修改,有可能改变数据包的长度,对于TCP来说,就需要动态的调整TCP头部的序号和确认序号的数值。输入处理ipvs的应用app模块中函数app_tcp_pkt_in用于处理输入方向的数据流。这里使用两个标志IP_VS_CONN_F_IN_SEQ和IP_VS_CONN_F_OUT_SEQ分别表示是否要修正报文的序号和确认序号。注意这两个标志的判...原创 2019-08-20 19:10:02 · 674 阅读 · 0 评论 -
IPVS真实服务器
先看一下与真实服务器相关的两个部分的初始化,一是在全局初始化函数ip_vs_init中调用的ip_vs_control_init函数;另外一个是在网络命名空间中的初始化函数ip_vs_control_net_init。static int __init ip_vs_init(void){ ret = ip_vs_control_init(); ret = register_pe...原创 2019-08-09 23:33:19 · 364 阅读 · 0 评论 -
IPVS虚拟服务
以下两者方式创建ipvs虚拟服务。前者指定为目的地址和端口为:207.175.44.110:80,协议为TCP(-t选项)的流量提供虚拟服务,采用的调度方式为轮询Round-Robin(-rr)。后者指定为防火墙标记(Firewall-Mark)为1的流量提供虚拟服务,调度方式采用与前者相同的轮询方式。ipvsadm -A -t 207.175.44.110:80 -s rripvsadm -...原创 2019-08-08 20:41:27 · 1350 阅读 · 0 评论 -
ipvsadm配置命令解析
以下为ipvsadm命令,第一行配置Linux虚拟服务:地址为207.175.44.110,端口号为80(-A选项),-t表明此服务为TCP,-s选项指定调度算法为Round-Robin。随后的几行为添加实际的服务器,如192.168.10.1:80(-r选项),-a选项表明为添加实际服务器,-t选项表明是TCP协议,-m选项表明转发方式采用NAT masquerading。ipvsadm -A...原创 2019-08-05 20:03:51 · 2023 阅读 · 0 评论 -
IPVS子系统的app应用结构
在ipvs网络命名空间初始化时,调用函数ip_vs_app_net_init初始化app模块。其中初始化了ipvs网络命名空间结构中的成员app_list链表。另外其还在proc文件系统中创建了名称为"ip_vs_app"的文件,用于显示当前的app应用信息。int __net_init ip_vs_app_net_init(struct netns_ipvs *ipvs){ ...原创 2019-08-15 20:30:48 · 405 阅读 · 0 评论 -
IPVS的PE引擎SIP
如下配置命令指定使用Persistence功能,并且PE(Persistence Engine)指定为sip。$ sudo ipvsadm -A -t 207.175.44.110:80 -s rr -p --pe sip$ SIP PE初始化初始化函数ip_vs_sip_init,执行sip PE的注册工作,将ip_vs_sip_pe结构注册到全局的pe链表ip_vs_pe上。sta...原创 2019-08-25 23:27:43 · 696 阅读 · 0 评论 -
IPVS收发数据相关的速率计算
本文介绍IPVS中的收发数据相关的速率计算。使能估算器ip_vs_start_estimator函数将第二个参数stats包含的estimator挂载到ipvs网络命名空间中的估算器列表中。void ip_vs_start_estimator(struct netns_ipvs *ipvs, struct ip_vs_stats *stats){ struct ip_vs_e...原创 2019-08-12 20:37:47 · 666 阅读 · 0 评论 -
IPVS调度算法之WRR
WRR(Weighted Round-Robin),即带权重的轮询算法。调度器注册WRR调度器的定义结构为ip_vs_wrr_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。static struct ip_vs_scheduler ip_vs_wrr_scheduler = { .name = ...原创 2019-09-05 21:14:36 · 1699 阅读 · 0 评论 -
IPVS调度算法之WLC
WLC(Weighted Least-Connection),即带权重的LC算法,根据权重将新流量分配于活动连接少的真实服务器。调度器注册WLC调度器的定义结构为ip_vs_wlc_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。static struct ip_vs_scheduler ip_vs_wlc_scheduler ={...原创 2019-09-05 21:05:44 · 1656 阅读 · 2 评论 -
IPVS调度算法之SH
SH(Source Hashing)调度算法,将连接调度到连接数量较少的真实服务器。调度器注册SH调度器的定义结构为ip_vs_sh_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。static struct ip_vs_scheduler ip_vs_sh_scheduler ={ .name = ...原创 2019-09-04 20:18:34 · 1222 阅读 · 0 评论 -
IPVS调度算法之DH
DH(Destination Hashing)调度算法,将报文IP头部的目的地址进行哈希计算,之后根据hash值在由真实服务器组成的buckets数组中查找目标服务器。调度器注册DH调度器的定义结构为ip_vs_dh_scheduler,使用函数register_ip_vs_scheduler注册到IPVS的调度器系统中。static struct ip_vs_scheduler ip_vs...原创 2019-09-04 20:16:21 · 687 阅读 · 0 评论 -
IPVS调度算法之LC
LC(Least-Connection)调度算法,将连接调度到连接数量较少的真实服务器。调度器注册由以下的调度器结构定义ip_vs_lc_scheduler可知,此调度器比较简单,仅实现了schedule指针函数。static struct ip_vs_scheduler ip_vs_lc_scheduler = { .name = "lc", ...原创 2019-09-02 19:41:39 · 725 阅读 · 0 评论 -
IPVS调度算法Round-Robin
函数register_ip_vs_scheduler将RR调度器链接到全局链表ip_vs_schedulers上。具体内容请参见:https://blog.youkuaiyun.com/sinat_20184565/article/details/100126417。static struct ip_vs_scheduler ip_vs_rr_scheduler = { .name = ...原创 2019-08-29 21:09:51 · 462 阅读 · 0 评论 -
IPVS调度层
IPVS子系统的调度器统一注册在全局链表ip_vs_schedulers上。IPVS调度器注册函数register_ip_vs_scheduler负责向IPVS系统内注册调度器。内核中不同的调度器以名称作区分,所有注册的调度器链接在全局链表ip_vs_schedulers上。注册函数首先检查全局链表上是否已有相同名称的调度器,如果有的话,说明调度器已注册。否则,将调度器链接到全局链表ip_vs...原创 2019-08-28 20:40:56 · 530 阅读 · 0 评论