0%

Linux基础知识


概述

Linux是一个基于POSIX多用户多任务、支持多线程和多CPU的操作系统

可移植操作系统接口(英语:Portable Operating System Interface, 缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件, 而定义API的一系列互相关联的标准的总称.

电气与电子工程师协会(英语: Institute of Electrical and Electronics Engineers), 简称IEEE, 总部位于美国纽约, 是一个国际性的电子技术与信息科学工程师的协会, 也是目前全球最大的非营利性专业技术学会. IEEE大部分成员是电子工程师计算机工程师计算机科学家

Unix是20世纪70年代初出现的一个操作系统, 除了作为网络操作系统之外, 还可以作为单机操作系统使用.

API(英语:Application Programming Interface, 应用程序接口)是一些预先定义接口(如函数、HTTP接口), 或指软件系统不同组成部分衔接的约定. 用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程, 而又无需访问源码, 或理解内部工作机制的细节.

用户类型

uid=0 gid=0 groups=0 root用户: 一个特殊的管理帐户, 也被称为超级用户; root已接近完整的系统控制, 对系统损害几乎有无限的能力, 除非必要, 不要登录为root.
999 >= uid gid groups >= 1 系统用户: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器, 默认服务程序会有独立的系统用户负责运行, 进而有效控制被破坏范围.
uid gid groups >= 1000 普通用户: 由root创建的用于日常工作的用户, 权限有限, 造成损害的能力比较有限.

终端类型

设备终端: 键盘、鼠标、显示器
控制台终端: /dev/console
串行终端: /dev/ttyS数字
虚拟终端: tty(teletypewriters), /dev/tty数字.
图形终端
伪终端: /dev/pts/数字
查看终端的命令: tty

交互式接口

图形用户界面(英语: Graphical User Interface, 简称: GUI, 又称图形用户接口)是指采用图形方式显示的计算机操作用户界面.
命令行界面(英语: Command-Line Interface, 简称: CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面, 它通常不支持鼠标, 用户通过键盘输入指令, 计算机接收到指令后, 予以执行.

Shell

Shell是Linux系统的用户界面(命令行), 提供了用户与内核进行交互操作的一种接口. 它接收用户输入的命令并把它送入内核去执行; Shell也被称为Linux的命令解释器(Command Interpreter); Shell是一种高级程序设计语言.

1
2
3
4
5
# 显示当前使用的shell
echo ${SHELL}

# 显示当前系统使用的所有shell
cat /etc/shells

Vim文本编辑器

Vim编辑器中设置了三种模式:

 命令模式: 控制光标移动, 可对文本进行复制、粘贴、删除和查找等工作.
 输入模式: 正常的文本录入.
 末行模式: 保存或退出文档, 以及设置编辑环境.

vim不同模式间的切换

命令模式的常用命令

命令作用
dd删除(剪切)光标所在整行
5dd删除(剪切)从光标处开始的5行
yy复制光标所在整行
5yy复制从光标处开始的5行
n显示搜索命令定位到的下一个字符串
N显示搜索命令定位到的上一个字符串
u撤销上一步的操作
p将之前删除(dd)或复制(yy)过的数据粘贴到光标后面

末行模式的常用命令

命令作用
:w保存
:q退出
:q!强制退出(放弃对文档的修改内容)
:wq!强制保存退出
:set nu显示行号
:set nonu不显示行号
:命令执行该命令
:整数跳转到该行
:s/one/two将当前光标所在行的第一个one替换成two
:s/one/two/g将当前光标所在行的所有one替换成two
:%s/one/two/g将全文中的所有one替换成two
?字符串在文本中从下至上搜索该字符串
/字符串在文本中从上至下搜索该字符串

配置主机名称

在Linux系统中, 主机名大多保存在/etc/hostname文件中.

第1步: 使用Vim编辑器修改”/etc/hostname”主机名称文件.
vim /etc/hostname

第2步: 保存并退出文档, 然后使用hostname命令检查是否修改成功.
hostname

配置网卡信息

第1步: 切换到/etc/sysconfig/network-scripts目录中(存放着网卡的配置文件).
cd /etc/sysconfig/network-scripts/  vim ifcfg-eno16777736

第2步: 使用Vim编辑器修改网卡文件ifcfg-eno16777736,逐项写入下面的配置参数并保存退出.

设备类型: TYPE=Ethernet
地址分配模式: BOOTPROTO=static
网卡名称: NAME=eno16777736
是否启动: ONBOOT=yes
IP地址: IPADDR=192.168.10.10
子网掩码: NETMASK=255.255.255.0
网关地址: GATEWAY=192.168.10.1
DNS地址: DNS1=192.168.10.1

第3步: 重启网络服务并测试网络是否联通
systemctl restart network

配置Yum仓库

Yum软件仓库的作用是为了进一步简化RPM管理软件的难度以及自动分析所需软件包及其依赖关系的技术

FTP提供方式

客户端:
配置好FTP服务进行文件共享

服务端:

vi repo_http.repo
 [http]
 name=http_centos7.2
 baseurl=ftp://用户名:密码@ftp服务端ip/默认根目录下的指定目录
 gpgcheck=0
 enabled=1

HTTP提供方式

本地镜像:
安装httpd软件. 启动httpd服务并设置配置为开机启动.

 yum -y install httpd
 systemctl enabled httpd
 systemctl restart httpd

镜像资源目录拷贝至http的网站根目录(/var/www/html/)

 /var/www/html/centos7.2

使用该yum仓库

 vi /etc/yum.repo.d/centos.repo

 [http]
 name=http_centos7.2
 baseurl=http://ip地址/centos7.2
 gpgcheck=0
 enabled=1

阿里源镜像:

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

查看yum源中是否有软件包
yum repolist

本地提供方式

第1步: 进入到/etc/yum.repos.d/目录中(因为该目录存放着Yum软件仓库的配置文件).
cd /etc/yum.repos.d/

第2步: 使用Vim编辑器创建一个名为rhel7.repo的新配置文件(文件名称可随意,但后缀必须为.repo), 逐项写入下面加粗的配置参数并保存退出.
vim rhel7.repo

[rhel-media]Yum软件仓库唯一标识符, 避免与其他仓库冲突.
name=linuxprobeYum软件仓库的名称描述, 易于识别仓库用处.
baseurl=file:///media/cdrom提供的方式包括FTP(ftp://..)、HTTP(http://..)、本地(file:///..).
enabled=1设置此源是否可用; 1为可用, 0为禁用.
gpgcheck=1设置此源是否校验文件; 1为校验, 0为不校验.
gpgkey=file///media/cdrom/RPM-GPG-KEY-redhat-release: 若上面参数开启校验,那么请指定公钥文件地址.

第3步: 按配置参数的路径挂载光盘, 并把光盘挂载信息写入到/etc/fstab文件中.

 mkdir -p /media/cdrom
 mount /dev/cdrom /media/cdrom

 vim /etc/fstab
 /dev/cdrom /media/cdrom iso9660 defaults 0 0

第4步: 使用yum install httpd -y命令检查Yum软件仓库是否已经可用.
尝试使用Yum软件仓库来安装Web服务, 末尾出现Complete!则代表配置正确.

计划任务服务程序

一次性计划任务

at 时间设置一次性计划任务
atrm 任务序号根据任务序号删除一次性计划任务
at -l查看已设置好但还未执行的一次性计划任务
at -c 任务序号查看指定一次性计划任务的执行命令

周期性计划任务

cronb:服务名称
crontab:配置工具

crontab -e编辑计划任务
crontab -e -u 用户名编辑指定用户的计划任务
crontab -l查看当前计划任务
crontab -r 任务序号删除某条计划任务
*  *  *  *  *  任务内容
分 时 日 月 周  执行命令
whereis 命令 --查询命令的所在路径
注:用任务计划执行时, 命令必须使用绝对路径.

用户身份与能力

管理员UID:0系统的管理员用户
系统用户UID:1-999Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器, 默认服务程序会有独立的系统用户负责运行, 进而有效控制被破坏范围.
普通用户UID:1000-由管理员创建的用于日常工作的用户

id命令

id命令用于显示指定用户的用户ID和组ID, 其格式为:id [选项] [用户名].

useradd命令

useradd命令用于创建新的用户, 格式为useradd [选项] 用户名.

使用该命令创建用户账户时, 默认的用户家目录会被存放在/home目录中, 默认的Shell解释器为/bin/bash.
在Linux系统中创建每个用户时, 将自动创建一个与其同名的基本用户组, 而且这个基本用户组只有该用户一个人.

groupadd命令

groupadd命令用于创建用户组, 格式为groupadd [选项] 群组名.

如果该用户以后被归纳入其他用户组, 则这个其他用户组称之为扩展用户组.
一个用户只有一个基本用户组, 但是可以有多个扩展用户组, 从而满足日常的工作需要.

usermod命令

usermod命令用于修改用户的属性, 格式为usermod [选项] 用户名.

用户的信息保存在/etc/passwd文件中

passwd命令

passwd命令用于修改用户密码、过期时间、认证信息等, 格式为passwd [选项] [用户名].

普通用户只能使用passwd命令修改自身的系统密码, 而root管理员则有权限修改其他所有人的密码.
root管理员在Linux系统中修改自己或他人的密码时不需要验证旧密码

userdel命令

userdel命令用于删除用户, 格式为userdel [选项] 用户名.

文件权限与归属

-普通文件
d目录文件
l链接文件
b块设备文件
c字符设备文件
p管道文件
字符表示rwx
特殊字符表示sst
数字表示421
权限分配文件所有者文件所属组其他用户

文件的特殊权限

SUID执行者临时获取命令的所有者权限??x/??s | ??-/??Su+s
SGID在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)??x/??s | ??-/??Sg+s
SBIT确保用户只能删除自己的文件, 而不能删除其他用户的文件.??x/??t | ??-/??To+t

文件的隐藏属性

chattr命令

chattr命令用于设置文件的隐藏权限, 格式为chattr [参数] 文件.

lsattr命令

lsattr命令用于显示文件的隐藏权限, 格式为lsattr [参数] 文件.

文件访问控制列表

对某个指定的用户进行单独的权限控制, 就需要用到文件的访问控制列表(ACL).
通俗来讲, 基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限.
另外, 如果针对某个目录设置了ACL, 则目录中的文件会继承其ACL; 若针对文件设置了ACL, 则文件不再继承其所在目录的ACL.

setfacl命令

setfacl命令用于管理文件的ACL规则

 setfacl 选项 用户:名:权限 文件名称/目录
 |__ -m --更改文件的访问控制列表
 |__ -M --从文件读取访问控制列表条目更改
 |__ -x --根据文件中访问控制列表移除条目
 |__ -X --从文件读取访问控制列表条目并删除
 |__ -b --删除所有扩展访问控制列表条目
 |__ -k --移除默认访问控制列表
 |__ -d --应用到默认访问控制列表的操作
 |__ -P --依照自然逻辑, 不跟随符号链接
 |__ -v --显示版本并退出
 |__ -R --递归操作子目录

getfacl命令

getfacl命令用于显示文件上设置的ACL信息, 格式为getfacl 文件名称.

su命令和sudo服务

su命令

su命令可以解决切换用户身份的需求, 使得当前用户在不退出登录的情况下, 顺畅地切换到其他用户.
格式:su - 用户名, -:表示完全切换, 环境变量信息也变更为新用户的相应信息.

sudo服务

sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务

sudo命令功能:
限制用户执行指定的命令
记录用户执行的每一条命令
配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数
验证密码的后5分钟内(默认值)无须再让用户再次验证密码
 sudo [选项] 命令名称
 |__ -h --列出帮助信息
 |__ -l --列出当前用户可执行的命令
 |__ -u 用户名/UID值 --以指定的用户身份执行命令
 |__ -k --清空密码的有效时间, 下次执行sudo时需要再次进行密码验证.
 |__ -b --在后台执行指定的命令
 |__ -p --更改询问密码的提示语
root管理员进行授权:
 visudo
 谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
 root ALL=(ALL) ALL
 ...
 #xxx ALL=(ALL) NOPASSWD: xxx//普通用户执行命令时无需输入密码

普通用户获取权限:
 sudo 命令名称
 输入当前用户的密码后执行命令

存储结构与磁盘划分

一切从”/“开始

在Linux系统中, 目录、字符设备、块设备、套接字、打印机等都被抽象成了文件, 即Linux系统中一切都是文件.
Linux系统中的一切文件都是从”根(/)”目录开始的, 并按照文件系统层次化标准(FHS)采用树形结构来存放文件, 以及定义了常见目录的用途.

Linux系统中常见的目录名称以及相应内容
/boot开机所需文件—内核、开机菜单以及所需配置文件等
*/etc配置文件
*/home用户主目录
/media用于挂载设备文件的目录
/opt放置第三方的软件
*/root系统管理员的家目录
/srv一些网络服务的数据文件目录
/tmp任何人均可使用的"共享"临时目录
*/proc虚拟文件系统, 例如系统内核、进程、外部设备及网络状态等.
/usr/local用户自行安装的软件
/usr/share帮助与说明文件, 也可放置共享文件.
*/var主要存放经常变化的文件, 如日志.

详细介绍请看CSDN博主:Super-小志志的博客介绍

 相对路径: 根据一个路径来定位
 绝对路径: 指定全路径

物理设备的命令规则

IDE设备/dev/hd[a-d]
SCSI/SATA/U盘/dev/sd[a-p]
软驱/dev/fd[0-1]
打印机/dev/lp[0-15]
光驱/dev/cdrom
鼠标/dev/mouse
磁带机/dev/st0或/dev/ht0
主分区或扩展分区的编号从1开始, 到4结束; 逻辑分区从编号5开始.
 硬盘设备是由大量的扇区组成的, 每个扇区的容量为512字节.

 第一个扇区最重要: 里面保存着主引导记录与分区表信息. 
 主引导记录需要占用446字节, 分区表为64字节, 结束符占用2字节.

 分区表中每记录一个分区信息就需要16字节
 最多只有4个分区信息可以写到第一个扇区中, 这4个分区就是4个主分区.

 为了解决分区个数不够的问题, 可以将第一个扇区的分区表中16字节的空间(称之为扩展分区)拿出来指向另外一个分区.
 扩展分区其实并不是一个真正的分区, 而更像是一个占用16字节分区表空间的指针, 一个指向另外一个分区的指针.

文件系统与数据资料

用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的. 文件系统的作用是合理规划硬盘, 以保证用户正常的使用需求.

计算机系统在发展过程中产生了众多的文件系统, 为了使用户在读取或写入文件时不用关心底层的硬盘结构, Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System, 虚拟文件系统)接口, 这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了

最常见的文件系统

 Ext3:是一款日志文件系统, 能够在系统异常宕机时避免文件系统资料丢失, 并能自动修复数据的不一致与错误. 然而, 当硬盘容量较大时, 所需的修复时间也会很长, 而且也不能百分之百地保证资料不会丢失.它会把整个磁盘的每个写入动作的细节都预先记录下来, 以便在发生异常宕机后能回溯追踪到被中断的部分, 然后尝试进行修复.

 Ext4:Ext3的改进版本, 作为RHEL 6系统中的默认文件管理系统, 它支持的存储容量高达1EB(1EB=1,073,741,824GB), 且能够有无限多的子目录. 另外, Ext4文件系统能够批量分配block块, 从而极大地提高了读写效率.

 XFS:是一种高性能的日志文件系统, 而且是RHEL 7中默认的文件管理系统, 它的优势在发生意外宕机后尤其明显, 即可以快速地恢复可能被破坏的文件, 而且强大的日志功能只用花费极低的计算和存储性能.并且它最大可支持的存储容量为18EB, 这几乎满足了所有需求.
 Linux系统中有一个名为super block的"硬盘地图", 里面记录着整个文件系统的信息.
 Linux只是把每个文件的权限与属性记录在inode中, 而且每个文件占用一个独立的inode表格, 该表格的大小默认为128字节.

 该文件的访问权限(read、write、execute)
 该文件的所有者与所属组(owner、group)
 该文件的大小(size)
 该文件的创建或内容修改时间(ctime)
 该文件的最后一次访问时间(atime)
 该文件的修改时间(mtime)
 文件的特殊权限(SUID、SGID、SBIT)
 该文件的真实数据地址(point)
 文件的实际内容则保存在block块中(大小可以是1KB、2KB或4KB), 一个inode的默认大小仅为128B(Ext3), 记录一个block则消耗4B.
 当文件的inode被写满后, Linux系统会自动分配出一个block块, 专门用于像inode那样记录其他block块的信息, 
 这样把各个block块的内容串到一起,就能够让用户读到完整的文件内容了.

 对于存储文件内容的block块,有下面两种常见情况(以4KB的block大小为例进行说明).
 情况1:文件很小(1KB), 但依然会占用一个block, 因此会潜在地浪费3KB.
 情况2:文件很大(5KB), 那么会占用两个block(5KB-4KB后剩下的1KB也要占用一个block).

挂载硬件设备

当用户需要使用硬盘设备或分区中的数据时, 需要先将其与一个已存在的目录文件进行关联, 而这个关联动作就是”挂载”.
挂载: mount 存储设备 挂载点
卸载: umount 存储设备/挂载点

永久挂载的各字段所表示的含义(写入到/etc/fstab文件)
设备文件挂载目录格式类型权限选项是否备份是否自检
一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier).指定要挂载到的目录, 需在挂载前创建好.指定文件系统的格式若设置为defaults, 则默认权限为:rw, suid, dev, exec, auto, nouser, async.若为1则开机后使用dump进行磁盘备份, 为0则不备份.若为1则开机后自动进行磁盘自检, 为0则不自检.

添加硬盘设备

添加硬盘: 虚拟主机 -> 设置 -> 添加 -> 硬盘

第一步: fdisk命令用于管理磁盘分区, 格式为fdisk [磁盘名称];
使用file命令查看该文件的属性, 格式为file 分区名称.

第二步: 输入partprobe命令手动将分区信息同步到内核, 格式为partprobe.
第三步: 使用mkfs命令对其分区进行格式化, 格式为mkfs.文件类型名称 分区名称.
第四步: 创建一个用于挂载设备的挂载点目录; 然后使用mount命令将存储设备与挂载点进行关联.
使用df -h命令来查看挂载状态和硬盘使用量信息

用于查看文件数据占用量的du命令, 其格式为du [选项] [文件].

添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间, 然后将把内存中暂时不常用的数据临时存放到硬盘中, 以便腾出物理内存空间让更活跃的程序服务来使用的技术, 其设计目的是为了解决真实物理内存不足的问题. 但由于交换分区毕竟是通过硬盘设备读写数据的, 速度肯定要比物理内存慢, 所以只有当真实的物理内存耗尽后才会调用交换分区的资源.

交换分区的划分建议: 在生产环境中, 交换分区的大小一般为真实物理内存的1.5~2倍.

第一步: fdisk命令用于管理磁盘分区, 格式为fdisk [磁盘名称];
第二步: 输入partprobe命令手动将分区信息同步到内核, 格式为partprobe.
第三步: 使用mkfs命令对其分区进行格式化, 格式为mkswap 分区名称.
第四步: 使用swapon命令把准备好的SWAP分区设备正式挂载到系统中, 格式为swapon 分区名称.
第五步: 进行永久挂载:/dev/分区名称 swap swap defaults 0 0
使用free -m命令查看交换分区的大小变化

磁盘容量配额

使用quota命令进行磁盘容量配额管理, 从而限制用户的硬盘可用容量或所能创建的最大文件个数.

 软限制: 当达到软限制时会提示用户, 但仍允许用户在限定的额度内继续使用.
 硬限制: 当达到硬限制时会提示用户, 且强制终止用户的操作.

创建一个用于检查quota磁盘容量配额效果的用户tom, 并针对/boot目录增加其他人的写权限, 保证用户能够正常写入数据.

 useradd tom
 chmod -Rf o+w /boot

xfs_quota命令

xfs_quota命令是一个专门针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令,
格式为xfs_quota [参数] 配额 文件目录.

 xfs_quota [参数] 配额 文件目录
 |__ -c --用于以参数的形式设置要执行的命令
 |__ -x --专家模式

硬盘使用量的软限制和硬限制分别为3MB和6MB; 创建文件数量的软限制和硬限制分别为3个和6个.
xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot

edquota命令

edquota命令用于编辑用户的quota配额限制, 格式为edquota [参数] [用户].

 edquota [参数] [用户]
 |__ -u --表示要针对哪个用户进行设置
 |__ -g --表示要针对哪个用户组进行设置

 edquota命令会调用Vi或Vim编辑器来让root管理员修改要限制的具体细节

使用RAID与LVM磁盘阵列技术

RAID磁盘冗余阵列

RAID技术通过把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列, 并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上, 然后利用分散读写技术来提升磁盘阵列整体的性能, 同时把多个重要数据的副本同步到不同的物理硬盘设备上, 从而起到了非常好的数据冗余备份效果.
也就是说, RAID不仅降低了硬盘设备损坏后丢失数据的几率, 还提升了硬盘设备的读写速度.

RAID 0

RAID0技术能够有效地提升硬盘数据的吞吐速度, 但是不具备数据备份和错误修复能力.
RAID0

RAID 1

如果生产环境对硬盘设备的读写速度没有要求, 而是希望增加数据的安全性时, 就需要用到RAID1技术了.
RAID1

RAID 5

RAID5技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中. RAID5磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中, 而是存储到除自身以外的其他每一块硬盘设备上, 这样的好处是其中任何一设备损坏后不至于出现致命缺陷.
RAID5

RAID 10

大部分企业更在乎的是数据本身的价值而非硬盘价格, 因此生产环境中主要使用RAID10技术.
顾名思义, RAID10技术是RAID1+RAID0技术的一个”组合体”. RAID10技术需要至少4块硬盘来组建, 其中先分别两两制作成RAID1磁盘阵列, 以保证数据的安全性; 然后再对两个RAID1磁盘阵列实施RAID0技术, 进一步提高硬盘设备的读写速度.
RAID10

部署磁盘阵列

mdadm命令用于管理Linux系统中的软件RAID硬盘阵列,
格式为mdadm [模式] <RAID设备名称> [选项] [成员设备名称].

 mdadm [模式] <RAID设备名称> [选项] [成员设备名称]
 |__ -a --向RAID设备中添加一个成员
 |__ -n --指定设备数量
 |__ -l --指定RAID级别
 |__ -C --创建
 |__ -v --显示过程
 |__ -f --模拟设备损坏
 |__ -r --移除设备
 |__ -Q --查看摘要信息
 |__ -D --查看详细信息
 |__ -S --停止RAID磁盘阵列
 |__ -x --指定初始RAID设备的备用成员的数量

在虚拟机中添加4块硬盘设备来制作一个RAID 10磁盘阵列
第一步: mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
第二步: mkfs.ext4 /dev/md0
第三步: mkdir /RAID  mount /dev/md0 /RAID
第四步: echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab

损坏磁盘阵列及修复

在确认有一块物理硬盘设备出现损坏而不能继续正常使用后, 应该使用mdadm命令将其移除, 然后查看RAID磁盘阵列的状态, 可以发现状态已经改变.
在RAID 10级别的磁盘阵列中, 当RAID 1磁盘阵列中存在一个故障盘时并不影响RAID 10磁盘阵列的使用. 当购买了新的硬盘设备后再使用mdadm命令来予以替换即可, 在此期间我们可以在/RAID目录中正常地创建或删除文件.

 mdadm /dev/md0 -f /dev/sdb

 umount /RAID
 mdadm /dev/md0 -a /dev/sdb

磁盘阵列 + 备份盘

RAID备份盘技术核心理念就是准备一块足够大的硬盘, 这块硬盘平时处于闲置状态, 一旦RAID磁盘阵列中有硬盘出现故障后则会马上自动顶替上去.

 mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
 mkfs.ext4 /dev/md0
 echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
 mkdir /RAID
 mount -a

LVM逻辑卷管理器

逻辑卷管理器是Linux系统用于对硬盘分区进行管理的一种机制
LVM的核心理念:物理卷处于LVM中的最底层, 可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列, 这都可以. 卷组建立在物理卷之上, 一个卷组可以包含多个物理卷, 而且在卷组创建之后也可以继续向其中添加新的物理卷. 逻辑卷是用卷组中空闲的资源建立的, 并且逻辑卷在建立后可以动态地扩展或缩小空间.

部署逻辑卷

功能/命令物理卷管理卷组管理逻辑卷管理
扫描pvscanvgscanlvscan
建立pvcreatevgcreatelvcreate
显示pvdisplayvgdisplaylvdisplay
删除pvremovevgremovelvremove
扩展vgextendlvextend
缩小vgreducelvreduce

让新添加的两块硬盘设备支持LVM技术
第一步:pvcreate /dev/sdb /dev/sdc

把两块硬盘设备加入到storage卷组中, 然后查看卷组的状态.
第二步:vgcreate storage /dev/sdb /dev/sdc  vgdisplay

切割出一个约为150MB的逻辑卷设备, 以容量为单位, 所使用的参数为-l.
第三步:lvcreate -n vo -l 37 storage  lvdisplay

把生成好的逻辑卷进行格式化, 然后挂载使用.
第四步:mkfs.ext4 /dev/storage/vo  mkdir /linuxprobe
mount /dev/storage/vo /linuxprobe

查看挂载状态, 并写入到配置文件, 使其永久生效.
第五步:df -h  echo "/dev/storage/vo /linuxprobe ext4 defaults 0 0" >> /etc/fstab

扩容逻辑卷

扩展前要先卸载设备和挂载点的关联
umount /linuxprobe

把逻辑卷vo扩展至290MB
第一步:lvextend -L 290M /dev/storage/vo

检查硬盘完整性, 并重置硬盘容量.
第二步:e2fsck -f /dev/storage/vo  resize2fs /dev/storage/vo

重新挂载硬盘设备并查看挂载状态
第三步:mount -a  df -h

缩小逻辑卷

一定要提前备份好数据. 另外Linux系统规定, 在对LVM逻辑卷进行缩容操作之前, 要先检查文件系统的完整性. 在执行缩容操作前记得先把文件系统卸载掉.
umount /linuxprobe

检查文件系统的完整性
第一步:e2fsck -f /dev/storage/vo

把逻辑卷vo的容量减小到120MB.
第二步:resize2fs /dev/storage/vo 120M  lvreduce -L 120M /dev/storage/vo

重新挂载文件系统并查看系统状态
第三步:mount -a  df -h

逻辑卷快照

LVM还具备有”快照卷”功能, 该功能类似于虚拟机软件的还原时间点功能.
LVM的快照卷功能有两个特点:

快照卷的容量必须等同于逻辑卷的容量
快照卷仅一次有效, 一旦执行还原操作后则会被立即自动删除.

首先查看卷组的信息, 用重定向往逻辑卷设备所挂载的目录中写入一个文件.
vgdisplay
echo "Welcome to Linuxprobe.com" > /linuxprobe/readme.txt

使用-s参数生成一个快照卷, 使用-L参数指定切割的大小.
第一步:lvcreate -L 120M -s -n SNAP /dev/storage/vo  lvdisplay

在逻辑卷所挂载的目录中创建一个100MB的垃圾文件, 然后再查看快照卷的状态.
第二步:dd if=/dev/zero of=/linuxprobe/files count=1 bs=100M  lvdisplay

对逻辑卷进行快照还原操作, 在此之前先卸载掉逻辑卷设备与目录的挂载.
第三步:umount /linuxprobe  lvconvert --merge /dev/storage/SNAP

进行挂载和查看当前的状态
第四步:mount -a  ls /linuxprobe/

删除逻辑卷

当生产环境中想要重新部署LVM或者不再需要使用LVM时, 则需要执行LVM的删除操作.
依次删除逻辑卷、卷组、物理卷设备, 这个顺序不可颠倒.

取消逻辑卷与目录的挂载关联, 删除配置文件中永久生效的设备参数.
第一步:umount /linuxprobe  vim /etc/fstab

删除逻辑卷设备, 需要输入y来确认操作.
第二步:lvremove /dev/storage/vo

删除卷组, 此处只写卷组名称即可, 不需要设备的绝对路径.
第三步:vgremove storage

删除物理卷设备
第四步:pvremove /dev/sdb /dev/sdc

Iptables与Firewalld防火墙

保障数据的安全性是继保障数据的可用性之后最为重要的一项工作. 防火墙作为公网与内网之间的保护屏障, 在保障数据的安全性方面起着至关重要的作用.

Linux的防火墙体系主要工作在网络层, 针对TCP/IP数据包实施过滤和限制, 属于典型的包过滤防火墙(或称为网络层防火墙). Linux系统的防火墙体系基于内核编码实现, 具有非常稳定的性能和极高的效率.

netfilter和iptables的主要区别
netilter指的是Linux内核中实现包过滤防火墙的内部结构, 不以程序或文件的形式存在, 属于"内核态"(Kernel Space, 又称为内核空间)的防火墙功能体系.
iptables指的是用来管理Linux防火墙的命令程序, 通常位于/sbin/iptables目录下, 属于"用户态(User Space, 又称为用户空间)的防火墙管理体系.

防火墙管理工具

主要功能都是依据策略对穿越防火墙自身的流量进行过滤. 防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制, 然后防火墙使用预先定制的策略规则监控出入的流量, 若流量与某一条策略规则相匹配, 则执行相应的处理, 反之则丢弃.

iptables与firewalld都不是真正的防火墙, 它们都只是用来定义防火墙策略的防火墙管理工具而已, 或者说, 它们只是一种服务. iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理, 而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理.

Iptables

在早期的Linux系统中, 默认使用的是iptables防火墙管理服务来配置防火墙. 尽管新型的firewalld防火墙管理服务已经被投入使用多年, 但是大量的企业在生产环境中依然出于各种原因而继续使用iptables.

策略与规则链

防火墙会从上至下的顺序来读取配置的策略规则, 在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止). 如果在读取完所有的策略规则之后没有匹配项, 就去执行默认的策略.

一般而言, 防火墙策略规则的设置有两种:一种是”通”(即放行), 一种是”堵”(即阻止).

iptables服务把用于处理或过滤流量的策略条目称之为规则, 多条规则可以组成一个规则链, 而规则链则依据数据包处理位置的不同进行分类:

 在进行路由选择前处理数据包(PREROUTING)
 处理流入的数据包(INPUT)
 处理转发的数据包(FORWARD)
 处理流出的数据包(OUTPUT)
 在进行路由选择后处理数据包(POSTROUTING)
应用顺序为:raw -> mangle -> nat -> filter
规则表名作用内核模块规则链
filter对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包.iptable_filterINPUT
FORWARD
OUTPUT
nat修改数据包的IP地址、端口号等信息.iptable_natPREROUTING
POSTROUTING
OUTPUT
mangle修改数据包的TOS(Type Of Service, 服务类型)、TTL(Time To Live, 生存周期), 或者为数据包设置Mark标记, 以实现流量整形、策略路由等高级应用.iptable_manglePREROUTING
POSTROUTING
INPUT
OUTPUT
FORWARD
raw决定是否对数据包进行状态跟踪iptable_rawOUTPUT
PREROUTING

处理这些匹配流量的相应动作:

 ACCEPT(允许流量通过)
 REJECT(拒绝流量通过并且响应)
 LOG(记录日志文件)
 DROP(拒绝流量通过, 但不会响应.)

基本的命令参数

iptables是一款基于命令行的防火墙策略管理工具, iptables命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配, 一旦匹配成功, iptables就会根据策略规则所预设的动作来处理这些流量. 未指定表名时将默认使用filter表.

 iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 相应动作]
 |__ -P --设置默认策略
 |__ -F --清空规则链
 |__ -L --查看规则链
 |__ -A --在规则链的末尾加入新规则
 |__ -I num --在规则链的头部加入新规则
 |__ -R num --修改、替换指定链中的某一条规则, 可指定规则序号或具体内容.
 |__ -D num --删除某一条规则
 |__ -s --匹配来源地址IP/MASK, 加叹号"!"表示除这个IP外.
 |__ -d --匹配目标地址
 |__ -i 网卡名称 --匹配从这块网卡流入的数据
 |__ -o 网卡名称 --匹配从这块网卡流出的数据
 |__ -p --匹配协议, 如TCP、UDP、ICMP.
 |__ -j --处理动作
 |__ -n --使用数字形式显示输出结果
 |__ -y --查看规则列表时显示详细的信息
 |__ -h --查看命令帮助信息
 |__ -line-numbers --查看规则列表时, 同时显示规则在链中的顺序号.
 |__ --dport num --匹配目标端口号
 |__ --sport num --匹配来源端口号

规则的匹配条件

在编写防火墙规则时, 匹配条件的设置起着决定性的作用.

通用匹配

通用匹配也称为常规匹配, 这种匹配方式可以独立使用, 不依赖于其他条件或扩展模块. 常见的通用匹配包括协议匹配、地址匹配、网络接口匹配.

可用的协议类型存放于Linux系统的/etc/protocols文件中
匹配名称指定形式作用
协议匹配-p 协议名检查数据包所使用的网络协议
地址匹配-s 源地址
-d 目标地址
检查数据包的源地址或目标地址
网络接口匹配-i 接口名
-o 接口名
检查数据包从防火墙的哪一个接口进入或发出, 分别对应入站网卡、出站网卡.

隐含匹配

这种匹配方式要求以指定的协议匹配作为前提条件, 相当于子条件, 因此无法独立使用, 其对应的功能由iptables在需要时自动(隐含)载入内核. 常见的隐含匹配包括端口匹配、TCP标记匹配、ICMP类型匹配.

匹配名称指定形式作用
端口匹配--sport 源端口
--dport 目标端口
针对协议:TCP或UDP
范围端口:起始端口:结束端口
检查数据包的源端口或目标端口
ІСМР类型匹配--icmp-type ICMP 类型(使用字符串或数字代码表示)
Echo-Request(代码为8)--------------请求
Echo-Reply(代码为0)-----------------回显
Destination-Unreachable(代码为3)--目标不可达
针对协议:ICMP
检查ICMP数据包的类型
iptables -p icmp -h命令, 列出所有支持的类型.

显式匹配

这种匹配方式要求有额外的内核模块提供支持, 必须手动以”-m 模块名称”的形式调用相应的模块, 然后方可设置匹配条件. 添加了带显式匹配条件的规则以后, 可以执行”lsmod | grep xt_”命令查看到相关的内核扩展模块. 常见的显式匹配包括多端口匹配、IP范围匹配、MAC地址匹配、状态匹配.

常见的连接状态:NEW(与任何连接无关的)、BI(响应请求或者已建立连接的)和RELATED(与已有连接有相关性的, 如FTP数据连接).
匹配名称指定形式作用
多端口匹配-m multiport-sports 端口列表
-m multport-dports 端口列表
检查数据包的源端口、目标端口, 多个端口之间以逗号进行分隔
IP范围匹配-m iprange --src-range IP范围
-m iprange --dst-range IP范围
检查数据包的源地址、目标地址, 其中IP范围采用"起始地址 - 结束地址"的形式表示.
МAC地址匹配-m mac --mac-source MAC地址检查数据包的源MAC地址(一般只适用于内部网络)
状态匹配-m state --state 连接状态基于iptables的状态跟踪机制用来检查数据包的连接状态(State)

iptables命令实例
查看已有的防火墙规则链:
iptables -L

清空已有的防火墙规则链:
iptables -F

设置INPUT规则链的默认策略为拒绝:
iptables -P INPUT DROP

向INPUT规则链中添加允许ICMP流量进入的策略规则:
iptables -I INPUT -p icmp -j ACCEPT

向INPUT规则链中添加拒绝ICMP流量进入的策略规则:
iptables -I INPUT -p icmp -j REJECT

删除INPUT规则链中刚刚加入的那条策略, 并把默认策略设置为允许:
iptables -D INPUT 1  iptables -P INPUT ACCEPT

将INPUT规则链设置为只允许指定网段的主机访问本机的22端口, 拒绝来自其他所有主机的流量:
iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT

向INPUT规则链中添加拒绝所有人访问本机12345端口的策略规则:
iptables -I INPUT -p tcp --dport 12345 -j REJECT
iptables -I INPUT -p udp --dport 12345 -j REJECT

向INPUT规则链中添加拒绝192.168.10.5主机访问本机80端口(Web服务)的策略规则:
iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT

向INPUT规则链中添加拒绝所有主机访问本机1000~1024端口的策略规则:
iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
iptables -A INPUT -p udp --dport 1000:1024 -j REJECT

注:使用iptables命令配置的防火墙规则默认会在系统下一次重启时失效, 如果想让配置的防火墙策略永久生效, 需要执行保存命令:
service iptables save

规则的导出、导入

在Linux系统中, iptables为我们提供了批量备份与恢复规则的命令, 也提供了标准的系统服务以便开启、关闭防火墙功能.

规则的备份及还原

防火墙规则的批量备份、还原用到两个命令, 即iptables-save和iptables-restore, 分别用来保存(Save)和恢复(Restore).

iptables-save命令用来批量导出Linux防火墙规则. 直接执行iptables-save命令时, 将显示出当前启用的所有规则.

以”#”号开头的内容表示注释
“*表名”表示所在的表
“: 链名 默认策略”表示相应的链及默认策略
具体的规则部分省略了命令名”iptables”
后面的”COMMIT”表示提交前面的规则设置

备份所有表的规则
iptables-save > /opt/iprules_all.txt

iptables-retore命令用来批量导入Linux防火墙规则, 如果已经使用iptables-save命令导出备份文件, 则恢复规则的过程在一瞬间就能完成. 与iptables-save命令相对的iptables-restore命令应结合重定向输入来指定备份文件的位置.

从备份文件恢复规则
iptables-restore < /opt/iprules_all.txt

使用防火墙脚本

防火墙脚本的构成:定义基本变量、加载内核模块、调整/proc参数

定义基本变量

将防火墙的网卡、IP地址、局域网段、iptables命令的路径等定义为变量, 便于对脚本程序进行维护和移植使用.

加载内核模块

iptables命令的大部分模块都可以根据需要动态载入内核, 只有个别模块需要手动进行加载. 但如果需要启用的规则数量较多, 为了提高规则设置的效率, 保持防火墙的稳定性, 建议将用到的各种模快提加载到内核中.

调整/proc参数

proc是Linux或UNIX系统中的一种伪文件系统机制, 提供了访问内核运行结构、改变内核设置的实时数据. 与EXT3, FAT32等本地文件系统不同, /proc中的数据存放在内存而不是硬盘上.
在文件夹/proc/sys下存放着与系统相关的一些可控参数, 可以直接用来改变内核的行为, 通常作为Linux内核调优的实时入口.
用echo, sysctl命令都可以修改相关参数, 当然也可以写到/etc/sysctl.conf文件(执行sysctl -p后生效).

设置具体的iptables规则

1.清理已有的规则
为了避免已有的防火墙规则造成干扰, 通常会预先安排一个”清理”操作, 删除所有表中用户自定义的链, 清空所有链内的规则.

 删除各表中自定义的链
 $TPT -t filter -X
 $IPT -t nat -X
 $IPT -t mangle -x
 $IPT -t raw -X
 清空各表中已有的规则
 $IPT -t filter -F
 $IPT  t nat -F
 $IPT -t mangle -F
 $IPT -t raw -F

2.设置规则链的默认策略
在实际生产环境中, 防火墙过滤规则建议采取”默认拒绝”的策略, 可以获得更好的安全性.

 $IPT -P INPUT DROP
 $IPT -P FORWARD DROP
 $IPT -P OUTPUT ACCEPT

3.设置nat表中的各种规则
iptables的nat表主要用在Linux网关服务器中, 一般的主机型防火墙方案很少会用到nat表. 根据实际情况编写相应的SNAT、DNAT规则(如局域网共享上网、发布内部Web服务器), 如果没有则跳过此部分.

4.设置fiter表的各种规则
iptables的filter表主要用来过滤数据包, 无论是Linux网关还是一般的Linux服务器都可能用到. 主机型的防火墙主要使用INPUT, OUTPUT链, 而对于网络型的防火墙主要使用FORWARD链.

防火墙脚本示例

 vim /opt/myipfw.hostonly
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
#1.定义基本变量
IPT="/sbin/iptables" # iptables命令的路径
CTL="/sbin/sysctl" # sysctl命令的路径

#2.调整/proc参数
$CTL -w net.ipv4.tcp_syncookies=1 # 启用SYN Cookie机制
$CTL -w net.ipv4.tcp_syn_retries=3 # 最大SYN请求重试次数
$CTL -w net.ipv4.tcp_synack_retries=3 # 最大ACK确认重试次数
$CTL -w net.ipv4.tcp_fin_timeout=60 # TCP连接等待超时
$CTL -w net.ipv4.tcp_max_syn_backlog=3200 # SYN请求的队列长度

#3.设置具体的防火墙规则

#3.1 删除自定义链、清空已有规则
$IPT -t filter -X
$IPT -t nat -X
$IPT -t mangle -X
$IPT -t raw -X
$IPT -t filter -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t raw -F

#3.2 定义默认策略
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

#3.3 设置filter表中的各种规则
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
chmod +x /opt/myipfw.hostonly

Firewalld

RHEL 7系统中集成了多款防火墙管理工具, 其中firewalld(Dynamic Firewall Manager of Linux systems, Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具, 它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式.

firewalld支持动态更新技术并加入了区域(zone)的概念. 简单来说, 区域就是firewalld预先准备了几套防火墙策略集合(策略模板), 用户可以根据生产场景的不同而选择合适的策略集合, 从而实现防火墙策略之间的快速切换.

配置文件
/usr/lib/firewalld/
/usr/lib/firewalld/zones:被用于默认和备用配置

/etc/firewalld/
/etc/firewalld/zones:被用于用户创建和自定义配置文件

区域默认规则策略
*trusted允许所有的数据包
home拒绝流入的流量, 除非与流出的流量相关; 而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关, 则允许流量.
internal等同于home区域
work拒绝流入的流量, 除非与流出的流量相关; 而如果流量与ssh、ipp-client与dhcpv6-client服务相关, 则允许流量.
*public拒绝流入的流量, 除非与流出的流量相关; 而如果流量与ssh、dhcpv6-client服务相关, 则允许流量.
external拒绝流入的流量, 除非与流出的流量相关; 而如果流量与ssh服务相关, 则允许流量. 默认将经过此区域转发的IPv4地址传出流量进行地址伪装.
dmz拒绝流入的流量, 除非与流出的流量相关; 而如果流量与ssh服务相关, 则允许流量.
block拒绝流入的流量, 除非与流出的流量相关.
*drop丢弃流入的流量, 除非与流出的流量相关.

Firewalld数据处理流程

检查数据来源的源地址
1.若源地址关联到特定的区域, 则执行该区域所指定的规则.
2.若源地址未关联到特定的区域, 则使用传入网络接口的区域并执行该区域所指定的规则.
3.若网络接口未关联到特定的区域, 则使用默认区域并执行该区域所指定的规则.

Firewalld防火墙的配置

运行时配置

实时生效, 并持续至Firewalld重新启动或重新加载配置.
不中断现有连接
不能修改服务配置

永久配置

不立即生效, 除非Firewalld重新启动或重新加载配置.
中断现有连接
可以修改服务配置

终端管理工具

防火墙进程操作

 systemctl start firewalld
 systemctl stop firewalld
 systemctl restart firewalld
 systemctl status firewalld

防火墙管理操作

firewall-cmd是firewalld防火墙配置管理工具的CLI(命令行界面)版本, 它的参数一般都是以”长格式”来提供的.

参数作用
--zone=<区域名称>指定区域
--get-default-zone查询默认的区域名称
--set-default-zone=<区域名称>设置默认的区域, 使其永久生效.
--get-zones显示预定义的区域
--get-services显示预定义的服务
--get-active-zones显示当前正在使用的区域与网卡名称
--add-source=将源自此IP或子网的流量导向指定的区域
--remove-source=不再将源自此IP或子网的流量导向某个指定区域
--add-interface=<网卡名称>将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称>将某个网卡与区域进行关联
--remove-interface=<网卡名称>将某个网卡从指定区域中移除
--query-interface=<网卡名称>在默认区域中查询是否包含该网卡
--get-zone-of-interface=<网卡名称>显示指定网卡绑定的区域
--list-all显示当前区域的网卡配置参数、资源、端口以及服务等信息
--list-all-zones显示所有区域的网卡配置参数、资源、端口以及服务等信息
--list-services显示默认区域内允许访问的所有服务
--add-service=<服务名>设置默认区域允许该服务的流量
--remove-service=<服务名>设置默认区域不再允许该服务的流量
--query-service=<服务名>查询默认区域中是否启用了该服务
--list-ports显示默认区域内允许访问的所有端口号
--add-port=<端口号/协议>设置默认区域允许该端口的流量
--remove-port=<端口号/协议>设置默认区域不再允许该端口的流量
--query-port=<端口号/协议>查询默认区域中是否启用了该端口和协议
--list-icmp-blocks显示默认区域内阻塞的所有ICMP类型
--add-icmp-block=echo-reply为默认区域设置阻塞echo-reply类型的ICMP
--remove-icmp-block=echo-reply删除默认区域已阻塞的echo-reply类型的ICMP
--query-icmp-block=echo-request查询默认区域的echo-request类型的ICMP是否阻塞
--query-icmp-block=echo-request查询默认区域的echo-request类型的ICMP是否阻塞
--get-icmptypes显示预定义的icmp类型
--reload让"永久生效"的配置规则立即生效, 并覆盖当前的配置规则.
--panic-on开启应急状况模式
--panic-off关闭应急状况模式

防火墙状态查询

 systemctl status firewalld
 firewall-cmd --state

防火墙重载配置

 firewall-cmd --reload
 # 状态信息将会丢失, 多用于处理防火墙出现问题时.
 firewall-cmd --complete-reload
 systemctl restart firewalld

区域管理

查看默认区域
firewall-cmd --get-default-zone

列出当前正在使用的区域及其所对应的网卡接口
firewall-cmd --get-active-zone

列出所有可用的区域
firewall-cmd --get-zones

设置默认区域
firewall-cmd --set-default-zone=home

服务管理

查看预定义服务
firewall-cmd --get-service

添加httpd服务到public区域
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --reload

查看public区域已配置规则
firewall-cmd --list-all --zone=public

移除public区域的httpd服务, 不使用–zone指定区域时使用默认区域.
firewall-cmd --remove-service=http --permanent
firewall-cmd --reload

也可以同时添加多个服务到某一区域, 如果不添加-permanent选项表示是即时生效的临时设置.
firewall-cmd --add-service=http --add-service=https

端口管理

允许TCP的3306端口到public区域
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

从public区域将TCP的3306端口移除
firewall-cmd --remove-port=3306/tcp --permanent
firewall-cmd --reload

允许某一范围的端口
firewall-cmd --add-port=2048-2050/udp --permanent
firewall-cmd --reload

使用–list-ports查看加入的端口操作是否成功
firewall-cmd --list-ports

配置实例

将默认区域设置为dmz区域, 来自网络192.168.46.0/24的流量全部分配给internal区域, 并且打开internal区域的80端口供用户访问.
firewall-cmd --set-default-zone=dmz
firewall-cmd --add-source=192.168.46.0/24 --zone=internal --permanent
firewall-cmd --add-service=http --zone=internal --permanent
firewall-cmd --reload

使用firewalld配置的防火墙策略默认为运行时(Runtime)模式, 又称为当前生效模式, 而且随着系统的重启会失效.
想让配置策略一直存在, 就需要使用永久(Permanent)模式, 方法就是在用firewall-cmd命令正常设置防火墙策略时添加–permanent参数, 但是使用永久生效模式设置的策略只有在系统重启之后才能自动生效. 如果想让配置的策略立即生效, 需要手动执行firewall-cmd --reload命令.

firewalld命令实例
查看firewalld服务当前所使用的区域:
firewall-cmd --get-default-zone

查询eno16777728网卡在firewalld服务中的区域:
firewall-cmd --get-zone-of-interface=eno16777728

把firewalld服务中eno16777728网卡的默认区域修改为external, 并在系统重启后生效. 分别查看当前与永久模式下的区域名称:
firewall-cmd --permanent --zone=external --change-interface=eno16777728
firewall-cmd --get-zone-of-interface=eno16777728
firewall-cmd --permanent --get-zone-of-interface=eno16777728

把firwalld服务的当前默认区域设置为public:
firewall-cmd --set-default-zone=public

启动/关闭firewalld防火墙服务的应急状况模式, 阻断一切网络连接(当远程控制服务器时请慎用):
firewall-cmd --panic-on
firewall-cmd --panic-off

查询public区域是否允许请求SSH和HTTPS协议的流量:
firewall-cmd --zone=public --query-service=ssh
firewall-cmd --zone=public --query-service=https

把firewalld服务中请求HTTPS协议的流量设置为永久允许, 并立即生效:
firewall-cmd --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

把firewalld服务中请求HTTP协议的流量设置为永久拒绝, 并立即生效:
firewall-cmd --permanent --zone=public --remove-service=http
firewall-cmd --reload

把在firewalld服务中访问8080和8081端口的流量策略设置为允许, 但仅限当前生效:
firewall-cmd --zone=public --add-port=8080-8081/tcp

把原本访问本机888端口的流量转发到22端口, 要且求当前和长期均有效:

firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
流量转发命令格式:
firewall-cmd --permanent --zone=<区域>
--add-forward-port=
port=<源端口号>:
proto=<协议>:
toport=<目标端口号>:
toaddr=<目标IP地址>

在客户端使用ssh命令尝试访问192.168.10.10主机的888端口:
ssh -p 888 192.168.10.10

irewalld中的富规则表示更细致、更详细的防火墙策略配置, 它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置. 它的优先级在所有的防火墙策略中也是最高的.
例:拒绝192.168.10.0/24网段的所有用户访问本机的ssh服务(22端口)

 firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
 firewall-cmd --reload
 ssh 192.168.10.10

图形管理工具

firewall-config是firewalld防火墙配置管理工具的GUI(图形用户界面)版本, 几乎可以实现所有以命令行来执行的操作. 打开firewall-config的命令:firewall-config
firewall-config界面

1选择运行时(Runtime)模式或永久(Permanent)模式的配置
2可选的策略集合区域列表
3常用的系统服务列表
4当前正在使用的区域
5管理当前被选中区域中的服务
6管理当前被选中区域中的端口
7开启或关闭SNAT(源地址转换协议)技术
8设置端口转发策略
9控制请求icmp服务的流量
10管理防火墙的富规则
11管理网卡设备
12被选中区域的服务, 若勾选了相应服务前面的复选框, 则表示允许与之相关的流量.
13firewall-config工具的运行状态

将当前区域中请求http服务的流量设置为允许, 但仅限当前生效.
允许其他主机访问http服务

添加一条防火墙策略规则, 使其放行访问8080~8088端口(TCP协议)的流量, 并将其设置为永久生效, 以达到系统重启后防火墙策略依然生效的目的.
允许其他主机访问8080-8088端口

在Options菜单中单击Reload Firewalld命令, 让配置的防火墙策略立即生效. 这与在命令行中执行–reload参数的效果一样.
重启后依然有效

选中Masquerade zone复选框, 就自动开启了SNAT技术.
开启伪装功能

使用firewall-cmd来配置防火墙策略规则, 将本机888端口的流量转发到22端口, 且要求当前和长期均有效.
将向本机888端口的请求转发至本机的22端口
reload立即生效

配置富规则, 让192.168.10.20主机访问到本机的1234端口号.
仅允许192.168.10.20主机访问本机的1234端口

如果生产环境中的服务器有多块网卡在同时提供服务(这种情况很常见), 则对内网和对外网提供服务的网卡要选择的防火墙策略区域也是不一样的. 也就是说, 可以把网卡与防火墙策略区域进行绑定. 配置防火墙策略的原则—只要能实现所需的功能, 用什么工具请随君便.
查看网卡设备信息

服务的访问控制列表

TCP Wrappers是RHEL 7系统中默认启用的一款流量监控程序, 它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作. 换句话说, Linux系统中其实有两个层面的防火墙:

 第一种是前面讲到的基于TCP/IP协议的流量过滤工具;
 而TCP Wrappers服务则是能允许或禁止Linux系统提供服务的防火墙, 从而在更高层面保护了Linux系统的安全运行.

TCP Wrappers服务的防火墙策略由两个控制列表文件所控制, 用户可以编辑允许控制列表文件来放行对服务的请求流量, 也可以编辑拒绝控制列表文件来阻止对服务的请求流量. 控制列表文件修改后会立即生效:

 系统将会先检查允许控制列表文件(/etc/hosts.allow), 如果匹配到相应的允许策略则放行流量; 
 如果没有匹配, 则去进一步匹配拒绝控制列表文件(/etc/hosts.deny), 若找到匹配项则拒绝该流量. 
 如果这两个文件全都没有匹配到, 则默认放行流量.
客户端类型示例满足示例的客户端列表
单一主机192.168.10.10IP地址为192.168.10.10的主机
指定网段192.168.10.IP段为192.168.10.0/24的主机
指定网段192.168.10.0/255.255.255.0IP段为192.168.10.0/24的主机
指定DNS后缀.linuxprobe.com所有DNS后缀为.linuxprobe.com的主机
指定主机名称www.linuxprobe.com主机名称为www.linuxprobe.com的主机
指定所有客户端ALL所有主机全部包括在内

在配置TCP Wrappers服务时需要遵循两个原则:

 编写拒绝策略规则时, 填写的是服务名称, 而非协议名称;
 建议先编写拒绝策略规则, 再编写允许策略规则, 以便直观地看到相应的效果.

编写拒绝策略规则文件, 禁止访问本机sshd服务的所有流量:

 vim /etc/hosts.deny
 sshd:*

在允许策略规则文件中添加一条规则, 使其放行源自192.168.10.0/24网段, 访问本机sshd服务的所有流量:

 vim /etc/hosts.allow
 sshd:192.168.10.

Linux下的NAT技术

SNAT策略及应用

SNAT(Source Network Address Translation, 源网络地址转换)是Linux防火墙的一种地址转换操作, 也是iptables命令中的一种数据包控制类型, 其作用是根据指定条件修改数据包的源IP地址.

SNAT策略概述

随着Internet网络在全世界范围内的快速发展, IPv4协议支持的可用IP地址资源逐渐变少. 通过在网关中应用SNAT策略, 可以解决局域网共享上网的问题.

SNAT技术是一种为了解决IP地址匮乏而设计的技术, 它可以使得多个内网中的用户通过同一个外网IP接入Internet.

1.只开启路由转发, 未设置地址转换的情况.
如果网关服务器没有应用SNAT技术, 则互联网中的网站服务器在收到PC的请求数据包, 并回送响应数据包时, 将无法在网络中找到这个私有网络的IP地址, 所以PC也就收不到响应数据包了.
未用SNAT1

2.开启路由转发, 并设置SNAT转换的情况.
由于网关服务器应用了SNAT技术, 所以互联网中的网站服务器会将响应数据包发给网关服务器, 再由后者转发给局域网中的PC.
使用SNAT1

SNAT策略应用

SNAT的典型应用是为局域网共享上网提供接入策略, 处理数据包的切入时机是在路由选择之后(POSTROUTING)进行. 关键操作是将局域网外发数据包的源IP地址(私有地址)修改为网关服务器的外网口IP地址(公有地址)

SNAT策略只能用在nat表的POSTROUTING链, 使用iptables命令编写SNA策略时, 需要结合”–to-source IP地址”选项来指定修改后的源IP地址.
例:-j SNAT --to-source 公有ip地址

共享固定IP地址上网

环境:
Linux网关服务器eth0eth1
网卡分别接入网Internet局域网
网卡ip地址218.29.30.31192.168.1.1

第1步:Linux主机作为网关设备时, 打开网关的路由转发.
修改sysctl.conf配置文件, 永久打开路由转发功能.

 vim /etc/sysctl.conf
 
1
net.ipv4.ip_forward = 1
sysctl -p # 读取修改后的配置

临时开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1

第2步:正确设置SNAT策略
将源地址更改为网关的公网IP地址, 若要保持SNAT策略长期有效, 应将相关命令写入到rc.local配置文件, 以便开机后自动设置.
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31

第3步:测试SNAT共享接入结果
ping ip地址

共享动态IP地址上网

在某些情况下, 网关的外网IP地址可能并不是固定的. 针对这种需求, iptables命令提供了一个名为MASQUERADE(伪装)的数据包控制类型, MASQUERADE相当于SNAT的一个特例, 同样用来修改(伪装)数据包源IP地址, 且能够自动获取外网接口的IP地址.
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o 接口名 -j MASQUERADE

DNAT策略及应用

DNAT(Destination Network Address Translation, 目标地址转换)是Linux防火墙的另一种地址转换操作, 同样也是iptables命令中的一种数据包控制类型, 其作用是根据指定条件修改数据包的目标IP地址和目标端口.

DNAT策略概述

DNAT用来修改目标IP地址和目标端口, DNAT只能用在nat表的PREROUTING链和OUTPUT链(或被其调用的链)中.
使用DNAT

DNAT策略应用

DNAT的典型应用是在Internet中发布企业内部的服务器, 处理数据包的切入时机是在路由选择之前(PREROUTING)进行. 关键操作是将访问网关外网接口IP地址(公有地址)的数据包的目标地址修改为实际提供服务的内部服务器的IP地址(私有地址).

使用iptables命令设置DNAT策略时, 需要结合”–to-destination IP地址”选项来指定内部服务器的IP地址

发布企业内部的Web服务器

环境:
网站域名:www.Iyun.com, IP地址:218.29.30.31.
网站服务器:局域网内, IP地址:192.168.1.6.

第1步:打开网关的路由转发

 vim /etc/sysctl.conf
 
1
net.ipv4.ip_forward = 1
sysctl -p

第2步:正确设置DNAT策略
需要针对Internet中的任意主机访问网关80端口的数据包, 将目标地址修改为位于内网的网站服务器的IP地址.
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6

第3步:测试DNAT发布结果
网址中输入域名或IP地址

发布企业内部的OpenSSH服务器

大多数情况下, DNAT策略只是用来修改数据包的目标IP地址, 但在需要时也可以修改目标端口号.

网关公网IP地址:218.29.30.31, 在2345端口启用OpenSSH服务.
网站服务器位于局域网内IP地址:192.168.1.6, 在22端口启用OpensSH服务.

第1步:配置OpenSSH服务
在网关、网站服务器中均开启OpenSSH服务, 分别使用2345、22端口. 其中网关的sshd服务因直接面向Internet, 因此不使用默认端口.

第2步:打开网关的路由转发

 vim /etc/sysctl.conf
 
1
net.ipv4.ip_forward = 1
sysctl -p

第3步:正确设置DNAT策略
在网关中设置防火墙规则, 修改访问外网IP地址2346端口的数据包, 将目标地址改为192.168.1.6, 将目标端口改为22, 以便转发给网站服务器。
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346
-j DNAT --to-destination 192.168.1.622

第4步:测试DNAT发布结果
在Internet中进行SSH登录测试

 ssh -p 2345 iyun@218.29.30.31
 输入用户名密码
 /sbin/ifconfig eth0 | grep "inet addr" # 确认连接结果

 ssh -p 2346 iyun@218.29.30.31
 输入用户名密码
 /sbin/ifconfig eth0 | grep "inet addr" # 确认连接结果
部分转载(原文链接):https://www.linuxprobe.com/chapter-00.html
>
-------------------本文结束 感谢阅读-------------------