Linux篇-Linux就该这么学

image.png

第1章部署虚拟环境安装Linux系统

  • Linux 系统内核指的是一个由 Linus Torvalds 负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。

  • Linux 发行套件系统是我们常说的 Linux 操作系统,也即是由 Linux 内核与各种常用软件的集合产品。

安装Linux

安装过程不在累赘,主要记录一下一些易错点

  • 安装的时候不要选择最小安装,最小安装会将一些功能给去掉

网络模式

  • 桥接模式:相当于在物理主机与虚拟机网卡之间架设了一座桥梁,从而可以通过物理 主机的网卡访问外网。
  • NAT 模式:让 VM 虚拟机的网络服务发挥路由器的作用,使得通过虚拟机软件模拟 的主机可以通过物理主机访问外网,在真机中 NAT 虚拟机网卡对应的物理网卡是 VMnet8。
  • 仅主机模式:仅让虚拟机内的主机与物理主机通信,不能访问外网,在真机中仅主机 模式模拟网卡对应的物理网卡是 VMnet1。

RPM 红帽软件包管理器

image.png

YUM 软件仓库

image.png

systemd初始化进程

Linux 操作系统的开机过程是这样的,即从 BIOS 开始,然后进入 Boot Loader,再加 载系统内核,然后内核进行初始化,最后启动初始化进程。初始化进程作为 Linux 系统的 第一个进程,它需要完成 Linux 系统中相关的初始化工作,为用户提供合适的工作环境。
image.png
image.png

第2章新手必须掌握的Linux命令

强大好用的 Shell

image.png
Shell 就是这样的一个命令行工具。Shell(也称为终端或壳)充当的是人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端,它就会调用相应的程序服务去完成某些工作。

执行帮助文档命令

1
2
3
4
5
#长格式
man --help
#短格式
man -h
man -?

常用系统工作命令

echo

用于在终端输出字符串或变量提取后的值.格式为“echo [字符串|$变量]”

1
2
3
4
5
6
例子
echo hello
#输出
hello
#输出变量值
echo $var1

date

date 命令用于显示及设置系统的时间或日期,格式为“date [选项] [+指定的格式]”。
image.png

1
2
3
4
5
6
7
8
9
date
#2021年 07月 13日 星期二 22:52:58 CST
date "+%Y-%m-%d %H:%M:%S"
#2021-07-13 22:52:44
date -s "20170901 8:30:00"
2017年 09月 01日 星期五 08:30:00 CST
#date 命令中的参数%j 可用来查看今天是当年中的第几天。这个参数能够很好地区分备份时间的新旧,即数字越大,越靠近当前时间。该参数的使用方式以及显示结果如下所示。
date "+%j"
#输出194

reboot

reboot 命令用于重启系统,其格式为 reboot。

poweroff/shutdown

poweroff 命令用于关闭系统,其格式为 poweroff。该命令与 reboot 命令相同,都会涉及硬件资源的管理权限
shutdown命令表示关机

1
2
3
4
5
6
7
8
9
10
11
12
13
shutdown --help
shutdown [OPTIONS...] [TIME] [WALL...]

Shut down the system.

--help Show this help
-H --halt Halt the machine
-P --poweroff Power-off the machine
-r --reboot Reboot the machine
-h Equivalent to --poweroff, overridden by --halt
-k Don't halt/power-off/reboot, just send warnings
--no-wall Don't send wall message before halt/power-off/reboot
-c Cancel a pending shutdown

wget

wget 命令用于在终端中下载网络文件,格式为“wget [参数] 下载地址”。
image.png

1
wget https://mikeygithub.github.io/2021/07/07/yuque/hmar21/

ps

ps 命令用于查看系统中的进程状态,格式为“ps [参数]”。
image.png
Linux 系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能。在Linux 系统中,有 5 种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各自含义如下所示。

  • R(运行):进程正在运行或在运行队列中等待。
  • S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
  • D(不可中断):进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
  • Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数后将进程释放。
  • T(停止):进程收到停止信号后停止运行。

image.png

top

top 命令用于动态地监视进程活动与系统负载等信息,其格式为 top。

个人更加推荐安装htop其可视化度更高

image.png

  • 第 1 行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为 1 分钟、5分钟、15 分钟内的平均值,数值越小意味着负载越低)。

  • 第 2 行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。

  • 第 3 行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。

    注:第 3 行中的数据均为 CPU 数据并以百分比格式显示,例如“97.1 id”意味着有 97.1%的 CPU 处理器资源处于空闲。

  • 第 4 行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。

  • 第 5 行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。

pidof

pidof 命令用于查询某个指定服务进程的 PID 值,格式为“pidof [参数] [服务名称]”。

1
2
3
pidof mysqld
#输出
1625

kill

kill 命令用于终止某个指定 PID 的服务进程,格式为“kill [参数] [进程 PID]”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Send a signal to a job.

Send the processes identified by PID or JOBSPEC the signal named by
SIGSPEC or SIGNUM. If neither SIGSPEC nor SIGNUM is present, then
SIGTERM is assumed.

Options:
-s sig SIG is a signal name
-n sig SIG is a signal number
-l list the signal names; if arguments follow `-l' they are
assumed to be signal numbers for which names should be listed
-L synonym for -l

Kill is a shell builtin for two reasons: it allows job IDs to be used
instead of process IDs, and allows processes to be killed if the limit
on processes that you can create is reached.

Exit Status:
Returns success unless an invalid option is given or an error occurs.

例子

1
kill -9 12131

killall

命令killall 命令用于终止某个指定名称的服务所对应的全部进程,格式为:“killall [参数] [进程名称]”。

1
2
3
4
mikey@mikey:~$ pidof httpd
13581 13580 13579 13578 13577 13576
mikey@mikey:~$ killall httpd
mikey@mikey:~$ pidof httpd

如果我们在系统终端中执行一个命令后想立即停止它,可以同时按下 Ctrl + C 组合键(生产环境中比较常用的一个快捷键),这样将立即终止该命令的进程。或者,如果有些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执行命令时在末尾添加上一个&符号,这样命令将进入系统后台来执行。

lsof

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。

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
33
34
35
36
37
38
39
mikey@mikey:~$ lsof --help
lsof: illegal option character: -
lsof: -e not followed by a file system path: "lp"
lsof 4.89
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Defaults in parentheses; comma-separated set (s) items; dash-separated ranges.
-?|-h list help -a AND selections (OR) -b avoid kernel blocks
-c c cmd c ^c /c/[bix] +c w COMMAND width (9) +d s dir s files
-d s select by FD set +D D dir D tree *SLOW?* +|-e s exempt s *RISKY*
-i select IPv[46] files -K list tasKs (threads) -l list UID numbers
-n no host names -N select NFS files -o list file offset
-O no overhead *RISKY* -P no port names -R list paRent PID
-s list file size -t terse listing -T disable TCP/TPI info
-U select Unix socket -v list version info -V verbose search
+|-w Warnings (+) -X skip TCP&UDP* files -Z Z context [Z]
-- end option scan
-E display endpoint info +E display endpoint info and files
+f|-f +filesystem or -file names +|-f[gG] flaGs
-F [f] select fields; -F? for help
+|-L [l] list (+) suppress (-) link counts < l (0 = all; default = 0)
+m [m] use|create mount supplement
+|-M portMap registration (-) -o o o 0t offset digits (8)
-p s exclude(^)|select PIDs -S [t] t second stat timeout (15)
-T qs TCP/TPI Q,St (s) info
-g [s] exclude(^)|select and print process group IDs
-i i select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]
+|-r [t[m<fmt>]] repeat every t seconds (15); + until no files, - forever.
An optional suffix to t is m<fmt>; m must separate t from <fmt> and
<fmt> is an strftime(3) format for the marker line.
-s p:s exclude(^)|select protocol (p = TCP|UDP) states by name(s).
-u s exclude(^)|select login|UID set s
-x [fl] cross over +d|+D File systems or symbolic Links
names select named files or files on named file systems
Anyone can list all files; /dev warnings disabled; kernel ID check disabled.

例子

1
2
3
mikey@mikey:~$ lsof -i:33922
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chrome 8805 mikey 112u IPv4 12262340 0t0 UDP *:33922

netstat

Linux netstat 命令用于显示网络状态。

  • -a或–all 显示所有连线中的Socket。
  • -A<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址。
  • -c或–continuous 持续列出网络状态。
  • -C或–cache 显示路由器配置的快取信息。
  • -e或–extend 显示网络其他相关信息。
  • -F或–fib 显示路由缓存。
  • -g或–groups 显示多重广播功能群组组员名单。
  • -h或–help 在线帮助。
  • -i或–interfaces 显示网络界面信息表单。
  • -l或–listening 显示监控中的服务器的Socket。
  • -M或–masquerade 显示伪装的网络连线。
  • -n或–numeric 直接使用IP地址,而不通过域名服务器。
  • -N或–netlink或–symbolic 显示网络硬件外围设备的符号连接名称。
  • -o或–timers 显示计时器。
  • -p或–programs 显示正在使用Socket的程序识别码和程序名称。
  • -r或–route 显示Routing Table。
  • -s或–statistics 显示网络工作信息统计表。
  • -t或–tcp 显示TCP传输协议的连线状况。
  • -u或–udp 显示UDP传输协议的连线状况。
  • -v或–verbose 显示指令执行过程。
  • -V或–version 显示版本信息。
  • -w或–raw 显示RAW传输协议的连线状况。
  • -x或–unix 此参数的效果和指定”-A unix”参数相同。
  • –ip或–inet 此参数的效果和指定”-A inet”参数相同。
    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
    33
    34
    35
    36
    mikey@mikey:~$ netstat --help
    usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}
    netstat [-vWnNcaeol] [<Socket> ...]
    netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }

    -r, --route display routing table
    -i, --interfaces display interface table
    -g, --groups display multicast group memberships
    -s, --statistics display networking statistics (like SNMP)
    -M, --masquerade display masqueraded connections

    -v, --verbose be verbose
    -W, --wide don't truncate IP addresses
    -n, --numeric don't resolve names
    --numeric-hosts don't resolve host names
    --numeric-ports don't resolve port names
    --numeric-users don't resolve user names
    -N, --symbolic resolve hardware names
    -e, --extend display other/more information
    -p, --programs display PID/Program name for sockets
    -o, --timers display timers
    -c, --continuous continuous listing

    -l, --listening display listening server sockets
    -a, --all display all sockets (default: connected)
    -F, --fib display Forwarding Information Base (default)
    -C, --cache display routing cache instead of FIB
    -Z, --context display SELinux security context for sockets

    <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}
    {-x|--unix} --ax25 --ipx --netrom
    <AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: inet
    List of possible address families (which support routing):
    inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
    netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
    x25 (CCITT X.25)
    例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    显示详细的网络状况
    netstat -a
    显示当前户籍UDP连接状况
    netstat -nu
    显示UDP端口号的使用情况
    netstat -apu
    显示网卡列表
    netstat -i
    显示组播组的关系
    netstat -g
    显示网络统计信息
    netstat -s
    显示监听的套接口
    netstat -l

系统状态检测命令

uname

uname 命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”。
如果要查看当前系统版本的详细信息,则需要查看 redhat-release 文件,其命令以及相应的结果如下:

1
cat /etc/redhat-release

uptime

uptime 用于查看系统的负载信息,格式为 uptime。

free

free 用于显示当前系统中内存的使用量信息,格式为“free [-h]”。

1
2
3
4
5
mikey@mikey:~$ free -h
total used free shared buff/cache available
Mem: 15G 4.8G 994M 153M 9.7G 10G
Swap: 0B 0B 0B
mikey@

who

who 用于查看当前登入主机的用户终端信息,格式为“who [参数]”。
这三个简单的字母可以快速显示出所有正在登录本机的用户的名称以及他们正在开启的终端信息。

last

last 命令用于查看所有系统的登录记录,格式为“last [参数]”。

history

history 命令用于显示历史执行过的命令,格式为“history [-c]”。

sosreport

sosreport 命令用于收集系统配置及架构信息并输出诊断文档,格式为 sosreport。

工作目录切换命令

pwd 命令

pwd 命令用于显示用户当前所处的工作目录,格式为“pwd [选项]”。

cd 命令

cd 命令用于切换工作路径,格式为“cd [目录名称]”。

ls 命令

ls 命令用于显示目录中的文件信息,格式为“ls [选项] [文件] ”。

1
2
3
ls -l
ls -h
ls -al

文本文件编辑命令

cat 命令

cat 命令用于查看纯文本文件(内容较少的),格式为“cat [选项] [文件]”。

more 命令

more 命令用于查看纯文本文件(内容较多的),格式为“more [选项]文件”。

head 命令

head 命令用于查看纯文本文档的前 N 行,格式为“head [选项] [文件]”。

tail 命令

tail 命令用于查看纯文本文档的后 N 行或持续刷新内容,格式为“tail [选项] [文件]”。
tailf 是tail -f的缩写监听当前文件的变化内容

tr 命令

tr 命令用于替换文本文件中的字符,格式为“tr [原始字符] [目标字符]”。

1
cat anaconda-ks.cfg | tr [a-z] [A-Z]

wc 命令

wc 命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。

1
2
mikey@mikey:~$ wc shell.sh 
6 10 70 shell.sh

stat 命令

stat 命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名称”。

1
2
3
4
5
6
7
8
mikey@mikey:~$ stat shell.sh 
File: shell.sh
Size: 70 Blocks: 8 IO Block: 4096 regular file
Device: 10302h/66306d Inode: 11944410 Links: 1
Access: (0775/-rwxrwxr-x) Uid: ( 1000/ mikey) Gid: ( 1000/ mikey)
Access: 2021-07-14 23:00:53.289730038 +0800
Modify: 2021-04-17 10:24:53.819388827 +0800
Change: 2021-04-17 10:24:53.819388827 +0800

cut 命令

cut 命令用于按“列”提取文本字符,格式为“cut [参数] 文本”。

1
2
3
4
5
6
7
8
9
mikey@mikey:~$ cut -d: -f1 /etc/passwd
root
daemon
bin
sys
sync
games
man
lp

diff 命令

diff 命令用于比较多个文本文件的差异,格式为“diff [参数] 文件”。

1
2
3
mikey@mikey:~$ diff shell.sh shell_backup.sh 
6a7
> echo "backup file"

文件目录管理命令

touch 命令

touch 命令用于创建空白文件或设置文件的时间,格式为“touch [选项] [文件]”。
image.png

mkdir 命令

mkdir 命令用于创建空白的目录,格式为“mkdir [选项] 目录”。

cp 命令

cp 命令用于复制文件或目录,格式为“cp [选项] 源文件 目标文件”。
image.png

mv 命令

mv 命令用于剪切文件或将文件重命名,格式为“mv [选项] 源文件 [目标路径|目标文件名]”。

rm 命令

rm 命令用于删除文件或目录,格式为“rm [选项] 文件”。

dd 命令

dd 命令用于按照指定大小和个数的数据块来复制文件或转换文件,格式为“dd [参数]”。
image.png

file 命令

file 命令用于查看文件的类型,格式为“file 文件名”。

1
2
mikey@mikey:~$ file shell.sh 
shell.sh: ASCII text

打包压缩与搜索命令

tar 命令

用于对文件进行打包压缩或解压,格式为“tar [选项] [文件]”。
image.png

grep 命令

grep 命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为“grep [选项] [文件]”。
grep 命令的参数及其作用如表
image.png

find 命令

find 命令用于按照指定条件来查找文件,格式为“find [查找路径] 寻找条件 操作”。
image.png

第3章管道符、重定向与环境变量

  • 标准输入重定向(STDIN,文件描述符为 0):默认从键盘输入,也可从其他文件或命令中输入。
  • 标准输出重定向(STDOUT,文件描述符为 1):默认输出到屏幕。
  • 错误输出重定向(STDERR,文件描述符为 2):默认输出到屏幕。

输入输出重定向

1.输入
image.png
2.输出
image.png

管道命令符

把前一个命令原本要输出到屏幕的数据当作是后一个命令的标准输入

  • 找出被限制登录用户的命令是 grep “/sbin/nologin” /etc/passwd;
  • 统计文本行数的命令则是 wc -l。

“命令 A | 命令 B | 命令 C”

1
ls /etc/ | more

命令行的通配符

  • “*”表示匹配所有
  • “?”表示匹配一个字符

常用的转义字符

  • 反斜杠():使反斜杠后面的一个变量变为单纯的字符串。
  • 单引号(‘’):转义其中所有的变量为单纯的字符串。
  • 双引号(“”):保留其中的变量属性,不进行转义处理。
  • 反引号(``):把其中的命令执行后返回结果。

重要的环境变量

image.png

第4章Vim编辑器与Shell 命令脚本

Vim 文本编辑器

image.png
image.png
image.png

编写 Shell 脚本

  • 交互式(Interactive):用户每输入一条命令就立即执行。
  • 批处理(Batch):由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本中诸多的命令。

接收用户的参数

$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而
$1、$2、$3……则分别对应着第 N 个位置的参数值

image.png

流程控制语句

image.png
image.png
image.png
image.png
image.png
image.png

计划任务服务程序

安装

1
sudo apt install at

设置定时

1
2
3
4
5
6
7
8
mikey@mikey:~$ at 23:30
at > systemctl restart httpd
at > 此处请同时按下 Ctrl + D 组合键来结束编写计划任务
job 3 at Mon Apr 27 23:30:00 2017
mikey@mikey:~$ at -l
3 Mon Apr 27 23:30:00 2017 a root

mikey@mikey:~$ echo "systemctl restart httpd" | at 23:30

image.png

第5章用户身份与文件权限

用户身份与能力

在 RHEL 7 系统中,用户身份有下面这些。

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

需要注意的是,UID 是不能冲突的,而且管理员创建的普通用户的 UID 默认是从 1000开始的(即使前面有闲置的号码)。

useradd 命令

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

groupadd 命令

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

usermod 命令

用于修改用户的属性,格式为“usermod [选项] 用户名”。Linux 系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在/etc/passwd 文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用 usermod 命令修改已经创建的用户信息,诸如用户的 UID、基本/扩展用户组、默认终端等。usermod 命令的参数以及作用如表
image.png

passwd 命令

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

userdel 命令

userdel 命令用于删除用户,格式为“userdel [选项] 用户名”。
image.png

文件权限与归属

尽管在 Linux 系统中一切都是文件,但是每个文件的类型不尽相同,因此 Linux 系统使用了不同的字符来加以区分,常见的字符如下所示。

  • -:普通文件。
  • d:目录文件。
  • l:链接文件。
  • b:块设备文件。
  • c:字符设备文件。
  • p:管道文件。

image.png

文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。

image.png

文件的特殊权限

SUID

SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行 passwd 命令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow 文件中。

SGID

SGID 主要实现如下两种功能:

  • 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
  • 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

SGID

SBIT现在,大学里的很多老师都要求学生将作业上传到服务器的特定共享目录中,但总是有几个“破坏分子”喜欢删除其他同学的作业,这时就要设置 SBIT(Sticky Bit)特殊权限位了(也可以称之为特殊权限位之粘滞位)。SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。

文件的隐藏权限

chattr 命令

chattr 命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。chattr 命令中可供选择的隐藏权限参数非常丰富,具体如下表所示。
image.png

lsattr 命令

lsattr 命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在 Linux 系统中,文件的隐藏权限必须使用 lsattr 命令来查看,平时使用的 ls 之类的命令则看不出端倪:

文件访问控制列表

setfacl 命令

setfacl 命令用于管理文件的 ACL 规则,格式为“setfacl [参数] 文件名称”。文件的 ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用 setfacl 命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R 递归参数;针对普通文件则使用-m 参数;如果想要删除某个文件的 ACL,则可以使用-b 参数。

1
2
3
4
5
6
7
8
9
#设置用户在/root 目录上的权限
[root@mikey ~]# setfacl -Rm u:mikey:rwx /root
[root@mikey ~]# su - mikey
Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1
[mikey@mikey ~]$ cd /root
[mikey@mikey root]$ ls
anaconda-ks.cfg Downloads Pictures Public
[mikey@mikey root]$ cat anaconda-ks.cfg
[mikey@mikey root]$ exit

getfacl 命令

getfacl 命令用于显示文件上设置的 ACL 信息,格式为“getfacl 文件名称”。Linux 系统用户身份与文件权限
中的命令就是这么好记。想要设置 ACL,用的是 setfacl 命令;要想查看 ACL,则用的是 getfacl 命令。下面使用 getfacl 命令显示在 root 管理员家目录上设置的所有 ACL 信息。

1
2
3
4
5
6
7
mikey@mikey:~$ getfacl ./
# file: .
# owner: mikey
# group: mikey
user::rwx
group::r-x
other::r-x

su 命令与 sudo 服务

SU命令

su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从 root 管理员切换至普通用户

1
su - mikey

上面的 su 命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。

SUDO命令

sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式为“sudo [参数] 命令名称”。sudo 服务中可用的参数以及相应的作用如表
image.png
总结来说,sudo 命令具有如下功能:

  • 限制用户执行指定的命令:
  • 记录用户执行的每一条命令;
  • 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
  • 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。

当然,如果担心直接修改配置文件会出现问题,则可以使用 sudo 命令提供的 visudo 命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 sudoers 配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。

只有 root 管理员才可以使用 visudo 命令编辑 sudo 服务的配置文件。

root ALL=(ALL) ALL
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表

第6章存储结构与磁盘划分

一切从“/”开始;

image.png

物理设备的命名规则

image.png

物理设备的命名规则

image.png
首先,/dev/目录中保存的应当是硬件设备文件;其次,sd 表示是存储设备;然后,a 表示系统中同类接口中第一个被识别到的设备,最后,5 表示这个设备是一个逻辑分区。一言以蔽之,“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为 5 的逻辑分区的设备文件”。考虑到我们的很多读者完全没有 Linux 基础,不太容易理解前面所说的主分区、扩展分区和逻辑分区的概念,因此接下来简单科普一下硬盘相关的知识。
正是因为计算机有了硬盘设备,我们才可以在玩游戏的过程中或游戏通关之后随时存档, 而不用每次重头开始。硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用 446 字节,分区表为 64 字节,结束符占用 2 字节;其中分区表中每记录一个分区信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,这 4 个分区就是 4 个主分区。第一个扇区中的数据信息如下图所示。
image.png
现在,问题来了—第一个扇区最多只能创建出 4 个分区?于是为了解决分区个数不够的问题,可以将第一个扇区的分区表中 16 字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用 16 字节分区表空间的指针—一个指向另外一个分区的指针。这样一来,用户一般会选择使用 3 个主分区加 1 个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于 4 个)的需求。当然,就目前来讲大家只要明白为什么主分区不能超过 4 个就足够了。主分区、扩展分区、逻辑分区可以像下图那样来规划。
image.png

文件系统与数据资料

用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。

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

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

  • XFS:是一种高性能的日志文件系统,而且是 RHEL 7 中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为 18EB,这几乎满足了所有需求。

日常在硬盘需要保存的数据实在太多了,因此 Linux 系统中有一个名为 super block 的“硬盘地图”。Linux 并不是把文件内容直接写入到这个“硬盘地图”里面,而是在里面记录着整个文件系统的信息。因为如果把所有的文件内容都写入到这里面,它的体积将变得非常大,而且文件内容的查询与写入速度也会变得很慢。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)。

image.png

挂载硬件设备

mount 命令

mount 命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。

  • -a 挂载所有在/etc/fstab 中定义的文件系统
  • -t 指定文件系统的类型

image.png

umount 命令

umount 命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”

添加硬件设备

fdisk 命令

在 Linux 系统中,管理硬盘设备最常用的方法就当属 fdisk 命令了。fdisk 命令用于管理磁盘分区,格式为“fdisk [磁盘名称]”,它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。
image.png

du 命令

既然存储设备已经顺利挂载,接下来就可以尝试通过挂载点目录向存储设备中写入文件了。在写入文件之前,先介绍一个用于查看文件数据占用量的 du 命令,其格式为“du [选项][文件]”。简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。我们还可以使用 du -sh /*命令来查看在 Linux 系统根目录下所有一级目录分别占用的空间大小。

添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。

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

磁盘容量配额

Linux 系统的设计初衷就是让许多人一起使用并执行各自的任务,从而成为多用户、多任务的操作系统。但是,硬件资源是固定且有限的,如果某些用户不断地在 Linux 系统上创建文件或者存放电影,硬盘空间总有一天会被占满。针对这种情况,root管理员就需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用 quota命令进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。 quota命令还有软限制和硬限制的功能。

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

xfs_quota 命令

xfs_quota 命令是一个专门针对 XFS 文件系统来管理 quota 磁盘容量配额服务而设计的命令,格式为“quota [参数] 配额 文件系统”。其中,-c 参数用于以参数的形式设置要执行的命令;-x参数是专家模式,让运维人员能够对 quota 服务进行更多复杂的配置。

edquota 命令

edquota 命令用于编辑用户的 quota 配额限制,格式为“edquota [参数] [用户] ”。在为用户设置了 quota 磁盘容量配额限制后,可以使用 edquota 命令按需修改限额的数值。其中,-u参数表示要针对哪个用户进行设置;-g 参数表示要针对哪个用户组进行设置。

软硬方式链接

在 Linux 系统中存在硬链接和软连接两种文件。

  • 硬链接(hard link):可以将它理解为一个“指向原始文件 inode 的指针”,系统不为它分配独立的 inode 和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的 inode 连接数就会增加 1;而且只有当该文件的 inode 连接数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件 inode 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。

  • 软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与 Windows 系统中的“快捷方式”具有一样的性质。

ln 命令

ln 命令用于创建链接文件,格式为“ln [选项] 目标”
image.png

第7章使用RAID与LVM磁盘阵列技术

RAID(独立冗余磁盘阵列)

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

任何事物都有它的两面性。RAID 技术确实具有非常好的数据冗余备份功能,但是它也相应地提高了成本支出。就像原本我们只有一个电话本,但是为了避免遗失,我们将联系人号码信息写成了两份,自然要为此多买一个电话本,这也就相应地提升了成本支出。RAID 技术的设计初衷是减少因为采购硬盘设备带来的费用支出,但是与数据本身的价值相比较,现代企业更看重的则是 RAID 技术所具备的冗余备份机制以及带来的硬盘吞吐量的提升。也就是说,RAID 不仅降低了硬盘设备损坏后丢失数据的几率,还提升了硬盘设备的读写速度,所以它在绝大多数运营商或大中型企业中得以广泛部署和应用。

目前已有的 RAID 磁盘阵列的方案至少有十几种,接下来会详细讲解 RAID 0、RAID 1、RAID 5 与 RAID 10 这 4 种最常见的方案。

RAID 0

RAID 0 技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。这样一来,在最理想的状态下,硬盘设备的读写性能会提升数倍,但是若任意一块硬盘发生故障将导致整个系统的数据都受到破坏。通俗来说,RAID 0 技术能够有效地提升硬盘数据的吞吐速度,但是不具备数据备份和错误修复能力。如图所示,数据被分别写入到不同的硬盘设备中,即 disk1 和 disk2 硬盘设备会分别保存数据资料,最终实现分开写入、读取的效果。
image.png

RAID 1

尽管 RAID 0 技术提升了硬盘设备的读写速度,但是它是将数据依次写入到各个物理硬盘中,也就是说,它的数据是分开存放的,其中任何一块硬盘发生故障都会损坏整个系统的数据。因此,如果生产环境对硬盘设备的读写速度没有要求,而是希望增加数据的安全性时,就需要用到 RAID 1 技术了。

在图 7-2 所示的 RAID 1 技术示意图中可以看到,它是把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上(可以将其视为数据的镜像或备份)。当其中某一块硬盘发生故障后,一般会立即自动以热交换的方式来恢复数据的正常使用。
image.png
RAID 1 技术虽然十分注重数据的安全性,但是因为是在多块硬盘设备中写入了相同的数据,因此硬盘设备的利用率得以下降,从理论上来说,图 7-2 所示的硬盘空间的真实可用率只有 50%,由三块硬盘设备组成的 RAID 1 磁盘阵列的可用率只有 33%左右,以此类推。而且,由于需要把数据同时写入到两块以上的硬盘设备,这无疑也在一定程度上增大了系统计算功能的负载。

RAID 5

如图 7-3 所示,RAID5 技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。RAID 5 磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中,而是存储到除自身以外的其他每一块硬盘设备上,这样的好处是其中任何一设备损坏后不至于出现致命缺陷;图 7-3 中 parity 部分存放的就是数据的奇偶校验信息,换句话说,就是 RAID 5 技术实际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据。RAID 这样的技术特性“妥协”地兼顾了硬盘设备的读写速度、数据安全性与存储成本问题。
image.png

RAID 10

鉴于 RAID 5 技术是因为硬盘设备的成本问题对读写速度和数据的安全性能而有了一定的妥协,但是大部分企业更在乎的是数据本身的价值而非硬盘价格,因此生产环境中主要使用 RAID 10 技术。

顾名思义,RAID 10 技术是 RAID 1+RAID 0 技术的一个“组合体”。如图 7-4 所示,RAID 10 技术需要至少 4 块硬盘来组建,其中先分别两两制作成 RAID 1 磁盘阵列,以保证数据的安全性;然后再对两个 RAID 1 磁盘阵列实施 RAID 0 技术,进一步提高硬盘设备的读写速度。这样从理论上来讲,只要坏的不是同一组中的所有硬盘,那么最多可以损坏 50%的硬盘设备而不丢失数据。由于 RAID 10 技术继承了 RAID 0 的高读写速度和 RAID1 的数据安全性,在不考虑成本的情况下 RAID 10 的性能都超过了 RAID 5,因此当前成为广泛使用的一种存储技术。
image.png

部署磁盘阵列

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

1
mdadm [模式] <RAID设备名称> [选项] [成员设备名称]

image.png

损坏磁盘阵列及修复

之所以在生产环境中部署 RAID 10 磁盘阵列,是为了提高硬盘存储设备的读写速度及数据的安全性,但由于我们的硬盘设备是在虚拟机中模拟出来的,因此对读写速度的改善可能并不直观。

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

LVM(逻辑卷管理器)

在硬盘分好区或者部署为 RAID 磁盘阵列之后,再想修改硬盘分区大小就不容易了。换句话说,当用户想要随着实际需求的变化调整硬盘分区的大小时,会受到硬盘“灵活性”的限制。这时就需要用到另外一项非常普及的硬盘设备资源管理技术了—LVM(逻辑卷管理器)。LVM 可以允许用户对硬盘资源进行动态调整。

逻辑卷管理器是 Linux 系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而 LVM 技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的低层架构和布局,就可以实现对硬盘分区的动态调整。LVM 的技术架构如图 7-7 所示。
image.png

比如小明家里想吃馒头但是面粉不够了,于是妈妈从隔壁老王家、老李家、老张家分别借来一些面粉,准备蒸馒头吃。首先需要把这些面粉(物理卷[PV,Physical Volume])揉成一个大面团(卷组[VG,Volume Group]),然后再把这个大团面分割成一个个小馒头(逻辑卷[LV,Logical Volume]),而且每个小馒头的重量必须是每勺面粉(基本单元[PE,Physical Extent])的倍数。

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

部署逻辑卷

image.png

扩容逻辑卷

在前面的实验中,卷组是由两块硬盘设备共同组成的。用户在使用存储设备时感知不到设备底层的架构和布局,更不用关心底层是由多少块硬盘组成的,只要卷组中有足够的资源,就可以一直为逻辑卷扩容。扩展前请一定要记得卸载设备和挂载点的关联。

缩小逻辑卷

相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,其丢失数据的风险更大。所以在生产环境中执行相应操作时,一定要提前备份好数据。另外 Linux 系统规定,在对 LVM 逻辑卷进行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)。在执行缩容操作前记得先把文件系统卸载掉。

逻辑卷快照

LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,可以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。LVM 的快照卷功能有两个特点:

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

首先查看卷组的信息。

1
vgdisplay

删除逻辑卷

当生产环境中想要重新部署 LVM 或者不再需要使用 LVM 时,则需要执行 LVM 的删除操作。为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒。
第 1 步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。

1
2
umount /linuxprobe
vim /etc/fstab

第 2 步:删除逻辑卷设备,需要输入 y 来确认操作。

1
lvremove /dev/storage/vo

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

1
vgremove storage

第 4 步:删除物理卷设备。

1
pvremove /dev/sdb /dev/sdc

第8章iptables与frewalld防火墙

防火墙管理工具

防火墙策略可以基于流量的源目地址、端口号、协议、应 用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策 略规则相匹配,则执行相应的处理,反之则丢弃。这样一来,就可以保证仅有合法的流量在 企业内网和外部公网之间流动了。
image.png

在 RHEL 7 系统中,firewalld 防火墙取代了 iptables 防火墙。

iptables

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

策略与规则链

防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作 并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配 项,就去执行默认的策略。一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行), 一种是“堵”(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否 则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防 火墙也就失去了防范的作用。 iptables 服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则 链,而规则链则依据数据包处理位置的不同进行分类,具体如下:

  • **在进行路由选择前处理数据包(PREROUTING); **
  • **处理流入的数据包(INPUT); **
  • **处理流出的数据包(OUTPUT); **
  • **处理转发的数据包(FORWARD); **
  • 在进行路由选择后处理数据包(POSTROUTING)。

一般来说,从内网向外网发送的流量一般都是可控且良性的,因此我们使用最多的就是 INPUT 规则链,该规则链可以增大黑客人员从外网入侵内网的难度。

比如在您居住的社区内,物业管理公司有两条规定:禁止小商小贩进入社区;各种车辆 在进入社区时都要登记。显而易见,这两条规定应该是用于社区的正门的(流量必须经过的 地方),而不是每家每户的防盗门上。根据前面提到的防火墙策略的匹配顺序,可能会存在多 种情况。比如,来访人员是小商小贩,则直接会被物业公司的保安拒之门外,也就无需再对车辆进行登记。如果来访人员乘坐一辆汽车进入社区正门,则“禁止小商小贩进入社区”的 第一条规则就没有被匹配到,因此按照顺序匹配第二条策略,即需要对车辆进行登记。如果 是社区居民要进入正门,则这两条规定都不会匹配到,因此会执行默认的放行策略。

firewalld

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

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

image.png

终端管理工具

firewall-cmd
image.png
流量转发命令格式为

1
firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标 IP 地址> 

图形管理工具

firewall-config它是 firewalld 防火墙配置管理工具的 GUI(图形用户界面)版本,几乎可以实现所有以命令行来执行的操作。毫不夸张的说,即使读者没有扎实的 Linux 命令基础,也完全可以通过它来妥善配置 RHEL 7 中的防火墙策略。
其功能具体如下。

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

服务的访问控制列表。

image.png

第9章使用ssh服务管理远程主机

RHEL 和 CentOS 系统默认使用 NetworkManager 来提供网络服务,这是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。可以使用 nmcli 命令来管理 Network Manager 服务。nmcli 是一款基于命令行的网络配置工具,功能丰富,参数众多。它可以轻松地查看网络信息或网络状态:
image.png
另外,RHEL7 系统支持网络会话功能,允许用户在多个配置文件中快速切换(非常类似于 firewalld 防火墙服务中的区域技术)。

配置 sshd 服务

SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理 Linux 系统的首选方式。在此之前,一般使用 FTP 或 Telnet 来进行远程登录。但是因为它们以明文的形式在网络中传输账户密码和数据信息,因此很不安全,很容易受到黑客发起的中间人攻击,这轻则篡改传输的数据信息,重则直接抓取服务器的账户密码。
想要使用 SSH 协议来远程管理 Linux 系统,则需要部署配置 sshd 服务程序。sshd 是基于 SSH
协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供两种安全验证的方法:

  • 基于口令的验证—用账户和密码来验证登录;
  • 基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全。

image.png

远程传输命令

scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp [参数] 本地文件 远程帐户@远程 IP 地址:远程目录”。

1
scp [参数] 本地文件 远程帐户@远程 IP 地址:远程目录

image.png

不间断会话服务

大家在学习 sshd 服务时,不知有没有注意到这样一个事情:当与远程主机的会话被关闭时,在远程主机上运行的命令也随之被中断。
如果我们正在使用命令来打包文件,或者正在使用脚本安装某个服务程序,中途是绝对不能关闭在本地打开的终端窗口或断开网络链接的,甚至是网速的波动都有可能导致任务中断,此时只能重新进行远程链接并重新开始任务。还有些时候,我们正在执行文件打包操作,同时又想用脚本来安装某个服务程序,这时会因为打包操作的输出信息占满用户的屏幕界面,而只能再打开一个执行远程会话的终端窗口,时间久了,难免会忘记这些打开的终端窗口是做什么用的了。

screen 是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异
常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用 screen 服务程序同
时在多个远程会话中自由切换,能够做到实现如下功能。

  • 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
  • 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
  • 会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之 间的输入输出信息共享。

在 RHEL 7 系统中,没有默认安装 screen 服务程序,因此需要配置 Yum 仓库来安装它。

第10章使用Apache服务部署静态网站

网站服务程序

目前能够提供 Web 网络服务的程序有 IIS、Nginx 和 Apache 等

安装apache

1
2
3
4
5
6
7
#安装
yum install httpd
#启动
systemctl start httpd
#开机自启
systemctl enable httpd
#浏览器访问

配置服务文件参数

image.png

SELinux 安全子系统

SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发 的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。RHEL 7 系统使用 SELinux 技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。

SELinux 服务有三种配置模式,具体如下。

  • enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
  • permissive:遇到服务越权访问时,只发出警告而不强制拦截。
  • disabled:对于越权的行为不警告也不拦截。

semanage 命令

semanage 命令用于管理 SELinux 的策略,格式为“semanage [选项] [文件]”。 SELinux 服务极大地提升了 Linux 系统的安全性,将用户权限牢牢地锁在笼子里。 semanage 命令不仅能够像传统 chcon 命令那样—设置文件、目录的策略,还可以管理网络 端口、消息接口(这些新特性将在本章后文中涵盖)。使用 semanage 命令时,经常用到的几 个参数及其功能如下所示:

  • -l 参数用于查询;
  • -a 参数用于添加;
  • -m 参数用于修改;
  • -d 参数用于删除。

虚拟主机功能

如果每台运行 Linux 系统的服务器上只能运行一个网站,那么人气低、流量小的草 根站长就要被迫承担着高昂的服务器租赁费用了,这显然也会造成硬件资源的浪费。在 虚拟专用服务器(Virtual Private Sever,VPS)与云计算技术诞生以前,IDC 服务供应商 为了能够更充分地利用服务器资源,同时也为了降低购买门槛,于是纷纷启用了虚拟主 机功能。 利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服 务器”。但是,该技术无法实现目前云主机技术的硬件资源隔离,让这些虚拟的服务器 共同使用物理服务器的硬件资源,供应商只能限制硬盘的使用空间大小。出于各种考虑 的因素(主要是价格低廉),目前依然有很多企业或个人站长在使用虚拟主机的形式来 部署网站。

第11章使用vsftpd服务传输文件

文件传输协议

FTP 是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20、21 号端口,其中端口 20(数据端口)用于进行数据传输,端口 21(命令端口)用于接受客户端 发出的相关 FTP 命令与参数。FTP 服务器普遍部署于内网中,具有容易搭建、方便管理的特 点。而且有些 FTP 客户端工具还可以支持文件的多点下载以及断点续传技术,因此 FTP 服务 得到了广大用户的青睐。

  • 主动模式:FTP 服务器主动向客户端发起连接请求。
  • 被动模式:FTP 服务器等待客户端发起连接请求(FTP 的默认工作模式)。

vsftpd 服务程序

/etc/vsftpd/vsftpd.conf
image.png
三种认证模式:

  • 匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录 到 FTP 服务器。

  • 本地用户模式:是通过 Linux 系统本地的账户密码信息进行认证的模式,相较于匿名 开放模式更安全,而且配置起来也很简单。但是如果被黑客破解了账户的信息,就可 以畅通无阻地登录 FTP 服务器,从而完全控制整台服务器。

  • 虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为 FTP 服务单独 建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在 服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。这样,即使 黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

简单文件传输协议

简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于 UDP 协议在客户端 和服务器之间进行简单文件传输的协议。顾名思义,它提供不复杂、开销不大的文件传输服 务(可将其当作 FTP 协议的简化版本)。 TFTP 的命令功能不如 FTP 服务强大,甚至不能遍历目录,在安全性方面也弱于 FTP 服务。而且,由于 TFTP 在传输文件时采用的是 UDP 协议,占用的端口号为 69,因此 文件的传输过程也不像 FTP 协议那样可靠。但是,因为 TFTP 不需要客户端的权限认证, 也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率 更高。

1
2
#安装
yum install tftp-server tftp -y

第12章使用Samba或NFS实现文件共享

Samba 文件共享服务

image.png
配置共享资源
image.png

NFS(网络文件系统)

autofs 自动挂载服务

第13章使用BIND提供域名解析服务

第14章使用DHCP动态管理主机地址

第15章使用Postifx与Dovecot部署邮件系统

第16章使用Squid部署代理缓存服务

第17章使用IsSCSI服务部署网络存储

第18章使用MariaDB数据库管理系统

第19章使用PXE+Kickstart无人值守安装服务

第20章使用LNMP架构部署动态网站环境

资料

LinuxProbe.pdf


Linux篇-Linux就该这么学
https://mikeygithub.github.io/2021/07/07/yuque/Linux篇-Linux就该这么学/
作者
Mikey
发布于
2021年7月7日
许可协议