双出口负载均衡问题 出口链路负载均衡设备_链路


今天,主要想讲一下如何利用Linux内核功能,搭建与市面上十几万的商用产品(F5、RADWARE等)功能相同的多互联网线路负载均衡设备。

负载均衡,相信各位是了解的。主要包括两大类,一类是应用负载均衡,另一类是链路负载均衡。应用负载均衡,包括了软负载均衡如nginx、LVS,硬负载均衡如F5、RADWARE等大厂的产品。应用负载均衡利用了反向代理和DNS解析,在于同一套业务系统中多台应用服务器间分摊负载,一来便于扩展应用性能,二来通过反向代理等功能保护后面实际的应用服务器。

而链路负载均衡,广泛应用于自建机房且有面向互联网业务的公司,主要目的是在多条互联网出口间分摊网络流量,利用NAT映射功能为内网服务器提供多家运营商的互联网出口以保证访问体验。使用链路负载均衡:

一是可以提高互联网出口利用效率。

二是如果在防火墙实现访问控制表、路由表、NAT映射表都需要CPU计算,对于内网规模较大、业务系统多的公司来说使用负载均衡可以减轻防火墙CPU负载。

三是负载均衡、防火墙、网关路由器承担各自角色,使各项功能模块化,发生单点故障时,仅需寻求该功能模块的替换方案即可,而不影响其他功能。

四是防火墙与链路负载均衡分开可以提高网络安全性,如果防火墙放开端口但负载均衡没有做映射便无法访问,反之亦然。

目前市面上的链路负载均衡设备,以商用产品为主,国际大厂包括F5、RADWARE,国内包括深信服、H3C等,其价格动辄十几万,而部分厂商售后政策也十分垄断,价格令人嗔目。

近期我司原本双机互备的两台链路负载均衡设备,使用年限长了,挂了一台。而新采购设备耗时较长,为了保证在此期间剩下那台发生故障能够有所准备。我研究起了能否用Linux做免费的链路负载均衡。

通过查找,最终在百度文库找了一篇论文有所提及,用iproute2、 ip rule和iptables如何实现。而顺着这条思路查找,网上各种资料、书籍仅仅是简单讲解了基本使用方法。而我写这篇文章,就是为了搞大事——演示如何实现更复杂的链路负载均衡。

首先说下基本条件:

1.当前共有移动、电信、联通三家运营商的互联网出口。

2.移动互联网,公网地址60.1.1.0/28,网关60.1.1.1,有14个公网地址可用。

3.联通互联网,公网地址232.5.5.64/28,网232.5.5.65,有14个公网地址可用。

4.电信互联网,公网地址58.7.7.128/28,网关58.7.7.129,有14个公网地址可用。

6.公司内网用于负载均衡的路由口为10.100.1.1/30,下一跳为防火墙10.100.1.2/30,内网网段包括172.16.11.0/24,172.16.56.0/24,172.16.210.0/24,10.201.1.0/24,192.168.200.0/24,共计5个网段。

7.内部办公区及服务器访问互联网的动态映射地址为移动60.1.1.14、联通232.5.5.78、电信58.7.7.142。各出口其余13各公网地址备案后给机房有互联网业务的服务器使用。

拓扑示意图如下:


双出口负载均衡问题 出口链路负载均衡设备_双出口负载均衡问题_02


介绍完基本情况,我开始正式讲解链路负载均衡的做法。虽然看似复杂,但是搞清楚逻辑概念,外加自己动手做个三四遍后,相信大家做的会比我更好的。

物理设备方面,找台PC主机,有条件的直接上服务器,由于路由表和NAT表都需要网卡与CPU通信、以及CPU的算力,想要延迟小,当然主板和CPU的性能越高越好。然后需要4个千兆网口(网卡也是,性能越高越好),服务器一般自带,而PC需要额外购置一块4口网卡。

软件方面,由于所需功能都是linux系统自带,仅需要装一个系统即可。我选用的是CentOS7,如果有redhat尽管用。

装好了系统,先接网线:

eth0:内网端口

eth1:移动口

eth2:联通口

eth3:电信口

网线接好后,开始进行配置:

一、配置IP地址

配置IP地址可以使用ifconfig或者ip addr。我使用是ip addr,主要是因为各互联网出口如果想把所有的公网ip都使用上,需要在同一个网口上配置多个IP地址。相较ifconfig而言,我个人认为还是ip addr好理解一些:


#首先配置内网口:
ip addr add 10.200.1.1/30 brd 10.200.1.3 dev eth0


配置完成后,先不要急着进行下一步。应该检查一下配置上的所有ip地址是否能够ping通。我在内网做实验过程中发现,有时候由于网关获取arp表中MAC地址较慢,同一网卡中的部分ip地址跨三层ping不通。如果路由不可达那么后续配置端口映射就会发生故障。

对于公网地址,推荐使用“ping & DNS”这款手机app,手机可以在流量模式下自由检测公网中IP地址和各种端口的通断情况,在各大应用商店都可以搜索下载的。

二、添加内网路由

在所有IP地址都确保可以ping通的情况下,先配置内网静态路由,使用ip route命令:


#通过如下命令检查配置情况
ip route show


三、配置table及检查路由转发功能

1.配置table

首先,在路由表中添加三个分表,用于对移动、电信、联通三家运营商实现负载均衡策略。路由表文件路径在/etc/iproute2/rt_tables。

打开rt_tables文件,添加如下三行:


#移动线路


2.开启路由转发功能:

命令如下:


echo "1" >/proc/sys/net/ipv4/ip_forward


四、配置ip rule

由于主要讲负载均衡配置,ip rule在这里不做过多的阐述。只简单提一句,我们可以通过ip rule来实现在多条线路负载均衡的情况下,控制流量从哪条线路出入。举个例子,访问淘宝的流量直走电信线路、访问天猫的直走联通线路等等,还可以结合iptables的mark功能——要求某一特定的内网用户只走联通线路(例如,现在银行系统一般会检查IP地址变动情况,而负载均衡会造成地址检测异常影响对银行网络的访问)。

我这里实验需求比较简单,仅确保联通进来的流量再从联通返回,类似这样的要求即可。代码如下:


#移动规则
ip rule add from 60.1.1.2 table CMCC


五、配置分表路由策略

分表路由策略比较简单,主要CMCC、CNC、CTC三个表中配置一条默认路由和一条相对应网段的路由即可:


#移动:
ip route add 60.1.1.0/28 dev eth1 table CMCC
ip route add default via 60.1.1.1 dev eth1 table CMCC


六、设置默认路由负载均衡

在路由主表中配置三个出口的负载均衡策略:

七、配置动态映射做内网互联网出口

下面主要用到iptables的SNAT功能,为移动60.1.1.14、联通232.5.5.78、电信58.7.7.142做动态映射,原则上每个内网网段都需要配置一条SNAT,当然也可以收敛为192.168.0.0/16,172.16.0.0/12,10.0.0.0/8三个网段做:


#移动:
iptables -t nat -A POSTROUTING -o eth1 -s 172.16.11.0/24 -j SNAT --to 60.1.1.14
iptables -t nat -A POSTROUTING -o eth1 -s 172.16.56.0/24 -j SNAT --to 60.1.1.14
iptables -t nat -A POSTROUTING -o eth1 -s 172.16.210.0/24 -j SNAT --to 60.1.1.14
iptables -t nat -A POSTROUTING -o eth1 -s 10.201.1.0/24 -j SNAT --to 60.1.1.14
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.100.0/24 -j SNAT --to 60.1.1.14


经过上面诸多配置,到这一步,我们内网的用户们便可以轻松的访问互联网,愉快的玩耍了。

结合iptables的mark与ip rule,可以实现更加智能的负载均衡策略。在这里不多赘述。下面,将介绍服务器映射。

八、服务器映射

完成上述工作,内部用户能够成功访问互联网后,剩下的工作就是简单的在iptables上做DNAT映射,唯一的区别就是同一台内网服务器,我们要做多条线路的DNAT映射,例如在本文中每个运营商,我们有14个公网地址,拿来做一对一、多对一的NAT都可以。简单举一个例子如下:


#为10.201.1.155的80端口web服务提供移动、联通、电信三条线路的公网映射:
iptables -t nat -A PREROUTING -i eth1 -d 60.1.1.4 -p tcp --dport


这样一来,我们就可以通过60.1.1.4/232.5.5.72/58.7.7.134这三个地址的80端口访问同一台服务器的web了。为了得到更好的访问体验,现在如阿里云等各大域名解析平台都可以根据运营商线路来解析对应的IP地址。

九、总结

本文,仅仅是讲述了linux搭建负载均衡的最基本的一些套路。动辄几十万的商业级链路负载均衡那些高级功能,同样可以利用iptables和iproute2的高级配置进行组合得以实现

至于性能方面,实际上商业产品也是用的服务器,甚至有些产品用的是低端的服务器。只是内部操作系统是自研、经过优化的。Linux虽然优化可能没有商业产品好,但是可以通过高性能硬件多少弥补。

至于交互界面复杂这种事情,对于我来说,可以通过perl或python写一个web端弥补。

所以,各位同仁们,链路负载均衡坏了不要怕,可以快速搭一个linux先顶着。