背景技术
在Linux***中,与外部通信一般需要三个步骤:
步骤1:发送方按照传输控制协议/网际协议(TCP/IP)生成IP数据包,所述数据包由IP源地址、IP目的地址、IP数据等组成;
步骤2:发送方在Linux***的路由缓存(route cache)中查询可用的路由条目,如果找到准确匹配的路由条目,则按照路由条目发送生成的IP数据包;如果没有找到匹配的路由条目,则在路由表(route table)中根据最长前缀匹配(LPM)算法查找路由条目;
其中,所述匹配的路由条目为:数据包的IP目的地址所对应网络的网络前缀与路由条目中的目的网络前缀相符;
步骤3:发送方根据route cache或route table中匹配的路由条目所指定的网口,发送IP数据包。
在只有一个网络接口的Linux***中,路由条目简单,所有的数据包都从一个网口进出。而对于拥有多个网口的Linux***来说,情况就会比较复杂:假设每一个网口都配置一个IP地址,不同的网口可能对应同一个网络,数据包的IP源地址,只与其中一个网口对应,当Linux***需要发送数据包时,Linux***根据数据包的IP目的地址,在路由表中选择第一个与IP目的地址相符的路由条目,此路由条目对应的网口的IP地址,可能与数据包的IP源地址不一致。在使用其他网口发数据包时,也会出现同样的问题,如此,就可能导致一个网口的带宽利用率很高,而另一个端口的带宽利用率几乎为零,造成不必要的资源浪费。
基于上述问题,现有技术中提出一种解决方案:通过设置套接字(SOCKET)属性的方式,将SOCKET绑定到指定网口上,这样,数据包就可以从指定网口发送出去,但是,这种方法有如下缺点:
第一、需要应用程序修改代码,增加绑定SOCKET到网口的设置,比较麻烦;第二、如果SOCKET绑定到错误的网口,会导致正常数据通信中断;第三、将SOCKET绑定到指定的网口,只能在此网口上接收数据包,其他网口无法被利用,应用不灵活。
现有技术中,还有解决方案提出:通过Linux***的IP ROUTE2来完成负载均衡,对数据包按照时间或者其他规则进行划分,使数据包从不同网口发送,虽然可以利用不同网口的带宽,但是规则制定后,无法控制数据包的出口,降低了***的灵活性。
发明内容
有鉴于此,本发明的主要目的在于提供一种多网口Linux服务器的配置方法及装置,能在保证***灵活性的同时,提高网口的利用率。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供了一种多网口Linux服务器的配置方法,包括:
获取Linux服务器各网口的配置信息,根据配置信息对网口进行分类;
重新配置各个网口的地址和路由;
设置策略路由规则,根据策略路由规则和网口配置构造特定路由表,并刷新路由缓存。
其中,所述根据配置信息对网口进行分类包括:以网口的IP地址和子网掩码的与操作为关键字,将关键字相同的网口分为一类,并将分类结果存储在数组中,数组中的元素为网口的配置信息,数组为网口的索引。
上述方案中,所述策略路由规则为:Linux***根据数据包的IP源地址查询与网口对应的特定路由表。所述根据策略路由规则和网口配置构造特定路由表包括:指定路由的网口地址、目的IP地址和子网掩码,并指定将路由存储在与此网口对应的特定路由表中;每个网口唯一对应一个特定路由表。
上述方案中,所述重新配置各个网口的地址和路由包括:通过ioctl_set_ifaddr接口设置网口的IP地址和子网掩码,通过ioctl_set_route接口设置网口的默认路由,指定默认路由的网口地址、网关地址,并将目的IP地址与子网掩码设置为0。
本发明还提供了一种多网口Linux服务器的配置装置,包括:
网口配置获取模块,用于获取Linux服务器中各个网口的配置信息,并发送给网口分类模块;
网口分类模块,用于根据网口配置获取模块获得的网口配置信息,对网口进行分类;
网口配置模块,用于根据分类后的网口配置信息,重新配置各个网口的地址和路由;
策略路由规则生成模块,用于设置策略路由规则;
路由表构造模块,用于根据策略路由规则和网口配置构造特定路由表;
路由缓存刷新模块,用于刷新路由缓存。
由此可见,本发明所提供的多网口Linux服务器的配置方法及装置,根据网口地址发送数据包,如此,不仅不需要修改应用程序的代码,实现简单方便,而且,可以使不同的数据包从不同的网口发送,因此,能更好的增加网口的利用率,提高带宽利用率和***的灵活性。
具体实施方式
本发明的基本思想为:重新配置Linux服务器各网口,并设置Linux服务器的策略路由规则,根据设置的策略路由规则和网口配置构造特定路由表,每个网口对应一个特定路由表,Linux服务器根据数据包的源IP地址查找特定路由表,根据路由表中的路由条目发送数据包。
这里,每个Linux服务器中均装载并执行Linux***。
所述策略路由规则可以是:Linux***根据数据包的IP源地址即网口地址查询与网口对应的特定路由表;也可以是:Linux***根据数据包的IP目的地址查询与网口对应的特定路由表,且实际应用中,不限于上述方法,只要能实现不同数据包从不同网口发送即可。
所述特定路由表为Linux***预设的路由表,通过ip_add_route接口构造,区别于***路由表,特定路由表序号在1到32765之间,每个网口对应一个特定路由表。
下面通过具体实施例结合附图对本发明进一步详细说明。
本发明多网口Linux服务器的配置方法如图1所示,包括以下步骤:
步骤101,获取Linux服务器各网口的配置信息,并根据所获取的网口配置信息对网口进行分类;
这里,所述获取是通过ioctl_get_allifaddrs接口获取各个网口的配置信息;其中,所述配置信息包括IP地址、子网掩码以及当前网口配置的下一跳地址,即网关地址等。所述ioctl_get_allifaddrs接口是对Linux***的ioctl编程接口的封装,主要功能为获取服务器中包含各个网口配置信息的数据块,并从数据块解析出网口配置信息。
所述对网口进行分类为:对所获取的网口配置信息,以网口的IP地址和子网掩码的与操作为关键字(KEY),具有相同关键字的网口为一类。
实际操作中,可设定一个数组NETSEG[SegCnt][count],用于存储网口分类信息;网口分类后,数组的每一行对应同一类网口,每一行的每个元素对应某一类网口中一个网口的配置信息,数组中的元素就是网口的索引。
步骤102,根据分类后的网口配置信息重新配置Linux服务器的各网口;
因为Linux服务器的网口可能存在没有被设置IP地址或者网口损坏的情况,所以需要对可正常使用的网口的IP地址、子网掩码和路由进行重新配置。
一般,通过ioctl_set_ifaddr接口设置网口的IP地址和子网掩码,所述IP地址和子网掩码根据分类后的网口配置信息来设置,所述ioctl_set_ifaddr接口为对Linux***的ioctl编程接口以及通过此接口进行网口IP地址和子网掩码设置进行的封装。
调用ioctl_set_ifaddr接口时,Linux***会自动给网口添加一个直连路由,所以,本步骤中配置路由主要是设置默认路由。由于同类网口配置的默认网关是相同的,所以只需要在其中一个网口上设置默认路由即可。通过ioctl_set_route接口设置默认路由,所述ioctl_set_route接口为对Linux***的ioctl编程接口以及通过此接口进行网口的路由设置进行的封装。
设置网口默认路由时,指定默认路由的网口地址、网关地址,并将目的IP地址与子网掩码设置为0。同类网口中选择设置默认路由的网口的标准是:同类网口中端口连接状态(LINK)为打开(UP),且同类网口中在NETSEG[SegCnt][count]中索引最小,以便用最短的时间查找路由。
步骤103,设置策略路由规则,根据所述策略路由规则和网口配置构造特定路由表。
具体包括:在Linux***中,通过ip_add_rule接口设置策略路由规则,所述策略路由规则为:Linux***根据数据包的IP源地址即网口地址查询与网口对应的特定路由表;也可是:Linux***根据数据包的IP目的地址查询与网口对应的特定路由表;并且,在实际应用中并不限于以上方法,只要能实现不同数据包从不同网口发送即可。
本发明具体实施例中,以Linux***根据数据包的IP源地址查询与网口对应的特定路由表为例,所述特定路由表为Linux***预设的路由表,特定路由表序号在1到32765之间,每个网口唯一对应一个特定路由表,为保证每个网口对应的特定路由表的唯一性,特定路由表的序号按照网口在NETSEG[SegCnt][count]中的索引递增。其中,所述ip_add_rule接口为Linux***对通过rtnetlink编程接口进行路由设置的封装。
通过ip_add_route接口构造特定路由表的路由,所述构造特定路由表的路由包括:指定路由的网口地址、目的IP地址和子网掩码,并指定将路由存储在与此网口对应的特定路由表中。特定路由表的路由设置方法和现有技术中设置路由的方法一致,设置网口路由,都需要指定网口地址、目的IP地址和子网掩码,不同的是:现有技术中不需要指定路由放在哪个路由表中,默认是放在***路由表中,而本发明设置网口路由时,需要指定路由存储在与所设置的网口对应的特定路由表中,所述ip_add_route接口为Linux***对通过rtnetlink编程接口进行路由设置的封装。
步骤104,刷新路由缓存,使特定路由表路由立即生效。
通常,构造特定路由表的路由后,特定路由表的路由并不是立即生效,因为Linux***存在路由缓存机制,Linux***首先通过route cache快速找到数据包到达目的地址的路由信息,然后再查找***路由表。因此,在完成特定路由表的路由设置后,需要使用ip_flush_cache接口对路由cache进行刷新,使特定路由表的路由生效。其中,所述ip_flush_cache接口为Linux***对通过rtnetlink编程接口进行route cache刷新的封装。
如图2所示,步骤101中所述对网口进行分类具体包括以下步骤:
步骤201,获取第一网口的关键字;
假设Linux服务器有N+1个网口,设置一个数组元素NETSEG[SegCnt][count],其中SegCnt表示网口的种类,count表示同类网口的数目;对网口进行顺序比较,假设从网口i开始,则初始的第一网口为网口i。
步骤202,判断第一网口的关键字是否为0,如果为0,则执行步骤207;否则,获取当前第二网口的关键字,执行步骤203;
这里,第二网口从网口i+1开始。
步骤203,比较两个网口的关键字是否相同,如果相同,说明第一网口与第二网口属于同一类网口,则执行步骤204;否则,执行步骤205。
步骤204,将当前第二网口的关键字的值置为0,同时将网口的配置信息存储在数组元素NETSEG[SegCnt][count]中存储第一网口配置信息的行中,count值加1。
步骤205,判断第一网口是否与其他网口依次比较完毕,如果是,则执行步骤207,否则,执行步骤206。
步骤206,第一网口继续依次与下一第二网口进行比较,如网口i与网口i+2进行比较,依此类推,获取当前新的第二网口的关键字,执行步骤203。
步骤207,判断当前第一网口是否为最后一个网口,如果是,则结束当前比较流程,否则,执行步骤208。
步骤208,SegCnt值加1,即:将当前第一网口的下一个网口作为新的第一网口,获取新的第一网口的关键字,执行步骤202,顺序同其他网口进行比较。
为实现上述方法,本发明还提供了一种多网口Linux服务器的配置装置,该装置包括:网口配置获取模块301、网口分类模块302、网口配置模块303、策略路由规则生成模块304、路由表构造模块305和路由缓存刷新模块306;其中,
网口配置获取模块301,用于通过ioctl_get_allifaddrs接口获取Linux服务器中各个网口的配置信息,并发送给网口分类模块302;
网口分类模块302,用于根据网口配置获取模块301获得的网口配置信息,对网口进行分类;
所述分类具体为:以网口的IP地址和子网掩码的与操作为关键字,关键字相同的网口为一类;并将分类结果存储在设定的数组中,数组中的元素是网口的配置信息,数组是网口的索引。
网口配置模块303,根据网口分类模块302分类后的网口配置信息,通过ioctl_set_ifaddr接口配置各个网口的地址,包括IP地址和子网掩码,通过ioctl_set_route接口配置网口的路由;
策略路由规则生成模块304,用于制定策略路由规则;
这里,所述策略路由规则为:根据数据包的IP源地址,查询与网口相对应的特定路由表;
路由表构造模块305,用于根据策略路由规则和网口配置,通过ip_add_route接口构造特定路由表的路由,设置路由时,要将设置的路由放在指定的特定路由表中;
所述特定路由表是Linux***预设的,每个网口唯一对应一个特定路由表,特定路由表的序号按照网口分类模块302分类结果中,网口在数组中的索引递增。
路由缓存刷新模块306,用于通过ip_flush_cache接口对路由cache进行刷新,使特定路由表的路由生效。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。