特殊事件处理篇

局域网路与 switch LACP

在局域网路内经常需要的网络服务,以及很重要的 LACP 功能!虽然有 10G 就没这需要...

最近更新时间: 2013/04/01

假设你已经看过 Linux 私房菜的基础学习篇服务器架设篇, 那么你应该会知道,架设一个在网络实体媒体分离的局域网路 (LAN) 其实不难,最简单的作法,那就 (1)买个便宜的 IP 分享器来处理对外连接, (2)内部的 LAN 使用一个便宜的 giga hub 来串接所有的 PC 与行动设备,一切就结束了。好开心!好愉快啊!

只是,如果 (1)你的 LAN 里面总共会有超过 60 部以上的电脑,而且这些电脑还需要常常共享数据,因此数据传输带宽非常大, 一般的 5~8 端口数的 hub 根本不够用!那该怎办?此外, (2)由于想要预防局域网路被恶搞,或者是需要加上一些防火墙控制参数来避免用户在区网内误用网络资源时, 如果考虑 IP 分享器,它根本没办法提供这些功能,又该怎办?又或者是 (3)LAN 里面有部大家都需要使用的文件服务器,当所有人都连上去时, 总带宽该怎么算?由於单张 Gb 网卡最多就只能提供 1Gbits/s 的带宽啊!但又不想要买 10Gbits/s 的网络设备 (现阶段还贵的要死),那又该如何增加有效带宽?

这些东西在服务器架设篇里头并没有仔细说明,因为那是给一般互联网环境使用的架构!互联网使用的数据量并不会太庞大! 但如果是校园或企业内部强调高速传输的环境底下,总传输数据量或尖峰传输量可能是相当庞大的!例如近年来相当热门的虚拟化技术就用到很多区网内部的高速保存设备! 这时,一个仔细规划过的局域网路就很重要啦!

鸟哥这里并没有谈到给高端保存设备使用的环境,因为那属于大型企业的尺度,那种环境的网络媒体,没有数百万是搞不定的。 我们这边强调的是给校园及中小企业使用的环境,包括一般校园的电脑教室或小型计算机中心的环境架构,想要高速运作网络传输时, 那就得要加些功夫进来,否则,你常常会发现,怎么局域网路的传输速度那么慢啊!呵呵!醒一醒吧!来用功啰!

1. 局域网路的硬件连接考虑

如果你有看过私房菜服务器篇了,那么局域网路的建置应该不怎么难才对~尤其是硬件的部分,不就是通过星形连接方式,中央部分使用集线器 (hub) 或交换器 (switch) 连接各个终端设备 (指的大部分就是 PC 啦),然后在各个终端设备上面搞定好操作系统,之后在区网内搞个路由器 (router) 或 IP 分享器提供局域网路的对外连接,一切就搞定了!有啥难度的啊?

话是这么说没错啦!不过,想一想,如果你的电脑数量是 60~100 台 PC,这么大量的电脑设备要连接,现在常见的多端口数交换器,最多也不就是 24~48 port 而已,那你要买几部?此外,switch 对 switch 又要如何连接?连接几个 port 会比较好?需要怎么进行 switch 设置?这些好像都应该要考虑考虑才好!

1.1 硬件、速度与 port 数量的考量

一般家庭使用的局域网路,不过是区区五、六台电脑,所以买个小型的桌面型 gigabit 交换器也就搞定了,小型 8 port 交换器不过一两千块就搞定了。 而且体积小也不占空间。唯一需要考虑的,是这个交换器不要放在密不通风的地方,例如桌子底下或柜子里面。因为鸟哥家里实际使用的小型 8 port gigabit 交换器,连续两三部都因为热当的问题导致数个 port 损毁,每个交换器大约使用 3 年就寿命终了了~没办法,鸟哥的机器所在的工作室,人不在的夏天没开冷气的情况下, 室内温度是高的吓人的~所以,夏天的时候,调制解调器、无线 AP 与交换器上方还会摆个小电风扇去吹他~电风扇再用定时器去控制~避免交换器热当导致没有网络可以用...

TP-Link 的 8 port 小型 switch hub
图 1.1-1、学生推荐的,鸟哥目前在家里用的 TP-Link 的 8 port 小型 switch hub
(图片来源:http://www.tp-link.com/en/products/details/?categoryid=224&model=TL-SG1008D)

家庭环境还好啦,简单就搞定了。不过一般中小型企业所在的环境就不是这么简单了!举个例子来说,鸟哥服务的昆山科大信息传播系,系上有四间电脑教室,其中一间内部含有 61 台 PC、一部防火墙系统、一部打印机,随便加一加就有 63 个设备,也就是说,至少得要有 63 port 的交换器才能够处理这个环境。问题是,早期的交换器较多 port 数的通常比较贵,加上厂商认为我们可能会在交换器上面做些控制,因此采购的是 3 台 24 port 的有网管功能中低级交换器,每一台大约是一万多块台币吧。 由于 3 台 switch 也需要连接,两两连接的结果,就占用了 4 port 了,所以全部可用的端口数为 3*24-4=68 个,看起来,这个数量好像还够喔!

两款目前在本系服务的 24 port 有网管交换器 两款目前在本系服务的 24 port 有网管交换器
图 1.1-2、厂商规划的,鸟哥服务的单位的两款 24 port switch
(D-Link 图片来源:http://www.dlink.com/us/en/support/product/...)
(ZyXEL 图片来源:http://download.zytpe.com.tw/zyxel/support/...)

原本以为上述的规划就够了,因为都已经是 gigabit 的网络了嘛!但后来接触到 DRBL+clonezilla (这个后面章节会谈到),同时鸟哥之前也自己搞一套信息传播系自己的快速复原系统, 这些系统都是统一通过一部 server 来提供用户端的快速复原。想一想,每一部 PC 都是向同一部 server 要数据啊,而一部 server 仅使用到一个 port, 每个 switch port 最高仅能使用 1Gbit/s 的速度,因此,60 台 PC 中,每部 PC 仅能分到 (1Gbits/s)/60=(1000Mbits/s)/60=17Mbits/s=2.1MBytes/s,要死了~如果每部 PC 同时下载一个 1GBytes 的文件,那得要花上 (1024Mbytes/(2.1Mbytes/s))=480sec=8分钟左右,这还是理论极限速度喔!哇!老师们随便提供的一个作业视频,光是上传就要死人~ 更何况是当系统需要复原时,需要传输的数据量通常是数十GBytes以上的数据量!所以,这样的架构看起来是有些问题了。

我们是定位在中小企业的实作环境啊,也就是说,我们需要的是使用较少的钱可以取得较大的电脑与网络使用效益。所以,上述的环境如果要改善,有经验的朋友当然会说, 阿全部换成 10Gbit 的网络就好了啊!那比 gigabit 的速度要再快上 10 倍呢!肯定没问题了吧?问题是,钱钱啊! 10Gbit 在目前 2013 年的现实环境下,还是贵的要命! 而且不只交换器,连电脑的网卡都要换掉才行~这样区网才能够全部上 10Gbit 啊!一张 10Gbit 网卡可能比一部低级的主机还要贵了哩 (上万块新台币)!那怎么有这么多钱钱? 所以,底下就得要来谈谈,有没有比较便宜且可行的方案呢?

既然还是得要在 gigabit 的网络上面着手改良,那想一想,有没有办法增加 Server 的带宽呢?举例来说,能不能使用多张 gigabit 网卡来增加 server 的总带宽? 如果可以用两张网卡来处理,那不就可以增加 100% 的带宽了 (从 1Gbits/s --> 2Gbits/s)!好棒呢!听网络上许多前辈在说,bonding 这个技术可以使用多张网卡来绑定成为一个 IP, 如此一来,该 IP 就能够使用多张网卡,就能够解决带宽问题了呢!真的吗?当然要考虑很多方面啦!最重要的地方是,带宽频颈可能在 switch 对 switch 的连接处喔! 怎么说呢?让我们看看底下的连接范例:

没有进行 trunk 的交换器连接方式
图 1.1-3、一般进行网络连接时,交换器直接连接的状况示意图

仔细看上图的结果喔,当有三部 PC 直接连上 B 这个 switch 时,这三部 PC 可以获得完整的服务器提供的三张网卡总带宽。但如果是 A 与 C 区连接的 PC 呢?由于 A 到 B 两个 switch 仅使用到一个端口口,因此这两个 switch 之间最大的带宽当然也只有 1Gbits/s 的量,所以,如果 A 区有三部 PC 要使用服务器的资源时,你猜猜网络流量的频颈在哪里?想也知道是两个 switch 间的总流量啊!那怎么办?能不能在两部 switch 之间接上两条以上的网络线啊?

后来又听说,如果要增加两个 switch 间的总带宽,可以通过一个称为 LACP 的协定来处理 (本章稍后会谈到) ,当两个 switch 想要分别使用到超过两个以上的端口口来互连时, 如上图的 A 到 B ,使用两条网络线来连接这两个 switch 时,可以通过这个协定来让两个端口口合成一个进行网络流通,如此一来,两个 switch 间的流量就可以倍增了! 这真是好棒啊!那就能够增加 A 区的 PC 连接到服务器的总带宽啰!

Tips 鸟哥 要注意的是,两个 switch 不可以在没有设置 LACP 或其他相关协定时,使用两条以上 (含) 的网络线连接~如果你用了两条以上的网络线串连两部 switch, 这时就会产生 switch 内部的广播风暴,好一点的 switch 会自动的关闭被你连接的那几个端口口 (那几个端口口不能使用了),差一点或者是没有设置防堵机制的, switch 可能会热当或者是造成连接到该 switch 的所有设备无法连接的问题喔!要注意!要注意!很严重!很严重!

由于 LACP 仅存在于有网管功能的 switch 上头,如果你使用的是无网管功能的 switch ,那么就无法使用 LACP,也就无法在两个 switch 之间使用多条网络线串接了! 好佳在,当初我们系上请的厂商规划的是有网管的 switch,那我们就可以使用多条网络线串接两部 switch 来增加局域网路内的带宽了吗?当然不是!没有这么愉快!为什么?

再回到图 1.1-3 的鸟哥服务的单位的网络环境。由于我们的服务器上头可以接上最多 3 个对内的 Gbits/s 网络,为了让 A, B, C 的 PC 均能够顺利的使用服务器 3 张网卡的功能,因此每个 switch 之间我们打算使用 3 条网络线来串接。由于 switch 是两两成对的,因此用在连接 LACP 的端口口数将到达 12 个这么多! 然后服务器提供了三张网卡进行 bonding,加上一台打印机、61 台 PC 电脑,则总端口口数需求为 12+3+1+61=77 !但我们的 24 port 3 台 switch 最多仅有 24*3=72 个啦! 少了五个...所以说,预留 switch 端口口数以供未来利用有多重要了!

综合来说,小型局域网路当然不用考虑底下的需求。但如果您的区网有超过 50 部以上的终端电脑设备,而且可能未来会考虑使用无硬盘环境、虚拟化环境, 或者是需要比较高数据传输的带宽设置时,同时,你没有钱钱购买较大型的网络设备 (10Gbits/s 之类的网络媒体),那你应该要注意:

  • 统一全区网的网络媒体到 1Gbits/s 的速度:
    还在使用 10/100 Mbits/s 的网络媒体吗?这与 Gbits/s 的速度可是差了 10 倍喔!速度差异之大在你使用 Internet 时并没有感觉,但使用 LAN 内部进行传输时, 传一个 1GBytes 的文件,理论极速传输完毕的时间分别是 80 秒与 8 秒喔!如果文件越大,这个数值差异会越可怕!所以赶紧换成 1Gbits/s 的网络媒体吧! 其实最重要的是网络线啦!如果你的区网内还有 Cat5 的网络线,赶紧换掉他~至少也要 Cat5e 或 Cat6 以上的网络线才好喔!建议至少都得要 Cat 6 的线了。

  • 至少保留多个网络端口口与预留布线线材 (预先设想未来可能会增加的设备):
    提到网络线就不能不说说,整个区网能够顺利运作与否,并非取决在服务器上面,连 switch/hub 恐怕也不是主因~最重要的反而是你平时不会注意到的网络线! 虽然目前大家都喜欢使用无线网络设备,但是骨干以及固定的终端设备总是使用网络线链接时,速度与可靠性都比较好!此外,网络线你总不会常常更换吧? 因此,检验一下你的局域网路,花一笔小钱将整个区网的网络线全部更换过,并且将这些网络线固定好,这些线材将可使用十年以上啊!为了避免日后一直去拆卸线材, 所以你最好预先设想某些重要设备的增加,预先留下几个预留的线材,未来你就可以直接使用网络而不需要再拉一次线~这很重要啊!

  • 至少购买中低级的入门型网络媒体 (例如有网管的低级 switch):
    过去的服务并不需要大量的数据传输,不过近年以来,虚拟化、快速复原等任务,都会使用到相当庞大的网络数据量!而我们从上面也知道,庞大数据量的传输频颈未来可能会出现在 switch 对 switch 之间!所以,能够提供一些网管功能的 switch 来增加带宽,就是一个很重要的考量因素~因此在大于 50 个以上的连接点,而你必须要有数个 switch 来串接的环境下,建议还是得要购买有网管功能的 Gbits switch 较佳!

1.2 网络链接拓朴

事实上,不同的网络使用行为产生不同的连接思考方向。如果你的环境仅是要实现大家都可以连上 Internet 的话,那么简单的连接即可。如果是想要在区网内部作个大流量的实验, 那可就不能随便连接而已,得要思考如何扩大带宽频颈处才行!

  • 一般办公场合,内部尚无大量数据传输的需求环境:

如上个小节说的,小型区网只要星形连接中间的 switch/hub 所提供的 port 数量够,将所有的 PC 与终端设备通通使用 cat6 以上等级的网络线连接在一起就好了! 但如果是具有比较多终端设备的环境下,就得要考虑考虑不同的方案了!上个小节鸟哥也提到我们系上的某间具有 61 台 PC 的电脑教室环境,使用了 3 台 24port switch 的环境。不过,后来我们在该教室内使用 PC 操作系统大量网络还原的机制,这就发现网络速度有点慢~因此只好将原本的网络环境稍作调整~

过去的文档都说,最好将每个小区网独立出来,这样除了可以克服网络封包的碰撞问题之外,管理与调试也会变的比较方便(参考注1, 2文档)。举例来说, 如果你所在的企业环境内部有三个部门,每个部门有大约 20 个左右的终端设备需要连接时,那么在每个部门摆上一部 24port 以上的 switch,然后将三个部门的 switch 统一拉到公司对外的线路所在的那个 switch 上,而公司内部的服务器也是连接到该部对外的 switch 上头,如此就完成整个区网的连接设置。如下图所示:

一般多个小型区网连接时的拓朴方式
图 1.2-1、一般多个小型区网连接时的拓朴方式

上述的连接方式是比较简单且单纯的,如果你的区网内,每个员工常常有需要连接到 FTP 去下载大型文件时,那么这个连接的架构的频颈将会发生在 FTP server 到 switch 这一段。 如果区网-1的内部网络中,有个特殊的服务被启动,而区网-2的员工都得要去访问他时,那么频颈就会发生在 switch 到 switch 连接的那个 port 上面啰。

  • 教室内设有无碟环境或大量数据传输的情况--切割成数个独立的小区网:

如果将上述的环境思考成在同一个电脑教室内呢?而且,在这个拥有 60 部电脑的教室中,若考虑统一控管电脑的操作系统,所以所有的 PC 其实内部并没有硬盘,而是使用服务器所提供的网络文件系统呢?那么上图的链接方式就不行啦!因为性能频颈会卡在服务器上面的那张网卡,全部的带宽仅有 1Gbits/s 而已。

在继续说明之前,让我们来作个数学吧!现在的新型桌机硬盘数据读写率大约在 100~150Mbytes/s 左右,至于中低级的笔记本电脑读取性能则可能在 40~80Mbytes/s 左右。 如果我们的 PC 是无硬盘环境,因此操作系统碟的数据是来自于服务器,PC 与服务器之间使用的是 1Gbits/s 的网络设备,转成文件容量单位,则最大磁盘访问率约为 125Mbytes/s 左右, 这差不多是一般一部桌机的硬盘读写率。

好了,一部这样的无碟设备是很 OK 的喔,如果是整间电脑教室 60 台电脑都使用这样的无碟环境呢?那么 125Mbytes/s 就得要分享给 60 部电脑,算一算喔, 平均每一部电脑能够用到的数据量大约是 2Mbytes/s 喔!请查找一下这个数据与一般低级笔电的 40~80Mbytes/s 数据比较看看,这 60 部电脑想要完成开机, 他开机所花费的时间是低级笔电的 20 倍以上时间喔!因为网络在很繁忙的时段将会造成更多的封包碰撞,导致网络性能低落~所以,想想看,一张 Gbytes 的网卡能够符合我们的需求吗?

为了改善单张 Gbits/s 网卡的困扰,台湾的国家高速网络中心所发展的 DRBL (Diskless Remote Boot in Linux, 注1) 安装环境中,他们建议,在一间 40 部电脑的教室中, 服务器至少得要有 4 张 Gbits/s 的网卡,每张网卡独立分给 10 个用户,因此分成 4 个小型区网。这 4 个区网得要分别安插在 4 个没有串接的 switch 上面 (有网管交换器的 VLAN 功能也属于没有串接的环境),且这四个区网的网络 IP 网段是不一样的 (考虑的每个区网的 NAT 与路由器设置之故)。详细的 DRBL 建议 40 台电脑串接与 IP 网段示意如下:

DRBL + 40 clients
图 1.2-2、DRBL 官网建议的,40 部电脑的环境底下,服务器的连接方式

继续来作个数学好了,上图中,由于每个单张网卡仅负责 10 个用户,因此每个用户可使用的网络速度平均可达 10~12Mbytes/s 左右, 由于 DRBL 主要是提供开机时读取数据量相对较少的 Linux 系统,因此整体的开机速度是可接受的。不过根据 DRBL 官网的说明,在这样的环境底下, 10 个用户同时打开 OpenOffice 这模拟较大型的办公室软件时,得要等待数分钟才能够打开完毕~虽然是比单机要慢很多,但至少是在可接受的范围内~

Tips 鸟哥 老实说,由于虚拟化技术的成熟,目前我们常常会接触到虚拟化的操作系统环境 (一般简称 VM)。就鸟哥的经验来看,如果 VM 的磁盘读写效率不能到达 20 Mbytes/s ,亦即是达不到低级的笔电 40Mbytes/s 的一半性能时,那么这个系统应该是算稍微失败的。不过考虑到用户经验, DRBL 建议的每张网卡 10 个用户,已经是很极限啰!最好是每张网卡给 5 个用户使用,那样的环境会较为合理些。

虽然说上述的网络连接环境可以满足 DRBL 的需求,不过就鸟哥个人的观点来看,实在有点不太舒服~怎么说呢?鸟哥所服务的单位,很多老师教导的是属于影音实务方面的课程, 得要使用到 Windows 加上 Adobe 这些较庞大的软件怪物。由于 DRBL 暂时不支持 Windows 系统,因此,我们得要在个别的 PC 上面安装各项所需要的软件。 问题来了,假设老师的电脑放置于 192.168.100.0/24 的网段,那么同网段的十个人可以很轻松的链接到老师端的网芳来下载老师提供的范例档。 但是其他三个网段就没有这个福利了!因为『网芳缺省仅提供区网内的用户端连接』而已。因此 192.168.101.0/24 之后的网段就无法使用老师的网芳了! 除非老师自行将 Windows 防火墙关闭或更改设置,否则就是很麻烦~

  • 教室内设有无碟环境或大量数据传输的情况--通过 switch 功能增大带宽且放置于同一网段:

那有没有办法将所有的电脑放置在同一个区网内?不要再分不同网段了啦!是可以啊!不过可能需要有网管功能的 switch 协助才行喔!就如上个小节谈到的, switch 对 switch 之间可以通过 LACP (下个小节会谈) 的功能将几个端口口绑在一起来加大两者间传输的带宽。

以鸟哥自己来说,鸟哥在自己的服务单位内,以一间共 61 台电脑的教室为示范空间, 里头摆了四部有网管的低级 switch,通过主控 switch 连接到其他三部 switch ,每部 switch 间使用 3 条网络线串接,通过 LACP 的功能,理论上可以让每个 switch 对 server 的带宽放大成三倍!同时 server 使用 bonding 功能安插了共 3 port Gbits/s 网卡,提高所有 PC 对 server 的总带宽。如此一来,所有的 PC 将可以在同一个区网内, 而且带宽方面也算是在还能接受的范围~底下为实际连接的示意图:

bonding + LACP
图 1.2-3、通过服务器主机的 bonding 加上 switch 间的 LACP 扩大带宽的连接方式示意图

如上图所示,主控的 (最上方那部) switch 仅直接连接服务器与 switch 而已,并不接受一般 PC 的连接。至于其他三部 switch 则是每部连接 20 个 PC 终端设备。 因为使用 24 port switch,所以这三部 switch 总共会花费 20+3 个端口口,就剩下一个备用的啰。其他共用设备 (打印机、服务器等) 就都接在主控 switch 上头, 如此一来,一般的互联网连接,就只会经过主控 switch 与该 PC 连接的 switch,其实是有扩大带宽的功能的。

除了扩大带宽功能之外,这个方案与图 1.2-2 的方案来比较,虽然封包碰撞的情况可能较严重,或许不利于 DRBL 的环境。但考量到目前电脑很少会没有硬盘的状况, 所以这个方案着重在上课过程中,除了同学间的数据分享可以具有较高的带宽之外,所有设备都在同一个网段下,让教学的网络环境较为单纯,是比较优良的地方。

1.3 什么是 LACP 与设置前准备

既然我们的局域网路连接需要使用到 LACP 来扩充带宽,不了解一下怎么行?所以底下就先来聊聊 LACP 吧!

  • 什么是 LACP :(注3)

LACP 的全名是 Link Aggregation Control Protocol,中文翻译为『链路聚合控制协定』,这个通信协定可以在 switch 对 switch 之间,或 switch 对 PC 之间有连接的需求时,可连接多条实体网络线,以达到网络连接容错以及增加两者间带宽的目的。

我们知道 swtich 对 switch 之间,如果没有激活特殊的功能,当连接两个以上的连接时,恐怕会造成 switch 的内部广播循环,导致整个 switch 或某些端口口的失败。 因此一般 switch 对 switch 之间,仅能连接一条实体网络线。但 switch 对 switch 之间如果仅有一个端口口的连接时,由于端口口速度的关系,整体网络传输总量的频颈将会产生在两个 switch 对接的端口口上。因此,这个 LACP 协定最初发展的目的就有两个,一个是由于有多条连接,因此连接就具有容错功能,可以在某条连接失败时, 两者间的连接依旧可以通过其他存在的连接来达成。另一个就是在增加整体的网络流量传输率(throughput)

那么 LACP 实际上在 switch 的连接是如何进行数据发送的呢?其实所有的数据都会被分散在实体的 switch 间的连接中,另外,我们知道 switch,尤其是第二层的 switch 主要是针对网卡卡号 (MAC) 来进行数据的发送,为了不要让 switch 一直在端口口间切换同一个 MAC,因此,同一部主机所发出的连续讯框 (frame), 基本上都会通过同一个实体网络线来发送,而不是交替在不同的网络线间发送。举例来说,如果有两条对接的线,在两边的 switch 各有两部主机,并且分别对另一台 switch 的主机连接。理论上,两两 PC 连接会通过不同的两条实体线路连接,所以总带宽就可以增加一倍了!当然,这是最佳的情况啦!

  • LACP 连接设置的设置模式与连接类别:

事实上,两个 switch 间多条连接达成的设置模式有两种,一种是静态的固定设置 (static),一种是让 switch 自动动态询问的模式 (就是 LACP):

  • Static(静态) 模式:switch 两边的连接端口口数量是固定的,而且需要设置成 Link Aggregation Group (LAG) 群组,且由于是静态设置, 因此每一条实体网络线都不可以出错,否则就会无法连接成功。

  • Dynamic(动态) LACP 模式:当 switch 两边都设置 LACP 模式时,两边端口口会通过询问的方式来检查是否有加入 LAG 群组,如果有的话,就达成 LACP 连接, 不然就略过 LACP 连接。

既然可以直接静态设置好 LAG 的链路聚合,干嘛需要使用 LACP 呢?这么说好了,假设你有三条固定的 switch 间的连接加入静态的固定设置方式, 那么这三条线都得要同时达成连接成功,有任何一条连接失败时,这两个 switch 间的连接都会失败了,因为这种方式并没有容错啦!那 LACP 就不一样, LACP 可以自动询问两个 switch 之间的连接是否有加入 LACP 协定,若有的话就会达成连接,若是该连接失败了 (例如线路脱落),那么该连接就会自动脱离 LACP 的控制,以让还存在的连接继续运作,这就是具有容错的能力了。

同时,动态的 LACP 模式提供两种类别的设置,包括 active 与 passive 两种类型,说说两种类别的运作方法吧!

  • Active:主动类别,设置为此类别的端口口会主动的询问链接的对口是否为 LACP (会发送 LACP 询问讯框),若是的话,就加入 LACP 的连接管理方式;

  • Passive:被动类别,主要是可以回复 active 的类别,并且被动的达成 LACP 的连接功能。若没有任何 LACP 的 active 要求时, 就不会处理 LACP 的任何动作。

所以,要达成 LACP 连接,switch 两端可以都是 active 连接,或是一边是 active 一边是 passive 才行!如果两边都是 passive 的话,那就不会有 LACP 询问讯框产生,那么 passive 就不会回应,自然也就无法达成 LACP 连接了。也就是说,接口两边至少需要有一边是 active 类别才行!

不知道你会不会觉得很奇怪,既然两者间的连接需要两个端口口间的主动沟通询问来达成 LACP 的完整连接行为,那为何需要 passive 这种类别呢? 根据 wiki 的内容说明,这是因为当 LACP 设置在 passive 类别时,即使你的环境没有任何 LACP 的连接,你的网络就不会去回应与发出任何 LACP 的讯框,如此一来,你的网络就可以持续正常运作,也不会有任何的 LACP 讯框产生。有何好处?可以节省设置的手续啦!何解?听鸟哥慢慢道来!

妳可以将你的 switch 设置启动 LACP 并且启动在 passive 类别下,那当你的 switch 并没有任何的多条网络连接与 active 的设置,那也不会有任何的干扰!可作为缺省的设置值也没关系!当有 LACP 的 active 讯框产生时,你的 passive port 就会自动的跟对方达成连接,想想看,这样是否就变得比较人性化些呢?有要求就连接,没要求就保持正常工作啊!

  • LACP 的设置前准备工作:

能不能设置 LACP 还是有一些限制的,前提之下当然就是你的 switch 要支持这个协定,一般来说,switch 上面写有支持 IEEE 802.3ad 或 IEEE 802.1ax 的, 理论上就可以支持啦!另外还有一些小细节要注意:

  • 所有作为 LACP 网络链接的组件都需要全双工模式 (full duplex mode);
  • 必须使用相同的数据传输速度,例如全部都是 1Gbits/s 的速度才行;
  • 必须点对点直接连接;
  • 总带宽为非线性增加,且由于分布的算法差异,通常流量分配率不太可能达到理论的 50/50 (假设有两条实体网络线时),能够到达 30/70 的分配率以上就很好了。

1.4 实际设置 LACP 的案例:

由于鸟哥所接触的环境中,目前仅测试过 ZyXEL 对接的系统,以及 ZyXEL 对接到 Cisco 的 switch 系统,其中又由于 Cisco 得要使用终端接口登录 RS232 的连接环境, 所以这边鸟哥就不列出示意图,详细数据可以参考文末的参考文献 (注3) 的说明内容。底下仅列出 ZyXEL 他们家的设置, 其他厂牌的 switch 请各自参考使用手册来设置吧!反正只要注意到几个重点,对接的端口口号码要对、模式要启动成 LACP,LACP 类别要设置成 Active,这样通常就能够设置妥当了。

请回到图 1.2-3 的内容,我们区网共有四台 switch,其中三台分别负责内部的 20 部电脑 (所以总量为 60 台电脑), 一台则是主干用的。主干 switch 必须要设置三个 LAG 群组,每个群组分别对应到一部 switch 的相对应群组。所以看起来主干 switch 最麻烦~ 我们就拿主干 switch 来设置给大家瞧瞧,那其他的三部依样画葫芦即可完成啰!

首先,妳必须要依据你的产品手册,找到能够登录这部 switch 的连接方式,包括 IP、帐号、密码等,ZyXEL 刚刚好有提供 web 接口的设置,于是我们就用浏览器来设置啦! 输入正确的参数后,理论上妳会看到如下的画面示意图:

ZyXEL switch 的 LACP 设置示范
图 1.4-1、ZyXEL switch 的 LACP 设置示范

如上图所示,左上角主要有四个设置值,详细的各项设置请参考您的使用手册。我们主要是找出 LACP 的设置而已,因此,依据上图箭头所指,依序点击 1 (Advanced Application), 2 (Link Aggregation), 3 (Configuration) 号按钮,同时请注意,因为这个 switch 的设置值已经实际在运作了,因此妳会看到上图画面已经有 4 个 LAG 群组!如果是您的环境,应该会看到上图右侧画面会空空如也~依序按了箭头之后,就会出现如下的画面了!

ZyXEL switch 的 LACP 设置示范
图 1.4-2、ZyXEL switch 的 LACP 设置示范

上图是设置画面的上半部,首先,请勾选 1 号箭头指的位置,那是启动 switch 的 LACP 支持的意思,这个设置项目务必要激活! 因为这是全域设置,如果妳没有勾选他,那么后面的所有设置值都缺省不会运行的!妳可以看到底下有四个 Group ID,这代表这个 switch 只支持最多四个 LAG 的群组而已。请选择你需要的项目,勾选 Active 与 Dynamic(LACP) 这两个设置值。为什么要两个通通勾选? 请自行参考上个小节 1.3 的介绍吧!不再赘述了!

上图中鸟哥会四个通通勾选,是因为除了这间教室的三部其他 switch 之外,我们还另外拉了三条网络线到主控机房,因此就得要有四个 LAG 群组。 这个示意图并不是要您全部都勾选喔!请依据妳的环境来设置即可。如果妳只有两部 switch 要互相作为 LACP 的话,那只要勾选 T1 那一列的 Active 与 Dynamic(LACP) 即可,不必每项都勾选!注意注意喔!勾选完毕后,将画面往下拉一些,妳会看到如下的图标出现了:

ZyXEL switch 的 LACP 设置示范
图 1.4-3、ZyXEL switch 的 LACP 设置示范

由于考虑到预留端口口的问题,所以我们原本是使用 9~12, 13~16, 17~20, 21~24 作为四个群组,但由于 9, 11 两个端口口又刚好出问题~ 因此,最终我们是使用如下的端口口对应到各个 LAG 的 ID:

  • T1: 10, 12, 13
  • T2: 14, 15, 16
  • T3: 18, 19, 20
  • T4: 22, 23, 24

选择好了每个 port 对应的 LAG 群组 ID 之后,那么每一个 port 最后面的 30 seconds 又是什么呢?那个是 LACP 发送检测讯框时间啦 (Control Frame Interval)!缺省应该是 1 秒钟才对,那个检测讯框时间,指的是 LACP 多久检测一次实体连接有没有保持在连接的状态中!Wiki 是说不可以设置的太长,否则当实体连接失败时,整个 LACP 群组恐怕会有一小段时间的连接中断的问题。鸟哥是建议使用 ZyXEL 的缺省 30 秒~ 这个时间不算太频繁,但也不会太短暂~算很 OK 的时间啰!

Tips 鸟哥 基本的设置值就介绍到这里,其他详细的说明除了参考您的 switch 使用手册之外,也可以参考文末的参考数据 (注3) 的说明! 那些文档都写得很详细了!可以详细参考看看啰! ^_^

设置完毕之后,回到状态栏,妳就会看到如下图所示的模样!在这个画面截取的时候,这间电脑教室的四部 switch 是正常运作的, 所以 T1, T2, T3 就会看到设置的端口口 (Enabled Ports) 有对应到同步的端口口 (Synchronized Ports)。但第四个拉到外部的那三条线, 由于设置完毕之后,鸟哥的学生突然又重新整线,整线的时间超过了 30 秒以上,结果机房的 Cisco switch 就认定这组 LACP 完全失败了! 根据 Wiki 的文档显示,某些不同品牌的 switch 互相作为 LACP 时,确实会发生这样的情况。那怎么解决呢? 妳一定想不到!解决的方法就是,将 switch 重新设置或重新开机即可。在我们将 Cisco switch 重新开机后,嘿嘿! 整个画面就正常了! ^_^

ZyXEL switch 的 LACP 设置示范
图 1.4-4、ZyXEL switch 的 LACP 设置示范
  • LACP 设置完毕后的实验结果

根据 wiki 的 LACP 文档内容说明,由于讯框在 LACP 各个实体连接之间散布,其实整体性能并不可能有几条网络线就提升几倍!所以, 老实说,如果每条网络线都可以增加 50~80% 的话,那就赚到了!

为了测试整体性能,鸟哥在作好了教室内的 LACP 之后,就开了 8 部 Linux 主机来进行测试。 这 8 部主机中每 4 部串接在同一个 swich 上面,也就是说,两部 switch (假设为 A, B) 上各有 4 部主机的意思。然后两两成对,A switch 上的四部主机打开 NFS 文件系统,B switch 上的四部主机则分别挂载了 A switch 上的不同主机的 NFS 文件系统。接下来鸟哥这样做测试:

  1. 基本磁盘性能测试:首先,鸟哥先在 A switch 上面的四部 NFS 主机进行 dd 一个 2GB 的大文件测试,结果除了一部速度可达 80Mbytes/s 之外, 其他的三部大约都在 65Mbytes/s 左右。这表示网络文件系统最大也只能到这样的速度而已 (65~80Mbytes/s)。

  2. 用户端单部主机的网络性能测试:然后我们到 B switch 上面的四部主机上,个别 (非同时) dd 一个大文件到 NFS 的挂载点上面, 结果速度与上述的磁盘性能差不多 (65~80Mbyes/s)!这表示成对的两部主机通过 switch 串接后,网络性能比磁盘性能佳,所以性能是卡在磁盘上。

  3. 用户端全部四部主机的网络性能测试:之后将四部 B switch 上面的主机通通进行 dd 2GB 大文件到 NFS 挂载点,结果除了一台速度可达 65Mbytes/s 之外,其他的三部平均差不多均为 40Mbyes/s 左右而已。

上面的测试中,我们大概可以看出来,LACP 的讯框分布演算机制可能没有这么完美,因此没有办法将四部主机平均分散到三条网络线。同时,根据信号的观察, 三条网络线接口的闪灯,通常仅有两条在闪烁,其中一条可能没有被分配到,所以常常都没有闪烁的情况...

另外,如果将四部主机同时运作的速度相加, 那么可得到整体的传输性能是 65+40*3=185 Mbytes/s ,这差不多是两条 Gbits/s 网络线的带宽了!因为通常一条 Gbits/s 的网络线,能够取得的传输带宽达到 100Mbytes/s 就很不错了啦!因此,上述的测试结果,还是可以看出 LACP 是有帮助的!而且, 当用户端数量越大时,应该可以越看得出效果呢!

2. 局域网路内主控服务器设置

谈完了区网内硬件连接的方式,加上以 LACP 的手段来处理 switch 间的带宽合并功能后,接下来我们得要谈谈区网内最重要的一部设备,那当然就是 NAT + 防火墙设备! 但是大家都会忘记,其实区网内还有两个很重要的服务,那就是自动发派 IP 的 DHCP 服务以及私有领域名称解析的 DNS 服务!咦!不是只要 DHCP 就好吗? 不要忘记了,现在很多服务都会主动的去查找『反解』的,因此,这个 DNS 真的很重要!不要忽略他~

另外,既然连 switch 之间的带宽都增加了,那如果 server 还是仅有区区那 1Gbits/s 的流量,不是很可笑吗?这时有用的 Linux bonding 技术就得要来讨论讨论才行呦!不过, bonding 的使用还是有限制的喔!并不是加了更多张网卡对于局域网路的速度就一定会有帮助的! 那就让我们来谈谈如何使用吧! ^_^

2.1 通过 Linux bonding 技术合并多张网卡的带宽

承接上一章的内容,在局域网路里面,如果考量用户端彼此之间的流量,以及整体局域网路的性能频颈,那么 LACP 是不可或缺的好帮手! 但是,一般企业或者是学校的电脑教室环境,还有后续章节我们会持续介绍的 DRBL 无碟环境中,其实大家访问最频繁的应该是服务器才对吧! 尤其是电脑教室环境中,常常需要做为用户端复原的镜像档提供者 (Server),在大家都来取得镜像档的时刻,网络说有多忙就有多忙! 所以啦,当然就得要增加服务器的带宽才行啊!

增加带宽?能不能将服务器的网卡变换成为 10Gbits/s 呢?当然不行!因为局域网路内各网络媒体如果要达成连接功能, 那么网络传输的速度必须要相同才行!如果只是将 server 的网卡改成 10Gbits/s 的情况,其他的设备通通不变,那么这张 10Gbits/s 网卡将必须要向其他 Gbits/s 妥协,所以他的速度将会降到 1Gbits/s 来跟大家连接才行!真是浪费钱了~

那我能不能用数张 Gbits/s 的网卡组合起来,让这些网卡的带宽通通绑在同一个 IP 底下,这样不就能够放大带宽了吗?OKOK!这样想才有通! 这就是 Linux kernel 里面谈到的 bonding 技术啰!

  • 什么是 bonding ?(注4)

早期由于以太网路卡的速度还不够快,那如果妳的服务器需要比较大的带宽使用时,就得要购买更昂贵的设备才行。 那为什么不能将几张网卡合并成为一张来扩大带宽呢?此外,对于重要的服务来说,网络是不能中断的!所以,能不能使用两条以上的线路连接到我的服务器呢? 因此,(1)合并网络卡的带宽与 (2)让网络具有容错能力 (fault tolerance) 就成了 Linux bonding 最主要的考量了!目前 Linux bonding 功能已经加入内核,所以妳只要启动它即可!不需要额外安装其他软件呦!

另外得要注意的是,如果妳的服务器想要使用 bonding 来增加合并带宽的话,那就不能使用 hub 了!因为 hub 是共享媒体,总带宽是不变的! 要使用 switch 才行!这样才能够增加服务器的整体带宽使用喔!不过还是有些限制的~后面会再来讲一讲。

既然 Linux bonding 主要的任务是将多张网卡合并带宽或者是作为备援与容错,那么妳的服务器上面当然就得要有多张网卡才行!那这么多张网络卡组合起来使用, 到底可以怎么用呢?这时候就得要考虑到妳想要达成什么功能啦!底下就来谈谈~

  • Bonding 的模式与功能:

根据 wiki 的文档以及相关内核文档的说明, Linux bonding 共有七种模式!不过我们仅说说常见的几种模式而已:

  • 模式 0,循环负载平衡合并带宽 (Round-robin, balance-rr):
    Linux bonding 会将要发送的封包循序的从任何可用的网卡上面循环发送,因为是循环发送的,所以每张网卡就能够被充分利用~ 这种模式可以提供负载平衡来合并带宽并具有网络容错的能力。不过,由于 switch 是会自动学习每个端口口所对应的网卡卡号 (MAC),但同一个目标的连续封包,可能会经由不同的网卡来发送(循环发送的方式)~这时可能会造成 switch 的误判问题。虽然 bonding 可以处理这些问题,不过,就鸟哥的经验来看,这种模式的负载平衡方面似乎没有想像中的好!所以鸟哥不建议使用。

  • 模式 1,自动备援模式 (Active-backup):
    假设有三个网络卡做成这种 bonding 模式的话,那么永远都只有一个网络卡会运作,我们称之为主要网卡 (primary)!除非这个主要网卡连接失败了, 另一张网卡 (slave) 才会扶正而成为下一个主要网卡,并持续提供服务。这种模式并不会合并带宽,只会用在连接的容错而已。 所以如果妳想要同时合并带宽,这种模式并不可行。

  • 模式 4,LACP 链路聚合模式 (IEEE 802.3ad Dynamic link aggregation):
    这种模式算是业界的标准支持吧!上一小节我们才刚刚谈过 LACP,妳应该不会忘记吧?妳的 bonding 网卡启动在这种模式下, 然后让串接到这些网卡的 switch 端口口设置好 LACP 群组,这样就能够达成与 LACP 相同的带宽倍增功能!当然啦,既然连 switch 都要支持 LACP, 所以这种模式不能用在普通的 switch 上头~得要有支持网管且提供 LACP 设置的 switch 才行!这种模式可以同时提供合并带宽与网络容错! 唯一伤脑筋的,就是必须要有网管的 switch 支持才行!

  • 模式 5,自动调整传输负载平衡 (Adaptive transmit load balancing, balance-tlb):
    从字面上的意思来看,这种模式主要就是针对『发送』合并带宽所设计的,但是接收恐怕就没有办法做到合并带宽了。这种模式得要分发送与接收来说明。 在发送方面,这种模式会将封包分散在各个可用的 bonding 网卡上送出,因此发送才能够达到合并带宽。不过在接收封包时,由于考虑到 switch 的 MAC 记忆能力,因此仅有一个网卡的 MAC 会被纪录于 switch 上头,简单的说,就是仅有一张网卡会用于接收!除非该接收网卡挂点, 否则其他网卡不会被用在接收上。

    因为一般服务器就是服务提供者,主要负责喂数据给用户,至于接收部分,又由于 switch 仅要负责一张网卡的 MAC 记忆,服务器通过 switch 接收是相对稳定的。所以这种模式也很适合于服务提供者的角度上。但如果考虑到局域网路的双向沟通,这种模式总觉得好像缺少了些什么的感觉~

  • 模式 6,自动调整全负载平衡 (Adaptive load balancing, balance-alb):
    这个模式包括了模式 5,除了发送可以合并带宽之外,连接收也可以合并带宽了。当服务器要传数据出去给用户端时,bonding 模块会主动的拦截封包, 并通过 ARP 协商机制 (ARP 就是通过 IP 去找出 MAC 的通信协定),将不同的网卡要送出到同一个用户端的封包,都改写成单一一个固定的发送端 MAC 地址, 如此一来,发送有合并带宽的功能了,但接收却还是只有一个 MAC 而已对吧?那怎么说接收有合并带宽的负载平衡机制呢?

    原因是这样的:当有数据封包要送出到多个不同的用户端时,此模式的 bonding 模块就会通过 ARP 协商机制,找出 bonding 管理的比较闲置的网卡 MAC 分配给下个用户端,如此一来,不同的用户端回传给服务器的数据,就可以通过不同的网卡来接收,就能达到接收也合并带宽的功能了。

    这个模式不需要特别的 switch 支持,而且设置简单,可以在接收、发送都达成合并带宽的能力,且也具有基本的网络容错功能, 是目前鸟哥最爱使用的 bonding 模式啦!
  • 一个实际设置成 mode=6 的 bonding 范例:

让我们回到图 1.2-3 的环境下,所有的 switch 之间的连接已经改成 LACP 了! 这个图标中,我们是可以使用 LACP 的 mode=4 的方式来处理 bonding,不过,鸟哥比较建议使用 mode=6 这个简单的设置方式!性能其实没有差很多, 设置与使用上则更简便!图 1.2-3 里面的那部主机,其实是 2009 年左右的产品,里头仅有一张内置的网卡而已。鸟哥在上头额外安插了三张网卡 (所以共有 4 张), 一张作为 Gateway 对外提供 Internet 连接,三张 (连同内置网卡) 则做为内部的区网环境使用。

设置 bonding 的方法其实很简单,首先,(1)妳必须要加载 bonding 模块,且将妳的 bonding 接口取个名字,通常最常取的名字就是 bond0。 如果妳想要做成两个 bonding 的话,那就得要有 bond0, bond1.. 依此类推。再来,(2)妳得要修改归这个 bonding 接口管理的网络卡设置档, 就是在 /etc/sysconfig/network-scripts/ifcfg-ethX 的文件内容,改完之后,(3)接下来就是创建 bond0 这个新的接口的网络设置档, (4)最后重新启动网络就成功了!就让我们来实际测试看看吧!

  1. 加载 bonding 模块,并将接口取名为 bond0
    在 CentOS 5.x 以后,Linux 的模块对应表已经写入到 /etc/modprobe.d/*.conf 文件内了~这个目录内的文件名是可以自己取的,不过扩展名必须是 .conf 就是了。 我们取个名为 bonding.conf 的文件好了,内容这样写即可:
    [root@centos ~]# vim /etc/modprobe.d/bonding.conf
    alias bond0 bonding
    # bond0 为我们需要的接口, bonding 则是 Linux 的内核模块之意!
    
  2. 修改 bond0 所管理的各个实体网卡设置档:
    在鸟哥的这个案例中,Linux 系统的 eth0 为对 Internet 连接的接口,所以 bond0 管理的接口有 eth1, eth2, eth3 这 3 个!那这三张网卡的设置档该如何修改呢? 很简单,如底下这样设置即可。(注意,被 bonding 所管理的各张网卡,习惯上,我们都会称之为 slave 网卡!)
    [root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
    DEVICE="eth1"
    HWADDR="00:1B:21:3E:8C:47"   <==某些情况下,可能要对应好网卡卡号,才能够让网卡正确取得代号
    NM_CONTROLLED="yes"
    ONBOOT="yes"
    MASTER=bond0
    SLAVE=yes
    USERCTL=no
    # 最重要的是那个 MASTER 与 SLAVE 两个设置项目。且因为是受 bond0 管理,所以不需要网络参数。
    # 至于 eth2, eth3 则是依样画葫芦,这里就不示范啰!自行修订即可。
    
  3. 创建 bond0 新接口的设置档:
    现在开始,这 eth1~eth3 这 3 张网卡都是归 bond0 所管,那当然要创建一个名为 ifcfg-bond0 的网络参数设置档啰!鸟哥目前管理的这个教室的网域参数为 192.168.42.0/24 这一段,因此这样设置我的服务器:
    [root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
    DEVICE=bond0
    USERCTL=no
    BOOTPROTO=none
    ONBOOT=yes
    IPADDR=192.168.42.254
    NETMASK=255.255.255.0
    BONDING_OPTS="miimon=100 mode=6"
    TYPE=Unknown
    IPV6INIT=no
    # 重点是 BONDING_OPTS 这一串!mode=6 不用谈,当然就是各个模式!这里我们用 6 ,
    # 至于那个 miimon 指的是『多久侦测一次各个 slave 网卡的连接状态』的意思,
    # 这个值的单位是『毫秒』,就是 10 的 -3 次方秒~1000毫秒为一秒~
    # 也就是说,我们大约 0.1 秒就侦测一次每张网卡的状态!据以进行网络容错测试!
    
  4. 重新启动网络与观察 bond0 接口状态:
    重新启动很简单,但如何观察 bond0 呢?这就得要直接观察内存内的 bond0 相关参数了!如下所示:
    [root@centos ~]# /etc/init.d/network restart
    
    [root@centos ~]# ifconfig
    bond0     Link encap:Ethernet  HWaddr 00:1B:21:3E:8C:47
              inet addr:192.168.42.254  Bcast:192.168.42.255  Mask:255.255.255.0
              inet6 addr: fe80::21b:21ff:fe3e:8c47/64 Scope:Link
              UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
    ....(中间略过)....
    eth1      Link encap:Ethernet  HWaddr 00:1B:21:3E:8C:47
              UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
    ....(中间略过)....
    eth2      Link encap:Ethernet  HWaddr 00:07:E9:5E:2D:76
              UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
    ....(中间略过)....
    eth3      Link encap:Ethernet  HWaddr 00:07:E9:5E:09:8D
              UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
    
    上表中观察的重点有几个:(1)你会看到 bond0 所使用的网卡卡号与底下的某个 slave 接口相同~这代表目前正在使用当中的网卡主要是以该 MAC 的实体网卡为主。 (2)你也会发现 bond0 的启动信息为 MASTER 而其他的接口为 SLAVE 的显示!再来,我们想要看一下完整的每个网卡的信息时,可以这样做:
    [root@centos ~]# cat /proc/net/bonding/bond0
    Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
    
    Bonding Mode: adaptive load balancing  <== 注意到,是否为 mode 6 才行!
    Primary Slave: None
    Currently Active Slave: eth1           <== 目前以哪张网卡为主要网络服务提供者!
    MII Status: up
    MII Polling Interval (ms): 100         <== 多久侦测一次网卡连接有问题否 (单位毫秒)
    Up Delay (ms): 0
    Down Delay (ms): 0
    
    Slave Interface: eth1
    MII Status: up
    Speed: 1000 Mbps                       <== 这张网卡的速度有多快?
    Duplex: full                           <== 是否为全双工/半双工
    Link Failure Count: 0                  <== 这张网卡连接曾发生过几次错误?
    Permanent HW addr: 00:1b:21:3e:8c:47
    Slave queue ID: 0
    
    Slave Interface: eth2
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 00:07:e9:5e:2d:76
    Slave queue ID: 0
    ....(底下省略)....
    
    如果你可以看到上面的消息显示,那就表示你的 bonding 已经开始顺利运作了!接下来你就可以 (1)开始在用户端同时连接到这部主机来测试看看,到底带宽的增加有多少啰! 并且可以 (2)拔除某一条网络卡上面的线路,再来查找一下 /proc/net/bonding/bond0 这个文件内的变化,看看能不能有容错的情况发生啊!^_^
  • bonding 的使用限制:

虽然说 Linux bonding 有很多好处,但是它并不是万灵丹!某些场合底下还是无法增加带宽的!很多文档都没有写到这点,或者是虽然有带到,但是却没有特别强调! 因此,鸟哥一开始利用 bonding 来增加虚拟机的带宽时,曾经遭遇到非常多的问题,导致有一阵子有点厌恶 bonding 哩~就是没有搞清楚的原因啦! 那就来让大家搞清楚一点好了!来看看吧!

  • 连接的网络媒体必须使用 switch 不能使用 hub:
    这是因为 hub 是共享带宽,只有 switch 才具有每个端口口独立带宽的功能!另外,除了 mode=4 的 bonding 需要用到支持 802.3ad (LACP) 协定的有网管 switch 之外,其他模式的 bonding 都可以使用无网管低级的 switch 来达成喔!

  • 两部主机之间,只会有一个 NIC 有作用:
    想像一个状况,你有两部主机需要很频繁的进行网络交换,因此需要超高带宽!那我能不能在两部主机上面都安装三张网卡,然后将各自的三张网卡都做成 bonding 合并带宽, 让两部主机之间可以通过各自的一个 bonding IP 来达成流量的倍增呢?答案是『不可能!』因为不论是 LACP 还是 bonding ,主要还是通过以太网路的 MAC 来进行收发! 因此,两者之间最多还是仅能通过一张网卡来进行接收~所以,这种 bonding 行为只能增加容错的好处,并无法增加带宽喔!很多文档这点都没有写好, 害鸟哥之前花了好几个月去测试这东西~结果是『杯具』啊!准备喝茶去 @_@~

  • 针对 Internet 的服务而言,带宽卡在对外的传输,因此 bonding 不会有合并带宽的好处:
    如果考虑你的服务器主要是针对 Internet 提供服务,那么由于你的服务器还是得要通过互联网来发送~而互联网的速度应该不可能超过 Gbits/s 的速度! 加上你的 Gateway 通常也只是 1Gbits/s 的速度而已,因此针对 Internet 所设计的 bonding 仅有网络容错的功能,合并带宽在现阶段应该是不可能达成的! 也就是说, bonding 通常仅使用于区网或者是需要大带宽的内部网络,不会用在 Internet 上。

  • Bonding 不见得会增加传输量,需考虑服务器的文件系统:
    如果你的服务器主要是针对区网提供用户端映像档的访问,而你的磁盘机并没有使用较新的机制,因此最快的性能仅达到 80Mbytes/s 的速度时,那么 bonding 对你的系统来说, 并没有什么帮助!因为用户端通过网络到你的系统后,你还是得要从自己的服务器将数据读出来才能传出去!但读取的速度就已经受限于 80Mbytes/s (还不到 1Gbits/s 呢!), 所以 bonding 当然只有容错而没有增加带宽的可能性!也就是说,如果用在磁盘 I/O 很频繁的主机状态,则速度的频颈将会发生于磁盘读写上而不是网络。

  • 虚拟化所附挂的桥接 (bridge) 网卡,不建议使用 bonding:
    所谓的虚拟机,指的是让你的 Linux 通过类似 KVM 的软件在你的系统上仿真出一个独立的硬件主机,这个虚拟的独立的硬件主机当然就得要分享你的实体硬件啰。 由于一部实体主机可以产生多部虚拟机,过去鸟哥以为,那么通过 bonding 来做成分享给虚拟机使用的网络桥接器之后,那虚拟机就可以增加带宽的使用量了。 结果非常『杯具』 (又喝茶去)~

    因为 bonding 常常会去改变 MAC ,其中 mode 6 甚至会去分析与变更 MAC,如此一来,虚拟机的虚拟 MAC 将会附挂于变更后的网卡上~ 但是实体主机的 bonding 并不会去调整虚拟机的虚拟网卡卡号,这时就会造成时通时不通困扰~虽然使用 mode 5 等其他类型可以克服这个问题~但是,对于同时的收/发来说, 就没有两者均增加带宽的功效。因此,对于虚拟化附挂的桥接设备 (bridge) 来说,bonding 最好不要使用,鸟哥的经验是『很容易出问题』。

另外,鸟哥用过最简单而且性能最好的应该是 mode 6 这个模式!简单好用,又不用重新设置 switch,缺少网卡就叠上去,非常简单! 所以,有兴趣的伙伴们,可以使用这个模式来制作一下,应该可以得到不错的效果呦!

  • 用于 bonding 上面的 GB 网卡接口选择与性能测试:

我们知道 gigabit 网络卡的理论极限速度可以到达大约 120Mbytes/s 的文件传输量。不过,由于 gigabit 网络卡设计的插槽接口的差异,速度落差非常大喔! 鸟哥去年 (2012) 为了研究上面的需求,又因为要买比较便宜的 GB 网卡 (没有钱作大量研究啦),因此购买了数十张的 Intel PCI 接口的网卡,原本想说,PCI 的传输率为 32bit * 33MHz => 1000 Mbits/s ,这与 GB 网卡的速度应该是差不多才对!没想到实际应用之后,可能 PCI 接口的传输已经快要饱和, 所以测试出最快的 PCI 传输率大约只到 70Mbytes/s 而已,与理论值也差太多了...

后来还是为了经费,所以还是买了比较便宜的 PCI-E 1X 一倍数的网卡,只是没想到,这个 PCI-E 的 GB 网卡 (用的是螃蟹卡芯片组) ,性能随随便便就可以上 90~100 Mbytes/s,与 Intel 的 PCI-E 1X 的 105~110 Mbytes/s 差异没很大,但跟 PCI 接口也差太多了!因此,建议如果想要使用 bonding 时,最好所有的网卡速度能够差不多比较妥当!不要使用 PCI-E, PCI 接口混插,不然好像效果会没很好,因为这与 bonding 的主控 slave 网卡找到哪一张有关~

那怎么测试性能呢?过去鸟哥都习惯使用 NFS 然后一堆用户端挂载服务器后,用力的 dd 下去!后来发现,这样的测试方法不太准确,因为都卡在磁盘的性能上~测不出网络性能。 因此,如果想要测试 bonding 到底有没有效果,你可以这样实验看看:

  • 先在做好 bonding 的那部服务器上面,使用 dd 创建一个大约 2GB 的大文件 (dd if=/dev/zero of=somefile bs=1M count=2048) ;
  • 将上述创建文件的目录,使用 NFS 分享出来给局域网路用户读取;
  • 打开至少三部 Linux 用户端,并且挂载刚刚来自服务器的 NFS 目录;
  • 跑到挂载点,利用『 dd if=somefile of=/dev/zero 』指令,测试一下网络速度。

这个测试中,因为服务器的大文件仅提供用户端读取,并没有写入。如果你的内存够大 (超过 4G 以上),这个文件将被内存缓存住!此时,所有传输将不会再次的读取硬盘了。 而你在用户端使用 dd 读入大文件后直接丢入垃圾桶 (/dev/null) ,这样用户端也没有用到磁盘读写,如此就可以单纯的去测试网络性能了。

在鸟哥的测试中,四部主机同时跑时,由于鸟哥用了三 GB 网卡作 bonding,此时将会有两部主机共用一张网卡,所以有两部主机速度可达 80~90Mbytes/s,另外两部仅能到达 60Mbytes/s 而已。 不过,这样也差不多有 70~80% 的理论速度啦!还算很 OK 的啦!

2.2 NAT 服务器 (IP 分享功能) 与防火墙设置

整理完服务器与局域网路内的网络带宽问题后,再来就是得要处理处理局域网路内的整体网络参数啦!在鸟哥本章的案例中,我们用的是图 1.2-3 里头的环境,因应该环境所在的教室编号,所以鸟哥使用的是 192.168.42.0/24 这一段私有网域啦!在鸟哥的习惯上,会使用最后一个可用 IP 作为路由器设置,因此,鸟哥这部服务器对内的 IP 就会是 192.168.42.254 啰。另外,本教室对外的那个 IP 我们就假设为 1.2.3.4/24 ,Gateway 就设为 5.6.7.8 (详细的对外 IP 就得要询问贵中心啰)。

另外,在服务器架设篇当中,我们提到通常局域网路的主控电脑防火墙中,对内部的主机管理会比较松散,对外则比较严格。不过,由于这是个电脑教室环境,啥时会有人来恶搞,你也不知道, 也就是说,对内的防火墙设置恐怕也得思考才行!不能随便通通放行的!底下我们就来谈一谈吧!

  • 网络参数设置:

其实网络参数设置在本案例中,就仅有 eth0 与 bond0 需要设置而已,其中 bond0 已经在前一个小节里面谈过了。至于 eth0 这个对外的 IP 设置,你只要注意到 IP, Netmask, Gateway 必须要跟你的 ISP 取得正确的数据来设置即可,并没有什么难处啊!不过这里得要特别强调一下,希望不要启动 Network Manager 这个网络管理模块, 否则常常会出现一些奇奇怪怪的问题喔~

# 1. 先设置好 ifcfg-eth0 设置档吧!ifcfg-bond0 请参考上一小节的设置:
[root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
HWADDR="00:26:18:C3:7D:21"
NM_CONTROLLED="yes"
ONBOOT="yes"
IPADDR=1.2.3.4               <== 重点是改这三行!
NETMASK=255.255.255.0
GATEWAY=5.6.7.8

# 2. 设置好 DNS server 的设置:
[root@centos ~]# vim /etc/resolv.conf
nameserver 120.114.150.1     <== 先用教室所在处的昆山科大的 DNS 服务器!这未来会变喔!
nameserver 120.114.100.1

# 3. 关闭 Network Manager 之后,重新启动网络并观察:
[root@centos ~]# /etc/init.d/NetworkManager stop <== 立刻关闭
[root@centos ~]# chkconfig NetworkManager off    <== 重新开机也不会启动
[root@centos ~]# chkconfig NetworkManager --list
NetworkManager  0:off   1:off   2:off   3:off   4:off   5:off   6:off

[root@centos ~]# /etc/init.d/network restart
[root@centos ~]# ifconfig            <== 看 IP/Netmask 对否
[root@centos ~]# route -n            <== 看 GW 对否
[root@centos ~]# ping -c 3 5.6.7.8   <== 看与 GW 的连接正常否
[root@centos ~]# dig www.google.com  <== 看 DNS 设置正确否
# 建议上面的检查步骤请每次设置完网络且重新启动后,一定要进行一次!避免出现问题啊!
  • 系统初步安全强化整理 -- 更新!更新!更新!关掉!关掉!关掉!

还记得服务器篇里面说过吗?针对你开放的网络服务来说,防火墙其实一点用处也没有~那如何强化你的网络服务呢?最简单的想法就是『更新到最新版本!』 虽然对某些强调酷炫的 Linux distribution 来说,升级到最新的版本不见得是有修补漏洞的结果,但针对企业版的 CentOS 来说,更新到最新版,确实就有一定程度的保护力。

考虑到中小企业对外网络带宽可能原本就不够啊,因此,找一个最靠近你的映射站是很重要的!以昆山科大来说,我们学校有提供 FTP 服务,且 FTP 里面就有 CentOS 的映射数据了!当然就选择校内的网址为优先!如果你是非昆山校内的机器,那就建议使用国家高速网络中心的 FTP 啰!

# 如果是在昆山科大校内,那就使用校内的 FTP 服务器了:
[root@centos ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/6/os/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[updates]
name=CentOS-$releasever - Updates
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/6/updates/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
# 建议就保留这两个,其他的都先杀掉或者是加上 enabled=0 的设置来暂时不使用!

# 如果不在昆山科大,但是在台湾本岛,那就使用国家高速网络中心吧!
[root@centos ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ftp.twaren.net/Linux/CentOS/6/os/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[updates]
name=CentOS-$releasever - Updates
baseurl=http://ftp.twaren.net/Linux/CentOS/6/updates/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

# 选择好你的 YUM 软件仓储来源后,开始更新系统啊!依据 CentOS 版本不同,速度会有差异!
[root@centos ~]# yum clean all
[root@centos ~]# yum -y update
# 开始一堆升级进程!这里鸟哥就略过不写了!

[root@centos ~]# vim /etc/crontab
10 0 * * * root /usr/bin/yum -y update  <== 每天凌晨 12 点进行一次自动更新!!

更新了软件之后,还得要记得,不用的软件最好将他关掉!不但节省系统资源,也能够避免某些忘记关掉的网络服务被攻击!那么哪些服务可以关闭呢? 这就得要看您的环境而定了,并没有一定的规范~不过,鸟哥通常喜欢用『 netstat -tlunp 』这个指令来查出目前有启动于 TCP/UDP 监听的服务, 然后再去 /etc/init.d/* 找到相对应的启动脚本,进入该脚本去查找该功能为何,如果该功能真的不需要,那就予以关闭,如果不知道是啥咚咚,通常会先保留啦!

[root@centos ~]# vim close_service.sh
#!/bin/bash
services="NetworkManager autofs avahi-daemon certmonger cups kdump rpcbind rpcgssd rpcidmapd nfslock"
for service in ${services}
do
        chkconfig ${service} off
        /etc/init.d/${service} stop
done
# 将不需要的服务一个一个关掉~请依您的需求写入上头的 services="" 双引号内即可!
# 完全照上面的抄写时,可能会有某些不存在的服务,发生一些错误也没关系~

[root@centos ~]# sh close_service.sh

在更新系统完毕且关闭不必要的服务后,如果你从来没有更新过,或者是好长一段时间忘记更新了,那可能就得要重新开机 (reboot)!原因是, 你的系统内核可能已经被更新过,内核升级一定要重新开机才能选择新内核,否则升级的内核是不会被使用的!这与一般软件不太一样喔!注意注意!一般来说, 更新完毕后如果有:(1)内核与 (2)重大软件函数库 (例如 glibc, openssl 等软件) 时,就一定要重新开机!否则调用这些函数库的软件并不会使用新的函数库功能之故!

  • 服务器服务规划与防火墙设置:

前面稍微提到,我们的重点是想要让这部服务器针对内网提供一堆服务~不过又担心被内网的用户搞破坏~所以,针对 Internet 应该要严格限制, 但对于内部网络而言,还是仅开放要让用户连接的服务之端口口即可!没必要全部放行啦!我们这部服务器『并不针对 Internet 放行任何服务』,不过, 由于管理者可能会从另一段局域网路连进来,因此可能还是得要设置信任 IP 给互联网连进 port 21, 22, 80 来进行测试才行啊!预计的服务器对内、对外服务以及信任 IP 分别是:

  • 信任 IP 与网段: 1.2.3.4/24, 4.3.2.1/32
  • 对信任网段 (eth0) 放行的服务主要有: port 21, 22, 80 而已;
  • 对内网而言 (bond0) 规划未来放行的服务有: DNS, DHCP, TFTP, NFS, SSHD, Proxy 等服务,其中 NFS 通过该服务自己的内部设置,规定 port 901~904 来放行各相关服务。
  • 对内网而言 (bond0) 还得要开放向外部联网的功能 (SNAT)

针对上述功能,鸟哥拿服务器架设篇的简易防火墙来进行修改,并将整个脚本再简化,得到如下的结果:

[root@centos ~]# vim iptables.sh
#!/bin/bash
# 先设置好本脚本所需要的各项参数:
nic_out="eth0"                 <== 对外部连接的网卡代号
nic_in="bond0"                 <== 对内部连接的网卡代号
trust_ip="1.2.3.4/24,4.3.2.1"  <== 来自外部连到本服务器的信任 IP

# 底下 6 行在清除规则与设置缺省防火墙政策
iptables -F
iptables -X
iptables -Z
iptables -P INPUT   DROP
iptables -P OUTPUT  ACCEPT
iptables -P FORWARD ACCEPT

# 底下三行放行服务器本机所需要的网络封包
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT

# 底下数行是针对内网开放各式服务!请参考上述说明,就知道这几个 port 的意义为何了!
iptables -A INPUT -i ${nic_in} -p tcp -m multiport --dport 21,22,53,80,3128 -j ACCEPT
iptables -A INPUT -i ${nic_in} -p udp -m multiport --dport 53,67,69 -j ACCEPT
iptables -A INPUT -i ${nic_in} -p tcp -m multiport --dport 111,2049,901:904 -j ACCEPT
iptables -A INPUT -i ${nic_in} -p udp -m multiport --dport 111,2049,901:904 -j ACCEPT
iptables -A INPUT -i ${nic_in} -p udp --dport 9000:9001 -j ACCEPT
iptables -A INPUT -i ${nic_in} -j REJECT  

# 针对外部来的信任 IP 网段之设置!
iptables -A INPUT -i ${nic_out} -p tcp -m multiport --dport 21,22,80 -s ${trust_ip} -j ACCEPT

# 清除内部要连到外网的 SNAT 功能!并设置好 IP 伪装,后面几行则是保留给未来使用的!
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
iptables -t nat -P PREROUTING  ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT      ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o eth0 -j MASQUERADE
#iptables -t nat -A PREROUTING -s 192.168.42.0/24 -p tcp --dport 80 -j REDIRECT \
#                --to-ports 3128
#iptables -t nat -A PREROUTING -i ${nic_out} -p tcp --dport 8080 -j DNAT \
#                --to-destination 192.168.42.40:80

/etc/init.d/iptables save   <== 这行加上去,自动保存防火墙规则!

[root@centos ~]# sh iptables.sh
[root@centos ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
# 找到上面这行,将内容加上两个可以让 FTP 顺利运作的模块呦!

[root@centos ~]# /etc/init.d/iptables restart

# 不要忘记还得要启动内核转递的规则才行呦!
[root@centos ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1   <==将这一行的 0 改成 1  即可!

[root@centos ~]# sysctl -p

这样就整个处理完毕啰!有够好简单吧! ^_^!不过由于你开放内网与信任网段的 ssh 连接,这里鸟哥也是要建议您,/etc/ssh/sshd_config 这个设置档中, 针对 root 是否可以登录的项目部分,最好是设置为 no,不让 root 登录为宜喔!

2.3 DHCP 服务器与 switch 的 STP 协定设置

区网的硬件网络带宽搞定、服务器本身的网络参数搞定,再来要干嘛?当然是局域网路内部用户端的网络参数分派啦!用户端取得的网段为 192.168.42.0/24, 至于 Gateway 则是服务器本身内网的 IP (192.168.42.254),那 DNS 呢?

大家知道,很多软件都会去反向检查 DNS 的反解~我们知道 192.168.42.0/24 是私有 IP 的网段,因此,当有内部网络连接的需求时,如果没有加上反解的确认, 在达成连接的时间会比较久~为解决这问题,因此鸟哥的服务器也会提供 DNS 的服务,因此,用户端取得的 DNS 也是咱们这部服务器的 IP 喔!

  • 固定 IP 与非固定 IP 之规划:

老实说,这件示范教室还挺有趣的,因此很多会议或研习都会在这里举行,因此,很多时候,伙伴们都会携带笔电或者是其他行动设备来这里上网~一听到这种模式,当然 DHCP 自动分配 IP 是最简单的!不过,由于这间教室平时是电脑教室课程来上课的,老师们喜欢固定座位有固定的 IP,这样也比较好管理啊!也就是说,这间教室在台式机的部分, 希望是固定 IP 的分配,但是额外还会提供一些 IP 来给行动设备使用的。

鸟哥的规划是,自动分配的是 192.168.42.101~192.168.42.200 这 100 个可用 IP,至于 192.168.42.1 到 192.168.42.100 则保留给教室内的固定终端设备使用。 但这间电脑教室共有 62 个设备ㄟ!包括 61 部主机以及一部打印机。如果要每部主机都去登记网卡的 MAC 再来服务器设置 dhcp 设置档,真的很头昏~因此,固定 IP 的部分, 我们通过的方式,是先去用户端电脑启动一个 Linux 系统,将该 Linux 系统手动设置 IP (ifconfig eth0 192.168.42.X),然后通过 ARP 的指令去侦测 IP 与 MAC 的对应, 最终写入设置档即可。这样可以避免抄错卡号,在实作上面也比较能够相信实际座位与主机 IP 的对照表!

在你完成后面几章才会谈到的 kickstart 大量部署 Linux client 端操作系统后,教室内每部电脑都会有一个可用的 Linux 系统,登录他,用上述的方法实作, 然后运行下列的功能来取得每部电脑的 MAC 吧!

[root@centos ~]# vim getmac.sh
#!/bin/bash
read -p "How many PC's in this class (31, 54, 61)? " num
if [ "$num" != "" ]; then
        for site in $(seq 1 ${num})
        do
                siteip="192.168.42.${site}"
                allip="$allip $siteip"
                ping -c 1 -w 1 $siteip > /dev/null 2>&1
                if [ "$?" == "0" ]; then
                        okip="$okip $siteip"
                else
                        errorip="$errorip $siteip"
                        echo "$siteip is DOWN"
                fi
        done
        [ -f getmac.conf ] && rm getmac.conf
        for site in $allip
        do
                pcname=pc$(echo $site | cut -d '.' -f 4)
                mac=$(arp -n | grep "$site " | awk '{print $3}')
                echo "  host $pcname {"
                echo "          hardware ethernet ${mac};"
                echo "          fixed-address     ${site};"
                echo "  }"
                echo "  host $pcname {"                         >> getmac.conf
                echo "          hardware ethernet ${mac};"      >> getmac.conf
                echo "          fixed-address     ${site};"     >> getmac.conf
                echo "  }"                                      >> getmac.conf
        done
else
        exit 0
fi
echo "You can use getmac.conf (this directory) to modified your /etc/dhcp/dhcpd.conf"
echo "Finished."

[root@centos ~]# sh getmac.sh
How many PC's in this class (31, 54, 61)? 4
  host pc1 {
          hardware ethernet 52:54:00:ac:30:56;
          fixed-address     192.168.42.1;
  }
....(底下省略)....
You can use getmac.conf (this directory) to modified your /etc/dhcp/dhcpd.conf
Finished.

最终你会在该目录中取得一个名为 getmac.conf 的文件,将里面的数据粘贴 dhcpd.conf 即可。但是,dhcpd.conf 内容要怎么制作呢?我们用最阳春的方式来设置他! 而且,预计每部主机的名称会是 pcX.i4502.dic.ksu ,其中 i4502 就是我们这间电脑教室的编号!

[root@centos ~]# yum -y install dhcp
[root@centos ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style       none;
default-lease-time      259200;
max-lease-time          518400;
option routers          192.168.42.254;
option broadcast-address        192.168.42.255;
option domain-name-servers      192.168.42.254;
subnet 192.168.42.0 netmask 255.255.255.0 {
        range 192.168.42.101 192.168.42.200;
        option subnet-mask      255.255.255.0;
        option domain-name      "i4502.dic.ksu";
  # 从这行底下的,都是刚刚 getmac.conf 的内容抓过来使用的!
  host pc1 {
          hardware ethernet 52:54:00:ac:30:56;
          fixed-address     192.168.42.1;
  }
....(中间省略)....
}   <== 不要忘记这个大刮号!

[root@centos ~]# /etc/init.d/dhcpd restart <== 立刻启动
[root@centos ~]# chkconfig dhcpd on        <== 下次开机也会启动
[root@centos ~]# vim /var/log/messages     <== 重点是看一下注册表有没有顺利启动

你没有看错喔!这样就结束了!更多 DHCP 相关的介绍,请参考服务器篇的相关内容吧!

  • 用户端延迟 DHCP 取得网络参数的时间问题 -- 什么是 STP?

如果你真的很有服务器课程的经验时,那偶而可能会发现,在比较高端 switch 的教室环境中,介绍如何自动取得 DHCP 网络参数的课程时,让学生重新取得 IP 的速度怎么会这么慢? 大概得要等个十几秒到半分钟左右!怎么会这样?明明都是 gigabit 的网络速度了!不可能这么慢吧?其实,这是由于 switch 为了要避免某些呆瓜不小心让 switch 之间连接错误, 导致循环 (loop) 来造成广播风暴,最终让整个区网的网络停止的问题,而增加的 STP (Spanning Tree Protocol) 这个通信协定的问题。

我们在前面的小节里面谈到 LACP 之前,曾经说过,有两部 switch 之间如果没有做好一些通信协定的设置,直接拿两条网络线同时串接起来,switch 之间可能就会产生广播风暴, 造成整个 switch 的停顿。那个广播风暴的成因就是 switch loop (交换器内部封包循环问题)。那你会说,好!我知道了,为了避免这个问题,每个 switch 之间都最多串接一条线就好! 这样总不会出问题了吧?很可惜,还是会出错!怎么回事?找个案例好了,如下图所示:

swith loop
图 2.3-1、交换器的广播循环问题 (switch loop)

每间电脑教室都已经串接在一起,主要通过教室 A 来跟其他两个教室的 switch 串接。有个同学来这个环境后,想说,那我能不能直接将教室 B 与教室 C 串在一起, 实体线路串在一起比较快嘛!所以,拿了条网络线就直接串在一起啦!如上图所示的环境。这时,有没有看到一个圈圈啊!这就形成一个回路 (Loop)!这个时候就会产生广播风暴了! 没有人是故意的!问题是,如果线拉的够长,就有可能会出现这个情况啊!理解乎?

为了解决这个问题,因此,国际组织就核定了 STP (Spanning Tree Protocol) 这个通信协定!这个通信协定的目的,就是在于解决 switch loop 的问题! 通过的解决方式是:『让产生 loop 的端口口中,找出最无关紧要的那条线,让那条线中断 (down) 』就解决了!但这里就产生几个问题要处理:

  • switch 是如何判断有没有 loop 循环产生的呢?其实有支持 STP 协定的 switch 会发送一个名为 BPDU (Bridge Protocol Data Units) 的封包,这个封包就会主动的去侦测每个端口口, 以及邻近的几个 switch 之间的沟通状况,通过这些状况去了解有没有产生非预期的 loop 状态,并同时去寻找出『最不重要的』那个连接;

  • 那如何判断『最不重要的』那条连接呢?其实在 STP 的协定中,他会通过 STP 协定主动设置 stwitch 的优先权 (Priority, 数值越小代表越重要),若没有设置的话, STP 会通过 switch 的卡号 (MAC) 自动设置好最重要交换器 (root switch),然后如果有 loop 的状态时,就以这个 root switch 为主,每个 switch 都必须要可以连接到 root switch ,并借此找出连接到 root switch 的最快路径,保留该路径,然后将其他非重要路径关闭!

更详细的 STP 相关介绍可以参考文末的参考文献的数据,这里不再重复。你要问的问题是,那为何 STP 会影响 DHCP 呢? 由于 switch 会侦测 switch 之间是否有产生 loop 的情况,因此当你在某个端口口安装一部主机后,这部主机的网络使用权大约得花 30 秒钟才能够启动。 那当你重新取得 IP 时,某些 swtich 就有可能误判你这个 switch port 有重新被调整过,为了避免 loop,于是他就进入检测状态,一般得要花 30 秒钟才能够侦测完毕啊!

所以,为了节省不必要的等待时间,你可以:

  1. 保留 STP 给设置为 LACP 或尚未接上设备的端口口,其他的已经接上电脑的端口口,建议就关掉他;
  2. 如果不想随便关掉 STP 的话,那可以修改一下 STP 的收敛时间,让 STP 的检查速度加快~也能够处理掉这个 DHCP 延迟的问题;
  3. 如果是比较新的交换器,或许可以设置为快速 STP (Rapid STP) 模式,这样可以在 10 秒内检测完毕,就不会有很严重的 DHCP 延迟问题啰!
  • 一个简单的 switch STP 设置处理方式:

如同在 LACP 设置的小节里面谈到的,鸟哥管理的这间电脑教室目前使用的是旧式的 switch,过去全部的端口口都激活 STP 的缺省设置时,dhcp 的延迟非常严重! 很多同学甚至会发生 DHCP timeout 的惨剧,导致无法取得 IP 来进行上课!这真是非常的杯具啊~(喝茶去)~后来问了昆山科大计中的罗丰彬组长,这才发现有可能是 STP 这玩意儿的影响! 相当感谢罗组长大人的提醒啊!

之前我们是将 STP 整个关闭的,不过,STP 既然可以避免 switch loop 的状况,那,在做成 LACP 的那几个端口口,应该还是打开一下 STP 比较好!同时, 为了降低 DHCP 的延迟,因此鸟哥将整个 STP 的收敛时间设置的比较短些,因此目前 DHCP 的 IP 参数取得,大约是在 10 秒钟内可以顺利完成!算是可接受的范围内啦! 底下还是使用 ZyXEL 的交换器来作个简单的示范吧:

STP
图 2.3-2、ZyXEL 的交换器设置 STP 示意图

如上图所示,按下 1 号箭头『 Spanning Tree Protocol 』的设置后,再按下右上角的『 Configuration 』进入设置环境中!如下图所示:

STP
图 2.3-3、修改 STP 的收敛时间

为了避免用户端电脑通过 LACP 的线路向 server 要求 DHCP 服务而有延迟现象的状况,所以我们是将这个 STP 的许多收敛时间整个缩小了!基本上,Hello Time 保留 2 秒钟, Max Age 则从 20 秒修订为 7 秒,Forwarding Delay 则由 15 秒缩减为 5 秒,这样的设置完成之后,用户端取得 DHCP 的时间可大幅的从 timeout 的悲剧性状况, 变成小于 10 秒内完成的可接受范围内。这个是整体设置,那设置仅将 STP 开放于 LACP 端口口上的情况,就得要针对每个端口口来调整,如下:

STP
图 2.3-4、仅将 STP 启动在有设置 LACP 的端口口上

如上图所示,我们仅针对有设置 LACP 的端口口作 STP 的设置而已。其实如果修改了上面的时间参数,全部的端口口启动应该也还 OK 没问题~ 不过如果没有调整 STP 的收敛时间,那你的 DHCP 恐怕会很慢!

Tips 鸟哥 会发现这个问题,是因为鸟哥管理的电脑教室都会使用到 PXE (后面章节会谈到) 的相关功能,就是通过网络卡开机取得网络参数后,让主机自动安装或进行其他任务的方式。 但是每次开机等待 DHCP 的时间常常会 timeout,这才到处询问专家!才有后来罗组长的说明!感谢呢! ^_^

2.4 与 DHCP 参数相符合的 DNS 服务器设置

局域网路的 DNS 设置那就简单了!重点是你务必要有正解与反解~因为『反解』才是我们要作内部区网 DNS 的主要原因啊!再重复一次我们预计要处理的网域名称对应:

  • pcX.i4502.dic.ksu <==> 192.168.42.X (X 从 1~200 通通要设置),并且将 DNS 数据库文件名设置为: named.i4502.dic.ksu
  • server.i4502.dic.ksu <==> 192.168.42.254 (这是服务器名称),并且将 DNS 数据库文件名设置为: named.192.168.42

其实,整个 DNS 的设置与注意事项,都在服务器篇里面谈过了,这里仅是很快速的将我们所需要的环境,如果你需要每个设置项目的详细说明,就请参考服务器篇里面的 DNS 吧!那就让我们开始来处理啰!只要两个 domain,一个正解的 i4502.dic.ksu,以及一个反解的 192.168.42.254 即可!

  1. 安装所需要的 bind 以及 bond-chroot 等软件,并设置好 /etc/named.conf 主设置:
    先装好所需要的软件才行!服务器篇里面谈到的,要设置好有点被保护的 DNS 系统,最好要加上 chroot 才好!所以这样做:
    [root@centos ~]# yum install bind bind-chroot
    [root@centos ~]# vim /etc/named.conf
    options {
            directory       "/var/named";
            dump-file       "/var/named/data/cache_dump.db";
            statistics-file "/var/named/data/named_stats.txt";
            memstatistics-file "/var/named/data/named_mem_stats.txt";
            allow-query     { any; };
            recursion yes;
    };
    
    zone "." IN {                         <== 一定要存在的项目
            type hint;
            file "named.ca";
    };
    
    zone "i4502.dic.ksu" IN {             <== 这是正解的相关设置
            type master;
            file "named.i4502.dic.ksu";
    };
    
    zone "42.168.192.in-addr.arpa" IN {   <== 这是反解的相关设置
            type master;
            file "named.192.168.42";
    };
    

  2. 在 /var/named 底下设置好正解档 named.i4502.dic.ksu:
    设置好整个区网内的可能产生的 IP 对应的主机名称!记得,要有 1~200 以及 254 的 server 对应才行!
    [root@centos ~]# cd /var/named
    [root@centos named]# vim named.i4502.dic.ksu
    $TTL    86400
    @       IN SOA  @ root ( 20130401 1D 1H 1W 3H )
    @       IN NS   @
    @       IN A    192.168.42.254
    server  IN A    192.168.42.254
    pc1     IN A    192.168.42.1
    pc2     IN A    192.168.42.2
    ....(中间省略)....
    pc199   IN A    192.168.42.199
    pc200   IN A    192.168.42.200
    
    [root@centos named]# chmod 640 named.i4502.dic.ksu
    [root@centos named]# chown root.named named.i4502.dic.ksu
    

  3. 在 /var/named 底下设置好反解档 named.192.168.42:
    反解档就不可以使用缩写了!必须写上完整的 FQDN 才行喔!
    [root@centos named]# vim named.192.168.42
    $TTL    86400
    @       IN SOA  server.i4502.dic.ksu. root.server.i4502.dic.ksu. (
                    20130401 1D 1H 1W 3H )
    @       IN NS   server.i4502.dic.ksu.
    254     IN PTR  server.i4502.dic.ksu.
    254     IN PTR  i4502.dic.ksu.
    1       IN PTR  pc1.i4502.dic.ksu.
    2       IN PTR  pc2.i4502.dic.ksu.
    ....(中间省略)....
    199     IN PTR  pc199.i4502.dic.ksu.
    200     IN PTR  pc200.i4502.dic.ksu.
    
    [root@centos named]# chmod 640 named.192.168.42
    [root@centos named]# chown root.named named.192.168.42
    

  4. 启动并观察与检测设置值:
    不要忘记启动后检查 /var/log/messages 的内容,同时修改 /etc/resolv.conf 并且使用 dig 自我检测一下才好!
    [root@centos ~]# /etc/init.d/named start
    [root@centos ~]# chkconfig named on
    [root@centos ~]# vim /etc/resolv.conf
    nameserver 127.0.0.1    <== 注意!这要在上面才对!才会用到自己的 DNS!
    nameserver 168.95.1.1
    
    [root@centos ~]# vim /var/log/messages
    Apr  1 12:14:53 centos named[2212]: zone 42.168.192.in-addr.arpa/IN: loaded serial 20130401
    Apr  1 12:14:53 centos named[2212]: zone i4502.dic.ksu/IN: loaded serial 20130401
    Apr  1 12:14:53 centos named[2212]: managed-keys-zone ./IN: loaded serial 0
    Apr  1 12:14:53 centos named[2212]: running
    # 要看到如上图的特殊字样才好!
    
    [root@centos ~]# dig server.i4502.dic.ksu
    [root@centos ~]# dig pc1.i4502.dic.ksu
    [root@centos ~]# dig -x 192.168.42.254
    [root@centos ~]# dig -x 192.168.42.1
    # 要有出现个别的 IP 以及个别的主机名称才是对的!
    

进行到这一步,你的整个区网内部网络连接,应该是有备援的稳定,以及合并带宽的优点~接下来的章节,就让我们来搞一搞怎么大量部署内部网络的用户端吧! 期待下一章的内容吧! ^_^

3. 参考数据与延伸阅读

其实,这整篇文章最重要的地方在讲一个概念,那就是我们的局域网路使用 1Gbits/s 的流量已经不够用了!尤其是在需要较大带宽的电脑教室或中小型企业环境下。 这时就得要进行一些手脚才能够让区网的带宽给予提升!所以才会谈到 LACP 以及 bonding 等功能。此外,未来的世界里面,非常多的虚拟化啊!这些虚拟化的服务器, 最可怕的地方在于文件系统的跨网络访问,恐怕连 10G 都无法解决虚拟化的大带宽需求!这时,很多上面用到的技术就值得来练习啰!

这篇文章也很感谢鸟哥的学生们,包括吴虹霖、刘俊睿帮忙查找 LACP 以及 Cisco 的 switch 设置仿真,苏伟哲、施译其、林佳辰等人协助局域网路的线路设置, 还有其他的同学们,感谢妳们喔!

另外,上面的实作中,其实最简单的是服务器的设置,最麻烦的地方在于网络线路的配置!实际动工过,您就知道鸟哥为什么这么讲了! 所以,如果对自己的施工没有信心,记得一定要请专家来配线!因为,线路一配下去,一用就是十数年~留心!留心!注意!注意!


修改历史:
2013/04/01:局域网路硬件环境重点在配线以及 LACP/bonding,服务器主力在 NAT+DHCP+DNS 啰!好不容易终于完成了!
2013/04/16:防火墙加入了 FTP 的 NAT 模块~

2013/04/01 以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计