第7章:使用 RAID 与 LVM 磁盘阵列技术
1、RAID 独立冗余磁盘阵列
1)什么是 RAID ?
RAID(Redundant Array of Independent Disks)即独立冗余磁盘阵列。
2)RAID 诞生的背景,为什么需要 RAID ?
CPU的处理性能保持着高速的增长,但是硬盘设备的性能提升却不是很大。硬盘设备的性能,逐渐成为当代计算机整体性能的瓶颈。其次,硬盘设备需要进行持续、频繁、大量的IO操作,相较于其它设备,其损坏率更高,导致重要数据丢失的几率也更高。
鉴于硬盘这样的性能瓶颈和数据风险,1988 年,加利福尼亚大学伯克利分校首次提出并定义了 RAID 技术的概念。RAID 技术通过把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上,然后利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理硬盘设备上,从而起到了非常好的数据冗余备份效果。
3)RAID 的利与弊
任何事物都有它的两面性。RAID 技术确实具有非常好的数据冗余备份功能,但是它也相应地提高了成本支出。RAID 不仅降低了硬盘设备损坏后丢失数据的几率,还提升了硬盘设备的读写速度。出于成本和技术方面的考虑,需要针对不同的需求在数据可靠性及读写性能上作出权衡,制定出满足各自需求的不同方案。目前已有的 RAID 磁盘阵列的方案至少有十几种,下面将介绍4种最常见的方案 —— RAID0 / RAID1 / RAID5 / RAID10 。
4)RAID0 技术及其特点
RAID 0 技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。RAID 0 技术能够有效地提升硬盘数据的吞吐速度,但是不具备数据备份和错误修复能力。
RAID05)RAID1 技术及其特点
RAID1 是把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备份)。当其中某一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常使用。
RAID 1 技术虽然十分注重数据的安全性,但是因为是在多块硬盘设备中写入了相同的数据,因此硬盘设备的利用率有所下降;并且由于同一份数据要写两次以上,因此这在一定程度上增大了系统计算功能的负载。
RAID16)RAID5 技术及其特点
RAID5 技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。RAID 5 磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上,这样的好处是其中任何一设备损坏后不至于出现致命缺陷。
换句话说,就是 RAID 5 技术实际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据。RAID5 这样的技术特性“妥协”地兼顾了硬盘设备的读写速度、数据安全性与存储成本问题。
RAID57)RAID10 技术及其特点
RAID 10 技术是 RAID 1+RAID 0 技术的一个“组合体”。AID 10 技术需要至少 4 块硬盘来组建,其中先分别两两制作成 RAID 1 磁盘阵列,以保证数据的安全性;然后再对两个 RAID 1 磁盘阵列实施 RAID 0 技术,进一步提高硬盘设备的读写速度。
由于 RAID 10 技术继承了 RAID 0 的高读写速度和 RAID1 的数据安全性,在不考虑成本的情况下 RAID 10 的性能都超过了 RAID 5,因此当前成为广泛使用的一种存储技术。
RAID102、部署 RAID10 独立冗余磁盘阵列
1)第1步:在虚拟机上手动添加四块虚拟硬盘,依照Linux系统内核中用来给硬件命名的 udev服务可以推测,新添加的这几块硬盘名称分别为 sdb、sdc、sdd、sde。
2)第2步:使用 mdadm 命令来管理Linux系统中的 RAID 磁盘阵列。mdadm 命令的常用参数如下表:
mdadm3)第3步:开始部署 RAID10 独立冗余磁盘阵列
开始部署4)第4步:把上一步中制作好的 RAID 磁盘阵列格式化为 ext4 格式。
[root@localhost sh]# mkfs.ext4 /dev/md0
5)第5步:对格式化后的 RAID 磁盘阵列执行目录挂载。
挂载 RAID 磁盘阵列6)第6步:查看上述挂载完成后的 RAID磁盘阵列的详细信息,并把挂载信息写入到配置文件中去,使其永久有效。
查看上述RAID磁盘阵列的详细信息:
[root@localhost sh]# mdadm -D /dev/md0
把挂载信息写入到 /etc/fstab 文件中去,使其永久生效:
[root@localhost sh]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
3、损坏RAID磁盘阵列及修复
在确认有一块物理硬盘设备出现损坏而不能继续正常使用后,应该使用 mdadm 命令将其移除,然后查看 RAID 磁盘阵列的状态,可以发现状态已经改变。
mdadm在 RAID 10 级别的磁盘阵列中,当 RAID 1 磁盘阵列中存在一个故障盘时并不影响 RAID 10 磁盘阵列的使用。当购买了新的硬盘设备后再使用 mdadm 命令来予以替换即可,在此期间我们可以在/RAID 目录中正常地创建或删除文件。
[root@localhost sh]# umount /RAID
[root@localhost sh]# mdadm /dev/md0 -a /dev/sdb
[root@localhost sh]# mdadm -D /dev/md0
[root@localhost sh]# mount -a
4、磁盘阵列之备份盘技术
RAID 10 磁盘阵列中最多允许 50%的硬盘设备发生故障,但是存在这样一种极端情况,即同一 RAID 1 磁盘阵列中的硬盘设备若全部损坏,也会导致数据丢失。
事实上,我们完全可以使用 RAID 备份盘技术来预防这类事故。该技术的核心理念就是准备一块足够大的硬盘,这块硬盘平时处于闲置状态,一旦 RAID磁盘阵列中有硬盘出现故障后则会马上自动顶替上去。
如下示例,我们部署一个“RAID5 + 备份盘”的磁盘阵列。
1)第1步:创建“RAID5+备份盘” 磁盘阵列
RAID52)第2步:对上一步中所创建的磁盘阵列进行 ext4 格式化。
[root@localhost sh]# mkfs.ext4 /dev/md0
3)第3步:对格式化后的磁盘阵列进行永远挂载,即挂载至目录(配置 /etc/fstab 文件)。
[root@localhost sh]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
[root@localhost sh]# mkdir /RAID
[root@localhost sh]# mount -a
4)第4步:测试备份盘。我们再次把硬盘设备/dev/sdb 从磁盘阵列中移除,然后迅速查看/dev/md0 磁盘阵列的状态,你会发现备份盘已经被自动顶替上去并开始了数据同步。
// -f 参数,模拟损坏硬盘
[root@localhost sh]# mdadm /dev/md0 -f /dev/sdb
[root@localhost sh]# mdadm -D /dev/md0
这种备份盘技术非常实用,可以在保证 RAID 磁盘阵列数据安全性的基础上进一步提高数据可靠性,所以,如果公司不差钱的话还是再买上一块备份盘以防万一。
5、LVM(逻辑卷管理器)
1)LVM 和 RAID 之间最基础的区别是什么?LVM 解决了什么问题?
部署为 RAID 磁盘阵列之后,若再想修改硬盘分区大小就不太容易。当用户想要随着实际需求的变化调整硬盘分区的大小时,就会受到硬盘“灵活性”的限制。
LVM 可以允许用户对硬盘资源进行动态调整。这是 LVM 和 RAID 之间最基本的区别。
2)什么是 LVM 逻辑卷管理器?其核心概念是怎么的?
逻辑卷管理器是 Linux 系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而 LVM 技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的底层架构和布局,就可以实现对硬盘分区的动态调整。LVM 的技术架构如下图所示:
LVM物理卷处于 LVM 中的最底层,可以将其理解为物理硬盘、硬盘分区或者 RAID 磁盘阵列,这都可以。卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是 LVM 的核心理念。
6、开始部署 LVM 逻辑卷管理器
部署 LVM 时,需要逐个配置物理卷、卷组和逻辑卷。常用的部署命令如下图示:
LVM部署常用的命令1)第1步:在虚拟机中添加两块虚拟硬盘,分别是 sdb 和 sdc 。使用 pvcreate 命令让这两块硬盘支持 LVM 技术。
[root@localhost sh]# pvcreate /dev/sdb /dev/sdc
Physical volume "/dev/sdb" successfully created
Physical volume "/dev/sdc" successfully created
2)第2步:把上一步中的两块硬盘加入到卷组中去,并查看卷组的状态。
[root@localhost sh]# vgcreate mystorage /dev/sdb /dev/sdc
Volume group "mystorage" successfully created
[root@localhost sh]# vgdisplay
3)第3步:从上一步所创建的卷组中切割出一个约150MB的逻辑卷设备。(这里需要注意切割单位的问题,在对逻辑卷进行切割时有两种计量单位。第一种是以容量为单位,所使用的参数为 -L。另外一种是以基本单元的个数为单位,所使用的参数为 -l。每个基本单元的大小默认为 4MB。)
[root@localhost sh]# lvcreate -n vo -l 37 mystorage
Logical volume "vo" created
[root@localhost sh]# vgdisplay
4)第4步:把上一步中所创建的逻辑卷进行 ext4 格式化,并挂载到系统目录中去。
Linux 系统会把 LVM 中的逻辑卷设备存放在/dev 设备目录中(实际上是做了一个符号链接),同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即/dev/卷组名称/逻辑卷名称)。
[root@localhost sh]# mkfs.ext4 /dev/mystorage/vo
[root@localhost sh]# mkdir /myvo
[root@localhost sh]# mount /dev/mystorage/vo /myvo
5)查看上一步的挂载结果和状态,并将挂载信息写入配置文件中去,实现永久生效。
[root@localhost sh]# df -h
echo "/dev/mystorage/vo /myvo ext4 defaults 0 0" >> /etc/fstab
7、对逻辑卷进行扩容
用户在使用存储设备时感知不到设备底层的架构和布局,更不用关心底层是由多少块硬盘组成的,只要卷组中有足够的资源,就可以一直为逻辑卷扩容。扩容前请一定要记得卸载设备和挂载点的关联。
1)第1步:卸载扩容前的LVM逻辑卷
[root@localhost sh]# umount /myvo
2)把上述的逻辑卷vo扩容至290M
[root@localhost sh]# lvextend -L 290M /dev/mystorage/vo
3)检查硬盘的完整性,并重置硬盘容量。
[root@localhost sh]# e2fsck -f /dev/mystorage/vo
[root@localhost sh]# resize2fs /dev/mystorage/vo
4)重新挂载硬盘设备,并查看挂载状态。
[root@localhost sh]# mount -a
[root@localhost sh]# df -h
8、对LVM逻辑卷进行减容
相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,其丢失数据的风险更大。所以在生产环境中执行相应操作时,一定要提前备份好数据。另外 Linux 系统规定,在对 LVM 逻辑卷进行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)。在执行缩容操作前记得先把文件系统卸载掉。
1)卸载减容前的LVM逻辑卷
[root@localhost sh]# umount /myvo
2)检查硬盘的完整性,并重置硬盘容量至120M。
[root@localhost sh]# e2fsck -f /dev/mystorage/vo
[root@localhost sh]# resize2fs /dev/mystorage/vo 120M
3)把上述逻辑卷减容至120MB。
[root@localhost sh]# lvreduce -L 120M /dev/mystorage/vo
4)重新挂载逻辑卷,并查看挂载状态。
[root@localhost sh]# mount -a
[root@localhost sh]# df -h
9、生成LVM逻辑卷的快照卷
LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。可以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。LVM 的快照卷功能有两个特点:
- 快照卷的容量必须等同于逻辑卷的容量;
- 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。
1)查看上述逻辑卷的信息,查看逻辑卷组的已使用容量、空闲容量。
[root@localhost sh]# vgdisplay
2)使用重定向向逻辑卷设备所挂载的文件目录中写入一个文件。
[root@localhost sh]# echo "Welcome to Linux.org" > /myvo/readme.txt
[root@localhost sh]# ls -l /myvo
3)使用 -l 参数生成一个快照卷,使用 -L 参数指定切割的大小。并在命令后面指定将要对哪个逻辑卷执行快照操作。
[root@localhost sh]# lvcreate -L 120M -s -n SNAP /dev/mystorage/vo
[root@localhost sh]# lvdiplay
4)在逻辑卷所挂载的目录下创建一个100M 的垃圾文件,然后再查看其快照卷的状态。
[root@localhost sh]# dd if=/dev/zero of=/myvo/files count=1 bs=100M
[root@localhost sh]# lvdisplay
5)为了校验快照卷SNAP快照卷的效果,我们需要对逻辑卷进行快照还原操作。在此操作之前记得先卸载掉逻辑卷设备与目录的挂载。
[root@localhost sh]# umount /myvo
[root@localhost sh]# lvconvert --merge /dev/mystorage/SNAP
6)执行上述操作后,快照卷SNAP会自动被删除掉。现在我们对还原后的逻辑卷执行挂载操作,并查看其状态。
[root@localhost sh]# mount -a
[root@localhost sh]# ls -l /myvo
[root@localhost sh]# lvdiplay
10、删除LVM逻辑卷
当生产环境中想要重新部署 LVM 或者不再需要使用 LVM 时,则需要执行 LVM 的删除操作。为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒。
1)取消逻辑卷设备与目录的挂载关联,删除 /etc/fstab 配置文件中永久生效的挂载参数。
[root@localhost sh]# umount /myvo
[root@localhost sh]# vim /etc/fstab
删除 /etc/fstab 配置文件中关于逻辑卷设备 /dev/mystorage/vo 与 /myvo目录的挂载配置。
2)删除逻辑卷设备,并输入 y 来确认删除操作。
[root@localhost sh]# lvremove /dev/mystorage/vo
3)删除卷组,此处只需写上卷组名称即可,无须指定卷组的绝对路径。
[root@localhost sh]# vgremove mystorage
4)删除物理卷组设备。
[root@localhost sh]# pvremove /dev/sdb /dev/sdc
上述步骤执行完毕之后,再执行 lvdisplay、vgdisplay、pvdisplay 命令来查看 LVM 的信息,将看不到任何关于 mystorage 逻辑卷的信息了。
11、本章复习题
本章复习题第8章:iptables 与 firewalld 防火墙
本章学习内容有:防火墙管理工具,iptables,firewalld,服务的访问控制列表。
保障数据的安全性是继保障数据的可用性之后最为重要的一项工作。防火墙作为公网与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用。
1、防火墙管理工具
1)什么是防火墙?它有什么用?
相较于企业内网,外部的公网环境更加恶劣。防火墙正是充当着公网与内网之间的保护屏障,其虽有软件和硬件之分,但主要功能都是依据策略对穿越防火墙自身的流量进行过滤。防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。如此,就可以保证仅有合法的流量在企业内网和外部公网之间流动了。
防火墙2)什么是firewalld防火墙?
在 RHEL 7 系统中,firewalld 防火墙取代了 iptables 防火墙。对于接触 Linux 系统比较早或学习过 RHEL 6 系统的读者来说,当他们发现曾经掌握的知识在 RHEL 7 中不再适用,需要全新学习 firewalld。
事实上,iptables 与 firewalld 都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,或者说,它们只是一种服务。iptables服务会把配置好的防火墙策略交由内核层面的 netfilter 网络过滤器来处理,而 firewalld 服务则是把配置好的防火墙策略交由内核层面的 nftables 包过滤框架来处理。
另外,在Linux 系统中存在多个防火墙管理工具,旨在方便运维人员管理 Linux 系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是保持一致的。我们只要在这多个防火墙管理工具中任选一款并将其学透,就足以满足日常的工作需求了。
2、使用 iptables 管理工具
在早期的 Linux 系统中,默认使用的是 iptables 防火墙管理服务来配置防火墙。尽管新型的 firewalld 防火墙管理服务已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用 iptables。
1)防火墙的策略、默认策略、规则链
防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。
iptables 服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,常用的常见的规则链有如下五个:
- 在进行路由选择前处理数据包(PREROUTING);
- 处理流入的数据包(INPUT);
- 处理流出的数据包(OUTPUT);
- 处理转发的数据包(FORWARD);
- 在进行路由选择后处理数据包(POSTROUTING)。
一般来说,从内网向外网发送的流量一般都是可控且良性的。因此我们使用最多的就是 INPUT 规则链,该规则链可以增大黑客人员从外网入侵内网的难度。
2)防火墙对流量出入控制的四种动作
防火墙策略规则分为两类:一类是“通”(即允许通过),一类是“堵”(即拒绝通过)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时(通),就要设置拒绝规则(堵),否则谁都能进来,防火墙也就失去了防范的作用。具体有四种动作可以选择,如下:
- ACCEPT(允许流量通过);
- LOG(记录日志信息);
- REJECT(拒绝流量通过),拒绝流量后会再回复一条“您的信息已经收到,但是被扔掉了”信息,从而让流量发送方清晰地看到数据被拒绝的响应信息。
- DROP(拒绝流量通过),直接将流量丢弃,不会给流量发送方任何的响应信息。
3)使用 iptables 命令
iptables 是一款基于命令行的防火墙策略管理工具,具有大量参数,学习难度较大。iptables 命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功,iptables 就会根据策略规则所预设的动作来处理这些流量。需要注意的是,防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。该命令的常用参数如下表:
iptables使用 -L 参数查看已有的防火墙规则链:
[root@localhost sh]# iptables -L
使用 -F 参数清空已有的防火墙规则链:
[root@localhost sh]# iptables -F
[root@localhost sh]# iptables -L
把 INPUT 规则链的默认策略设置为 DROP 拒绝。防火墙策略规则的设置有两种:通和堵。当把 INPUT 链设置为默认拒绝后,就要在防火墙策略中写入允许策略了,否则所有到来的流量都会被拒绝掉。另外,需要注意的是,规则链的默认拒绝动作只能是 DROP,而不能是 REJECT。
[root@localhost sh]# iptables -P INPUT DROP
[root@localhost sh]# iptables -L
向 INPUT规则链中添加一条规则:允许 ICMP 流量进入。在日常运维工作中,经常会使用 ping 命令来检查对方主机是否在线,而向防火墙的INPUT 规则链中添加一条允许 ICMP 流量进入的策略规则就默认允许了这种 ping 命令检测行为。
[root@localhost sh]# iptables -I INPUT -p icmp -j ACCEPT
[root@localhost sh]# ping -c 4 127.0.0.1
从INPUT规则链中删除一条规则,并同时把INPUT规则链的默认策略设置为 ACCEPT 允许。
[root@localhost sh]# iptables -D INPUT 1
[root@localhost sh]# iptables -P INPUT ACCEPT
[root@localhost sh]# iptables -L
把INPUT规则链设置为只允许指定网段的主机访问本机的22端口,并拒绝来自其他所有主机的流量。再次重申,防火墙策略规则是按照从上到下的顺序匹配的,因此一定要把允许动作放到拒绝动作前面,否则所有的流量就将被拒绝掉,从而导致任何主机都无法访问我们的服务。
[root@localhost sh]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
[root@localhost sh]# iptables -A INPUT -p tcp --dport 22 -j REJECT
[root@localhost sh]# iptables -L
22号端口是 ssh 服务使用的端口。现在我们使用 ssh 来测试上面所设置的 INPUT 规则链。
[root@localhost sh]# ssh 192.168.10.10 // 默认为 22号端口
[root@localhost sh]# ssh 192.168.10.24
[root@localhost sh]# ssh 192.168.10.1
[root@localhost sh]# ssh 192.168.10.30 // 默认为 22号端口
向INPUT规则链中添加一条规则:拒绝所有人访问本机的12345端口。
[root@localhost sh]# iptables -I INPUT -p tcp --dport 12345 -j REJECT
[root@localhost sh]# iptables -I INPUT -p udp --dport 12345 -j REJECT
[root@localhost sh]# iptables -L
向INPUT规则链中添加一条规则:拒绝192.168.10.5主机访问本机的80端口(Web服务)。
[root@localhost sh]# iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT
[root@localhost sh]# iptables -L
向INPUT规则链中添加一条规则:拒绝所有主机访问本机的1000~1024端口。
[root@localhost sh]# iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
[root@localhost sh]# iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
[root@localhost sh]# iptables -L
特别注意,使用 iptables 命令配置的防火墙规则默认会在系统下一次重启时失效,如果想让配置的防火墙策略永久生效,还要执行保存命令,把防火墙规则保存至 /etc/sysconfig/iptables 配置文件中去。如下:
[root@localhost sh]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
3、使用 firewalld 管理工具
RHEL 7 系统中集成了多款防火墙管理工具,其中 firewalld(Dynamic Firewall Manager of Linux systems,Linux 系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于 CLI(命令行界面)和基于 GUI(图形用户界面)的两种管理方式。
1)firewalld 有什么核心特点?
相较于传统的防火墙管理配置工具,firewalld 支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是 firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。firewalld中常见的区别名称及其默认策略规则,如下图示:
firewalld服务中常用的区域及其策略规则2)使用 firewalld服务的命令行管理工具
命令行终端是一种极富效率的工作方式,firewall-cmd 是 firewalld 防火墙配置管理工具的 CLI(命令行界面)版本。它的参数一般都是以“长格式”来提供的(使用 Tab键可以自动补齐长格式参数)。firewall-cmd 的常用参数如下图示:
firewall-cmd什么是运行时模式(Runtime)和永久模式(Permanent)?
- 与 Linux 系统中其他的防火墙策略配置工具一样,使用 firewalld 配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。
- 如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用 firewall-cmd 命令正常设置防火墙策略时添加--permanent 参数,这样配置的防火墙策略就可以永久生效了。但永久模式有一个缺点,那就是只有当系统重启后才能自动地生效。如果想让配置的策略立即生效,需要手动执行 firewall-cmd --reload 命令。
查看filewalld服务当前正在使用的区域:
[root@localhost sh]# firewall-cmd --get-default-zone
查询 eno16777728 网卡在 firewalld 服务中的区域:
[root@localhost sh]# firewall-cmd --get-zone-of-interface=eno16777728
把firewalld服务中的 eno16777728 网卡的默认区域修改为 external,并让其在系统重启后生效。再分别查看运行时模式下和永久模式下的区域别称:
[root@localhost sh]# firewall-cmd --permanent --zone=external --change-interface=eno16777728
[root@localhost sh]# firewall-cmd --get-zone-of-interface=eno16777728
[root@localhost sh]# firewall-cmd --permanent --get-zone-of-interface=eno16777728
把firewalld服务的当前默认区域设置为 public。
[root@localhost sh]# firewall-cmd --set-default-zone=public
[root@localhost sh]# firewall-cmd --get-default-zone
启动/关闭 firewalld 防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用):
[root@localhost sh]# firewall-cmd --panic-on
[root@localhost sh]# firewall-cmd --panic-off
查询 public 区域是否允许请求 SSH 和 HTTPS 协议的流量:
[root@localhost sh]# firewall-cmd --zone=public --query-service=ssh
[root@localhost sh]# firewall-cmd --zone=public --query-servece=https
把 firewalld 服务中请求 HTTPS 协议的流量设置为永久允许,并立即生效:
[root@localhost sh]# firewall-cmd --zone=public --add-service=https
[root@localhost sh]# firewall-cmd --permanent --zone=public --add-service=https
[root@localhost sh]# firewall-cmd --reload
把 firewalld 服务中请求 HTTP 协议的流量设置为永久拒绝,并立即生效:
[root@localhost sh]# firewall-cmd --permanent --zone=public --remove-service=http
[root@localhost sh]# firewall-cmd --reload
把在 firewalld 服务中访问 8080 和 8081 端口的流量策略设置为允许,但仅限当前生效:
[root@localhost sh]# firewall-cmd --zone=public --add-port=8080-8081/tcp
[root@localhost sh]# firewall-cmd --zone=public --list-ports
把原本访问本机 888 端口的流量转发到 22 端口,要且求当前和长期均有效:
[root@localhost sh]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=127.0.0.1
[root@localhost sh]# firewall-cmd --reload
测试一下
[root@localhost sh]# ssh -p 888 127.0.0.1 // ssh默认使用 22号端口
firewalld 中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比如,我们可以在 firewalld 服务中配置一条富规则,使其拒绝192.168.10.0/24 网段的所有用户访问本机的 ssh 服务(22 端口):
[root@localhost sh]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
[root@localhost sh]# firewall-cmd --reload
测试一下
[root@localhost sh]# ssh 192.168.10.11
3)使用 firewalld服务的图形化管理工具
firewalld图形化管理工具,是 firewalld防火墙配置管理工具的 GUI(图形用户界面)版本,几乎可以实现所有以命令行来执行的操作。由于是图形化管理工具,此处就不再赘述。
4)什么是 SNAP 技术?
SNAT 是一种为了解决 IP 地址匮乏而设计的技术,它可以使得多个内网中的用户通过同一个外网 IP 接入 Internet。该技术的应用非常广泛,甚至可以说我们每天都在使用,只不过没有察觉到罢了。
4、TCP Wrappers 服务的访问控制列表
1)什么是 TCPWrappers ?
TCP Wrappers 是 RHEL 7 系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。换句话说,Linux 系统中其实有两个层面的防火墙,第一种是前面讲到的基于 TCP/IP 协议的流量过滤工具,而 TCP Wrappers服务则能够允许或禁止 Linux 系统提供服务的防火墙,从而在更高层面保护了 Linux 系统的安全运行。
2)两个用于 TCP Wrappers 的配置文件
TCP Wrappers 服务的防火墙策略由两个控制列表文件所控制,用户可以编辑允许控制列表文件(/etc/hosts.allow)来放行对服务的请求流量,也可以编辑拒绝控制列表文件(/etc/hosts.deny)来阻止对服务的请求流量。
控制列表文件修改后会立即生效,系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量。
在配置 TCP Wrappers 服务时需要遵循如下两个原则:
- 编写拒绝策略规则时,填写的是服务名称,而非协议名称;
- 建议先编写拒绝策略规则,再编写允许策略规则,以便直观地看到相应的效果。
这两个配置文件中,常用的字段含义如下图示:
用于TCP Wrappers配置的常用字段[root@localhost sh]# vim /etc/hosts.deny
[root@localhost sh]# vim /etc/hosts.allow
5、本章复习题
复习题第9章:网络服务 与 ssh服务管理远程主机
本章学习的内容有:配置网络服务,远程控制服务,不间断会话服务。
1、配置网络服务
配置网络并确保网络的连通性是学习部署 Linux 服务之前的最后一个重要知识点。事实上,在 RHEL 7 系统中有至少 5 种网络的配置方法,本小节我们将使用 nmtui 命令来配置网络。
1)使用 nmtui 命令配置网络
[root@localhost sh]# nmtui
注意:在 RHEL 5、RHEL 6 系统及其他大多数早期的 Linux 系统中,网卡的名称一直都是 eth0、eth1、eth2、……,但在 RHEL 7 中则变成了类似于 eno16777736 这样的名字。不过除了网卡的名称发生变化之外,其他几乎一切照旧。
2)手动激活网卡
在安装 RHEL 7 系统时默认是没有激活网卡的。我们只需使用 Vim 编辑器将网卡配置文件中的 ONBOOT参数修改成 yes,这样在系统重启后网卡就被激活了。
[root@localhost sh]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736
3)手动重启网络
当修改完 Linux 系统中的服务配置文件后,并不会对服务程序立即产生效果。要想让服务程序获取到最新的配置文件,需要手动重启相应的服务,之后就可以看到网络畅通了。
[root@localhost sh]# systemctl restart network
测试一下网络是否已经连通
[root@localhost sh]# ping -c 4 127.0.0.1
2、创建网络会话
RHEL 和 CentOS 系统默认使用 NetworkManager 来提供网络服务,这是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。可以使用 nmcli 命令来管理 NetworkManager 服务。nmcli 是一款基于命令行的网络配置工具,功能丰富,参数众多。
1)查看网络信息或网络状态
[root@localhost sh]# nmcli connection show
[root@localhost sh]# nmcli con show eno16777736
2)创建网络会话
另外,RHEL7 系统支持网络会话功能,允许用户在多个配置文件中快速切换(非常类似于 firewalld 防火墙服务中的区域技术)。使用 nmcli 命令并按照“connection add con-name type ifname”的格式来创建网络会话。
创建一个名为“company”的网络会话:
[root@localhost sh]# nmcli connection add con-name company iframe eno16777736 autoconnect no type ethernet ip4 192.168.10.10/24 gw4 192.168.10.1
再创建一个名为“house”的网络会话:
[root@localhost sh]# nmcli connection add con-name house type ethernet iframe eno16777736
查看当前系统中所有的网络会话:
[root@localhost sh]# nmcli connection show
3)切换网络会话
使用 nmcli 命令配置过的网络会话是永久生效的,这样当我们下班回家后,顺手启用 house网络会话,网卡就能自动通过 DHCP 获取到 IP 地址了。
[root@localhost sh]# nmcli connection up house
[root@localhost sh]# ifconfig
注意:如果大家使用的是虚拟机,请把虚拟机系统的网卡(网络适配器)切换成桥接模式。然后重启虚拟机系统即可。
3、绑定两块网卡(网卡绑定)
一般来讲,生产环境必须提供 7×24 小时的网络传输服务。借助于网卡绑定技术,不仅可以提高网络传输速度,更重要的是,还可以确保在其中一块网卡出现故障时,依然可以正常提供网络服务。
1)第1步:在虚拟机系统中再添加一块网卡设备,请确保两块网卡都处在同一个网络连接中(即网卡模式相同),处于相同模式的网卡设备才可以进行网卡绑定,否则这两块网卡无法互相传送数据。
2)第2步:使用 Vim 文本编辑器来配置网卡设备的绑定参数。我们需要对参与绑定的网卡设备逐个进行“初始设置”。这些原本独立的网卡设备此时需要被配置成一块“从属”网卡,一块“主”网卡,且不应该再有自己的 IP 地址等信息。在进行了初始设置之后,它们就可以支持网卡绑定。
网卡初始化3)第3步:把绑定后的设备命名为 bond0 并把 IP 地址等信息填写进去,这样当用户访问相应服务的时候,实际上就是由这两块网卡设备在共同提供服务。
配置 bond04)第4步:让 Linux 内核支持网卡绑定驱动。常见的网卡绑定驱动有三种模式—mode0、mode1和 mode6,如下图。
三种网卡绑定驱动模式下面使用 Vim 文本编辑器创建一个用于网卡绑定的驱动文件,使得绑定后的 bond0 网卡设备能够支持绑定技术(bonding);同时定义网卡以 mode6 模式进行绑定,且出现故障时自动切换的时间为 100 毫秒。
[root@localhost ~]# vim /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=6
5)第5步:重启网络服务后,网卡绑定操作即可成功。正常情况下只有 bond0 网卡设备才会有 IP 地址等信息。
[root@localhost sh]# systemctl restart network
[root@localhost sh]# ifconfig
6)测试网卡绑定的效果。使用 ping 检测网络的连通性。为了检验网卡绑定技术的自动备援功能,我们突然在虚拟机硬件配置中随机移除一块网卡设备,可以非常清晰地看到网卡切换的过程(一般只有 1 个数据丢包),然后另外一块网卡会继续为用户提供服务。
测试网卡绑定效果4、配置 sshd 服务
1)什么是 SSH ?为什么要使用 SSH ?
SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux 系统的首选方式。在此之前,一般使用 FTP 或 Telnet 来进行远程登录。但是因为它们以明文的形式在网络中传输账户密码和数据信息,因此很不安全,很容易受到黑客发起的中间人攻击,这轻则篡改传输的数据信息,重则直接抓取服务器的账户密码。
2)SSH 登录有哪两种验证方式?
想要使用 SSH 协议来远程管理 Linux 系统,则需要部署配置 sshd 服务程序。sshd 是基于 SSH协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供两种安全验证的方法:
- 基于口令的验证—用账户和密码来验证登录;
- 基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全。
3)配置 sshd 服务
Linux 系统中的一切都是文件,因此在 Linux 系统中修改服务程序的运行参数,实际上就是在修改程序配置文件的过程。sshd 服务的配置信息保存在/etc/ssh/sshd_config 文件中,该配置文件中常用字段及其含义如下图示:
字段及其含义4)使用 ssh 命令连接远程主机
在 RHEL 7 系统中,已经默认安装并启用了 sshd 服务程序。
[root@localhost sh]# ssh 192.168.10.10
5)禁止以root身份在远程登录到服务器
如果禁止以 root 管理员的身份远程登录到服务器,则可以大大降低被黑客暴力破解密码的几率。打开 sshd 服务的主配置文件,然后把第 48 行#PermitRootLogin yes 参数前的井号(#)去掉,并把参数值 yes 改成 no,这样就不再允许 root 管理员远程登录了。
[root@localhost sh]# vim /etc/ssh/sshd_config
编辑sshd_config文件
注意:一般的服务程序并不会在配置文件修改之后立即获得最新的参数。如果想让新配置文件生效,则需要手动重启相应的服务程序。最好也将这个服务程序加入到开机启动项中,这样系统在下一次启动时,该服务程序便会自动运行,继续为用户提供服务。
[root@localhost sh]# systemctl restart sshd
[root@localhost sh]# systemctl enable sshd
5、使用安全密钥验证
1)什么加密?什么是公钥和私钥?
加密是对信息进行编码和解码的技术,它通过一定的算法(密钥)将原本可以直接阅读的明文信息转换成密文形式。密钥即是密文的钥匙,有私钥和公钥之分。在传输数据时,如果担心被他人监听或截获,就可以在传输前先使用公钥对数据加密处理,然后再行传送。这样,只有掌握私钥的用户才能解密这段数据,除此之外的其他人即便截获了数据,一般也很难将其破译为明文信息。
2)使用ssh-keygen 在客户端生成“密钥对”。
ssh-keygen3)使用ssh-copy-id 把客户端生成的公钥文件传送至远程主机。
ssh-copy-id4)对远程主机(服务端)进行SSH配置,使其只允许密钥验证,拒绝传统的口令验证方式。
[root@localhost sh]# vim /etc/ssh/sshd_config
编辑sshd_config文件
接下来就可以这个客户端的机器上使用 ssh 来远程连接服务器了,并且使用的是本地的私钥与远程服务器的公钥来进行验证。
6、远程传输命令(文件传输)
1)什么 scp 命令?它有什么用?
scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,它不仅能够通过网络传送数据,而且所有的数据都将进行加密处理。scp命令的常用参数如下:
scp2)如何把本地文件传递至另一台Linux机器上去?
命令格式为:“scp [参数] 本地文件 远程帐户@远程 IP 地址:远程目录”。在使用 scp 命令把文件从本地复制到远程主机时,首先需要以绝对路径的形式写清本地文件的存放位置。如果要传送整个文件夹内的所有数据,还需要额外添加参数-r 进行递归操作。
[root@localhost sh]# echo "welcome to geekxia.cn" > readme.txt
[root@localhost sh]# scp /root/readme.txt 192.0.0.1:/home/geekxia
3)如何从另一台Linux机器上下载文件至本机?
命令格式为:“scp [参数] 远程用户@远程 IP 地址:远程文件 本地目录”。
[root@localhost sh]# scp 192.168.10.10:/root/readme.txt /home
7、不间断的会话服务
1)为什么需要不间断的会话服务?
因为我们在连接远程主机时,一旦会话被关闭后,在远程主机上运行的命令也会随之被中断。比如我通过远程连接服务器,执行一个打包压缩任务,此时如果不小心把本地的会话关闭了,那么在远程主机上的打包压缩任务就会被中止。这显示是我们不希望看到的,所以我们需要不间断的会话服务。
2)那么该怎么解决“本地会话中断导致远程主机上的命令也中断”的问题呢?
screen 是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用 screen 服务程序同时在多个远程会话中自由切换。其核心功能如下:
- 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
- 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
- 会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享。
3)如何安装screen?
在 RHEL 7 系统中,没有默认安装 screen 服务程序,因此需要配置 Yum 仓库来安装它。
首先把CentOS-7-x86_64-DVD-1810.iso镜像文件所在设备/dev/cdrom挂载到系统目录/media/cdrom下。
[root@localhost sh]# mkdir -p /media/cdrom
[root@localhost sh]# mount /dev/cdrom /media/cdrom
然后对Yum仓库的配置文件进行如下修改,为稍后的screen安装指定仓库地址:
[root@localhost sh]# vim /etc/yum.repos.d/rhel7.repo
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
最后使用yum命令即可安装screen程序了:
[root@localhost sh]# yum install screen
4)开始使用screen管理远程会话
screen 命令能做的事情非常多:可以用-S 参数创建会话窗口;用-d 参数将指定会话进行离线处理;用-r 参数恢复指定会话;用-x 参数一次性恢复所有的会话;用-ls 参数显示当前已有的会话;以及用-wipe 参数把目前无法使用的会话删除等。
创建一个名称为backup的会话窗口:
[root@localhost sh]# screen -S backup
[root@localhost sh]# screen -ls
使用 exit 命令,可以退出当前会话窗口:
[root@localhost sh]# exit
使用 screen 命令执行要运行的命令,这样在命令中的一切操作也都会被记录下来,当命令执行结束后 screen 会话也会自动结束。
[root@localhost sh]# screen vim demo.txt
5)会话共享功能
screen 命令不仅可以确保用户在极端情况下也不丢失对系统的远程控制,保证了生产环境中远程工作的不间断性,而且它还具有会话共享、分屏切割、会话锁定等实用的功能。
所谓会话共享功能,即它可以把屏幕内容共享出来,让每个用户都可以看到相同的内容。其拓扑图如下示:
会话共享功能首先,我们让终端A连接到远程主机,并创建一个会话窗口:
ssh 192.168.10.10 // 连接远程主机
screen -S backup // 创建一个名为backup的会话
然后,终端B使用ssh连接远程主机,并获取远程会话。这样一来,终端B和终端A就可以看到相同的内容了。
ssh 192.168.10.10 // 连接远程主机
screen -x // 获取远程主机上的当前会话
8、本章复习题
复习题1 复习题2本章完 2019年1月3日
网友评论