linux两台服务器 同一个地址_【网工玩Linux】搭建开源多运营商(ISP)链路负载均衡器...

5888d0a6736389bc0a7e7ae29cc42c57.png

今天,主要想讲一下如何利用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各公网地址备案后给机房有互联网业务的服务器使用。

拓扑示意图如下:

5f7acd6c0833cd42a1dfb64cbbd60859.png

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

物理设备方面,找台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先顶着。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hive 和mysql配置_Hive学习和配置Mysql

1.Hive简介 起源自facebook由Jeff Hammerbacher领导的团队 构建在Hadoop上的数据仓库框架 设计目的是让SQL技能良好,但Java技能较弱的分析师可以查询海量数据 2008年facebook把hive项目贡献给Apache Hive的组件与体系架构 用户接口:shell, thrift, web等…

python拦截修改数据包_会Python?那么你一定要试一试mitmproxy

mitmproxy 是一款工具,也可以说是 python 的一个包,使用这个工具可以在命令行上进行抓包(现在也可以在web页面上查看上抓的数据包了),还可以对所抓到的包进行脚本处理,非常有用。和 fiddler 或charles 等接口抓包工具相比&#xf…

java sha1_java使用SHA1加密算法详解

java使用SHA1加密算法程序源码://下面四个import放在类名前面 包名后面import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;public static String getSha1(S…

java调用hbase_Java调用Hbase

1、java调用hbase时(hbase0.96)报以下错误:Exception in thread "main" java.io.IOException: java.lang.reflect.InvocationTargetExceptionat org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:383)at org…

opython3l_python之 数据类型判定与类型转换

一、 判断数据类型0、type(x)type()可以接收任何东西作为参数――并返回它的数据类型。整型、字符串、列表、字典、元组、函数、类、模块,甚至类型对象都可以作为参数被 type 函数接受。>>> type(1)>>> li []>>> type(li)>>> …

java编写服务器_java编写一个简单的回射服务器

全部代码import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class Client {// 搭建客户端public static void main(String[] args) throws…

python filter函数_python基础——filter函数

python基础——filter函数Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。例如&am…

小程序 wxml selectable_微信小程序 抽象节点

抽象节点这个特性自小程序基础库版本 1.9.6 开始支持。在组件中使用抽象节点有时,自定义组件模板中的一些节点,其对应的自定义组件不是由自定义组件本身确定的,而是自定义组件的调用者确定的。这时可以把这个节点声明为“抽象节点”。例如&am…

java jar 配置文件路径_java jar 配置文件的相对路径问题

无论是在Windows还是Linux操作系统下,绝对路径和相对路径都是很重要的概念,也是许多初学者迷惑的地方,下面我们就这两个概念进行介绍。  绝对路径:由根目录‘/’开始写起的文件名或者目录名称,例如/home/student;  相…

python曲面图颜色渐变方向_matplotlib三维曲面的透明度和颜色渐变?

colset self._shade_colors(color, normals)虽然理论上一个平面的法线都是相同的,但实际上由于浮点运算。这些微小的变化被放大了normalization因为这个{a3}位于0和1之间。在因此,所有完全平面的曲面都容易出现这种着色缺陷。在当颜色是统一的(例如colo…

queue double java_一文弄懂java中的Queue家族

java中Queue家族简介简介java中Collection集合有三大家族List,Set和Queue。当然Map也算是一种集合类,但Map并不继承Collection接口。List,Set在我们的工作中会经常使用,通常用来存储结果数据,而Queue由于它的特殊性&am…

python os.walk_Python os.walk() 简介

os.walk目录遍历每个月都有那么几天想划水,又到划水的日子了,今天分享的是刚在处理遍历目录相关用到的相关方法。os.walkos.walk的参数如下:os.walk(top, topdownTrue, οnerrοrNone, followlinksFalse)其中:top是要遍历的目录。topdown是代…

python pdf转word 表格_太赞了!Pdf转Word,我用Python 轻松搞定表格和水印!

原标题:太赞了!Pdf转Word,我用Python 轻松搞定表格和水印!继上一次为大家推出了将pdf转word之后(卧槽!Pdf转Word用Python轻松搞定!),引起了大家的热烈讨论,我也总结了大家的一些意见…

dao传递类参数 mybatis_Mybatis (ParameterType) 如何传递多个不同类型的参数

偶然碰到一个需要给xml传一个String类型和一个Integer类型的需求,当时心想用map感觉有点太浪费,所以专门研究了下各种方式。方法一:不需要写parameterType参数public List getXXXBeanList(String xxId, String xxCode);select t.* from table…

semantic ui中文文档_Vuetify-广受欢迎的Material风格的开源UI框架

全世界范围内广受欢迎的 Vue UI 框架,一个非常精致的 Material Design UI 套件。 Material Design 风格 UI 框架Vuetify 是一个基于 Vue.js 精心打造 UI 组件库,整套 UI 设计为 Material 风格。能够让没有任何设计技能的开发者创造出时尚的 Material 风格…

java 异常捕获抛出_JAVA异常处理捕获与抛出原理解析

JAVA 异常当代码运行出现错误导致程序终止运行或出现错误情况的状况,就是异常。异常不是指语法错误,即不属于编译错误,只有运行的程序才会有异常。这个时候,JAVA 就提供了优秀的处理方法:异常处理异常处理能让程序在异…

提示tun虚拟网卡没有安装_Win10家庭版通过Hyper-V安装Centos7+Python3.7过程总结

Win10专业版自带有虚拟机Hyper-V, 只需要在控制面板--程序中将其添加到应用就可使用,非常方便,但我电脑预装的是Win10家庭版,没有这个工具,但可以通过以下方法把它安装上:新建文件Hyper-V.cmd,文件内容&…

python自动输入_使用Python和pywin32自动输入数据

我正在尝试编写一个python脚本来获取数据并将其输入任何形式以下是我目前为止的代码:def pasteNum(n):win32clipboard.OpenClipboard()win32clipboard.EmptyClipboard()win32clipboard.SetClipboardData(win32con.CF_TEXT, str(n))##CTRL-Awin32api.keybd_event(win…

nginx 带宽_谈谈Nginx和LVS各自的优缺点以及使用

在最开始呢,咱们先说一下什么叫负载均衡,负载均衡呢,就是将一批请求,根据请求的内容,分发到不同的后端去进行相应的处理,从而提供负载分担,主备切换等功能。对于不同的负载均衡软件,…