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,一经查实,立即删除!

相关文章

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…

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

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

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

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

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

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

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

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

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

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

wordpress 自定义分类url 重写_WordPress导航主题-WebStack导航主题

8月份写了一个导航主题,陆陆续续更新了十几版,功能自认已经很完善了,知乎也注册很久了,在这水片文章。首页截图预览地址一为忆 - 收集国内外优秀设计网站、UI设计资源网站、灵感创意网站、素材资源网站,定时更新分享优…

sql跨表查询_白话django之ORM的查询语句

教程源码:z991/django_turital在日常开发中,数据库的增删改查(CDUR)中,查询需求偏多,所以查询的语法比增删改操作多得多,尤其是跨表关联查询,可以让代码精简很多年。直接上代码吧&am…

看不懂论文代码怎么办_学位论文中的公式排版(制表位+mathtype+域)

写在前面为什么把公式排版单独拉出来写一篇文章呢?因为公式排版实在是太难了。公式居中标号右对齐,简直反人类好么。在学校期间一直寻找方便的公式排版自动编号方法,但搜索出来的大多只是用到了制表位,公式标号还要自己敲。最后毕…

利用trunk实现vlan内通信_实现不同VLAN间通信——单臂路由

单臂路由是一种实现不同VLAN间通信的技术,其方法是在虚拟机内接口上配置虚拟子接口。该技术是一种应急技术,仅仅用于网络预算不足,无力购买三层交换机,或者网络规模很小的情况下使用。一、实验路由器只需要一个端口和交换机(二层)…

java dispatchevent_java事件处理机制

java中的事件机制的参与者有3种角色:1.event object:就是事件产生时具体的“事件”,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中2.event source:具体的接受事件的实体&#xff0…

java中的action是指什么_Struts2【开发Action】知识要点

前言前面Struts博文基本把Struts的配置信息讲解完了.....本博文主要讲解Struts对数据的处理Action开发的三种方式在第一次我们写开发步骤的时候,我们写的Action是继承着ActionSupport类的...为啥我们继承了ActionSupport类呢?下面我就会讲解到继承Action…

hql 查询条件 set集合_Redis从入门到深入-Sorted_set的value

1. sorted_set 类型新的存储需求,数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式需要的存储结构:新的存储模型,可以保存可排序的数据sorted_set类型:在set的存储结构基础上添加可排序字段2…

pdm生成java_PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换

本篇文章主要介绍了PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换 超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下1.软件准备软件:Navicat 11.1,Powerdesigner 152.安装步骤第一步&…

java里面如何加入高级的东西_如何成为一名Java高级架构师

近些年来互联网快速发展,现阶段的数据量和高并发的诉求,引起了不少传统的技术人员的力不从心,企业愈发关注到了系统架构的重要性,既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的领导型人物——Java架构师应…

mysql获取最好成绩对应数据的其他项_开源数据同步神器——canal

前言如今大型的IT系统中,都会使用分布式的方式,同时会有非常多的中间件,如redis、消息队列、大数据存储等,但是实际核心的数据存储依然是存储在数据库,作为使用最广泛的数据库,如何将mysql的数据与中间件的…

window访问不到linux的activemq_springboot整合开源项目测试拦截接口访问的频率

本节目标本篇文章主要是介绍以下springboot整合开源项目,实现反爬虫接口防刷的demo,额外的介绍一下axios的基本用法;所以本篇文章阅读起来相对轻松。OK,下面开始整合.引入项目依赖cn.keking.project kk-anti-reptile …

sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet

上一篇Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询讲述了关于Django模型的介绍F对象、Q对象、聚合查询等功能。不管什么查询,返回的结果都基本是查询集QuerySet,如下:In [16]: MiddlewareInfo.objects.all()Out[16]: 1)>, 2)>,…

ecs 云服务器 管理控制台_阿里云ECS服务器监控资源使用情况

阿里云Ecs服务器运维过程中,无论是Centos系统还是Windows系统,有时候我们需要监控分析最新的服务器资源利用率等运行情况,例如最近3个小时CPU使用率情况、内存使用率、网络流入带宽、网络流出带宽、服务器TCP连接数等数据状况。上述提到的这些…