最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

2024Linux云计算SRE工程师万老师

业界 admin 23浏览 0评论

2023SRE线上班全程班(202309改版)

2024Linux云计算SRE工程师万老师

第1天-行业介绍和计算机基础

1-计算机基础和Linux安装

内容概述

计算机系统

计算机硬件组成

操作系统

Linux相关介绍

Linux哲学思想

虚拟机

Linux 安装

1 计算机系统

1.1计算机硬件

计算机发展历史:

电子管时代:第一代计算机(1945-1957)

晶体管时代:第二代计算机(1958-1964)

集成电路时代:第三代计算机(1965-1970)

大规模集成电路时代:第四代计算机(1972-至今)

量子计算机/生物计算机:第五代计算机(可能已经开始了)

冯诺依曼体系结构

其主要内容如下:

1.计算机处理的数据和指令一律用二进制数表示;

2.顺序执行程序的每一条指令;

3.计算机由运算器,控制器,存储器,输入设备和输出设备五大部份组成;

1.1.6 服务器硬件组成 存储器的层次结构

1.2 操作系统和Linux

什么是操作系统: 操作系统( operating system ,简称 OS )是管理计算机硬件与软件资源的计算机程序。操作系统需要处 理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。 linux unix 1.2.7 Linux Linux 的内核版本组成

2 Linux 安装

虚拟化软件,建议使用 Vmware Workstation

linux虚拟机安装

第2天-Linux基础入门和帮助

内容概述

用户 终端 Shell 介绍 执行命令 简单命令 Tab 键补全 命令行历史 bash 快捷键 帮助用法

1 Linux 基础

1.1 用户类型 root 用户 一个特殊的管理帐户 也被称为超级用户 root 已接近完整的系统控制 对系统损害几乎有无限的能力 除非必要,不要登录为 root 普通( 非特权 )用户 权限有限 造成损害的能力比较有限 1.3.2   什么是 shell

Shell Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行 

1.3.3 各种Shell

1.3.4 bash shell

GNU Bourne-Again Shell(bash)GNU计划中重要的工具软件之一,目前也是 Linux 标准的 shell,与sh兼容

显示当前使用的 shell

root@ubuntu2204:~# echo ${SHELL}

/bin/bash

显示当前系统使用的所有shell

root@ubuntu2204:~# cat /etc/shells

# /etc/shells: valid login shells

/bin/sh

/bin/bash

/usr/bin/bash

/bin/rbash

/usr/bin/rbash

/usr/bin/sh

/bin/dash

/usr/bin/dash

/usr/bin/tmux

/usr/bin/screen

1.4 设置主机名

#临时生效

hostname NAME

#持久生效,支持CentOS7Ubuntu18.04以上版本

hostnamectl set-hostname NAME

1.6.2 shell中可执行的两类命令

内部命令:由shell自带的,而且通过某命令形式提供,用户登录后自动加载并常驻内存中

外部命令:在文件系统路径下有对应的可执行程序文件,当执行命令时才从磁盘加载至内存中,执

行完毕后从内存中删除

1.7 常见命令

1.7.1 查看硬件信息

1.7.1.1 查看 cpu

lscpu 命令可以查看cpu信息

cat /proc/cpuinfo也可看查看到

1.7.1.2 查看内存大小

[root@ubuntu2204 ~]# free
total
used
353580
0
free
844332
shared buff/cache available
1328 791616 1479600
Mem:
1989528
2097148
Swap:
2097148
[root@ubuntu2204 ~]# cat /proc/meminfo
MemTotal:
MemFree:
MemAvailable:
.....

1.7.1.3 查看硬盘和分区情况

[root@centos8 ~]# lsblk

[root@centos8 ~]# cat /proc/partitions

1.7.2 查看系统版本信息

1.7.2.1 查看系统架构

[root@ubuntu2204 ~]# arch

x86_64

1.7.2.2 查看内核版本

[root@rocky8 ~]# uname -r

4.18.0-372.9.1.el8.x86_64

1.7.2.3 查看操作系统发行版本

#CentOS8 查看发行版本

[root@centos8 ~]#cat /etc/redhat-release

CentOS Linux release 8.1.1911 (Core)

[root@centos8 ~]#cat /etc/os-release

[root@centos8 ~]#lsb_release -a

1.7.3 日期和时间

Linux的两种时钟

系统时钟:由Linux内核通过CPU的工作频率进行的

硬件时钟:主板

[root@ubuntu2204 ~]# date
Mon May 8 02:21:33 AM UTC 2023
#显示时区信息
[root@ubuntu2204 ~]# date -R
Mon, 08 May 2023 02:21:40 +0000
#时间戳
[root@ubuntu2204 ~]# date +%s
1683512505
[root@ubuntu2204 ~]# date -d @`date +%s`
Mon May 8 02:21:51 AM UTC 2023
[root@ubuntu2204 ~]# date -d @1683512505
Mon May 8 02:21:45 AM UTC 2023
[root@ubuntu2204 ~]# date -d @1683512505 +%F_%T
2023-05-08_02:21:45
[root@ubuntu2204 ~]# date -d "2023-05-08" +%s
1683504000

clockhwclock 显示硬件时钟

[root@centos8 ~]# ll /usr/sbin/clock
lrwxrwxrwx. 1 root root 7 Oct 14 2021 /usr/sbin/clock -> hwclock
#对钟
[root@rocky86 ~]# clock -s
[root@ubuntu2204 ~]# ll /usr/sbin/clock
ls: cannot access '/usr/sbin/clock': No such file or directory
[root@ubuntu2204 ~]# ll /usr/sbin/hwclock
-rwxr-xr-x 1 root root 51704 Feb 21 2022 /usr/sbin/hwclock*

关机:

halt

poweroff

init 0

shutdown -h now

重启:

reboot

init 6

shutdown -r now

#ctrl+alt+delete 三键

关机或重启:shutdown

shutdown 程序会广播己登录的用户,被看作是安全的关机命令

是一个计划关机任务,可撤销

1.7.5 用户登录信息查看命令

whoami: 显示当前登录有效用户

who: 系统当前所有的登录会话

w: 系统当前所有的登录会话及所做的操作

1.7.6 文本编辑

nano 工具可以实现文本的编辑,上手容易,适合初学者

gedit 工具是图形工

1.7.7 会话管理

终端复用器软件就是会话与窗口的"解绑"工具,将它们彻底分离。

1. 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。

2. 它可以让新窗口"接入"已经存在的会话。

3. 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。

4. 它还支持窗口任意的垂直和水平拆分。

类似的终端复用器还有ScreenTmux

1.7.8 输出信息 echo

1.7.8.1 echo 基本用法

echo 命令可以将后面跟的字符进行输出

1.8 字符集和编码及语言环境

1.9 命令行扩展和被括起来的集合

1.9.1 命令行扩展:``  $()

[root@ubuntu2204 ~]# echo "echo $HOSTNAME"

echo ubuntu2204

[root@ubuntu2204 ~]# echo 'echo $HOSTNAME'

echo $HOSTNAME

[root@ubuntu2204 ~]# echo `echo $HOSTNAME`

ubuntu2204

#结论:

单引号:强引用,六亲不认,变量和命令都不识别,都当成了普通的字符串,"最傻"

双引号:弱引用,不能识别命令,可以识别变量,"半傻不精"

反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容

当成命令进行执行后,再交给调用反向单引号的命令继续,"最聪明"

1.9.2 括号扩展:{ }

{} 可以实现打印重复字符串的简化形式

{元素1,元素2,元素3}

{元素1..元素2}

echo file{1,3,5} 结果为:file1 file3 file5

[root@ubuntu2204 ~]# echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
[root@ubuntu2204 ~]# echo {a..z..2}
a c e g i k m o q s u w y
[root@ubuntu2204 ~]# echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i
j k l m n o p q r s t u v w x y z
[root@ubuntu2204 ~]# echo {a..z} {A..Z}
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z
[root@ubuntu2204 ~]# echo {a..z}{1..3}
a1 a2 a3 b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3 h1 h2 h3 i1 i2 i3
j1 j2 j3 k1 k2 k3 l1 l2 l3 m1 m2 m3 n1 n2 n3 o1 o2 o3 p1 p2 p3 q1 q2 q3 r1 r2 r3
s1 s2 s3 t1 t2 t3 u1 u2 u3 v1 v2 v3 w1 w2 w3 x1 x2 x3 y1 y2 y3 z1 z2 z3

1.10 tab 键补全

tab 键可以实现命令及路径等补全,提高输入效率,避免出错

1.11 命令行历史

命令:history

1.13 bash的快捷键

2 获得帮助

whatis & whereis 命令

command --help 选项

man 手册

程序自带文档 /usr/share/doc

项目官网文档

行业网站

搜索引擎

第3天-Linux文件管理和I0重定向

文件管理和IO重定向

内容概述

文件系统目录结构

创建和查看文件

复制、转移和删除文件

软和硬链接

IO 重定向和管道

文件系统目录结构

1.1 文件系统的目录结构

文件和目录被组织成一个单根倒置树结构

文件系统从根目录下开始,用“/”表示

根文件系统(rootfs)root filesystem

标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL

 . 开头的文件为隐藏文件

路径分隔的 /

文件名最长255个字节

包括路径在内文件名称最长4095个字节

蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件  ->其他文件

除了斜杠和NUL,所有字符都有效,但使用特殊字符的目录 和文件不推荐使用,有些字符需要用引

号来引用

每个文件都有两类相关数据:元数据:metadata,即属性,  data,即文件内容

1.2 常见的文件系统目录功能

1.3 应用程序的组成部分

不同类型文件常用的目录

1.5 Linux 下的文件类型 linux 系统中的文件类型标识符

2

文件操作命令

2.1 显示当前工作目录

显示当前shell CWD的绝对路径

pwd命令: printing working directory

2.2 绝对和相对路径

#
[
走绝对路径,从根目录出发
root@ubuntu2204 ~]# cd /etc/apt/
[
/
root@ubuntu2204 apt]# pwd
etc/apt
#
走相对路径,从当前目录出发
[
/
root@ubuntu2204 apt]# pwd
etc/apt
[
root@ubuntu2204 apt]# ls
apt.conf.d keyrings
sources.list
sources.list
auth.conf.d preferences.d sources.list.curtin.old trusted.gpg.d
[
root@ubuntu2204 apt]# cd apt.conf.d/
[
root@ubuntu2204 apt.conf.d]# pwd
etc/apt/apt.conf.d
/
#
[
走相对路径,从当前目录出发
root@ubuntu2204 apt.conf.d]# cd ../../.
[
root@ubuntu2204 ~]# pwd
root

2.3 更改目录

cd

2.4 列出目录内容

2.5 查看文件状态 stat

一个文件有两部份信息:元数据和具体内容

#查看文件元数据

[root@ubuntu2204 ~]# stat /etc/fstab

2.6 确定文件内容

文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用

[root@ubuntu2204 ~]# file test.sh

test.sh: Bourne-Again shell script, ASCII text executable

2.7 文件通配符模式 wildcard pattern

文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件

通配符采用特定的符号,表示特定的含义,此特定符号称为元 meta 字符

常见的通配符如下:

2.8 创建空文件和刷新时间

touch命令可以用来创建空文件或刷新文件的时间

2.9 复制文件和目录

利用 cpcopy)命令可以实现文件或目录的复制

2.10 移动和重命名文件

mv 命令可以实现文件或目录的移动和改名

同一分区移动数据,速度很快,数据位置没有变化

不同分区移动数据,速度相对慢,数据位置发生了变化

利用 rename 可以批量修改文件名

2.11 删除文件

使用 rm 命令可以删除文件和目录

注意:此命令非常危险,慎重使用,建议使用 mv 代替 rm

范例:避免误删除,定义别名

[root@ubuntu2204 ~]# alias rm='mv -t /tmp'

2.12 目录操作

2.12.1 显示目录树 tree

2.12.2 创建目录 mkdir

2.11.3 删除空目录 rmdir

rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树

3 文件元数据和节点表结构

3.1 inode 表结构

Linux系统中,一切皆文件,

每个文件,又分为文件元数据和具体内容两部份,

一个文件元数据和其具体内容数据,在磁盘分区上,是分开存放的。

这种存储文件元数据的区域就叫 inode,中文译作 "索引节点"

每一个inode表记录对应的保存了以下信息:

inode number(索引节点编号)

文件类型

权限

属主属组

链接数

文件大小

各时间戳

指向具体数据块的指针

有关文件的其他数据

3.2 (hard)链接

hard link

硬链接的作用是允许一个文件拥有多个有效的路径名,

新增一个文件,指向某个文件的inode,这样,这两个文件就互为硬链接,

也就是多个文件名,都是指向同一个inode,这是硬链接的本质。

3.3 符号 symbolic (或软 soft)链接

symbolic link,也称为符号链接,类似于windows 中的快捷方式,

软链接是建立一个独立的文件,这个文件的指向的是目标的文件名。

软链接特点

一个符号链接的内容是它引用文件的名称

可以对目录创建软链接

可以跨分区的文件实现

指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode

引用计数

软链接如果使用相对路径,是相对于源文件的路径,而非相对于当前目录

删除软链接本身,不会删除源目录内容

删除源目录的文件,不会删除链接文件

格式:

ln -s filename linkname

范例:删除软链接

3.4 硬链接和软链接区别总结

3.5 生产案例

3.5.1 案例1:提示空间满 No space left on device,但 df 可以看 到空间很多,为什么?

3.5.2 案例2:提示空间快满,使用 rm 删除了很大的无用文件后,df 仍然看到空间不足,为什么?如何解决?

4 IO 重定向和管道

4.1 标准输入和输出

Linux系统中有三个最基本的IO设备

1. 标准输入设备(stdin):对应终端键盘

2. 标准输出设备(stdout):对应终端的显示器

3. 标准错误输出设备(stderr):对应终端的显示器

4.2 I/O重定向 redirect

重定向:redirect

I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标

4.2.1 标准输出和错误重新定向

STDOUTSTDERR默认是使用当前终端,但也可以重定向到指定终端或指定文件

4.2.2 标准输入重定向

4.2.2.1 tr 命令

用于转换字符、删除字符和压缩重复的字符。它从标准输入读取数据并将结果输出到标准输出

4.2.2.1 标准输入重定向

标准输入重定向是使用文件来代替键盘的输入,

从文件中读取数据,代替当前终端的输入设备输入的数据,

此处要严格区分命令是否支持标准输入,标准输入和参数是两个概念;

怎么判断命令能使用标准输入重定向?

不跟任何选项参数,直接回车,看是否等待标准输入,如果是,则该命令可以使用标准输入重定向

[root@ubuntu2204 ~]# cat a.txt
1+2+3+4+5+6+7+8+9+10
#标准输入重定向
[root@ubuntu2204 ~]# bc < a.txt
55
#标准输入输出重定向
[root@ubuntu2204 ~]# bc < a.txt > rs.txt
[root@ubuntu2204 ~]# cat rs.txt
55
#多行执行
[root@ubuntu2204 ~]# seq -s + 10 > a.txt;bc<a.txt>rs.txt


4.2.2.2 标准输入多行重定向

使用 "<<终止词" 命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN

有时被称为就地文本(here documents,其中终止词可以是任何一个或多个符号,比如:!@$

EOFEnd Of File等,其中EOF比较常用

4.2.2.4 高级重定向写法

4.2.2.4.1 cmd <<< "string"

含义是 here-string ,表示传给给cmdstdin的内容从这里开始是一个字符串。

4.2.2.4.2 cmd1 < <(cmd2)

名称为 Process substitution ,是由两个部分组成

<(cmd2) 表示把cmd2的输出写入一个临时文件, 注意:< 符号 与( 符号之间没有空格

cmd1 < 这是一个标准的stdin重定向

把两个合起来,就是把cmd2的输出stdout传递给cmd1作为输入stdin, 中间通过临时文件做传递

范例:

[root@ubuntu2204 ~]# bc < <(echo 1+2+3)

6

[root@ubuntu2204 ~]# bc < <(seq -s + 3)

6

[root@ubuntu2204 ~]# tr 'a-z' 'A-Z' < <(hostname)

ROCKY86

4.3 管道

4.3.1 管道

(pipe):名顾思义,水管,从一端进去,再从另一端出来。

shell 中,可以将两个或多个命令(程序|进程)连接起来,将前一个命令的输出作为后一个命令的输入,

就像拿水管将两个命令连起来;

使用管道,要求前一个命令必须支持标准输出,后一个命令必须支持标准输入;

格式

COMMAND1|COMMAND2|COMMAND3|...

功能说明:

将命令1STDOUT发送给命令2STDIN,命令2STDOUT发送到命令3STDIN

所有命令会在当前shell进程的子shell进程中执行

组合多种工具的功能

注意:STDERR默认不能通过管道转发,可利用2>&1  |& 实现,格式如下

COMMAND1 2>&1 | COMMAND2

COMMAND1 |& COMMAND2

范例:

[root@ubuntu2204 ~]# echo 1+2+3|bc

6

4.3.2 tee 命令

将标准输入复制到每个指定文件,并显示到标准输出

第4天-用户和权限管理

内容概述

Linux的安全模型

用户和组相关文件

用户和组管理命令

理解并设置文件权限

默认权限

特殊权限

文件访问控制列表

1 Linux安全模型

资源分派:

Authentication:认证,验证用户身份

Authorization:授权,不同的用户设置不同权限

Accouting:审计 ,事后行为

Linux系统中,当用户登录成功时,系统会自动分配令牌 token,包括:用户标识和组成员等信息。

3A认证:又称AAA认证,是一套针对网络设备的网络访问控制策略安全模型。

1.1 用户

Linux系统是多用户系统,可以同时存在多个用户,每个用户之间都是互相隔离的。

Linux系统中,每个用户是通过User Id UID)来唯一标识的。

1.2 用户组

Linux中可以将一个或多个用户加入用户组中,组就是包含0个或多个用户的集合,用户组是通过Group ID(GID 来唯一标识的。

1.4 安全上下文

Linux安全上下文Context

Linux系统中,运行中的程序(即进程process),都是以进程发起者的身份运行;

进程所能够访问的资源权限取决于进程的运行者的身份;

首先,什么是程序

一个程序或一个命令,本质上也是一个可执行的二进制文件或一个可执行的脚本文件;

在服务器上有很多文件,只有那些特定的,可以被执行的二进制文件,才能被称为程序;

其次,什么是进程

运行中的程序,就是进程;

第三,程序,进程,用户之间的关系是怎样的

只有可以被执行的文件,才能叫作程序;

对于同一个程序,也不是所有用户都可以运行的,这要取决于当前用户对该程序有没有可执行权限;

第四,进程的访问资源

一个进程能不能访问某些资源,是由进程发起者决定的(跟进程本身的程序文件无关),比如某进程要

读写某个文件,则要看该进程发起者有没有权限读取该文件;

2 用户和组的配置文件

2.1 用户和组的主要配置文件

/etc/passwd:用户及其属性信息(名称、UID、主组ID等)

/etc/shadow:用户密码及其相关属性

/etc/group:组及其属性信息

/etc/gshadow:组密码及其相关属性

4 文件权限管理

4.1 Linux中的权限体系介绍

Linux系统中,一切皆文件;

对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户;

而每个角色用户,对该文件的权限,也分三种,分别是读,写,执行;

范例:面试题

执行 cp /etc/issue /data/dir/ 所需要的最小权限?

/bin/cp 需要x权限

/etc/ 需要x权限

/etc/issue 需要r权限

/data 需要x权限

/data/dir 需要w,x权限

4.6 访问控制列表 ACL

4.6.1 ACL权限功能

rwx 权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成;

ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制;

ACL生效顺序:

所有者,自定义用户,所属组,自定义组,其他人

4.6.2 ACL相关命令

setfacl 可设置ACL权限

getfacl 可查看设置的ACL权限

第5天-文本处理工具和正则表达式

内容概述

文本编辑工具VIM

各种文本工具

基本正则表达式和扩展正则表达式

文本处理三剑客之grep

1 文本编辑工具之神VIM

文本编辑种类:

全屏编辑器:nano(字符工具), gedit(图形化工具)vivim

行编辑器:sed

VIM 小抄

1.2.2 三种主要模式和转换

vim 是一个模式编辑器,击键行为是依赖于 vim 模式

三种模式:

命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本

插入(Insert)或编辑模式:用于修改文本

扩展命令(extended command )或命令()行模式:保存,退出等

1.8 vim 总结图

2 文本常见处理工具

2.1 文件内容查看命令

2.1.1 查看文本文件内容

2.1.1.1 cat

cat 可以查看文本内容

2.2 分页查看文件内容

2.2.1 more

可以实现分页查看文件,可以配合管道实现输出信息的分页

2.3 显示文本前面或后面的行内容

2.3.1 head

可以显示文件或标准输入的前面行

2.3.2 tail

tail head 相反,查看文件或标准输入的倒数行

2.3.3 head  tail 总结

2.4 按列抽取文本 cut

cut 命令可以提取文本文件或STDIN数据的指定列

2.5 合并多个文件 paste

paste 合并多个文件同行号的列到一行

2.6 分析文本的工具

文本数据统计:wc

整理文本:sort

比较文件:diffpatch

3 正则表达式

REGEXP Regular Expressions,由一类特殊字符及文本字符所编写的模式;其中有些字符(元字符)

不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能;但与通配符不同,通配

符功能是用来处理文件名,而正则表达式是处理文本内容中字符;

正则表达式被很多程序和开发语言所广泛支持:vim, lessgrepsedawk, nginxmysql ;

正则表达式分两类:

基本正则表达式:BRE Basic Regular Expressions

扩展正则表达式:ERE Extended Regular Expressions

3.1 基本正则表达式元字符

3.1.1 字符匹配

3.2 扩展正则表达式元字符

3.2.1 字符匹配

3.2.2 匹配次数

3.2.3 位置锚定

4 文本处理三剑客

grep 命令主要对文本的(正则表达式)行基于模式进行过滤

sedstream editor,文本编辑工具

awkLinux上的实现gawk,文本报告生成器

第6天-文件查找和打包压缩

内容概述

locate

find

xargs

compressuncompress

gzipgunzip

bzip2bunzip2

xzunxz

zipunzip

tar

1 文件查找

在文件系统上查找符合条件的文件

文件查找:

非实时查找(数据库查找)locate

实时查找:find

2 压缩和解压缩

主要针对单个文件压缩,而非目录

2.1 compress  uncompress

此工具来自于ncompress包,此工具目前已经很少使用

对应的文件是 .Z 后缀

3 打包和解包

3.1 tar

tar  Tape ARchive 磁带归档,可以对目录和多个文件打包成一个文件进行归档;

其本身不具备压缩功能,但可以使用参数调用相应的压缩命令进行压缩;

此命令可以保留文件属性,推荐使用;

对应的文件是 .tar 后缀

第7天-shell脚本编程-基础

内容概述

编程基础

脚本基本格式

变量

运算

条件测试

配置用户环境

流程控制

函数

脚本工具

数组

字符串处理

高级变量

1 编程基础

2 shell 脚本语言的基本用法

2.1 shell 脚本的用途

将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率

减少手工命令的输入,一定程度上避免人为错误

将软件或应用的安装及配置实现标准化

用于实现日常性的,重复性的,非交互式的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

2.6 shell 脚本调试

写一个脚本,获取主机系统信息,包括CPU型号,内存大小,硬盘大小,操作系统版本这四个指标

root@ubuntu2204 ~]# vim sysinfo-v1.sh
#!/bin/bash
lscpu | sed -nr 's/^Model name: +(.*)/\1/p'
cat /proc/meminfo | head -n 1 | tr -s " " | cut -d" " -f2,3
lsblk /dev/sda | grep "^sda" | tr -s " " | cut -d" " -f4
cat /etc/os-release | sed -nr "s/^VERSION=\"(.*)\"/\1/p"
[root@ubuntu2204 ~]# bash sysinfo-v1.sh

第二个版本

#!/bin/bash
echo -e "CPU
\c"
lscpu | sed -nr 's/^Model name: +(.*)/\1/p'
echo -e "Mem
\c"
cat /proc/meminfo | head -n 1 | tr -s " " | cut -d" " -f2,3
echo -e "DISK
\c"
lsblk /dev/sda | grep "^sda" | tr -s " " | cut -d" " -f4
echo -e "OS
\c"
cat /etc/os-release | sed -nr "s/^VERSION=\"(.*)\"/\1/p"
[root@ubuntu2204 ~]# bash sysinfo-v2.sh
第三个版本
#!/bin/bash
echo -e "========================= sysinfo begin ================\n"
echo -e "CPU
\c"
echo -e "\E[1;32m `lscpu | sed -nr 's/^Model name: +(.*)/\1/p'` \E[0m"
echo -e "Mem
\c"
echo -e "\E[1;32m `cat /proc/meminfo | head -n 1 | tr -s " " | cut -d" " -f2,3` \E[0m"
echo -e "DISK
\c"
echo -e "\E[1;32m `lsblk /dev/sda | grep "^sda" | tr -s " " | cut -d" " -f4` \E[0m"
echo -e "OS
\c"
echo -e "\E[1;32m `cat /etc/os-release | sed -nr 's/^VERSION=\"(.*)\"/\1/p'` \E[0m"
echo -e "\n========================= sysinfo end =================="
[root@ubuntu2204 ~]# bash sysinfo-v3.sh

2.7 变量

2.7.1 变量

变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据

数据要存在内存空间中,而内存空间又是通过内存地址来访问的,但内存地址一般是16进制的编号;

为了方便使用,就有了变量名,当访问一个变量时,实际是访问其对应的内存地址的那块内存空间;

练习:

1. 编写脚本 sysinfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核版 本,CPU型号,内存大小,硬盘大小

2. 编写脚本 backup.sh,可实现每日将 /etc/ 目录备份到 /backup/etcYYYY-mm-dd

3. 编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值

4. 编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

2.8 格式化输出 printf

相当于增强版的 echo, 实现丰富的格式化输出

2.9 算术运算

2.10 逻辑运算

2.10.1 与或非

2.12 关于 ()  {}

( cmd1;cmd2;... )  { cmd1;cmd2;...; } 都可以将多个命令组合在一起,批量执行

( list ) 会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境

{ list; } 不会开启子shell, 在当前shell中运行,会影响当前shell环境,左侧要有空格,右侧要有; 结束

2.13 组合测试条件

2.13.1 第一种方式

练习

1. 编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户至少应该给 一个参数,并立即退出;如果参

数个数不小于1,则显示第一个参数所指向的文件中的空白行数

2. 编写脚本 hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提 示用户IP地址可访问;如果不

ping通,则提示用户IP地址不可访问

3. 编写脚本 checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满

4. 编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写

5. 编写脚本 excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限, 否则提示用户非脚本文件

6. 编写脚本 nologin.sh login.sh,实现禁止和允许普通用户登录系统

2.14 使用read命令来接受输入

使用read来把输入值分配给一个或多个shell变量,read从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个

变量,如果变量名没有指定,默认标准输入的值赋值给系统内置变量REPLY

3 bash shell 的配置文件

3.1 按生效范围划分两类

全局配置:针对所有用户皆有效

/etc/profile

/etc/profile.d/*.sh

/etc/bashrc

个人配置:只针对特定用户有效

~/.bash_profile

~/.bashrc

3.2 shell登录两种方式分类

3.2.1 交互式登录

直接通过终端输入账号密码登录

使用 su - UserName 切换的用户

3.2.2 非交互式登录

su UserName

图形界面下打开的终端

执行脚本

任何其它的bash实例

3.5 Bash 退出任务

保存在~/.bash_logout文件中(用户),在退出登录shell时运行

功能:

创建自动备份

清除临时文件

练习

1. 让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin

2. 用户 root 登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm -i’ cdnet=‘cd /etc/sysconfig/network-scripts/’

editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’ editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736  ifcfg-

ens33  (如果系统是 CentOS7)

3. 任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous

4. 编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等

4 流程控制

4.1 条件选择

4.1.1 条件判断分绍

4.1.1.1 单分支条件

4.1.1.2 多分支条件

4.1.1.2 多分支条件

4.2 循环

4.2.1 循环执行介绍

练习

1. 每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记 录于日志/var/log/login.log,并退

出脚本

2. 随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出 k

3. 用文件名做为参数,统计所有参数文件的总行数

4. 用二个以上的数字为参数,显示其中的最大值和最小值

5 函数 function

5.1 函数介绍

函数 function

是由若干条shell命令组成的语句块,实现代码重用和模块化编程

它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分

5.8 函数递归

函数递归:

函数直接或间接调用自身,注意递归层数,可能会陷入死循环

递归特点:

函数内部自已调用自已

必须有结束函数的出口语句,防止死循环

练习

1. 编写函数,实现OS的版本判断

2. 编写函数,实现取出当前系统eth0IP地址

3. 编写函数,实现打印绿色OK和红色FAILED

4. 编写函数,实现判断是否无位置参数,如无参数,提示错误

5. 编写函数,实现两个数字做为参数,返回大值

6. 编写服务脚本/root/bin/testsrv.sh,完成如下要求

6 其它脚本相关工具

6.1 信号捕捉 trap

trap 命令可以捕捉信号,修改信号原来的功能,实现自定义功能

在脚本或程序的执行过程中,我们可以通过发送信号的方式,打断或终止程序的执行过程,为了避免这种情况,我们可以使用信号捕捉,来

自定义信号处理。

6.2 创建临时文件 mktemp

mktemp 命令用于创建并显示临时文件,可避免冲突

6.3 安装复制文件 install

install 功能相当于cpchmodchownchgrp mkdir 等相关工具的集合

7 数组 array

7.1 数组介绍

变量:存储单个元素的内存空间

数组:存储多个元素的连续的内存空间,相当于多个变量的集合

数组名和索引

索引的编号从0开始,属于数值索引

索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

bash的数组支持稀疏格式(索引不连续)

7.7 数组数据处理

数组切片

${ARRAY[@]:offset:number}
${ARRAY[*]:offset:number}
offset
number
#要跳过的元素个数
#要取出的元素个数
#取偏移量之后的所有元素
{ARRAY[@]:offset}
{ARRAY[*]:offset}

8 字符串处理

8.1 字符串切片

8.1.1 基于偏移量取字符串

9 高级变量

9.1 高级变量赋值

$str 为变量名,expr 为具体字符串

这些组合可以省掉一些 ifelse 的判断代码

9.3 变量间接引用

9.3.1 eval命令

eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描

第8天-软件管理

内容概述

软件运行环境

软件包基础

rpm包管理

yumdnf管理

定制yum仓库

编译安装

Ubuntu软件管理

1 软件运行和编译

1.1 软件相关概念

2 软件包和包管理器

2.1 软件包介绍

开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软

件。用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一个管理工具

dpkg也就应运而生,可用来管理deb后缀的""文件。从而著名的“package”概念第一次出现在

GNU/Linux系统中,稍后Red Hat才开发自己的rpm包管理系统。

3 包管理器rpm

CentOS系统上使用rpm命令管理程序包

功能:安装、卸载、升级、查询、校验、数据库维护

4 yumdnf

CentOS使用 yum, dnf 解决 rpm 的包依赖关系

YUM: Yellowdog Update Modififierrpm的前端程序,可解决软件包相关依赖性,可在多个库之间定

位软件包,up2date的替代工具

CentOS 8 dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的

5 Ubuntu 软件管理

Debian 软件包通常为预编译的二进制格式的扩展名“.deb”,类似 rpm 文件,因此安装快速,无需编译

软件。包文件包括特定功能或软件所必需的文件、元数据和指令

dpkgpackage manager for Debian,类似于rpm dpkg是基于Debian的系统的包管理器。可

以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项

aptAdvanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基

于客户/服务器架构(c/s)

5.4 snap 工具

Snap 包是 Ubuntu 16.04 LTS 发布时引入的新应用格式包。目前已流行在 Ubuntu 且在其他如

DebianArch LinuxFedoraKaili LinuxopenSUSERed Hat  Linux 发行版上通过 snapd 来安装使用 snap 应用。

6 程序包编译

序包编译安装:

源代码-->预处理-->编译-->汇编-->链接-->执行

多文件:文件中的代码之间,很可能存在跨文件依赖关系

虽然有很多开源软件将软件打成包,供人们使用,但并不是所有源代码都打成包,如果想使用开源软件,可能需要自已下载源码,进行编译安装。另外即使提供了包,但是生产中需要用于软件的某些特性,仍然需要自行编译安装。但是利用源代码编译安装是比较繁琐的,庆幸的是有相关的项目管理工具可以大大减少编译过程的复杂度。

6.4 C语言源代码编译安装过程

利用编译工具,通常只需要三个大的步骤

1. ./configure

(1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefifile.in

文件生成Makefile

(2) 检查依赖到的外部环境,如依赖的软件包

2. make 根据Makefifile文件,构建应用程序

make -j N

#并行编译,Ncpu 核数

3. make install 复制文件到相应路径

注意:安装前可以通过查看READMEINSTALL获取帮助

第9天-磁盘存储和文件系统

内容概述

磁盘结构

分区类型

管理分区

管理文件系统

挂载设备

管理swap空间

RAID管理

LVM管理

LVM快照

1 磁盘结构

1.1 设备文件

Linux 哲学思想:一切皆文件

对于硬件设备,在Linux系统中,也是以文件的形式呈现出来的

磁盘设备的设备文件命名

设备类型

设备文件命名

备注

1.2 硬盘类型

硬盘接口类型

IDE:133MB/s,并行接口,早期家用电脑

SCSI640MB/s,并行接口,早期服务器

SATA6GbpsSATA数据端口与电源端口是分开的,即需要两条线,一条数据线,一条电源线

SAS6GbpsSAS是一整条线,数据端口与电源端口是一体化的,SAS中是包含供电线的,而

SATA中不包含供电线。SATA标准其实是SAS标准的一个子集,二者可兼容,SATA硬盘可以插入

SAS主板上,反之不行

USB480MB/s

M.2

注意:速度不是由单纯的接口类型决定,支持Nvme协议硬盘速度是最快的

硬盘存储术语 CHS

2 管理存储

使用磁盘空间过程

1. 设备分区

2. 创建文件系统

3. 挂载新的文件系统

2.1 磁盘分区

2.1.1 为什么分区

优化I/O性能

实现磁盘空间配额限制

提高修复速度

隔离系统和程序

安装多个OS

采用不同文件系统

2.1.2 分区方式

两种分区方式:MBRGPT

2.2 文件系统

2.2.1 文件系统概念

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的

方法。

操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统

从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进

行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的

存取,安全控制,日志,压缩,加密等。

2.2.2 文件系统类型

Linux 常用文件系统

Windows 常用文件系统

Unix常用文件系统

网络文件系统

集群文件系统

分布式文件系统

RAW

裸文件系统,未经处理或者未经格式化产生的文件系统

2.3 挂载

挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问

入口的行为

卸载:为解除此关联关系的过程

把设备关联挂载点:mount Point

挂载点下原有文件在挂载完成后会被临时隐藏,因此,挂载点目录一般为空 进程正在使用中的设备无法被卸载

2.3.1 挂载文件系统 mount

2.3.2 卸载文件系统 umount

卸载时:可使用设备,也可以使用挂载点

2.3.3 查看挂载情况

查看挂载

2.3.4 持久挂载

将挂载保存到 /etc/fstab 中可以下次开机时,自动启用挂载

2.3.5 重新挂载

修改了/etc/fstab 文件中的挂载规则,无法通过 mount -a 生效,要执行执行挂载

mount -o remount MOUNTPOINT

2.4 处理交换文件和分区

2.4.1 swap 介绍

swap交换分区是系统RAM的补充,swap 分区支持虚拟内存。当没有足够的 RAM 保存系统处理的数据

时会将数据写入 swap 分区,当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。

配置过多 swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄

注意:为优化性能,可以将swap 分布存放,或高性能磁盘存放

2.5 移动介质

挂载意味着使外来的文件系统看起来如同是主目录树的一部分,所有移动介质也需要挂载,挂载点通常

/media /mnt

访问前,介质必须被挂载

摘除时,介质必须被卸载

按照默认设置,非根用户只能挂载某些设备(光盘、DVD、软盘、USB等等)

2.6 磁盘常见工具

2.6.1 文件系统查看工具 df

2.6.2 目录统计工具 du

2.6.3 文件工具 dd

dd 命令:convert and copy a file

3 RAID

3.1 什么是RAID

"RAID"一词是由David Patterson, Garth A. Gibson, Randy Katz 1987年在加州大学伯克利分校发明的。在19886SIGMOD会议上提交的文"A Case for Redundant Arrays of Inexpensive Disks"

(中文翻译:廉价磁盘冗余阵列案例) 中提出。为了提升磁盘系统性能,他们提出用许多块廉价的磁盘做成一个磁盘组,在性能上超过昂贵的大型机上的单个大容量磁盘。

文中同时定义了RAID5个级别:RAID 1RAID 2RAID 3RAID 4RAID 5,这些都被沿用至今。

旧称廉价磁盘冗余阵列 Redundant Array of Inexpensive Disks

现称独立硬盘冗余阵列( Redundant Array of Independent Disks

简称磁盘阵列

利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。

RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如:RAID 0RAID 1RAID 5RAID 6RAID 7RAID 01RAID 10RAID 50RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。

4 逻辑卷管理器(LVM

4.1 LVM介绍

LVM: Logical Volume Manager 可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小,

允许在多个物理设备间重新组织文件系统

LVM可以弹性的更改LVM的容量

实现过程

将设备指定为物理卷

用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent

PE)来定义的

在物理卷上创建的逻辑卷, 是由物理区域(PE)组成

可以在逻辑卷上创建文件系统并挂载

4.3 逻辑卷快照

4.3.1 逻辑卷快照原理

快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝,对于需要备份或者复制的现有数据

临时拷贝以及其它操作来说,快照是最合适的选择,快照只有在它们和原来的逻辑卷不同时才会消耗空

间, 建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照

逻辑卷管理器快照

快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移

动到快照区,没有改动的区域则由快照区和文件系统共享

逻辑卷快照工作原理

在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间

当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中

快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据

第10天-网络协议和通信

内容概述

网络概念

OSI模型

网络设备

TCP/IP

IP地址规划

1 网络基础

1.1 网络概念

计算机网络是一组计算机或网络设备通过有形的线缆或无形的媒介如无线,连接起来,按照一定的规则,进行通信的集合。

网络功能和优点

数据和应用程序

资源

网络存储

备份设备

1.2 常见的网络物理组件

1.3 网络应用程序

1.3.1 各种网络应用

1.3.2 应用程序对网络的要求

不同类型的应用程序对网络的要求有区别

1.4 网络的特征

速度、成本、安全性、可靠性、可用性、可扩展性、拓扑

在计算机网络或者是网络运营商中,一般宽带速率的单位用bps(b/s)表示;

bpsbits per second的缩写,表示比特/秒;即表示每秒钟传输多少位信息;

所以运营商所说的1M带宽的意思是 1Mbps(兆比特每秒,不是兆字节每秒);

1.4.2 网络拓扑

拓扑结构一般是指由点和线排列成的几何图形

计算机网络的拓扑结构是指一个网络的通信链路和计算机结点相互连接构成的几何图形

拓扑分类

物理拓扑

物理拓扑描述了物理设备的布线方式。

网络的物理拓扑指的是设备和电缆的物理布局。必须选择与需要安装的电缆类型匹配的恰当的物理拓扑。

逻辑拓扑

逻辑拓扑描述了信息在网络中流动的方式。

网络的逻辑拓扑表示信号从网络一个点传输到另一个点的逻辑路径。也就是说,数据访问网络介质,并通过网络介质传输数据包的方式。

拓扑结构分类

拓扑结构图

各拓扑结构的特点

总线拓扑

总线拓扑通常也称为线性总线,总线拓扑中的所有设备均由一条线缆进行连接。

在总线拓扑中,一条线缆从一台设备延伸到另一设备,类似于城市中的公交线路。主线缆段的末端必须采用终结端,当信号到达线路或线缆末端时,终结端将吸收信号。如果不具备终结端,表示数据的电子信号将在线缆末端弹回,导致网络出错。

环形拓扑

在这种拓扑结构中,网络上的所有设备都以环的形式连接。环形拓扑不需要终止的开始端或结束端。数据的传输方式不同于总线拓扑。其中一种实施形式为:“令牌沿环移动,并在每台设备处停止。如果一台设备希望传输数据,则会在令牌中添加数据和目标地址。随后,令牌继续沿环移动,直至最终找到目标设备,目标设备将从令牌中获取数据。这类方法的优势在于,数据包不会发生冲突。环形拓扑分为两种:单环和双环

单环拓扑

在单环拓扑中,网络上的所有设备共用一条线缆,数据单向传输。各设备等候轮到自己时再通过网络发送数据。但是,单环拓扑可能存在单一故障点的问题,一个故障就可能导致整个环形拓扑停止工作。

双环拓扑

在双环拓扑中,两个环形允许双向传输数据。这种设置能提供冗余(容错能力)。也就是说,如果一个环发生故障,数据仍可在另一个环上传输。

星形和扩展星形拓扑

星形拓扑是以太网LAN中最常见的物理拓扑。在星形网络扩展为包含连接主要网络设备的附加网络设备时,即称其为扩展星形拓扑。

星形拓扑

星形拓扑将表现为车轮轮辐的形式。它包含一个中央连接点,该点是集线器、交换机或路由器等设备,所有线缆段均汇集于这一点。网络上的所有设备均使用自己的线缆连接到中央设备。

扩展星形拓扑

扩展星形拓扑的一种常见部署方式就是分层设计,例如WAN、企业LAN或园区LAN

纯粹的扩展星形拓扑的问题在于,如果中央节点发生故障,大部分网络就会被隔离。因此,大多数扩展星形拓扑都采用一组独立连接设备之外的冗余连接,以避免在设备发生故障时造成隔离。

网状和部分网状拓扑

网状拓扑提供了星形拓扑中设备间的冗余。网络可以是完全网状的,也可以是部分网状的,具体取决于所需冗余级别。这种类型的拓扑有助于提高网络的可用性和可靠性。但是,这会提高成本,也会制约可扩展性。

全网状拓扑

全网状拓扑将所有设备(节点)彼此相连,以实现冗余和容错能力。其实施成本高、难度大。但这种拓扑的容错能力最强,因为任何一条链路的故障都不会影响网络的连通性。

连通线路计算公式:n(n-1)/2

部份网状拓扑在这种拓扑中,只有重要节点的设备与其它设备具有直接一一相连的线路,对于其它设备的数据传输,需要从其它节点中继,这种设计有一定的冗余和容错能力,也降低了全网状拓扑结构的成本和实施难度。

1.5 网络标准

1.5.1 网络标准和分层

旧模型:专有产品,由一个厂商控制应用程序和嵌入的软件

基于标准的模型:多厂商软件,分层方法

1.5 网络标准

1.5.1 网络标准和分层

旧模型:专有产品,由一个厂商控制应用程序和嵌入的软件

基于标准的模型:多厂商软件,分层方法

层次划分的必要性

计算机网络是由许多硬件、软件和协议交织起来的复杂系统。由于网络设计十分复杂,如何设计、组织

和实现计算机网络是一个挑战,必须要采用科学有效的方法。

层次划分的方法

网络的层应当具有相对独立的功能

梳理功能之间的关系,使一个功能可以为实现另一个功能提供必要的服务,从而形成系统的层次结

为提高系统的工作效率,相同或相近的功能仅在一个层次中实现,而且尽可能在较高的层次中实现

每一层只为相邻的上一层提供服务

层次划分的优点

各层之间相互独立,每一层只实现一种相对独立的功能,使问题复杂程度降低

灵活性好,各层内部的操作不会影响其他层

结构上可分割开,各层之间都可以采用最合适的技术来实现

易于实现和维护,因为整个系统已被分解成相对独立的子系统

能促进标准化工作,因为每一层的功能及其提供的服务都有了精确的说明

OSI 七层的记忆口诀

All People Seem To Need Data Process(物数网传会表应)

OSI 模型的七层结构

7 应用层

应用层(Application Layer)提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如:

HTTPHTTPSFTPTELNETSSHSMTPPOP3MySQL

6 表示层

表示层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式

5 会话层

会话层(Session Layer)负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。

4 传输层

传输层(Transport Layer)把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议

等发送信息。例如:传输控制协议(TCP)等。

3 网络层

网络层(Network Layer)决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成报文。

网络表头包含了网络数据。例如:互联网协议(IP)等。

2 数据链接层

数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形

成信息框(Data Frame)。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表

尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务

GPRS)等。分为两个子层:逻辑链路控制(logical link controlLLC)子层和介质访问控(Media

access controlMAC)子层。

1 物理层

物理层(Physical Layer)在局部局域网上传送数据帧(Data Frame),它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、主机接口卡等。

1.5.3 网络的通信过程

1.5.3.1 数据封装和数据解封

1.5.3.2 协议数据单元 PDU

PDU: Protocol Data Unit,协议数据单元是指对等层次之间传递的数据单位

发送方和接收方各层之间的PDU

1.5.3.3 三种通讯模式

三种通讯方式的区别在于目标,而不在于源

1.5.3.4 冲突域和广播域

冲突域

两个网络设备同时发送数据,如果发生了冲突,则两个设备处于同一个冲突域,反之,则各自处于不同的冲突域

广播域

一个网络设备发送广播,另一个设备收到了,则两个设备处于同一个广播域,反之,则各自处于不同的广播域

1.5.3.5 三种通讯机制

2 局域网 Local Area Network

2.1 概述

2.1.1 特点

网络为一个单位所拥有

地理范围和站点数目均有限

2.1.2 主要功能

资源共享和数据通信

2.1.3 优点

能方便地共享昂贵的外部设备、主机以及软件、数据。从一个站点可以访问全网

便于系统的扩展和逐渐演变,各设备的位置可灵活的调整和改变

提高系统的可靠性、可用性和易用性

2.1.4 标准

局域网标准

无线网络标准

中国国家无线网络标准:WAPI

Wi-Fi:无线保真(Wireless Fidelity),是Wi-Fi联盟制造商的商标做为产品的品牌认证,是一个创建于IEEE 802.11标准的无线局域网技术,Wi-Fi联盟成立于1999年,当时的名称叫做Wireless Ethernet Compatibility AllianceWECA)。在200210月,正式改名为Wi-Fi Alliance

2.2 组网设备

常见组网设备包括路由器(Router),交换机(Switch),集线器(Hub),中继器(Repeater),线缆等

2.2.1 网络线缆和接口

常见的网络线缆包括双绞线,同轴线,光纤线等;

双绞线就是我们常说的网线,又分为屏蔽双绞线(Shielded Twisted PairSTP)与非屏蔽双绞线

Unshielded Twisted PairUTP

2.2.2 网络适配器

网卡作用

进行串行/并行转换数据缓存

很短的等待时间

价格便宜

突破线缆的距离限制来扩展局域网段的距离

可用来连接不同的物理介质

缺点

采用中继器连接网络分支的数目要受具体的网络体系结构限制

中继器不能连接不同类型的网络

中继器没有隔离和过滤功能,无路由选择、交换、纠错/检错功能,一个分支出现故障可能会影响

到其他的每一个网络分支

使用中继器扩充网络距离是最简单最廉价的方法,但当负载增加时,网络性能急剧下降,所以只有

当网络负载很轻和网络时延要求不高的条件下才能使用

2.2.4 网桥和交换机

2.2.4.1 网桥 Bridge

网桥(Bridge)也叫桥接器,是连接两个局域网的一种存储/转发设备,根据MAC地址表对数据帧进行转发,可隔离碰撞域网桥将网络的多个网段在数据链路层连接起来,并对网络数据帧进行管

优点

缺点

过滤通信量

扩大了物理范围

提高了可靠性

可互连不同物理层、不同 MAC 子层和不同速率(如10 Mb/s  100 Mb/s 以太网)的局域网

存储转发增加了时延

MAC 子层并没有流量控制功能

具有不同 MAC 子层的网段桥接在一起时时延更大

网桥只适合于用户数不太多(不超过几百个)和通信量不太大的局域网,否则有时还会因传播过多的

广播信息而产生网络拥塞。这就是所谓的广播风暴

2.2.4.2 交换机 switch

交换机是工作在OSI参考模型数据链路层的设备,外表和集线器相似

它通过判断数据帧的目的MAC地址,从而将数据帧从合适端口发送出去

交换机是通过MAC地址的学习和维护更新机制来实现数据帧的转发

2.2.5 路由器 router

路由:把一个数据包从一个设备发送到不同网络里的另一个设备上去。这些工作依靠路由器来完成。路由器只关心网络的状态和决定网络中的最佳路径。路由的实现依靠路由器中的路由表来完成。

路由器功能:

工作在网络层

分隔广播域和冲突域

选择路由表中到达目标最好的路径

维护和检查路由信息

连接广域网

2.2.6 对比与总结

2.3 以太网技术

2.3.1 概述

以太网(Ethernet)是一种产生较早且使用相当广泛的局域网,由美国Xerox(施乐)公司的Palo Alto研究中心(简称为PARC)于20世纪70年代初期开始研究并于1975年研制成功。

2.3.2 以太网MAC帧格式

2.3.3 MAC地址

在局域网中,硬件地址又称为物理地址或MAC地址(因为这种地址用在MAC帧中)

IEEE 802标准为局域网规定了一种48位的全球地址(一般都简称为地址”),是局域网中每一台计算机固化在网卡ROM中的地址

IEEE 的注册管理机构 RA 负责向厂家分配地址字段的前三个字节(即高位 24 )

地址字段中的后三个字节(即低位 24 )由厂家自行指派,称为扩展标识符,必须保证生产出的适配器没有重复地址

2.3.4 冲突检测的载波侦听多路访问 CSMA/CD

主要用在早期的Hub环境中,用来解决冲突域的问题,现在主流的交换机上不再使用

2.4 虚拟局域网 VLAN

2.4.1 VLAN 原理

此技术可以用交换机来进行网络隔离,但要求交换机具有网络管理功能。

虚拟局域网 VLAN 是由一些局域网网段构成的与物理位置无关的逻辑组这些网段具有某些共同的需求。

每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的工作站是属于哪一个 VLAN。虚拟局域网

其实只是局域网给用户提供的一种服务,而并不是一种新型局域网

优点

1. 更有效地共享网络资源。如果用交换机构成较大的局域网,大量的广播报文就会使网络性能下降。

VLAN能将广播报文限制在本VLAN范围内,从而提升了网络的效能

2. 简化网络管理。当结点物理位置发生变化时,如跨越多个局域网,通过逻辑上配置VLAN即可形成网络设备的逻辑组,无需重新布线和改变IP地址等。这些逻辑组可以跨越一个或多个二层交换机

3. 提高网络的数据安全性。一个VLAN中的结点接收不到另一个VLAN中其他结点的帧

虚拟局域网的实现技术

1. 基于端口的VLAN

2. 基于MAC地址的VLAN

3. 基于协议的VLAN

4. 基于网络地址的VLAN

2.4.2 IEEE 802.1Q 帧结构

2.5 分层的网络架构

3 TCP/IP 协议栈

3.1 TCP/IP 标准

3.1.1 TCP/IP 介绍

Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议

TCP/IP是一个Protocol Stack,包括TCPIPUDPICMPRIPTELNETFTPSMTPARP等许多协议

最早发源于1969年美国国防部(缩写为DoD)的因特网的前身ARPA网络项目,198311日,TCP/IP

取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护

3.1.2 TCP/IP 分层

共定义了四层,和OSI参考模型的分层有对应关系

RFC文档:

https://www.ietf/rfc/rfc1122#section-1.3.3

RFC官方分为四层:

Application Layer

Transport Layer

Internet Layer

Link Layer(media-access)

TCP/IP 应用层

3.1.3 TCP/IP 通信过程

3.1.4 TCP/IPOSI模型的比较

相同点

两者都是以协议栈的概念为基础

协议栈中的协议彼此相互独立

下层对上层提供服务

不同点

OSI是先有模型;TCP/IP是先有协议,后有模型

OSI是国际标准,适用于各种协议栈;TCP/IP实际标准,只适用于TCP/IP网络

层次数量不同

3.2 transport 

TCPUDP对比

3.2.1 TCP

TCP:传输控制制协议 ( Transmission Control Protocol )

3.2.1.1 TCP特性

工作在传输层

面向连接协议

全双工协议

半关闭

将数据打包成段,排序

确认机制

数据恢复,重传

错误检查

流量控制,滑动窗口

拥塞控制,慢启动和拥塞避免算法

3.2.1.4 三次握手和四次挥手

TCP三次握手

seq 序号; ack 确认号

TCP四次挥手

MSL :Maximum Segment Lifetime

查看 MSL

[root@ubuntu2204 ~]# sysctl net.ipv4.tcp_fin_timeout

net.ipv4.tcp_fin_timeout = 60

[root@ubuntu2204 ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout

60

3.2.1.6 sync半连接和accept全连接队列

半连接:还没有完成3次握手的连接

全连接:己经完成三次握手,但没有被应用层提走的连接

注意,监听的 Socket 和真正用来传数据的 Socket 是两个:

一个叫作监听 Socket

一个叫作已连接 Socket

C/S 网络通信过程

3.2.1.5 有限状态机 FSM

3.2.1.7 TCP超时重传

异常网络状况下(开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传策略

3.2.1.8 拥塞控制

网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏。此情况称为拥塞

TCP为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制TCP拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分:慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)拥塞控制算法在Linux下有多种实现,比如reno算法、vegas算法和cubic算法等。它们或者部分或者全部实现了上述四个部分

3.2.2 UDP

UPD:用户数据报协议 ( User Datagram Protocol )

3.2.2.1 UDP特性

工作在传输层

提供不可靠的网络访问

非面向连接协议

有限的错误检查

传输性能高

无数据恢复特性

3.3 Internet

3.3.2 Address Resolution Protocol

3.3.2.1 ARP

ARP地址解析协议由互联网工程任务组(IETF)198211月发布的RFC 826中描述制定,是根据IP地址获取物理地址的一个TCP/IP协议。

主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存。

3.3.3 Reverse Address Resolution Protocol

RARP 反向ARP,即将MAC转换成IP

3.3.4 internet 协议

3.3.4.1 Internet 协议特征

运行于 OSI 网络层

面向无连接的协议

独立处理数据包

分层编址

尽力而为传输

无数据恢复功能

3.4 主机到主机的包传递完整过程

3.5 IP地址

3.5.1 IP地址组成

它们可唯一标识 IP 网络中的每台设备 ,每台主机(计算机、网络设备、外围设备)必须具有唯一的地址

mac 属于物理地址,mac 地址不可变,一出厂就写死,标识惟一设备

ip 属于逻辑地址,逻辑地址可修改,人为赋予,可以修改,使用灵活,便于管理

ipv4 32位二进制,以十进制显示

ipv6 128位二进制,以十六进制显示

3.5.2 IP地址分类

各类IP特点

3.5.3 公共和私有IP地址

公共IP地址:互联网上设备拥有的唯一地址

私有IP地址:不直接用于互联网,通常在局域网中使用

3.5.4 特殊地址

3.5.5 保留地址

在一个IP地址中,如果主机ID全为0,或主机ID全为1,则该地址是保留地址

如在B127.16 网段中,172.16.0.0  172.16.255.255 为保留地址

3.5.6 子网掩码

CIDR:无类域间路由,目前的网络已不再按ABC类划分网段,可以任意指定网段的范围

CIDR 无类域间路由表示法:IP/网络ID位数,如:172.16.0.100/16

netmask子网掩码:32位或128位(IPv6)的数字,和IP成对使用,用来确认IP地址中的网络ID和主机ID,对应网络ID的位为1,对应主机ID的位为0,范例:255.255.255.0 ,表现为连续的高位为1,连续的低位为0

范例:

IP地址

172.16.0.0

子网掩码

11111111.11111111.00000000.00000000

255.255.0.0

子网掩码十进制表示

子网掩码的八位

相关公式

一个网络的最多的主机数 2 ^ 主机ID位数 - 2

网络(段)数 = 2 ^ 网络ID中可变的位数

网络ID = IP  netmask

用不同命令查看ipnetmask

[root@ubuntu2204 ~]# ifconfig eth0

不同ip类型对应netmask

判断对方主机是否在同一个网段:

用自已的子网掩码分别和自已的IP及对方的IP相与,比较结果,相同则同一网络,不同则不同网段

#10.0.0.100/24, 10.0.1.100/24

#上述两个IP地址不在同一个网段,netmask都是24,则表示ip前三段是网络ID,两个网络ID不一样,所以

不是同一个网段

#10.0.0.100/16, 10.0.1.100/16

#上述两个IP地址在同一个网段,netmask都是16,则表示ip前两段是网络ID,两个网络ID一样,所以是同一个网段

#10.0.0.100/24, 10.0.1.100/16

#上述两个IP是否在同一个网段,要分情况

#10.0.0.100/24 ----> 10.0.1.100/16 

#10.0.0.100/24 = 10.0.0.100/255.255.255.0

#00001010.00000000.00000000.01100100  IP 

#11111111.11111111.11111111.00000000   netmask

#00001010.00000000.00000000.00000000  网络ID 10.0.0.0

#此处也要和前面的netmask与运算,而不是自己的

#10.0.1.100/24 = 10.0.1.100/255.255.255.0

#00001010.00000000.00000001.01100100  IP

#11111111.11111111.11111111.00000000 netmask

#00001010.00000000.00000001.00000000 网络ID 10.0.1.0

#结论:10.0.0.0 != 10.0.1.0,所以两者不在同一个网段

#10.0.1.100/16 ----> 10.0.0.100/24 

#结论,不用算,是同一个网段

#IP AIP B通信时,都是用IP Anetmask去算IP Bnetmask,因为在通信前,IP A不知道IP B的netmask值,只能用自己IP与运算

3.5.7 划分子网

划分子网:将一个大的网络(主机数多)划分成多个小的网络(主机数少),主机ID位数变少,网络ID位数变多,网络ID位向主机ID位借n,将划分2^n个子网

3.5.9 跨网络通信

跨网络通信:路由, 选择路径

路由分类:

主机路由

网络路由

默认路由

优先级:精度越高,优先级越高

3.5.10 动态主机配置协议 DHCP

第11天-网络属性及相关配置工具

内容概述

统一网卡名称

网卡配置

常用网络管理命令

软路由

软交换

多网卡绑定

网络测试工具

1 网络配置

1.1 NAT和仅主机

VMware 中的网络模式

1.2 统一网卡名称

CentOS 6之前,网络接口使用连续号码命名:eth0eth1等,但是,如果再新增硬件设备,也有可能会

被识别成 eth0eth1 等;

CentOS 7开始,改变了网卡设备命名规则,基于硬件生成网卡名,例如 ens33ens160 等,可以保证

网卡名称稳定且唯一;但是在批量环境中,没办法统一;

出于批量管理,以及脚本的通用性等方面的考虑;

在某些情况下,需要将新的网卡命名规则改成传统的命名方式;即将 ens33ens160等名称改为eth0,eth1 这样;

1.3 网络配置

将主机接入到网络,需要进行网络配置,每个网卡,都需要有对应的配置文件,才能永久生效

1.3.1 网络配置的两种方式

静态指定:

static,写在配置文件中,不会根据环境的改变而发生变化

动态分配:

DHCPDynamic Host Configuration Protocol,根据动态主机配置协议生成相应的配置

1.4 网络配置命令

1.4.1 主机名

hostname

hostname是临时有效,重启后消失

hostnamectl

写配置文件,永久有效

1.4.2 ifconfig 命令

该命令来自于net-tools包,建议使用 ip 代替

1.4.3 route 命令

该命令来自于net-tools包,建议使用 ip 代替

用主机实现软路由

用主机模拟路由器,打通多个网段,实现跨网段连通

拓扑图

常见路由协议算法

由上可知,从一个路由器要到达某个网段或主机,是通过路由接力的方式来实现的,网络一段段传输,

经由不同的路由器,最终到达目标网段或主机,而要去到某个地址,则路由器上必须要存有到达该地址

的路由表,根据实际情况,网络上有无数主机,一个路由器上不可能存有到达所有网段或主机的路由

表,这种情况也无法维护;

现实中的路由器上的路由表,都是由路由算法自动维护

常用的算法有 OSPFRIPMPLSBGP

1.4.5 netstat 命令

来自于net-tools包,建议使用 ss 代替

面试题:如何查看是哪个程序在监听端口

[root@ubuntu ~]# netstat -tunlp | grep ":22"

[root@ubuntu ~]# ss -ntulp | grep ":22"

[root@ubuntu ~]# lsof -i:22

1.4.7.2 管理路由

ip route 用法

1.4.8 ss 命令

来自于iproute包,代替netstatnetstat 通过遍历 /proc来获取 socket信息,ss 使用 netlink与内核

tcp_diag 模块通信获取 socket 信息

1.4.9 网络配置工具 nmcli

NetworkManager

NetworkManager 2004年由RedHat启动的项目,目的是让用户能更轻松的管理Linux中的网络,

1.5 网络配置文件

1.5.1 网络基本配置文件

CentOS 系列

IPMASKGWDNS相关的配置文件

/etc/sysconfig/network-scripts/ifcfg-IFACE

常用配置

1.5.3 本地主机名和IP地址的映射

优先于使用DNS前检查

getent hosts 查看/etc/hosts 内容

/etc/hosts

1.5.4 DNS域名解析

DNS 负责将域名转换成IP地址

#该文件内容根据网卡设备自动生成

/etc/resolv.conf

nameserver DNS_SERVER_IP1

nameserver DNS_SERVER_IP2

nameserver DNS_SERVER_IP3

search DOMAIN

1.6 网卡别名

将多个IP地址绑定到一个MAC

每个IP绑定到独立逻辑网卡,即网络别名,命名格式: ethX:Y,如:eth0:1 eth0:2eth0:3

1.7 多网卡 bonding

将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址

1.7.1 Bonding 聚合链路工作模式

1.8 网络组 Network Teaming

1.8.1 网络组工作模式

网络组:是将多个网卡聚合在一起方法,从而实现冗错和提高吞吐量

网络组不同于旧版中bonding技术,提供更好的性能和扩展性

常用工作模式

broadcast

roundrobin

random

activebackup

loadbalance

lacp (implements the 802.3ad Link Aggregation Control Protocol)

1.8.2 网络组实现

先添加两块仅主机模式的网卡

1.9 网桥(交换机)

1.9.1 桥接原理

此处的网桥是逻辑上的网桥,说的是网络上的一个桥梁,打通网路,而不是硬件设备。

桥接:把一台机器上的若干个网络接口连接起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。网桥就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。与网桥相连的主机就能通过交换机的报文转发而互相通信。

网络测试诊断工具

第12天-shel脚本编程-进程

第13天-进程-系统性能和计划任务

内容概述

进程相关概念

进程工具

系统性能相关工具

计划任务

1 进程和内存管理

1.1 什么是进程

进程是运行中的程序

Process: 运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位

进程IDProcess IDPID)号码被用来标记各个进程

UIDGID、和SELinux语境决定对文件系统的存取和访问权限

通常从执行进程的用户来继承

存在生命周期

进程创建:

init:第一个进程,从 CentOS7 以后为 systemd

进程:都由其父进程创建,fork(),父子关系,CoWCopy On Write (读时共享,写时复制)

每个进程都有自己的资源,由操作系统分配,内存,栈,文件描述符

进程,线程

进程

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。

进程的组成:进程一般由程序、数据集合和进程控制块三部分组成。

程序用于描述进程要完成的功能,是控制进程执行的指令集;

数据集合是程序在执行时所需要的数据和工作区;

程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。

进程具有的特征:

动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;

并发性:任何进程都可以同其他进程一起并发执行;

独立性:进程是系统进行资源分配和调度的一个独立单位;

结构性:进程由程序、数据和进程控制块三部分组成。

线程

在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。

后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程。

线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)

一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。

进程与线程的区别

进程是操作系统分配资源的最小单位;

线程是程序执行的CPU调度的最小单位;

一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;

进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;

调度和切换:线程上下文切换比进程上下文切换要快得多。

面试题: 查看进程中的线程

grep -i threads /proc/PID/status

查看进程的二进制文件

ll /proc/PID/exe

查看进程打开的文件

/proc/PID/fd/

并行和并发

1.3.4 进程使用内存问题

1.3.4.1 内存泄漏:Memory Leak

指程序中用mallocnew申请了一块内存,但是没有用freedelete将内存释放,导致这块内存一直处于占用状态。

1.3.4.2 内存溢出:Memory Overflow

指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出。

1.3.4.3 内存不足:OOM

OOM  Out Of Memory内存用完了,这种情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到类似下面的提示

Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child

JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error,因为这个问题已经严重到不足以被应用处理)。

原因:

给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。

应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。

使用的解决办法:

1. 限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用

2. 给系统增加swap空间

1.4 进程状态

进程的基本状态

创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态;

就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行;

执行状态:进程处于就绪状态被调度后,进程进入执行状态;

阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用;

终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行;

状态之间转换六种情况

运行——>就绪:1:主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;

2:在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态;

就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求;

阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列;

以下两种状态是不可能发生的:

阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取;

就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态;

进程更多的状态:

运行态:running

就绪态:ready

睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable

停止态:stopped,暂停于内存,但不会被调度,除非手动启动

僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死

态的子进程

1.5 LRU 算法

LRULeast Recently Used 近期最少使用算法(喜新厌旧),释放内存

1.6 IPC 进程间通信

IPC: Inter Process Communication

同一主机:

不同主机:socket=IP和端口号

1.7 进程优先级

linux2.6内核将任务优先级进行了一个划分,实时优先级范围是0MAX_RT_PRIO-1(0-99),而普通进程的静态优先级范围是从MAX_RT_PRIOMAX_PRIO-1(100-139)

1.8 进程分类

操作系统分类:

协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用CPU,否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU ,主动放弃使用。

抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是

否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU

使用权,把它排在询问队列的最后,再去询问下一个任务。

进程类型:

守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程

前台进程:跟终端相关,通过终端启动的进程

注意:两者可相互转化

按进程资源使用的分类:

CPU-BoundCPU 密集型,非交互

IO-BoundIO 密集型,交互

2 进程管理和性能相关工具

Linux系统状态的查看及管理工具:

pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill,

job, bg, fg, nohup

2.1 进程树 pstree

pstree 可以用来显示进程的父子关系,以树形结构显示

2.2 进程信息 ps

ps: process state,可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中

2.3 查看进程信息 prtstat

可以显示进程信息,来自于psmisc

此命令显的数据,都来自于 /proc/PID/ 目录,此命令加以整理,以格式化形式显示

2.4 设置和调整进程优先级

进程优先级调整

静态优先级:100-139

进程默认启动时的nice值为0,优先级为120

只有根用户才能降低nice值(提高优先性)

nice命令

以指定的优先级来启动进程

2.5 搜索进程

进程搜索的常用命名:

ps options | grep 'pattern'

2.5.1 pgrep

2.5.2 pidof

2.6 负载查询 uptime

2.7 显示CPU相关统计 mpstat

2.8 查看进程实时状态 top  htop

2.9 内存空间 free

free 可以显示内存空间使用状态

2.10 进程对应的内存映射 pmap

查看进程的内存占用情况

2.11 虚拟内存信息 vmstat

虚拟内存

虚拟内存是操作系统提供的一种内存管理技术,操作系统会为每个进程分配一套独立的,连续的,私有的内存空间,让每个程序都以为自己独享所有主存的错觉,这样做的目的是方便内存管理。

程序所使用的内存是虚拟内存(Virtual Memory)

CPU使用的内存是物理内存(Physical Memory) MMU LTB

虚拟内存地址和物理内存地址之间的映射和转换由CPU中的内存管理单元(MMU)进行管理​​​​​​​

2.12 统计CPU和设备IO信息 iostat

iostat 可以提供更丰富的IO性能状态数

2.13 监视磁盘I/O iotop

iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括PID、用

户、I/O、进程等相关信息,可查看每个进程是如何使用IO

2.14 显示网络带宽使用情况 iftop

2.15 查看网络实时吞吐量 nload

2.16 查看进程网络带宽的使用情况 nethogs

2.17 网络监视工具iptraf-ng

来自于iptraf-ng包,可以进网络进行监控,对终端窗口大小有要求

2.18 系统资源统计 dstat

dstatpcp-system-tools包提供,但安装dstat包即可, 可用于代替 vmstatiostat功能

2.19 综合监控工具 glances

CentOS 系统通过 epel 源安装,glances 可查看当前主机相关信息,也可运行于C/S模式查看远程主机信息

2.20 查看进程打开文件 lsof

lsoflist open files,查看当前系统文件的工具。在linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等,

系统在后台都为该应用程序分配了一个文件描述符

2.22 CentOS 8 新特性 cockpit

cockpit包提供,当前UbuntuCentOS7也支持此工具

Cockpit CentOS 8 取入的新特性,是一个基于 Web 界面的应用,它提供了对系统的图形化管理

监控系统活动(CPU、内存、磁盘 IO 和网络流量)

查看系统日志条目

查看磁盘分区的容量

查看网络活动(发送和接收)

查看用户帐户

检查系统服务的状态

提取已安装应用的信息

查看和安装可用更新(如果以 root 身份登录)并在需要时重新启动系统

打开并使用终端窗口

2.23 信号发送 kill

kill:内部命令,可用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写

2.24 作业管理

Linux的作业控制

前台作业:通过终端启动,且启动后一直占据终端

后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

让作业运行于后台

运行中的作业: Ctrl+z

尚未启动的作业: COMMAND &

后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系

nohup COMMAND &>/dev/null &

screenCOMMAND

tmuxCOMMAND

Ctrl+z 使占据终端的进程暂停,让出终端

2.25 并行运行

利用后台执行,实现并行功能,即同时运行多个进程,提高效率

3 计划任务

通过任务计划,可以让系统自动的按时间或周期性任务执行任务

计划任务时间表示法:

面试题:11月每天的6-12点之间每隔2小时执行/app/bin/test.sh

#6,8,10,12点整共4次分别执行test.sh

0 6-12/2 * 11 * /app/bin/test.sh

第14天-Linux启动流程和内核管理及AWK

内容概述

CentOS 6 之前版本的启动流程

服务管理

Grub管理

启动排错

CentOS 7 以后版本启动流程

Unit 介绍

服务管理和查看

启动排错

破解口令

修复Grub2

内核优化

1 CentOS 6 的启动管理

1. 加载BIOS的硬件信息,获取第一个启动设备

2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息

3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

4. 核心执行init程序,并获取默认的运行信息

5. init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统

6. 启动核心的外挂模块

7. init执行运行的各个批处理文件(scripts)

8. init执行/etc/rc.d/rc.local

9. 执行/bin/login程序,等待用户登录

10. 登录之后开始以Shell控制主机

1.1 硬件启动POST

1.2 启动加载器 bootloader

init进程

init进程是一个由内核启动的用户级进程。

/sbin/init 程序的功能之一就是要挂载整个根文件系统, /sbin/init 这个程序的可执行文件,它自

己也是在根文件系统里面,

也就是说,得先运行 /sbin/init 程序才有文件目录结构树,但是得先有目录结构,才能通过

/sbin/init 这个路径找到可执行文件

1.2.3 grub 管理

启动界面的grub管理

该界面的默认项由 /boot/grub/grub.conf 中的配置项决定,用户可在此界面输入命令进行操作。

1.3 加载 kernel

1.4 init初始化

/sbin/init 程序是内核启动之后的第一个进程,也是进程树中的树根,所以其进程ID始终为1 

1.4.1 运行级别

运行级别:为系统运行或维护等目的而设定;0-67个级别,一般使用3, 5做为默认级别

1.4.2 初始化脚本 sysinit

系统初始化脚本功能

1. 设置主机名

2. 设置欢迎信息

3. 激活udevselinux

4. 挂载/etc/fstab文件中定义的文件系统

5. 检测根文件系统,并以读写方式重新挂载根文件系统

6. 设置系统时钟

7. 激活swap设备

8. 根据/etc/sysctl.conf文件设置内核参数

9. 激活lvmsoftware raid设备

1.4.5 开机启动文件 rc.local

正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向

/etc/rc.d/rc.local脚本

不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置

/etc/rc.d/rc.local文件中

/etc/rc.d/rc.local在指定运行级别脚本后运行

注意:默认Ubuntu  /etc/rc.local 文件,需要手动创建并添加可执行权限,首行必须有shebang机制

1.5 CentOS 6 启动过程总结

2 systemd和启动流程

2.1 systemd 特性

Systemd:从 CentOS 7 版本之后开始用 systemd 实现init进程,系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程​​​​​​​

Systemd 新特性

系统引导时实现服务并行启动

按需启动守护进程

自动化的服务依赖关系管理

同时采用socket式与D-Bus总线式激活服务

socket与服务程序分离

向后兼容sysv init脚本

使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务,

systemctl无法与之通信和控制

系统状态快照

systemd 中的 unit

unit表示不同类型的systemd对象,通过配置文件进行标识和配置;

文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息

查看Unit类型

#查看unit类型

[root@ubuntu ~]# systemctl -t help

2.2 service 系统服务管理

2.3 service unit 文件格式

2.4 运行级别

centOS7开始,使用 target 来定义运行级别

查看所有target

[root@ubuntu ~]# ll /usr/lib/systemd/system/*target

......

......

[root@ubuntu ~]# systemctl list-unit-files --type target --all

......

......

centOS7之后的 runlevel 不再定义在 /etc/inittab 文件中,且 ubuntu 中没有该文件

[root@rocky86 ~]# cat /etc/inittab

# inittab is no longer used.

2.5 修改启动参数

#无限重启,这样设置后将无法进系统

[root@rocky86 ~]# systemctl set-default reboot.target

Removed /etc/systemd/system/default.target.

Created symlink /etc/systemd/system/default.target 

/usr/lib/systemd/system/reboot.target.

2.6 CentOS 7之后版本引导顺序

1. UEFiBIOS初始化,运行POST开机自检

2. 选择启动设备

3. 引导装载程序, centos7grub2,加载装载程序的配置文件: /etc/grub.d/

/etc/default/grub /boot/grub2/grub.cfg

4. 加载initramfs

2.7 破解 root 密码

破解CentOS87root密码

方法一

启动时任意键暂停启动

e键进入编辑模式

将光标移动linux 开始的行,添加内核参数 rd.break

ctrl+x启动

mount –o remount,rw /sysroot

chroot /sysroot

passwd root

#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行

touch /.autorelabel

exit

reboot

方法二

#此方式也适用于ubuntu18.04

启动时任意键暂停启动

e键进入编辑模式

将光标移动linux 开始的行,添加 rw init=/sysroot/bin/sh

ctrl+x启动

chroot /sysroot

passwd root

#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行

touch /.autorelabel

exit

reboot

2.8 grub2 安全

3 内核参数管理

sysctl 命令用来配置linux 系统内核参数,这些参数以文件的形式显示在 /proc/sys/ 目录中,

配置项就是目录名加文件名,值就是该文件中的内容

注意:不是所有内核参数都是可以被修改的

查看所有配置项

#内核参数配置目录

[root@ubuntu ~]# ll /proc/sys

total 0

1 root root 0 May 21 08:48 abi/

1 root root 0 May 21 08:48 debug/

1 root root 0 May 21 08:48 dev/

1 root root 0 May 21 08:43 fs/

1 root root 0 May 21 08:42 kernel/

1 root root 0 May 21 08:43 net/

1 root root 0 May 21 08:48 sunrpc/

1 root root 0 May 21 08:48 user/

1 root root 0 May 21 08:43 vm/

[root@ubuntu ~]# ll /proc/sys/net/ipv4/ip_forward

-rw-r--r-- 1 root root 0 May 21 08:48 /proc/sys/net/ipv4/ip_forward

[root@ubuntu ~]# cat /proc/sys/net/ipv4/ip_forward

0

sysctl 格式

sysctl [options] [variable[=value] ...]

第15天-加密和安全

内容概述

安全机制

对称和非对称加密

散列算法

PKICA

openssl

证书管理

ssh服务

权限授权管理 Sudo

PAM模块

时间同步服务

1 安全机制

如果这件事情有可能会出问题,那么它就一定会出问题

1.2 信息安全防护的目标

信息安全最终要达到的目标如下:

1.3 安全防护环节

1.4 常见的安全攻击 STRIDE

1.5 安全设计基本原则

使用成熟的安全系统

以小人之心度输入数据

外部系统是不安全的

最小授权

减少外部接口

缺省使用安全模式

安全不是似是而非

STRIDE思考

在入口处检查

从管理上保护好你的系统

1.6 常用安全技术

认证

授权

审计

安全通信

1.7 加密算法和协议

古代曾出现凯撒密码的加密方式,用于军事信息的加密处理;

近代战争中有用到摩斯密码发电报,传送信息;

发展到现在,加密技术己经越来越先进,手段也越来越多样化了;

常用的加密算法包括:对称加密,非对称加密,单向加密

1.7.1 对称加密算法

对称加密:加密和解密使用同一个密钥

特性:

加密、解密使用同一个密钥,效率高;

将原始数据分割成固定大小的块,逐个进行加密

缺陷:

密钥过多

密钥分发

数据来源无法确认

常见对称加密算法:

DESData Encryption Standard56bits

3DES

AESAdvanced (128, 192, 256bits)

BlowfishTwofish

IDEARC6CAST5

1.7.2 非对称加密算法

1.7.2.1 非对称加密算法介绍

非对称加密:密钥是成对出现

公钥:public key,公开给所有人,主要给别人加密使用

私钥:secret keyprivate key 自己留存,必须保证其私密性,用于自已加密签名

特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然

功能:

数据加密:适合加密较小数据,比如: 加密对称密钥

数字签名:主要在于让接收方确认发送方身份

缺点:

密钥长,算法复杂

加密解密效率低下

常见算法:

RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,可实现加密和数字签名

DSADigital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准)

ECCElliptic Curves Cryptography):椭圆曲线密码编码学,比RSA加密算法使用更小的密钥,

提供相当的或更高等级的安全

1.7.2.2 非对称加密实现加密

1.7.2.3 非对称加密实现数字签名

1.7.2.4 RSADSA

RSA:公钥加密算法是1977年由Ron RivestAdi ShamirhLenAdleman在(美国麻省理工学院)开发的,RSA取名来自开发他们三者的名字,后成立RSA数据安全有限公司。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥

DSA (Digital Signature Algorithm)1991726日提交,并归属于David W. KravitzNSA员工,

DSASchnorrElGamal签名算法的变种,被美国NISTSS(DigitalSignature Standard) DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多

1.7.3 单向哈希算法

哈希算法:也称为散列算法,将任意数据缩小成固定大小的 指纹,称为digest,即摘要

特性:

任意长度输入,固定长度输出。

若修改数据,指纹也会改变,且有雪崩效应,数据的一点微小改变,生成的指纹值变化非常大。

无法从指纹中重新生成数据,即不可逆,具有单向性。

功能:数据完整性

常见算法:

算法不一样,得到的摘要长度也不一样

md5: (128bits)sha1: (160bits)sha224sha256sha384sha512

#md5 16进制显示, 32*4=128

[root@ubuntu ~]# md5sum /etc/issue

d5faf84af6529c6e6a364f164e953ff6 /etc/issue

常用工具

md5sum,sha1sum,sha256sum,sha512sum,openssl,gpg,rpm -V

1.7.4 综合应用多种加密算法

1.7.4.1 实现数据加密

实现数据加密,无法验证数据完整性和来源

Key(data)+Pb(key)

1.7.4.2 实现数字签名

不加密数据,可以保证数据来源的可靠性、数据的完整性和一致性

data+Sa(hash(data))

1.7.4.3 综合加密和签名

即实现数据加密,又可以保证数据来源的可靠性、数据的完整性和一致性

方法1Pb{Sa[hash(data)]+data}

方法2:对称key{Sa[hash(data)]+data}+Pb(对称key)

1.7.5 密码交换

密钥交换:IKE Internet Key Exchange 

公钥加密:用目标的公钥加密对称密钥

DH (Deffie-Hellman):生成对称(会话)密钥

DH 介绍

这个密钥交换方法,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin

Edward Hellman)在1976年发表

它是一种安全协议,让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密

钥,这个密钥一般作为对称加密的密钥而被双方在后续数据传输中使用。

DH数学原理是base离散对数问题。做类似事情的还有非对称加密类算法,如:RSA

其应用非常广泛,在SSHVPNHttps...都有应用,勘称现代密码基石

DH 实现过程:

A: g,p 协商生成公开的整数g, 大素数p

B: g,p

A:生成隐私数据:a (a<p),计算得出 g^a%p,发送给B

B:生成隐私数据:b,(b<p),计算得出 g^b%p,发送给A

A:计算得出 [(g^b%p)^a]%p = g^ab%p,生成为密钥

B:计算得出 [(g^a%p)^b]%p = g^ab%p,生成为密钥

DH 特点

泄密风险:私密数据ab在生成K后将被丢弃,因此不存在ab过长时间存在导致增加泄密风险。

中间人攻击:由于DH在传输pg时并无身份验证,所以有机会被实施中间人攻击,替换双方传输时的数据

​​​​​​​1.8 CA和证书

1.8.1 中间人攻击

Man-in-the-middle,简称为 MITM,中间人

1.8.2 CA和证书

证书类型

证书授权机构的证书

服务器证书

用户证书

获取证书两种方法

自签名的证书: 自已签发自己的公钥

使用证书授权机构:1 生成证书请求 csr2 将证书请求csr 发送给CA3 CA 颁发签名证书

1.8.3 安全协议 SSL/TLS

主要功能

机密性

认证

完整性

重放保护

1.8.4 HTTPS

HTTPS 协议:就是“HTTP 协议“SSL/TLS 协议的组合。HTTP over SSL  HTTP over TLS ,对http协议的文本数据进行加密处理后,成为二进制形式传输

1.8.4.2 HTTPS 工作的简化过程

1. 客户端发起HTTPS请求

用户在浏览器里输入一个https网址,然后连接到服务器的443端口。

2. 服务端的配置

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是

自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹

出提示页面。这套证书其实就是一对公钥和私钥。

3. 传送服务器的证书给客户端

证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等。

4. 客户端解析验证服务器证书

这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间

等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成

一个随机值。然后用证书中公钥对该随机值进行非对称加密。

5. 客户端将加密信息传送服务器

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务

端的通信就可以通过这个随机值来进行加密解密了。

6. 服务端解密信息

服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值。

7. 服务器加密信息并发送信息

服务器将数据利用随机值进行对称加密,再发送给客户端。

8. 客户端接收并解密信息

客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容。

2 OpenSS

2.2 Base64 编码

Base64是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法

2.3.1 openssl 单向哈希加密

2.3.2 openssl passwd 生成用户密码

2.3.3 openssl 生成随机数

2.3.4 openssl 实现密钥对

生成私钥,再从私钥中提取公钥

2.4 建立私有CA实现证书申请颁发

建立私有CA

OpenCAOpenCA开源组织使用PerlOpenSSL进行二次开发而成的一套完善的PKI免费软件

openssl:相关包 opensslopenssl-libs

证书申请及签署步骤:

1. 生成证书申请请求

2. RA核验

3. CA签署

4. 获取证书

3 ssh服务

3.1.1 公钥交换原理

1. 客户端发起链接请求

2. 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)

3. 客户端生成密钥对 ----- 没有实体文件

4. 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密

5. 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res

6. 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)

7. 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

3.1.2 ssh加密通讯原理

3.2 openssh 服务

3.2.2 客户端scp命令

scp 命令利用ssh协议在两台主机之间复制文件

3.2.3 rsync命令

scp 命令在复制文件时是全量复制,不管文件有没有改动,都是复制,速度慢,消耗资源

rsync工具可以基于sshrsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传

输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync

注意:通信两端主机都需要安装 rsync 软件

格式:

rsync [OPTION]... SRC [SRC]... DEST

#常用选项

-n|--dry-run

-v|--verbose

-r|--recursive

-p|--perms

#只测试,不执行

#显示详细过程

#递归复制

#保留权限属性

-t|--times

#保留修改时间戳

-g|--group

#保留组信息

-o|--owner

#保留所有者信息

-l|--links

#将软链接文件本身进行复制(默认)

#将软链接文件指向的文件复制

#如果接收者的文件比发送者的文件较

-L|--copy-links

-u|--update

新,将忽略同步

-z|--compress

-a|--archive

selinux

#压缩,节约网络带宽

#保留所有属性,但不包括acl

--delete

#如果源数据中的文件被删除,则目标

中的对应文件也要被删除,配合-r使用

--progress

#显示进度

--bwlimit=5120

#限速以KB为单位,5120表示5MB

范例:

[root@ubuntu ~]# ls -l ./0525/*

-rw-r--r-- 1 123 456 657 May 25 15:46 ./0525/fstab

-rw-r--r-- 1 123 456 24 May 25 15:46 ./0525/issue

[root@ubuntu ~]# rsync -av /root/0525 root@10.0.0.161:/tmp/

root@10.0.0.161's password:

sending incremental file list

0525/

0525/fstab

0525/issue

sent 884 bytes received 58 bytes 209.33 bytes/sec

total size is 681 speedup is 0.72

#查看目标机,属性保持一致

root@ubuntu:~# ls -l /tmp/0525/

3.2.4 自动登录 ssh工具 sshpass

EPEL源提供,ssh登陆不能在命令行中指定密码。sshpass的出现,解决了这一问题。sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码(本机known_hosts文件中有的主机才能生效)。它允许你用 -p 参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环境变量中读取。

3.2.5 ssh登录验证方式介绍

ssh服务登录的常用验证方式有两种,分别是基于用户/口令的方式验证和基于密钥的方式验证

基于用户和口令登录验证

1. 客户端发起ssh请求,服务器会把自己的公钥发送给用户

2. 用户会根据服务器发来的公钥对密码进行加密

3. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功

基于密钥的登录方式

1. 首先在客户端生成一对密钥(ssh-keygen

2. 并将客户端的公钥ssh-copy-id 拷贝到服务端

3. 当客户端再次发送一个连接请求,包括ip、用户名

4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:magedu

5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端

7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

3.2.6 实现基于密钥的登录方式

在客户端生成密钥对

把公钥文件传输至远程服务器对应用户的家目录

用脚本实现公钥批量部署

[root@ubuntu ~]# cat ssh_push.sh
#!/bin/bash
HOST="
10.0.0.161
10.0.0.210
"
PASS=123456
ssh-keygen -P "" -f /root/.ssh/id_rsa &>/dev/null
dpkg -l sshpass &>/dev/null || apt install -y sshpass &>/dev/null
for i in $HOST;do
{
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $i &>/dev/null
}&
done
wait

 多机互相打通

#先生成密钥对
[root@ubuntu ~]# ls .ssh/
[root@ubuntu ~]# ssh-keygen
......
......
[root@ubuntu ~]# ls .ssh/
id_rsa id_rsa.pub




 
#然后将公钥复制到本机
[root@ubuntu ~]# ssh-copy-id 127.1
......
......
[root@ubuntu ~]# ls .ssh/
authorized_keys id_rsa id_rsa.pub known_hosts known_hosts.old
#将 .ssh 目录整体复制到其它主机,这样表示多机共用密钥对
[root@ubuntu ~]# rsync -a .ssh 10.0.0.157:/root/
[root@ubuntu ~]# rsync -a .ssh 10.0.0.154:/root/
windows客户端工具 xshell 也可以配置公钥远程连接
3.2.7 ssh服务器配置
ssh 服务端常用配置
[root@ubuntu ~]# cat /etc/ssh/sshd_config
Port 22
#远程端口,生产建议修改
ListenAddress ip
LoginGraceTime 2m
PermitRootLogin yes
StrictModes yes
MaxAuthTries 6
#默认ubuntu不允许root远程ssh登录
#检查.ssh/文件的所有者,权限等
#一次连接,最多可以输错6次密码
#同一个连接最大会话,就是xshell上
MaxSessions 10
的复制ssh隧道,修改后对新连接生效
PubkeyAuthentication yes
PermitEmptyPasswords no
PasswordAuthentication yes
MaxStartups 10:30:100
PrintMotd no
#开启基于key验证
#不允许空密码连接
#开启基于用户名和密码连接
#未认证连接最大值,默认值10
#是否输出motd信息,改成yes 则
motd 会输出两次
PrintLastLog yes
UseDNS yes
#是否输出上次登录信息
#是否需要解析主机名,no可加快连接
速度
GSSAPIAuthentication yes
度可改为no
#是否开启客户端对IP反解析,提高速
#远程连接时的登录前提示
Banner /path/file



3.2.7 ssh服务器配置

[root@ubuntu ~]# cat /etc/ssh/sshd_config

ssh 服务的最佳实践

1. 建议使用非默认端口

2. 禁止使用protocol version 1

3. 限制可登录用户

4. 设定空闲会话超时时长

5. 利用防火墙设置ssh访问策略

6. 仅监听特定的IP地址

7. 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12|

xargs

8. 使用基于密钥的认证

9. 禁止使用空密码

10. 禁止root用户直接登录

11. 限制ssh的访问频度和并发在线数

12. 经常分析日志

第16天-加密和安全及时间同步服务

​​​​​​​4 利用 sudo 实现授权

sudo特性

1. sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员

2. sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器

3. sudo使用时间戳文件来执行类似的检票系统。当用户调用sudo并且输入它的密码时,用户获得

了一张存活期为5分钟的票

4. sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440

4.4 sudo 授权规则配置

配置文件:

/etc/sudoers

/etc/sudoers.d/*

5 PAM认证机制

PAM(Pluggable Authentication Modules) 插件式的验证模块

5.2 PAM架构

PAM提供了对所有服务进行认证的中央机制,适用于本地登录,远程登录等程序。

如:telnetrloginfshftp,点对点协议PPPsu等应用程序中。

5.4 PAM工作原理

PAM认证一般遵循这样的顺序:Service(服务)PAM(配置文件)pam_*.so

PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d/) 后调用认证文

(位于/lib64/security/)进行安全认证

ulimit命令

ulimitlinux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。

使用ulimit对参数进行修改,会立即生效,但其修改是临时性的,重新登录后无效。

而且ulimit 的修改,只影响当前的shell进程及其子进程,每个进程都有自己独有的limits 值。

如果想永久生效,可以写在 profile 文件中。

5.7.3 pam_google_authenticator 模块

MFAMulti-Factor Authentication ( 多因子验证)

是一种简单有效的最佳安全实践方法,它能够在用户名和密码之外再额外增加一层安全保护

pam_google_authenticator 功能:实现SSH登录的两次身份验证,先验证APP的数字码,再验证root用户的密码,都通过才可以登录。

6 时间同步服务

[root@ubuntu ~]# timedatectl set-ntp 0

[root@ubuntu ~]# date -s "+10 year"

Mon May 30 08:02:48 AM CST 2034

6.1 计时方式

Centos7上使用 ntpdate 对钟

Centos7上使用 rdate 对钟

可用定时任务实现周期性对钟

[root@c7 ~]# crontab -e

*/10 * * * * /usr/sbin/ntpdate ntp.aliyun

ntpdate 程序在 centos8之后取消了,而且这种对钟方式,在最近一个10分钟的周期内,如果出现了误差,则这10分钟内都是有问题的。

6.2 时间同步服务

多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等。

利用NTPNetwork Time Protocol 协议使网络中的各个计算机时间达到同步。

目前NTP协议属于运维基础架构中必备的基本服务之一。

主流的时间同步有两种实现方案

ntp

将系统时钟和世界协调时UTC同步,精度在局域网内可达0.1ms,在互联网上绝大多数的地方精度可以达到1-50ms

ntp 是使用渐进性同步机制,如果本地时间与标准时间相差较大,则需要一定的时间才能同步完成;该项目属于早期项目,在Centos8 后不再使用。

chrony

实现NTP协议的的自由软件。

可使系统时钟与NTP服务器,参考时钟(例如GPS接收器)以及使用手表和键盘的手动输入进行同步。

还可以作为NTPv4RFC 5905)服务器和对等体运行,为网络中的计算机提供时间服务。

设计用于在各种条件下良好运行,包括间歇性和高度拥挤的网络连接,温度变化(计算机时钟对温度敏感),以及不能连续运行或在虚拟机上运行的系统。

centos8中以后的源中,只有chrony,且默认己经安装

6.3 chrony

6.3.5 公共NTP服务

常用的公共ntp服务地址

6.3.6 时间工具

timedatectl :时间查看和设置工具

6.3.7 实现私有时间服务

在同一个网络内,如果有多个需要进行时间同步的服务器,则我们可以在内网自建NTP Server

这样可以节约访问外网的网络资源;另一方面,如果外网不可用,则至少可以保证,内网的NTP服务还是可用的。

架构图

实现

主机

第17天-域名解析DNS服务

内容概述

DNS 基础知识

在公有云上配置DNS解析

DNS相关命令

自建DNS

智能DNS解析介绍

1 DNS服务基础知识

1.1 相关基础概念

DNSDomain Name System (域名系统)

DNS 是互联网上解决网络中机器命名的一种系统。在网络中,一台主机去访问另外一台主机时,必须要知道目标主机的IP地址,虽然网络上的节点都可以用IP地址来标识,并且可以通过IP地址被访问。但对于自然人而言,一组组由数字组成的IP地址,是难以被理解和记忆的。于是设计出了域名系统,用一组有意义的字符来表示某个特定主机或某个网络,再将网络中主机IP地址和域名之间做成一个映射表。

DNS 就是负责维护主机IP地址和域名映射关系的服务,同时也提供域名解析服务,即人类通过域名访问某个主机或节点时,由DNS服务将人类可读的域名转换为机器可读的IP地址,再通过IP地址找到对应的主机。

在互联网时代,日常的工作和生活,只要涉及到网络,都己经离不开DNS服务了。

域名的管理

域名由因特网域名与地址管理机构(ICANNInternet Corporation for Assigned Names and Numbers)

管理,这是为承担域名系统管理、IP地址分配、协议参数配置,以及主服务器系统管理等职能而设立的

非盈利机构。

ICANN为不同的国家或地区设置了相应的顶级域名,这些域名通常都由两个英文字母组成。例如:.uk

表英国、.fr代表法国、.jp代表日本。中国的顶级域名是下的域名由CNNIC进行管理。

根域:全球共有13IPV4根域名服务器,其中10台在美国,2台在欧洲,1台在亚洲

一级域名:又称顶级域名,可分为三类,一类代表国家和地区(cnhk......),一类代表各类组织

(comedu......),以及反向域

二级域名:某个具体组织,单位,机构,商业公司或个人使用,需要向域名管理机构申请(付费)才能获得使用权

二级域名以下的域名,由使用该域名的组织自行分配

13IPV4根域名服务器,并不是说只有13台服务器,而是指有13IP地址向外提供一级域名的DNS解析服务,每个IP地址对应的,都是多机集群。

像根服务器这种公共DNS,一般都是使用任播(Anycast)技术来实现的。其原理比较复杂,简单来说,将多台服务器对外广播为同一个IP地址,然后网络上的主机在请求这个公共IP地址时,在路由过程中会被路径上最近的拥有该IP的服务器收到,如此,用户的请求总是会分配给最近的服务器。

为什么只有13台根服务器

这是由DNS服务的工作模式所决定的​​​​​​​

DNS服务工作于C/S模式下,使用UDP协议在客户端和服务端传送数据,为了更好的性能,DNS服务需要将服务端的响应内容限制在一个响应报文内返回给客端,而网络中的设备繁多,不同的设备设定的MTU值(传输控制单元)可能也是不一样的,为了保证在经过不同设备时,DNS的响应报文不会被重组(ipv4协议规定ip层的最小重组缓冲区大小为576),所以在DNS响应报文中,真正能用来传输数据的的空间大小为512字节,这个大小,限制了根服务器的数量和名字。

当我们查询根域(.)的NS记录时,512字节只够返回包含13个由A-M命名的根域名服务器的NS记录和A记录的响应。NS记录在回答区段中,A记录在额外信息区段中,A记录用于帮助你接下来向根域名服务器进一步查询。

实际上DNS同时占据了UDPTCP53端口,TCP 53端口主要用于主从DNS之间的数据同步。

1.2 DNS服务工作原理

主机中DNS客户端配置

当一台主机接入互联网时,在配置网络时,通常有两种方式,一种是从DHCP服务自动获得IP地址,另外一种是手动指定静态地址;

DHCP服务自动获取IP时,通常也会自动获得DNS服务器地址,手动配置静态地址时,也需要手动配置DNS服务器地址;

当用户使用主机 发送/接收 邮件,或浏览网页时,就是由主机上配置的DNS服务器地址负责将域名转换成对应的IP地址。

DNS服务解析域名流程

1.3 DNS查询类型

递归查询

是指DNS服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果DNS服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。

一般客户机和本地DNS服务器之间属于递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到最终的肯定或否定的结果后转交给客户机。

此查询的源和目标保持不变,为了查询结果只需要发起一次查询。

递归算法:客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->但它知道谁知道->他代为帮客户端去查找-->最后再返回最终结果。

迭代查询

是指DNS服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台DNS服务器的地址,用户再向这台DNS服务器提交请求,这样依次反复,直到返回查询结果。

一般情况下(有例外)本地的DNS服务器向其它DNS服务器的查询属于迭代查询,如:若对方不能返回权威的结果,则它会向下一个DNS服务器(参考前一个DNS服务器返回的结果)再次发起进行查询,直到返回查询的结果为止。此查询的源不变,但查询的目标不断变化,为查询结果一般需要发起多次查询。

迭代算法:客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->但它知道谁知道并推荐客户端应该找谁-->客户端自己去找它。

DNS缓存

DNS缓存是将解析数据存储在靠近发起请求的客户端的位置,也可以说DNS数据是可以缓存在任意位置,最终目的是以此减少递归查询过程,可以更快的让用户获得请求结果。

1.4 DNS解析类型

DNS服务器里面有两个区域,即 正向查找区域  反向查找区域

正向解析:将域名解析成IP地址

反向解析:根据IP地址得到该IP地址指向的域名

1.5 hosts文件

hosts文件是一个没有扩展名的系统文件,可以直接用文本编辑工具修改,在该文件中直接定义域名与IP地址的对应关系,当主机访问某个域名时,会先从hosts文件中寻找与该域名对应的IP地址,如果找到,则直接请求该IP地址,如果找不到,才会将该域名提交DNS服务请求解析该域名对应的IP地址。

操作系统规定,在进行DNS请求以前,先检查系统自己的Hosts文件中是否有这个域名和IP的映射关系。

如果有,则直接访问这个IP地址指定的网络位置,如果没有,再向已知的DNS服务器提出域名解析请求。也就是说HostsIP解析优先级比DNS要高。

hosts文件是引入DNS服务之前的解析方案

早期的 internet 网络规模非常小,一个hosts文件就可以定义所有的域名与IP地址的映射关系,管理机构提供该文件下载地址,并定期更新文件内容,以此来反映网络上的变化。

但随着时间的推移,接入 internet 的主机和域名越来越多,通过一个中心文件管理所有域名与IP地址映射关系己经不再可取,于是便引入了DNS服务

1.6 完整的查询请求流程

当主机请求一个域名时

1 先查询本地 hosts 文件,是否有对应IP地址,如果有,则直接访问该IP地址,域名解析服务结束;

2 如果本地 hosts 文件中没有对应IP地址,则查询本地DNS缓存,如果本地DNS缓存中有对应IP地址,则直接访问该IP地址,域名解析服务结束;

3 如果没有本地DNS缓存,或本地DNS缓存中没有该域名的IP地址,则请求主机配置的DNS服务器来解析该域名;

4 DNS服务器经过迭代查询,将查询结果返回给主机,主机根据返回结果访问对应IP地址;

2 在公有云上配置DNS解析

3 DNS检测工具

3.1 dig命令

dig(Domain Information Groper) 域名信息查询工具

dig 命令不会查询本地 hosts文件中定义的域名和IP对应关系

3.2 host命令

host 命令可以根据域名查询得到对应的服务器IP地址

host 命令不会查询本地 hosts文件中定义的域名和IP对应关系

3.3 nslookup 命令

nslookup(name server lookup),一个命令行下的网络工具,主要用来查询DNS记录,查看域名解析是否正常,也可用来诊断网络问题

nslookup 支持交互式和非交互式两种执行方式,在Windows系统中和Linux系统中都可以使用

nslookup 命令不会查询本地 hosts文件中定义的域名和IP对应关系,也不能查询dns的递归或者迭代

3.4 rndc命令

rndc  bind 程序的客户端工具,默认使用 TCP 953 端口连接 bind 服务器,进行管理

[root@ubuntu ~]# dpkg -S /usr/sbin/rndc

3.5 whois 命令

whois 命令可以查询域名注册信息

4 自建DNS服务

4.1 ubuntu 中的 systemd-resolved 服务

 ubuntu 系统中,虽然在网卡中配置了 DNS 服务器的IP地址,但在使用相关命令进行 DNS 解析时,默认的 DNS 服务器使用的是 127.0.0.53,而并不是我们在网卡上配置的DNS 服务器地址。

[root@ubuntu ~]# cat /etc/netplan/00-installer-config.yaml

systemd-resolved 服务为本地应用程序提供了网络名字解析服务, 系统通过它对外进行 dns 请求。

[root@ubuntu ~]# ll /etc/resolv.conf

lrwxrwxrwx 1 root root 39 Apr 21 2022 /etc/resolv.conf ->

../run/systemd/resolve/stub-resolv.conf

[root@ubuntu ~]# cat /etc/resolv.con

设置全局DNS

[root@ubuntu ~]# vim /etc/systemd/resolved.conf

网卡配置中再加上

[root@ubuntu ~]# cat /etc/netplan/00-installer-config.yaml

4.2 bind安装和配置

能实现DNS功能的软件有很多,像 bindpowerdnsdnsmasqunboundcoredns

bind(Berkeley Internet Name Domain)

bind 是一款实现DNS服务的开放源码软件,由伯克利大学开发,能够提供双向解析,转发,子域授权,view 等功能,使用广泛,目前Internet上半数以上的DNS服务器都是由Bind来实现的。

安装

[root@ubuntu ~]# apt install -y bind9

启动服务

[root@ubuntu ~]# systemctl enable --now named.service

4.2.1.1 配置文件解析流程

bind 配置文件

4.2.1.2 主配置文件 /etc/bind/named.conf

[root@ubuntu bind]# cat /etc/bind/named.conf

4.2.2 A 记录  AAAA记录

A 记录也称主机记录,是将主机域名解析到指定的物理机IPV4地址上

AAAA 记录是IPV6地址的主机记录,是将主机域名解析到指定物理机的IPV6地址上

A 记录是DNS解析服务中最常见的资源记录

4.2.3 CNAME 别名记录

记录别名,将域名解析到另一个域名

4.2.4 MX 记录

邮件交换 (MX) 记录将一个域的电子邮件定向到托管该域用户帐号的服务器(SMTP服务器)

一个域可以定义多条MX记录,但每条MX记录的优先级不同,如果邮件通过最高优先级记录无法递送,

则采用第二优先级,以此类推。

每个MX记录的value之前有一个数字(0-99),表示此服务器的优先级,数字越小优先级越高;

MX记录而言,任何一个MX记录后面的服务器名字,都应该在后续有一个A记录

4.2.5 NS 记录

域名服务器 (NS) 记录用于确定哪些服务器为一个网域提供DNS解析服务。

一般来说,为了服务的安全可靠,一个域名,至少应该有两条NS记录,保证服务的冗余,防止出现单点失败。

4.2.6 PTR 记录

PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域

4.2.7 SOA 记录

SOA记录是起始授权记录,用于设置当前DNS服务器的某些规则,SOA记录要放在整个文件的最开始。

SOA 记录表示此DNS是该域名的权威解析服务器,当在查询的过程中,各级缓存都没有要查询的内容时,最后会通过递归查询的方式到达此DNS服务器,并请求此域名的SOA记录。

4.2.8 TXT 记录

TXT记录是对域进行标识和说明的一种方式,一般用于验证记录,该记录的值可以是人工可读文本,也可以是机器可读文本,也可为空。

使用场景:做SPF(反垃圾邮件)记录,验证域名所有权

4.3 实现DNS自解析

在自建的DNS服务中实现域名的自解析

DNS SERVER 上实域名解析

新增 zones 记录

[root@ubuntu ~]# vim /etc/bind/named.conf.default-zones

设置具体解析规则

[root@ubuntu ~]# cat /etc/bind/db.linuxxxx

4.4 实现DNS自解析的主从

在现实环境中,一台主机通常需要配置多个DNS服务器,如果只有单个DNS服务器,则有可能会出现因为DNS服务当机,而无法解析域名的情况出现。

我们在实现DNS自解析的基础上,来实现DNS的主从

DNS主从同步的原理

主从服务之间数据同步,有两种方式

1. 主服务器向从服务器推送数据(PUSH)

2. 从服务器向主服务器拉取数据(PULL)

4.5 实现DNS自解析的反向解析

反向解析是指根据IP地址解析域名

4.6 实现DNS缓存

在客户端实现DNS缓存,可以保证在DNS服务不可用时,还能使用DNS在本地的缓存数据。

另外,本地缓存的存在,也加快了DNS的查询速度。

4.7 实现DNS自解析的子域

将子域委派给其它的DNS服务器解析,实现分布式DNS服务

4.8 实现DNS自解析的转发

当前我们配置的DNS,如果在自己无法解析后,将直接请求根域的DNS服务器解析。

在某些特定环境下,我们可以设置DNS转发服务,将当前无法解析的域名,转发给另外的DNS解析,如果还是无法解析,再提交互联网。

4.9 实现DNS自解析的视图

在同一台DNS服务器上,根据不同客户端,实现返回不同的解析结果。

这样可以做到将客户端解析到距离其物理地址最近的机房内,以达到加快访问速度,以及分流的目的

5 智能DNS解析介绍

5.1 GLSB 全局负载均衡

GLSBGlobal Server Load Balance,全局负载均衡。

GLSB 是在广域网上,对不同地域的服务器间的流量进行调度,通过判断服务器的负载,带宽的负载等,决定服务器的可用性,同时判断客户端与服务器之间的链路状况,选择与客户端最佳匹配的服务器,并将客户端请求调度到该服务器上。

因此GSLB是对服务器和链路进行综合判断来决定由哪个机房的服务器来提供服务,实现异地服务器群服务质量的保证。

GLSB 的实现有三种方式:基于DNS实现、基于重定向实现、基于路由协议实现,其中最通用的是基于DNS的实现。

GLSB 的使用范围:常用于有异地机房的WEB系统,或在CDN系统中作为核心的流量调度系统。

 5.2 内容分发网络 CDN

 CDN:(Content Delivery Network)内容分发网络

CDN 工作原理

1. 客户端请求 www.a ,如果是第一次请求,则需要向DNS服务器请求解析

2. www.a 的运维人员设置了CNANME 解析,将 www.a 解析到 www.acdn

3. www.acdn 会根据客户端IP地址,返回一个响应速度最快的IP节点给客户端

4. 客户端根据DNS解析得到的IP地址,访问该节点,该节点一般都是CDN服务器节点

5. 如果该CDN节点被访问时没有相关数据,则会将客户端请求通过内部网络转发到原站点获取数据,同时该CDN节点会将此次请求的内容缓存起来,这样下次该节点被访问时,就不用再去请求源站点​​​​​​​

第18天-Linux防火墙

内容概述

网络安全技术基础

防火墙的分类

Linux中的防火墙技术

iptables基础

iptables基本语法

iptables 匹配条件

iptables 优化实践

iptables 持久化保存

NAT网络转换原理

iptables中的NAT实现网络转换

firewalld介绍和基本使用

公有云中的安全组

1 网络安全技术基础

1.1 网络安全技术

目前主流的网络安全产品(技术)包括以下几类

1.1.1 入侵检测系统 IDS

IDSIntrusion Detection Systems (入侵检测系统)

其特点是不阻断任何网络访问,而是依照一定的安全策略,通过软,硬件,对网络,系统的运行状况进行监控,尽可能发现各种攻击企图,攻击行为或攻击结果,以保证网络系统资源的机密性,完整性和可用性。

本质上,IDS 是监听设备(系统),不用直接接入网络链路,网络流量也不用经过IDS。所以IDS一般以旁路部署的形入接入系统,然后在网络上收集它所关心的报文即可。对于收集到的报文数据,IDS会进行清洗统计,并与内置的规则进行比对和分析,从而得出哪些网络数据是入侵和攻击。根据模型和部署方式不同,IDS 可分为基于主机的IDS,基于网络的IDS,以及新一代的分布式IDS

基于主机的IDS

在每个要保护的主机上运行一个代理程序,一般只能检测该主机上发生的入侵。主要部署在重要的系统服务器,工作站上。IDS代理程序监控操作系统或系统事件级别的可疑活动(如尝试登录等)。在使用时需要清楚的定义哪些是不合法的活动,然后根据这些定义的规则来做检测。

基于网络的IDS

该类系统一般被动地在网络上监听整个网段上的信息流,通过捕获网络数据包,进行分析,能够检测该网络段上发生的网络入侵。

分布式IDS

一般由多个部件组成,分布在网络的各个部分,每个部件完成相应功能,分别进行数据采集、数据分析等。通过中心的控制部件,进行数据汇总、分析、产生入侵警报等。在这种 "分布式IDS(入侵检测系统)” 的结构下,不仅可以检测到针对单独主机的入侵,同时也可以检测到针对该网段上的主机的入侵。

1.1.2 入侵防御系统 IPS

IPS Intrusion Prevention System (入侵防御系统)

IPS 以串行的方式接入系统,IPS系统可以深度感知并检测经流的数据报文,可以根据预先设定的安全策略,对流经的每个报文进行深度检测(包括协议分析跟踪、特征匹配、流量统计分析、事件关联分析等),如果发现藏匿于其中的网络攻击,可以根据该攻击的威胁级别立即采取措施,这些措施包括中断连接,丢弃报文,隔离文件,向管理员告警等。

IPS可以分为 主机入侵防御系统,网络入侵防御系统,无线入侵防御系统等几类。

主机 IPS

主机IPS部署在终端主机节点上,主要用来保护单台主机,主机IPS与网络IPS结合使用效果更佳,对于能够规避网络IPS的威胁,主机IPS可以看是防御系统的最后一道防线。

网络 IPS

网络IPS一般部署在系统的战略位置上,所有进出的流量和报文,都要经由网络IPS,其作用在整个网络上。

无线 IPS

此类的入侵防御系统可以扫描无线网络,进行寻找未经授权的访问,并可以将未授权的设备移出网络。

1.1.3 防火墙 FW

FWFirewall

防火墙系统是在内部网络和外部网络之间,专用网络与公共网络之间,可信网络和不可信网络之间建立屏障。它是一种隔离技术,是在两个网络通讯时执行的一种访问控制尺度,它能允许经你 同意的个人和数据进入你的网络,同时将你 不同意 的个人和数据拒之门外,最大限度的阻止非法的流量和数据进入系统或网络。同时防火墙也可以根据规则禁止本地网络向外发送数据报文,以及根据规则转发网络流量等。

防火墙以串行的方式接入系统,所有流入流出的网络报文都要经由防火墙。根据工作模式不同,防火墙可以分为 网络层防火墙,应用层防火墙等。

1.1.4 防水墙 WW

WWWaterwall

与防火墙相对,防水墙是一种防止内部信息泄漏的安全产品。它利用透明加解密,身份认证,访问控制和审计跟踪等技术手段,对涉密信息,重要业务数据和技术专利等敏感信息的存储,传播和处理过程,实施安全保护;最大限度地防止敏感信息泄漏、被破坏和违规外传,并完整记录涉及敏感信息的操作日志,以便日后审计。

1.2 防火墙的分类

1.2.1 按照保护范围来划分

按照保护范围来划分,可以分为主机防火墙和网络防火墙。

主机防火墙

主机防火墙对单个主机进行防护,运行在终端主机上,主机防火墙可以阻止未授权的程序和数据出入计算机,WindowsLinux 系统都有自带的主机防火墙。

网络防火墙

网络防火墙部署在整个系统的主线网路上,对整个系统的出入数据进行过滤。

1.2.2 按实现方式划分

按实现方式来划分,可以分为硬件防火墙和软件防火墙。

硬件防火墙

硬件防火墙以独立硬件设备的形式提供服务,独立供电,独立部署,其软件是单独运行在硬件里面的,所有硬件资源都只给防火墙这一个程序使用。

常见的硬件防火墙生产厂商有 华为,天融信,启明星辰,绿盟,深信服等。

软件防火墙

没有独立硬件,一般以应用程序的形式提供,运行于通用硬件平台,寄生于操作系统中,是通过纯软件的方式提供服务。

1.2.3 按网络协议划分

按网络协议划分,可以分为网络层防火墙和应用层防火墙。

网络层防火墙工作在OSI七层模型中的网络层,又称包过滤防火墙。

应用层防火墙工作在OSI七层模型中的应用层,又称网关防火墙或代理服务器防火墙。

网络层防火墙

网络层防火墙对流经的数据包中的源地址,目标地址,端口号及协议等内容做出分析,依据事先设定好的过滤规则,对数据包作出不同的处理(包括拒绝,丢弃,放行,转发等)。这些过滤规则,被称为访问控制列表(ACL)

网络层防火墙只能根据数据包头部的协议端口号等进行过滤,无法过滤应用层的具体数据

应用层防火墙

应用层网只针对特别的网络应用服务协议来确定数据过滤逻辑。应用层网关防火墙是内部网和外部网的隔离点,它部署在主链路上,将系统分为两部份,起到内外部网络通讯时的中间转接作用。

1.3 网络架构

2 Linux 防火墙基础知识

2.1 netfilter 基础

netfilter/iptables 有三部分组成,分别是netfilter 框架/iptables(内核空间)/iptables 命令行工具(用户空间)

内核中netfilter相关的模块

[root@ubuntu ~]# grep -i netfilter /boot/config-5.15.0-73-generic

2.2 防火墙工具

2.2.1 iptables

由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包。

2.2.2 firewalld

redhat 系列的发行版中,从CentOS 7 版本开始,引入了新的前端管理工具。

2.2.3 nftables

此软件是 CentOS 8的新特性,Nftables 最初在法国巴黎的 Netfilter Workshop 2008 上发表,后由

netfilter核心团队成员和项目负责人Patrick McHardy 20093月发布。并于2013年末合并到Linux内核中,自2014年开始,己经在 3.13版本以以后的版本的内核中可用。

它重用了 netfilter框架的许多部份,例如连接跟踪和NAT功能。它还保留了命名法和基本iptables设计的几个部份,例如表,链和规则。就像iptables一样,充当链的容器,并且链包含单独的规则,这些规则可以执行操作,例如丢弃数据包,移至下一个规则或跳至新链。

从用户角度来看,nftables添加了名为 nft 的新工具,该工具是iptables及其衍生指令 (ip6tables

arptablesebtables)的超集,替代了iptables 及其衍生指令的中的所有工具。从体系结构的角度来看,它还替换了内核中处理数据包过滤规则集运行时评估的那些部分。

2.3 netfilter 工作原理

netfilter 在内核中某些位置放置了五个勾子函数(hook function),分别是 INPUTOUTPUT

FORWARDPREOUTINGPOSTROUTING,管理员可以通过配置工具配置规则,让这五个函数按照自定义的规则进行工作,达到防火墙的功能。

2.4 iptables 的组成

netfilter 在内核中设置了五个勾子函数,管理员在用户空间,通过程序设置过滤规则,内核中的勾子函数根据预设的规则进行工作,达到对流经的数据包进行过滤,拒绝,转发等功能。

iptables中有五个链(chain)对应内核中的五个勾子函数。除此之外,iptables中还有五个表

table),一起来配合工作。

表的优先级(从高到低)

security --> raw --> mangle --> nat --> filter

链和表的对应关系(不是每个链都能支持五个表)

数据包过滤匹配流程

当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要传送出去;

如果数据包是进入本机的,则会进入INPUT链,然后交由本机的应用程序处理;

如果数据包是要转发的,且内核允许转发,则数据包在PREROUTING链之后到达FORWARD链,再经由POSTROUTING链输出

本机的应用程序往外发送数据包,会先进入OUTPUT链,然后到达POSTROUTING链输出

数据流入:PREROUTING --> INPUT

数据流出:OUTPUT --> POSTROUTING

数据转发:PREROUTING --> FORWARD --> POSTROUTING

3 iptables

3.1 前置工作

 ubuntu 中,在用iptables命令设置防火墙之前,先关闭自带的 ufw 服务,因为 ufw 服务中也有一套自定义的规则,如果在开启 ufw 服务的情况下再用 iptables 设置或删除规则,容易发生冲突。

[root@ubuntu ~]# systemctl is-active ufw

[root@ubuntu ~]# systemctl disable --now ufw

 redhat 系中要先停用 firewalld 服务

[root@rocky86 ~]# systemctl is-active firewalld

active

#在开启firewalld服务情况下的 iptables 规则

[root@rocky86 ~]# iptables -L

停用firewalld服务

#centOS7,8

[root@rocky86 ~]# systemctl disable --now firewalld.service

再次查看,规则为空

[root@rocky86 ~]# iptables -L

3.2 iptables 命令组成

iptables 完整命令由四部份组成

完整格式示例

iptables -t filter -A INPUT -s 192.168.0.1 -j DROP

iptables 命令格式

iptables [-t table] {-A|-C|-D} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain target

iptables [-t table] -E old-chain-name new-chain-name

rule-specification = [matches...] [target]

match = -m matchname [per-match-options]

target = -j targetname [per-target-options]

#指定表

-t|--table table

用抓包工具分析

[root@ubuntu ~]# tcpdump -i ens33 -nn icmp

iptables 防火墙中的规则,在生效时会按照顺序,从上往下生效,当前一条规则命中后,不再继续往下匹配。

如果多条规则里面,匹配条件中有交集,或者有包含关系,则这些规则,要注意前后顺序,范围小的,需要精确匹配的,要往前放,范围大的,往后放,负责兜底的,放在最后。

如果多条规则里面,匹配条件没有交集,彼此不会互相影响,则无所谓前后顺序,但是从效率上来讲,更容易命中的要放在前面。

3.3 iptables 匹配条件

iptables 中的匹配条件分为基本匹配和扩展匹配两种,当一条 iptables 规则中有多个匹配条件时,默认是  ,即要同时满足。

3.4 target

3.5 规则优化最佳实践

安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高

谨慎放行入站的新请求有特殊目的限制访问功能,要在放行规则之前加以拒绝

同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理

不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更

高。应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率

设置默认策略,建议白名单(只放行特定连接)

默认规则(iptables -P)是 ACCEPT,不建议修改,容易出现 自杀 现象

规则的最后定义规则做为默认策略,推荐使用,放在最后一条

3.6 iptables 规则保存

使用iptables 命令定义的规则,手动删除之前,其生效期限为 kernel 存活期限,当系统重启之后,定义的规则会消失。

持久化保存规则

[root@ubuntu ~]# iptables -t filter -A INPUT -s 10.0.0.1 -j ACCEPT

[root@ubuntu ~]# iptables -L

3.7 网络防火墙

3.7.1 NAT 网络转换原理

当我们从运营商接入宽带之后,经过路由器,防火墙,交换机等各种设备,后面再接入终端机,包括打印机,手机,电脑等,在大多数情况下,我们在接入运营商的宽带后,会在使用(公司,学校,工厂,家庭)范围内组建一个局域网。

以我现在的工作机为例。

物理机的IP地址是 192.168.1.101,在物理机上运行着两台虚拟机,它们的IP 分别是 10.0.0.150 

10.0.0.151

但是这三台主机,在访问互联网时,互联网上得到的这三台主机的IP都是 219.143.130.7

NAT

NAT:(Network Address Translation) 网络地址转换

局域网中的主机都是分配的私有IP地址,这些IP地址在互联网上是不可达的,局域网中的主机,在与互联网通讯时,要经过网络地址转换,去到互联网时,变成公网IP地址对外发送数据。服务器返回数据时,也是返回到这个公网地址,再经由网络地址转换返回给局域网中的主机。

一个局域网中的主机,想要访问互联网,在出口处,应该有一个公网可达的IP地址,应该能将局域网中的IP地址通过NAT转换成公网IP

3.8 iptables 中的自定义链

iptables 中除了系统自带的五个链之外,还可以自定义链,来实现将规则进行分组,重复调用的目的。自定义链添加规则之后,要作为系统链的 target 与之关联,才能起到作用。

[root@ubuntu ~]# iptables -L

#添加自定义链

[root@ubuntu ~]# iptables -t filter -N web_chain

#查看

[root@ubuntu ~]# iptables -L

4 firewalld

4.1 firewalld 介绍

firewalld  CentOS 7.0 新推出的管理 netfilter 的用户空间软件工具,也被 ubuntu18.04 版以上所支持 (apt install firewalld)

firewalld 是配置和监控防火墙规则的系统守护进程,可以实现 iptablesip6tablesebtables 的功

能。

firewalld 服务由 firewalld 包提供。

firewalld 中有多个系统自带的 Zone,每个zone都对应不同的防火墙规则,使用不同的 Zone,就表使用不同的防火墙规则,每个Zone的具体规则可以进行修改,也可以自定义Zone

firewalld 三种配置方法

firewall-config 图形工具:需要安装 firewall-config 

firewall-cmd 命令行工具:来自于 firewalld 包,默认己安装

/etc/firewalld/* 配置文件:一般不直接修改配置文件来管理firewalld

4.2 firewall-config 工具

4.3 firewall-cmd 工具

firewall-cmd  firewalld 服务的命令行编辑工具

4.4 firewall rich rule

当基本 firewalld 语法不能满足需求时,可以使用更为复杂的规则

rich rules:富规则

相对于基本的 firewalld 语法规则,rich 规则能实现更丰富的功能,比如拒绝/允许,日志,端口转发,伪装和限制速率等。​​​​​​​

第19天-Linux防火墙和MySQL基础

5 公有云中的安全组

在公有云环境中,可以使用安全组来配置出入栈规则,来起到防火墙的作用

第20天-MySQL数据库-SQL语言

第21天-MySQL数据库-SQL语言和LAMP项目实现


 

第22天-运维自动化工具Ansible

内容概述

运维自动化发展历程及技术应用

Ansible 工作原理和基础命令

Ansible 常用模块

Ansible playbook 基础

Ansible playbook 进阶

Ansible 中的 Roles

公有云中的批量管理

1 自动化运维应用场景

1.1 云计算运维工程师核心职能

运维工程师的基本职责就是保障系统和服务的稳定性,稳定压倒一切,确保服务一年365天,每天24小时不间断的为用户提供服务,在此基础上运维工程师的工作内容还有很多:

提升效率:使用自动化的平台或工具,来提升项目在研发生命周期内的效率。

控制成本:通过技术手段对服务架构进行优化,或采用新的产品或技术,来达到降低成本,提升效

益的作用。

发布管理:构建自动化运维平台,来确保每次发版都安全可控。

变更管理:通过技术手段,对每次变更做要记录在案,有迹可循。

备份恢复:对重要数据采用定时备份机制,以便能在发生问题时能及时恢复数据。

灾难演练:定期对预定义方案进行演练,确保是可行的。

系统分析:通过采集并分析各类日志,定位并分析出系统可能存在的风险点,及时修正,以及做好

预案。

技术选型:根据当前服务的业务情况,选用不同的产品和架构,以达到业务与经济的平衡。

从项目的生命周期来讲,运维工程师的工作主要包括四个阶段:

项目首次上线:平台架构组建,基础环境和服务部署

日常运行维护:负责保障项目的稳定运行,版本迭代升级等

性能效率优化:当项目发展到一定阶段后,需要一些新的技术或方案来实现性能提升,成本优化等

项目下线:备份数据,释放资源

1.2 运维工程师的发展路线

运维工程师的打怪升级之路:从入门到进厂

运维的未来是什么?

一切皆自动化

运维的未来是,让研发人员能够借助工具、自动化和流程,并且让他们能够在运维干预极少的情况下部署和运营服务,从而实现自助服务。每个角色都应该努力使工作实现自动化。----------《运维的未来》

1.3 企业实际应用场景分析

开发环境

又称 Dev Env / Development Environment 环境

开发环境是位于安全服务器或者本地机器的软件或者网络应用的一个工作备份。开发者可以对于源代码进行修改以及上传独立的功能。由于工作版本 the working version 通常和编译器、debugging、测试工具一同工作,因此工作版本只在这个环境下起作用。开发人员通常会用一个精简版的数据库来检查特定的功能。

开发环境一般是开发工程师使用和管理

测试环境

又称 QA Env / Test Environment 环境

测试环境帮助我们测试产品的某一个特定部分。它要求不同的配置和数据配置,因此测试环境没有一个一键生成式的配置方法(不同于 staging environment)。测试环境的分支一般是develop分支,部署到公司私有的服务器或者局域网服务器上,主要用于测试是否存在bug,一般会不让用户和其他人看到。

测试环境一般是测试工程师使用和管理

生产环境

又称 Prod/ Production Environment 环境

生产环境是指正式提供对外服务的环境,一般连接上互联网即可访问。一般会关掉错误报告,打开错误日志。部署分支一般为master分支。开发人员在这个时点不会再做任何的修改,因为之前对于源代码的工作复制已经在运转中的服务器上了。源代码在经过详尽地测试以后,可以被 push 出来了。

生产环境一般由运维工程师负责管理。

除了上述三个主要环境之外,对于一些较为复杂的项目,还会有 回归环境,预发布环境,灰度环境等场景。

1.4 程序发布流程

发版前提:要发布的分支己进行充分测试,所有BUG己修复完成,所有预期功能都己经实现。测试结果通过。

发版时间:避开业务高峰期,避开节假日。

发版流程:

1. 在调度器上下线一批主机

2. 关闭服务

3. 部署新版本的应用程序

4. 启动服务

5. 观察和验证

6. 重新接入调度器

7. 观察和验证

对于重大版本更新或大型项目,我们可以采用灰度发布或蓝绿发布的模式进行更新,一次更新一部份,待验证完成后,再进行批量更新,以减少出现问题的概率。

1.5 自动化运维应用场景

1.6 常用的自动化运维工具

有代理和无代理

有代理是指需要在被管理的机器上预先安装客户端软件,类似于C/S架构。

无代理是指预先不需要在被管理的机器上做任何操作,只需要被管理机器的远程连接用户名和密码即可。

2 Ansible 基础

Ansible 是一个自动化运维工具,基于Python开发,集合了众多运维工具(puppetcfenginechef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

2.2 Ansible 的功能和特点

Ansible 的主要功能

批量执行远程命令,可以对远程的多台主机同时进行命令的执行批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务编排高级的企业级复杂的IT架构任务,Ansible  Playbook  role 可以轻松实现大型的IT复杂架构

提供自动化运维工具的开发 API 有很多运维工具,如 jumpserver 就是基于 ansible 实现自动化

管理功能

Ansible 的主要优点

部署简单方便,在对多机进行批量管量时,只需要在主控机上部署 Ansible 服务,被管理的机器不

用部署;

默认通过 SSH 协议进行通信,只要保证主控端和被控机 ssh 通道畅通,就能保证服务可用;

配置简单,上手快,功能强大;

 python 开发,打开源文件,所见即所得,对二次开发的支持非常友好;

大量常规运维操作己经内置;

对于较复杂的需求,可以通过 playbook 功能和 role 功能来实现;

还提供了操作方便,功能强大的的 web 管理界面;

是一个己经商业化很久的项目了,生态成熟,社区活跃,文档完善

Ansible 的不足

在管理的主机数量较多时,性能略差,执行效率不如 saltstack 

不支持事务回滚

2.3 Ansible 工作原理

执行流程

1. 加载配置文件,读取配置;

2. 加载对应的模块文件;

3. 根据命令或模块,生成一个临时的 py 文件,再将该文件传送至对应的被管理的机器上

($HOME/.ansible/tmp/ansible-tmp-xxx/xx.py)

4. 给远程的 py 文件加可执行权限

5. 执行该文件,并将结果抓取回当前的主机显示;

6. 删除远端的临时 py 文件

2.4 Ansible 命令执行来源

系统用户直接执行:系统用户登录终端后直接在命令行下执行单条命令

 playbooks 中间接执行,playbook中编写多条 ansible 命令,ansible 根据playbook文件的内容

依次执行

执行流程

1. 加载配置文件,读取配置;

2. 加载对应的模块文件;

3. 根据命令或模块,生成一个临时的 py 文件,再将该文件传送至对应的被管理的机器上

($HOME/.ansible/tmp/ansible-tmp-xxx/xx.py)

4. 给远程的 py 文件加可执行权限

5. 执行该文件,并将结果抓取回当前的主机显示;

6. 删除远端的临时 py 文件

2.4 Ansible 命令执行来源

系统用户直接执行:系统用户登录终端后直接在命令行下执行单条命令

 playbooks 中间接执行,playbook中编写多条 ansible 命令,ansible 根据playbook文件的内容

依次执行

 web 管理界面上执行

使用 API 调用执行:配置API接口,让第三方应用或程序调用接口执行 ansible 命令

2.5 使用注意事项

执行ansible的主机一般称为管理端, 主控端,中控,master 或堡垒机

主控端Python版本需要2.6或以上

被控端Python版本小于2.4,需要安装python-simplejson

被控端如开启SELinux需要安装libselinux-python

windows 不能做为主控端,只能做为被控制端

3 Ansible 安装和基本使用

3.1 Ansible 安装

官方安装文档

https://docs.ansible/ansible/latest/installation_guide/index.html

Rocky中安装 ansible

#需要先安装 epel 

[root@rocky ~]# yum install -y epel-release

[root@rocky ~]# yum install -y ansible

#rocky9

[root@rocky ~]# rpm -q ansible

ansible-7.2.0-1.el9.noarch

[root@rocky ~]# ansible --version

ansible [core 2.14.2]

3.2 Ansible 配置文件

3.2.1 查看 ansible 配置文件

3.2.2 主配置文件

Ansible 的主配置文件可以有多个,分别存放于不同目录,其优先级如下

3.2.3 主机清单配置文件

ansible 的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在 inventory 主机清单文件中将其分组组织主机定义支持 ip 地址和主机名两种方式,写法多种多样。

注意:

生产建议在每个项目目录下创建项目独立的hosts文件

通过项目目录下的ansible.cfg文件中的 inventory = ./hosts 实现

3.3 Ansible 工具

[root@ubuntu ~]# ls /usr/bin/ansible*

3.4 ansible-doc 命令用法

ansible-doc 工具用来查看 ansible 文档

3.5 ansible-console 命令用法

ansible-console 用来交互式执行命令,支持 tab 键补齐

格式

3.6 ansible 命令用法

3.6.1 ansible 命令基础用法

ansible 工具一般用来执行单条命令,使用频率较高

3.6.2 host-pattern 规则

host-pattern 用于匹配被管理的主机列表

范例:所有主机

[root@ubuntu ~]# ansible all --list

3.6.3 执行结果状态说明

绿色 执行成功,此次执行远程主机没有写行为发生(修改文件,删除文件,新增文件等)

黄色 执行成功,有发生变改

红色 执行失败

4 Ansible 常用模块

4.1 command 模块

此模块为 ansible 默认模块,可以省略 -m 选项,该模块用来在远程主机上执行 shell 命令,但有些操作不支持,比如管道,重定向,通配符等,如果要实现这些功能,可以用 shell 模块实现。

此模块不具有幂等性

#查看帮助

[root@ubuntu ~]# ansible-doc -s command

4.2 shell 模块

此模块用法和 command 模块类似,都是用来执行 shell 命令,但功能比 command 模块强大,对于在command 模块中不支持的功能,此处均可使用。此模块也不具有幂等性。

在调用shell模块执行命令时,复杂的命令也有可能会执行失败,类似于包含多重管道,正则表达式这些,这种情况下,我们需要写成 shell 脚本,用 copy 模块直接推送到远程执行。

#查看帮助

[root@ubuntu ~]# ansible-doc -s shell

4.3 script 模块

script 模块可以在远程主机上运行 ansible 机器上的脚本(而且脚本文件可以没有执行权限),这里的脚本并不仅仅只是 shell脚本,只要远程主机上能执行的,都可以,包括但不限于 php, sh, py 等。

此模块不具有幂等性。

#查看帮助

[root@ubuntu ~]# ansible-doc -s script

4.4 copy 模块

copy 模块将 ansible 主机上的文件复制到远程主机,此模块具有幂等性。

查看帮助

[root@ubuntu ~]# ansible-doc -s copy

4.5 get_url 模块

该模块可以将网络上的资源下载到指定主机,支持 httphttpsftp 协议

#查看帮助

[root@ubuntu ~]# ansible-doc -s script

4.6 fetch 模块

从远程主机提取文件至 ansible 的主控端,copy 相反,不支持目录

#查看帮助

[root@ubuntu ~]# ansible-doc -s fetch

4.7 file 模块

file 模块主要提供文件管理功能,比如创建文件和目录,修改文件和目录,设置文件权限和属性,设置链接等

#查看帮助

[root@ubuntu ~]# ansible-doc -s file

4.8 stat 模块

stat 模块用来获取目标文件的状态,对于 windows 主机,要使用 win_stat 模块

#查看帮助

[root@ubuntu ~]# ansible-doc -s stat

4.9 unarchive 模块

unarchive 模块主要用来解压缩或解包,将 ansible 主机或其它主机上的压缩包复制到指定主机,再解压到某个目录

在使用此模块时,要保证远程主机能解压对应的压缩包

#查看帮助

[root@ubuntu ~]# ansible-doc -s unarchive

4.10 archive 模块

archive 模块在远程主机上执行压缩打包命令,此模块的源和目标都在远程主机上

[root@ubuntu ~]# ansible-doc -s archive

4.11 hostname 模块

此模块主要用于修改远程主机的主机名,修改后永久生效

[root@ubuntu ~]# ansible 10.0.0.206 -m hostname -a "name=test-name"

4.12 cron 模块

cron 模块用于管理远程主机上的 crontab 定时任务

#查看帮助

[root@ubuntu ~]# ansible-doc -s cron

4.13 yum 模块和 apt 模块

yum 模块和 apt 模块用于在远程主机上管理软件包,yum 模块适用于 redhat 系列,apt 适用于 debian系列

#查看帮助

[root@ubuntu ~]# ansible-doc -s yum

apt 模块

#查看帮助

[root@ubuntu ~]# ansible-doc -s apt

4.14 yum_repository 模块

此模块用来对远程主机上的 yum 仓库配置进行管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s yum_repository

4.15 service 模块

service 模块主要用于对远程主机的服务进行管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s service

4.16 user 模块

此模块用于对远程主机进行用户管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s user

4.17 group 模块

此模块用于对远程主机的组管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s group

4.18 lineinfile 模块

lineinfile 模块主要用于修改远程主机上的文件。

ansible 提供了两个常用的文件修改模块,其中 lineinfile 主要对文件单行进行替换修改,replace 模块主要进行多行替换和修改。

如果使用 ansible 调用 sed 进行文件修改时,经常会遇到需要转义的情况,而且在对特殊符号进行替换时,有可能会失败。

#查看帮助

[root@ubuntu ~]# ansible-doc -s lineinfile

4.19 replace 模块

该模块功能与 lineinfile 模块功能类似,也是基于正则匹配的模式来修改文件,但与 lineinfile 不同的是replace 模块用于多行匹配和修改

#查看帮助

[root@ubuntu ~]# ansible-doc -s replace

4.20 selinux 模块

selinux 模块用作对远程主机的 selinux 机制进行管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s selinux

4.21 reboot 模块

reboot 模块主要用于对远程主机进行重启操作

#查看帮助

[root@ubuntu ~]# ansible-doc -s reboot

4.22 mount 模块

mount 模块用于管理远程主机的挂载

#查看帮助

[root@ubuntu ~]# ansible-doc -s mount

4.23 setup 模块

此模块主要用来从远程主机上收集相关信息在 ansible 主机上显示,由于需要收集的信息较多,此模块执行较慢。

#查看帮助

[root@ubuntu ~]# ansible-doc -s setup

4.24 debug 模块

此模块可以用于输出信息,并且通过 msg 定制输出的信息内容,功能类似于 echo 命令

#查看帮助

[root@ubuntu ~]# ansible-doc -s debug

4.25 sysctl 模块

sysctl 模块用来修改远程主机上的内核参数

#查看帮助

[root@ubuntu ~]# ansible-doc -s sysctl

4.26 pam_limits 模块

此模块主要用于管理远程主机上的资源限制

#查看帮助

[root@rocky86 ~]# ansible-doc -s pam_limits

4.27 apt_repository 模块

此模块实现 apt 仓库的配置管理,仅于用 debian 系列的环境中

#查看帮助

[root@ubuntu ~]# ansible-doc -s apt_repository

4.28 apt_key 模块

此模块实现 apt 仓库的key 的配置管理,仅于用 debian 系列的环境中

#查看帮助

[root@ubuntu ~]# ansible-doc -s apt_key

4.29 其它模块

除了上述模块之外,ansible 还提供了很多其它的模块,在我们需要使用时,可以再进行查询

ansible-doc -l | grep "模块关键字"

ansible-doc 模块名

5 Ansible 中的 Playbook

5.1 Playbook 基础

Playbook 的定义

字面意思,剧本,编剧写的,导演定的,演员按照剧本来表演,自行想象春晚

 ansible 中,我们写好 playbook,服务器作演员,由服务器根据我们编排的剧本,完成环境安装,服务部署,系统搭建,状态检测等各种各样的功能。

为什么要使用 Playbook

 ansible 中,较简单的任务,我们可以直接调用单个模块来完成,但是,如果遇到复杂的需求,需要调用大量模块才能完成一个需求,或多个任务间有依赖的时候,使用单条命令就特别不方便,这种情况下,我们就可以使用 playbook 来实现这种需求。

module (模块)  Playbook 的区别

Playbook 是对多个 AD-Hoc 的一种编排组合的实现方式

Playbook 能控制任务执行的先后顺序

Playbook 可以持久保存到文件中从而方便多次调用运行,而 Ad-Hoc 只能临时运行

Playbook 适合复杂的重复性的任务,而 Ad-Hoc 适合做快速简单的一次性任务

playbook 文件规范

扩展名为 yaml  yml

第一行用 “---” (英文输入法下的中划线) 表示 yaml 的开始,一般不写,如果有多个 yaml 文件合

并,则可用此标识每个 yaml 文件内容

使用#作为注释

大小写敏感

缩进符要统一,用空格键缩进,不要用 tab

缩进空格的数量不重要,但是,相同层级的左边缩进,要保持一致,要对齐,就是说,同样的缩

进,代表同样的级别

使用 “-”(英文输入法下的中划线)+一个空格来表示单个列表项

使用 ”:”(冒号)+空格来表示一个键值对

使用“{}”(花括号) 来表示一个键值表

一个 name 只能有一个 task

5.2 YAML 语言

5.2.1 YAML 语言基础和特性

YAML: YAML Ain't Markup LanguagYAML不是一种标记性语言,实际上在开发这种语言的时候,YAML 的意思其实是:Yet Another Markup Language (YAML仍然是一种标记性语言)

YAML 是一个可读性高的用来表达资料序列的格式。是目前较流行的配置文件格式,很多新的项目或者软件都采用 yaml 文件来保存配置信息,例如 ubuntuansibledokerkubernets 等。

YAML 语言特点

YAML的可读性好

YAML和脚本语言的交互性好

YAML使用实现语言的数据类型

YAML有一个一致的信息模型

YAML易于实现

YAML可以基于流来处理

YAML表达能力强,扩展性好

5.2.2 YAML 语言语法

在单一文件第一行,用连续三个连字号 "-" 开始,还有选择性的连续三个点号( ... )用来表示文件的

结尾

次行开始正常写 Playbook 的内容,一般建议写明该 Playbook 的功能

使用#号注释代码

缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换

行来实现的

缩进不支持 tab,必须使用空格进行缩进

缩进的空格数不重要,只要相同层级的元素左对齐即可

YAML文件内容是区别大小写的,key/value 的值均需大小写敏感

多个 key/value 可同行写也可换行写,同行使用,分隔

key 后面冒号要加一个空格 比如 key: value

value 可是个字符串,也可是另一个列表

YAML 文件扩展名通常为 yml  yaml

5.2.3 YAML 中的数据类型

YAML 支持以下常用几种数据类型

Dictionary 字典

一个字典是由一个或多个keyvalue构成

key  value 之间用冒号 :分隔

冒号 : 后面有一个空格

所有 k/v 可以放在一行,每个 k/v 之间用逗号分隔

所有每个 k/v 也可以分别放在不同行,一对 k/v 放在独立的一行

List 列表

列表由多个元素组成

每个元素放在不同行,每个元素一行,且元素前均使用中横线 - 开头,并且中横线 - 和元素之间有

一个空格

也可以将所有元素用 [ ] 括起来放在同一行每个元素之间用逗号分隔

5.2.4 三种常见的数据格式

XMLExtensible Markup Language,可扩展标记语言,可用于数据交换和配置

JSONJavaScript Object NotationJavaScript 对象表记法,主要用来数据交换或配置,不支持

注释

YAMLYAML Ain't Markup LanguageYAML 不是一种标记语言, 主要用来配置,大小写敏

感,不支持 tab

5.3 Playbook 的构成

playbook 是由一个或多个 “play” 组成的列表。playbook 的主要功能在于,将多个 play 组织在一个

playbook 文件中,让多台预定义的主机按照 playbook 中编排的内容来完成一系列复杂的功能。

一个 playbook 至少要包含 name  tasks 两部份。

主要有以下几部份构成

facts 默认会自动调用的模块,获取远程主机的一些信息,可以在下面的任务中使用,相当于构造

函数,可以禁用;

hosts 指定要执行任务的远程主机,其值可以是通配符,主机或组,但一定是要在主机清单中定义

过的(/etc/ansible/hsots),可以用 -i 选项指定自定义的主机清单文件;

remote_user 指定任务在远程主机上执行时,所使用的用户,可以是任意用户,也可以 sudo,但

前提是用户是存在的,默认 root,可以不写;

variables 定义 playbook 运行时需要的使用的变量,有多种定义方式;

templates 模板模块,配合变量,模板文件,可以实现批量执行时,在不同主机上用同一个模板生

成不同配置文件的功能;

tasks 定义要在远程主机上执行的任务列表,各任务按顺序在 hosts 中指定的主机上执行,即所有

主机做完当前任务,才会开始下一个任务。task 的模式是执行指定模块,后面跟上预定的参数,参

数中可以使用变量,模块的执行是幂等的,这意味着多次执行是安全的,因为其结果均一致,如果

在执行过程中发生错误,则会全部回滚(包括前面己执行成功的);每个task 都应该定义name,用

于执行结果的输出,如果没有指定 name ,则 action 的结果将用于输出;

tags 定义哪些代码内容可以被忽略,就是用 tags 跳过部份代码;

notify/handlers 一般配合使用, 可以达到一种触发调用的效果,(类似于函数调用或触发器)​​​​​​​

5.4 Playbook 命令

5.4.1 ansible-playbook 命令

ansible-playbook <filename.yml> ... [options]

5.4.3 ansible-vault 文档加解密命令

5.6 Playbook 中的 nofify  handlers

5.6.1 notify  handlers

Handlers 本质上也是 task list,也定义了一系列的 task,每个 task 中同样调用指定模块执行操作,只不过 Handlers 中定义的 task,不会主动执行,需要配合 notify,让 notify 通知相应的 Handers 中的task,该 task 才会执行,而且,Handers 中的 task,是在 playbook tasks 中所有的 task 都执行完成之后才调用,这样是为了避免多次触发同一个 Hander 导致多次调用。

notify 配合 handlers,可以实现在特定条件下触发某些操作,特别适用于类似于服务重启,重载等场景。

注意

如果多个 task 通知了相同的 handlers  handlers 仅会在所有 task 结束后运行一 次。

只有 notify 对应的 task 发生改变了才会通知 handlers 没有改变则不会触发 handlers

handlers 是在所有前面的 tasks 都成功执行才会执行,如果前面任何一个 task 失败,会导致

handler 跳过执行

第23天-运维自动化工具Ansible(二)

5.6.2 force_handlers 强制执行 handlers

 task 中使用 notify 来调用 handlers 中的任务,如果该 task 执行失败,或者在该 task 之前的其它task 执行失败,则会导致 notify 通知的 handlers 中的任务不会被调用,想要保证 handlers 中的 task一定会被调用,则可以用 force_handlers 强制指定。

注意:force_handlers 是以整个 playbook 的角度来理解的,在 playbook 中,如果有 task 执行失败,那整个 playbook 也执行失败,即使有部份 task 执行成功,这部份 task 对应的 handlers 也不会被执行,force_handlers 保证的是己成功执行的 task 对应的 handlers 一定会被执行。

#shell 模块不具有幂等性,总是返回 changed,用来测试最好

[root@ubuntu ~]# cat force_handlers.yaml

5.7 忽略错误 ignore_erros

在同一个 playbook中,如果一个 task 出错,则默认不会再继续执行后续的其它 task,利用

ignore_errors: yes 可以忽略此 task 的错误,继续执行其它 task,此项也可以配置为全局选项。

[root@ubuntu ~]# cat ignore_errors.yaml

5.8 Playbook 中的 tags

默认情况下, Ansible 在执行一个 playbook 时,会执行 playbook 中所有的任务在 playbook 文件中,可以利用 tags 组件,为特定 task 指定标签,当在执行 playbook 时,可以只执行特定 tags  task,而非整个 playbook 文件。

可以一个 task 对应多个 tag,也可以多个 task 对应同一个 tag

还有三个内置的 tagall 表示所有任务,tagged 表示所有被 tag 标记的任务,untagged 表示所有没有被标记的任务。

tags 主要用于调试环境

5.9 Playbook 中的变量

playbook 支持变量的定义与引用

playbook 中的变量名由数字字母下划线组成,区分大小写,且只能以字母开头;

变量定义

var1=value

var2: value

#范例

http_port=80

ssh_port: 22

使用变量

通过 {{ variable_name }} 调用变量,且变量名前后建议加空格,在某些情况下需要加双引号,写成 "{{variable_name }}" 才生效

变量来源

1. 使用 setup facts 获取的远程主机的信息都是放在变量中的,可以直接使用

2. 在命令行执行 ansible-playbook 时,可以使用 -e 选项设置变量,这种变量的优先级最高

3.  playbook 文件中定义变量

4. 在单独的变量文件中定义变量,再在 playbook 中引用该文件

5. 在主机清单文件中定义,当单独主机的变量与分组的变量有冲突时,单独定义的主机的变量,优先级更高

6. 在主机变量目录(host_vars)和主机分组目录(group_vars)中创建以主机名或分组名为文件名的文

件,在该文件中定义

7. 使用 register 将其它 task 或模块的执行的输出内容保存到变量中,供别的 task 来使用

8.  role 中定义

5.9.1 使用 setup 模块中的变量

在命令行下,可以通过指定 setup 模块的方式获取目标主机信息

[root@ubuntu ~]# ansible 127.0.0.1 -m setup

 playbook 中,可以使用 gather_facts 选项来获得目标主机的信息,该选项默认是 yes ,每次执行都需要消耗一定的资源和时间,在不需要时可以禁用该项来加快 playbook 的执行效率,另外,目标主机的信息也可以保存在本地做缓存,以便在频繁执行时减少资源消耗。

[root@ubuntu ~]# cat facts-v1.yaml

5.9.3  playbook 文件中定义变量

 playbook 文件中定义的变量,只能在当前 playbook 中使用,属于私有变量

5.9.4 在单独文件中定义变量

在单独的变量文件中定义变量,再在 playbook 中引用该文件,在单独文件中定义的变量优先级比在playbook 中定义的变量优先级高

5.9.5 在主机清单中定义变量

[root@ubuntu ~]# vim /etc/ansible/hosts

[all:vars]

var1=all-var1

var2=all-var1

var3=all-var1

[group1]

10.0.0.166

10.0.0.157

[group1:vars]

ansible_python_interpreter=/usr/bin/python3

ansible_ssh_password='123456'

var2=group1-var2

var3=group1-var3

#在使用了分组的情况下,这两条单独写无法获取

10.0.0.157 ansible_python_interpreter=/usr/bin/python3

ansible_ssh_password='123456' var1=single-var1 var2=signle-var2 var3=signle-

var3

10.0.0.184 ansible_python_interpreter=/usr/bin/python3

ansible_ssh_password='123456' var1=single-var1 var2=signle-var2 var3=signle-

var3

[root@ubuntu ~]# cat var5.yaml

--- #var5

- hosts: all

  gather_facts: no

  tasks:

   - name: show-vars

      debug: msg={{ var1 }}---{{ var2 }}---{{ var3 }}

[root@ubuntu ~]# ansible-playbook var5.yaml --list-hosts

playbook: var5.yaml

5.9.6 在项目目录中定义变量

在不同的项目中添加 host_varsgroup_vars 目录,在 host_vars 目录下添加主机名或 ip 命名的文

件,将该主机的变量写在此文件中,在 group_vars 目录中添加以分组命名的文件,将该组的变写在此文件中。

5.9.7 register 注册变量

 playbook 中可以使用 register 将捕获命令的输出保存在临时变量中,方便后续调用此变量。

6 Ansible 中的 Templates

模板 templates:简历模板,ppt模板

Ansible 中的模板

狭义来讲,就是一个特定后缀的文本文件,在使用时,可以根据此文件,将部份关健内容进行替换,生成新的文件,以达到在不同主机中,使用不同配置的作用,其中的逻辑部份或动态代码,用 jinja2 来实现。

广义来讲,要模板文件,变量,变量文件,参数,条件判断,流程控制,playbook 中的 template 模块调用时相互配合,来实现预期的效果。

6.1 Jinjia2 语言

Jinja2  Python下一个被广泛应用的模版引擎,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能。

Jinjia2 的特点

沙箱中执行

强大的 HTML 自动转义系统保护系统免受 XSS

模板继承

及时编译最优的 python 代码

可选提前编译模板的时间

易于调试。异常的行数直接指向模板中的对应行。

可配置的语法

jinjia2 中的数据类型

6.2 Template 的使用规范

template 文件建议存放在和 playbook 文件同级目录的 templates 目录下,且以 .j2 结尾,这样在

playbook 中使用模板文件时,就不需要指定模板文件的路径。

6.3 Template 的基本替换

6.3 Template  for 循环和 if 判断

7 Ansible 中的流程控制

 ansible  task 中,如果要重复执行相同的模块,则可以使用循环的方式来实现

7.1 loop (with_items) 迭代

对于迭代项的引用,要使用内置变量 item 来引用,这是固定写法。

迭代元素使用 with_items 来锚定列表,列表中可以是单项元素,也可以是字典。

 ansible2.5 以后的版本中,使用 loop 来代替 with_items

7.2 until 循环

使用 until 也可以控制一个 task 重复执行,until 后面的值或表达式为 true 的时候,才退出重试,即在task 没有获得预期值的情况下,会一直重复执行,直到得到预期结果。

until 默认重试三次,每次重试之间间隔 5S,可自定义修改。

7.3 with_lines 逐行处理

with_lines 可以将一条命令的执行结果逐行调用同一个 task 进行处理

7.4 条件判断 when

when 语句可以实现选择执行,即根据条件判断的结果决定是否执行 task,条件判断的数据来源可以是变量,前面的 task 的执行结果等

范例:判断变量是否被定义

7.5 block 分组

使用 block 可以对 task 任务进行分组,将多个 task 任务放到一个 block 下,可以在写一个 when 判断的情况下调用多个 task 任务​​​​​​​

7.6 changed_when

只有在 task 的执行结果返回状态为 changed 的时候,我们才认为该 task 是真实执行了,在远程主机上产生了数据变化,但是在 ansible 中,不是所有模块都具有幂等性,对于某些不会产生数据变化的 task,ansible 也会给出 changed 输出,我们可以使用 changed_when 来避免这一情况。

#对于此 playbooktask-1 不会在远程主机上产生任何变化,task-2 总会产生变化,但每次执行,都会产生 changed 的提示

[root@ubuntu ~]# cat changed_when-1.yaml

7.7 滚动执行

默认情况下, ansible 从上到下执行,如果一个 playbook 中有多个 task,在有多台远程主机的情况下,需要在所有远程主机上执行完当前的 task 之后才执行下一个 task,如果主机过多,或者需要执行的task 比较消耗时间,则会导致所有主机都处于一个执行中状态。

滚动执行,深度优先

7.8 委派执行

利用委派执行可以在非指定的主机上执行 task

7.9 run_once 只执行一次

利用 run_once 指令可以让 task 只执行一次,而非在所有被控主机都执行。

7.10 修改环境变量

使用 environment 选项可以修改目标主机的环境变量,environment 配置的环境变量只在当前的 task中有效

7.11 Yaml 文件互相调用

include_tasks 包含

利用 include  include_tasks 可以在某个 task 中调用其它的只有 task 内容的 yaml 文件,include 在2.16 版本之后被弃用,建议使用 include_tasks 来实现包含。include_tasks 一次只能引用一个 yaml 文件

8 Ansible 中的 Role

role(角色) 用来实现代码的组织管理功能,将实现各种不同功能的 playook 文件,变量文件,模板文件,handlers 文件根据约定,分别放置在不同的目录,分门别类的管理起来,使其看起来更像一个项目,其主要用来解决多文件之间的相互包含,引用,组合等问题,将各个功能模块进行拆分,使其原子化,要实现一个大型复杂需求时,再用 include 指令来引用不同的功能。

角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中,复杂的场景中,建议使用 roles,代码复用度高。​​​​​​​

8.1 Role 工作原理和组成

在使用 ansible 实现复杂配置时,难免需要配置不同的主机分组,配置各种变量和和模板,使用各种功能模块等。那我们就可以将这种大型的复杂度高的任务进行分解,拆分成角色(role),来实现。

例如:需要在 A 主机上配置 LNMP 环境,在 B 主机上配置 LAMP 环境,在 C 主机上配置 MySQL,在 D主机上 Redis,则我们可以将各种不同的服务定义成 Role,然后根据需求搭配不同的 Role 来实现不同的需求,达到代码复用,灵活配置的目的。

默认roles存放路径

/root/.ansible/roles

/usr/share/ansible/roles

/etc/ansible/roles

role 的组成

role 的目录结构

tasks 任务文件目录,至少有一个名为 main.yaml 文件,该文件通过 include 来引用目录下的其它

文件files  role 使用过程中要用到的文件,比如安装包,比如 copy 要用到的文件

vars 变量文件目录,至少有一个名为 main.yaml 的文件,该文件通过 include 来引用目录下的其

它文件templates 模板文件目录,如果没有特别指定,则在该role 中其它文件要引用模板文件都默认存放在此目录

handlers 触发器目录,至少要有一个名为main.yaml的文件,该文件通过include 来引用目录下

的其它文件default 在该 role 中会用到的默认变量,此处的变量优先级比 vars 中的变量优先级更高

meta 额外信息需要用到的一些数据,至少有一个名为 main.yaml 的文件,该文件通过 include 

引用目录下的其它文件

8.2  playbook 中调用 role

直接调用

8.3  role 实现 LNMP

#创建目录

[root@ubuntu ~]# mkdir -pv

roles/{mysql,nginx,php,service,wordpress}/{tasks,files,templates}

[root@ubuntu ~]# tree roles/

8.2.1 nginx role 实现

[root@ubuntu ~]# tree roles/nginx/

roles/nginx/

8.2.2 php role 实现​​​​​​​

[root@ubuntu ~]# tree roles/php/

roles/php/

8.2.3 wordpress role 实现

8.2.4 service role 实现

8.2.5 mysql role 实现

8.2.6 playbook 中配置 role

#测试

[root@ubuntu ~]# cd lnmp_wp/

[root@ubuntu lnmp_wp]# ansible-playbook mysql.yaml

[root@ubuntu lnmp_wp]# ansible-playbook lnmp_wp.yaml

8.4 ansible-galaxy

ansible-galaxy 用来管理官方在云端提供的 role

​​​​​​​

9 Ansible Tower 介绍

Ansible Tower 是一个图形化基于 WEB 的任​​​​​​​务调度,复杂服务部署,IT自动化的一个管理平台,属于发布配置管理系统,支持 Api 及界面操作,基于 Django 编写。Tower 允许对用户进行权限控制,即使某用户不能传送某 SSH 凭证,你也可以通过 Tower 来对该用户共享该凭证。我们可以通过图形化界面来管理 Inventory,也可以对各种各样的云资源做同步。Tower可以记录所有 job 的日志,也可以与LDAP集成,并且拥有强大的可浏览的 REST APITower 也提供了命令行工具,可以与 Jenkins 轻松集成。

但是 ansible tower 是商业产品,仅适用于 redhat 企业版 Linux 中。

公有云中有也有以 Web 界面提供的批量管理主机的功能。

以阿里云为例,在 ECS 实例列表菜单页面,可以点击 批量管理 导航进入该功能。

第24天-MySQL性能优化和日志管理


 

第25天-MySOL备份还原和主从复制集群


 

第26天-MySQL读写分离和高可用集群


 

第27天-MySQL高可用和OpenVPN服务

内容概述

VPN 基础知识

OpenVPN 部署

OpenVPN 管理

1 VPN 基础知识

1.1 VPN 介绍

VPN: (Virtual Private Network) 虚拟专用网络

VPN 是虚拟专用网络,是专用网络的一种延伸,属于远程访问技术的一种。

VPN 可以在公用网络的基础上建立专用网络,但其并不是物理意义上的专线,而是在公共的互联网的基础上虚拟出一个专用网络,所以被称为虚拟专用网络。

VPN 技术在现在的网络环境中有着广泛的使用。VPN网关通过对数据包的加密和数据包目标地址的转换实现远程访问。VPN可通过服务器、硬件、软件等多种方式实现。

例如在企业中,员工出差到外地,所使用的终端不处于企业内网中,又需要访问企业内网,就可以使用VPN 技术来实现。

网络上所谓的 "翻墙软件",其实也是使用 VPN 相关的技术,绕过相关的IP限制,内容过滤,域名劫持等,实现对网络内容的访问。

VPN 是一种网络通信技术,并不同等于翻墙软件。​​​​​​​

1.2 VPN 常见应用模式

1.2.1点对站点 peer to site

1.2.2 站点对站点 site to site]

2 OpenVPN 实现

2.1 OpenVPN 介绍

OpenVPN  Linux下开源的 VPN 应用,它提供了良好的性能和友好的用户 GUI

OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。OpenVPN 提供了多种身份验证方式,用以确认参与连接双方的身份,包括:共享私钥,第三方证书以及用户名/密码组合。共享密钥最为简单,但同时它只能用于建立点对点的 VPN;基于 PKI 的第三方证书提供了最完善的功能,但是需要额外的精力去维护一个 PKI 证书体系。 OpenVPN2.0 后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍有一份服务器证书需要被用作加密。

2.2 部署环境说明

架构图

配置说明:

在阿里云上购买三台主机,设置为同一个内网网段,模拟公司内网,其中一台添加一个公网IP,在该机器上部署 OpenVPN 服务,以便让不在公司内网的远程主机可以连进公司内网的目的。

2.3 部署流程

1. 准备阿里云主机,其中一台配置公网IP

2. 在阿里云安全组中放行 1194 端口

3. 在有公网IP的阿里云主机上部署 OpenVPN Server

4.  xxx 内网主机上部署 OpenVPN Client

5. 测试OpenVPN 网络

2.4 配置 OpenVPN 证书

2.4.1 安装相关软件

#安装openvpn,安装证书管理工具

[root@vpn-server ~]# apt update;apt install openvpn easy-rsa

[root@vpn-server ~]# dpkg -l openvpn

[root@vpn-server ~]# dpkg -l easy-rsa

[root@vpn-server ~]# tree /etc/openvpn/

2.4.2 配置CA证书

准备证书环境

#准备证书环境,让证书和 openvpn 配置处于一个目录,方便迁移

[root@vpn-server ~]# cp -r /usr/share/easy-rsa/ /etc/openvpn/

[root@vpn-server ~]# tree /etc/openvpn/

vars 文件中相关配置说明

[root@openvpn-server ~]# cat /etc/openvpn/easy-rsa/vars

脚本工具使用说明

[root@vpn-server ~]# cd /etc/openvpn/easy-rsa/

[root@vpn-server easy-rsa]# mv vars.example vars

#vars 文件中相关配置说明

[root@vpn-server easy-rsa]# cat vars

[root@vpn-server easy-rsa]# ./easyrsa

初始化证书目录

[root@vpn-server easy-rsa]# ./easyrsa init-pki

生成CA机构证书

#生成CA机构证书,不使用密码

[root@vpn-server easy-rsa]# ./easyrsa build-ca nopass

2.4.3 配置OpenVPN服务器证书

生成证书申请文件

# server 表示文件前缀

[root@vpn-server easy-rsa]# ./easyrsa gen-req server nopass

审核申请文件,颁发机构证书

#查看命令帮助

[root@vpn-server easy-rsa]# ./easyrsa help sign

#颁发机构证书,第一个 server 指证书类型,第二个server 指申请文件

[root@vpn-server easy-rsa]# ./easyrsa sign-req server server

查看证书内容

# openssl 命令查看

[root@vpn-server easy-rsa]# openssl x509 -in pki/issued/server.crt -noout -text

创建 Diffie-Hellman 密钥

Diffie-Hellman 密钥交换方法是迪菲(Whitefield Diffie)和赫尔曼(Martin Hellman)在1976年公布的一种秘钥交换算法,它是一种建立秘钥的方法,而不是加密方法,所以秘钥必须和其他一种加密算法结合使用。这种密钥交换技术的目的在于使两个用户安全地交换一个密钥,用此密钥做为对称密钥来加密后续的报文传输。

#创建参数文件

[root@vpn-server easy-rsa]# ./easyrsa gen-dh

 openssl 命令也可以创建

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

2.4.4 配置OpenVPN客户端证书

客户端证书交由具体使用者作为登录 VPN 服务器的凭证,有效期不能太长

#修改配置文件,将证书有效时长改为180

[root@vpn-server easy-rsa]# vim vars

#set_var EASYRSA_CERT_EXPIRE

set_var EASYRSA_CERT_EXPIRE

825

180

#生成客户证书申请文件

[root@vpn-server easy-rsa]# ./easyrsa gen-req tom nopass

#签发客户端证书

[root@vpn-server easy-rsa]# ./easyrsa sign-req client tom

#openssl 命令查看

[root@vpn-server easy-rsa]# openssl x509 -in pki/issued/tom.crt -noout -text

重复上述步骤,为用户 jerry 创建证书

[root@vpn-server easy-rsa]# ./easyrsa gen-req jerry nopass

[root@vpn-server easy-rsa]# ./easyrsa sign-req client jerry

2.4.5 整理目录

 openVPN 服务端相关证书文件复制到 server 目录中

[root@vpn-server ~]# ls -lh /etc/openvpn/server/

total 0

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/issued/server.crt

/etc/openvpn/server/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/private/server.key

/etc/openvpn/server/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/

[root@vpn-server ~]# ls -lh /etc/openvpn/server/

total 20K

-rw------- 1 root root 1.2K Jun 26 16:28 ca.crt

-rw------- 1 root root 424 Jun 26 16:29 dh.pem

-rw------- 1 root root 4.6K Jun 26 16:29 server.crt

-rw------- 1 root root 1.7K Jun 26 16:29 server.key

为客户端用户创建目录,并将相关文件放到指定目录

[root@vpn-server ~]# ls -lh /etc/openvpn/client/

total 0

[root@vpn-server ~]# mkdir /etc/openvpn/client/{tom,jerry}

[root@vpn-server ~]# ls -lh /etc/openvpn/client/

total 8.0K

drwxr-xr-x 2 root root 4.0K Jun 26 16:30 jerry

drwxr-xr-x 2 root root 4.0K Jun 26 16:30 tom

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/ca.crt

/etc/openvpn/client/tom/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/private/tom.key

/etc/openvpn/client/tom/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/issued/tom.crt

/etc/openvpn/client/tom/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/ca.crt

/etc/openvpn/client/jerry/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/private/jerry.key

/etc/openvpn/client/jerry/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/issued/jerry.crt

/etc/openvpn/client/jerry/

[root@vpn-server ~]# tree /etc/openvpn/client/

2.5 OpenVPN 服务端配置

2.5.1 服务端配置文件说明

配置文件默认不存在,需要手动创建

[root@vpn-server ~]# cp /usr/share/doc/openvpn/examples/sample-config-

files/server.conf /etc/openvpn/

#配置文件中以 #开头或 ; 开头的都是注释

[root@vpn-server ~]# cd /etc/openvpn/

[root@vpn-server openvpn]# cat server.conf

2.5.2 设置服务端配置文件

[root@vpn-server openvpn]# mv server.conf server.conf.bak

#新建配置文件

[root@vpn-server openvpn]# vim server.conf

2.5.3 查看日志目录

[root@vpn-server ~]# ll /var/log/openvpn/ -d

drwxr-xr-x 2 root root 4096 Jul 14 2022 /var/log/openvpn//

[root@vpn-server ~]# tree /var/log/openvpn/

2.5.4 设置 service 服务脚本文件

此处仅限于 centos8 系列,因为 CentOS8  openvpn 服务脚本不可用

2.5.5 启动服务并查看状态

2.6 OpenVPN 客户端配置

2.6.1 客户端配置文件说明

[root@vpn-server ~]# cat /usr/share/doc/openvpn/examples/sample-config-

files/client.conf | grep -Ev "^#|^$"

2.6.2 为不同用户设置配置文件

[root@openvpn-server openvpn]# vim client/tom/client.ovpn

[root@openvpn-server openvpn]# vim client/jerry/client.ovpn

remote 项对应的服务端IP可以写成域名,将域名解析到对应的IP即可,这样即使以后服务端IP发生了变化,也只需要修改域名解析,而不用修改此处的配置文件。

2.7 部署 OpenVPN 客户端

2.7.1 部署 Windows 客户端

下载

https://openvpn/community-downloads/

下载后在Windows 中完成安装

将客户端配置下载到 windows 中,将相关文件放到 C:\Program Files\OpenVPN\config 目录下

[root@vpn-server openvpn]# cd client/

[root@vpn-server openvpn]# ls

jerry tom

[root@vpn-server openvpn]# tar zcvf tom.tar.gz tom/

tom/

tom/tom.key

tom/tom.crt

tom/ca.crt

tom/client.ovpn

[root@vpn-server openvpn]# ls

jerry tom tom.tar.gz

[root@vpn-server openvpn]# sz tom.tar.gz

查看 windows 目录

查看此时windows主机上的IP

C:\Program Files\OpenVPN\config>ipconfig

Windows 桌面上找到 OpenVPN 图标,以管理员身份运行连接成功后,在Windows 主机的右下角会出现绿色图标。

再次查看windows主机上的IP

C:\Program Files\OpenVPN\config>ipconfig

可以看到,此时windows主机多出来了一个 10.8.0.6 IP地址,而且生成了一条指向指向

172.30.0.0/255.255.255.0的路由记录。

PS C:\WINDOWS\system32> route print -4 |findstr 172.30

该路由记录是从OpenVPN服务端推送过来的。

[root@vpn-server ~]# cat /etc/openvpn/server.conf | grep route

push "route 172.30.0.0 255.255.255.0"

也可以在客户端日志中查到该信息

查看服务端连接状态

[root@vpn-server ~]# ss -tnp | grep openvpn

查看服务端日志

[root@vpn-server ~]# tail /var/log/openvpn/openvpn.log

客户端测试,此时无法ping  OpenVPN 服务器后端内网主机,但可以 ping  OpenVPN 服务器。

#OpenVPN服务器上的内网IP

PS C:\WINDOWS\system32> ping 172.30.0.66

#在服务端抓包,数据都是走 tun0 网卡

[root@vpn-server ~]# tcpdump -i tun0 -nn icmp

#OpenVPN服务器上的虚拟IP

PS C:\WINDOWS\system32> ping 10.8.0.1

#在服务端抓包,数据都是走 tun0 网卡

[root@vpn-server ~]# tcpdump -i tun0 -nn icmp

2.7.2 配置后端主机转发

当前客户端主机还是无法连通后端内网主机

PS C:\WINDOWS\system32> ping 172.30.0.100 -t

 OpenVPN server 主机上可以看到数据

[root@vpn-server ~]# tcpdump -i tun0 -nn icmp

但在后端主机上看不到数据

[root@node-1 ~]# tcpdump -i eth0 -nn icmp

OpenVPN 服务端开启 ip_forward 转发

[root@vpn-server ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf

[root@vpn-server ~]# sysctl -p

[root@vpn-server ~]# sysctl -p | grep ip_forward

net.ipv4.ip_forward = 1

OpenVPN server 主机上设置 SNAT 转发,将从 10.8.0.0/24 网段主机请求的源IP转换成本机

IP(172.30.0.66)

[root@vpn-server ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d

10.8.0.0/24 -j MASQUERADE

[root@vpn-server ~]# iptables -t nat -vnL POSTROUTING

 OpenVPN server 主机的 iptables 规则设置为开机加载,保证重启后有效

[root@vpn-server ~]# echo 'iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d

10.8.0.0/24 -j MASQUERADE' >> /etc/rc.d/rc.local

[root@vpn-server ~]# chmod a+x /etc/rc.d/rc.local

[root@vpn-server ~]# ll /etc/rc.d/rc.local

-rwxr-xr-x. 1 root root 550 Feb 25 21:17 /etc/rc.d/rc.local

除了在 OpenVPN server 主机主机上配置 SNAT 规则之外,也可以修改后端主机的网关,将

10.8.0.0/24 网段的网关指向 172.30.66

此方法理论可行,但在此处不行,因为我们设置的是点对点网络,后端主机并不是处于 OpenVPN 的客户端角色,所以在配置了网关的基础上,也无法使用 OpenVPN 的相关功能。

#将后端172.30.0.200主机的网关指向 172.30.0.66

[root@node-2 ~]# route -n

2.8 OpenVPN 管理

OpenVPN 的管理功能主要关于安全加强及客户端的证书管理,用户密码验证等

2.8.1 启用安全增强功能

服务端配置

[root@vpn-server ~]# openvpn --genkey --secret /etc/openvpn/server/ta.key

[root@vpn-server ~]# ll /etc/openvpn/server/ta.key

-rw------- 1 root root 636 Jun 28 14:32 /etc/openvpn/server/ta.key

#修改服务端配置文件

[root@vpn-server ~]# vim /etc/openvpn/server.conf

tls-auth /etc/openvpn/server/ta.key 0 #增加此行,服务端后面要跟数字0,客户端后面数字是

1

#重启服务端,客户端会断开连接,小图标会变成黄色

[root@vpn-server ~]# systemctl restart openvpn.service​​​​​​​

客户端配置

#key文件下载到本地,到到 C:\Program Files\OpenVPN\config 目录下

[root@vpn-server ~]# sz /etc/openvpn/server/ta.key

#修改客户端配置文件 C:\Program Files\OpenVPN\config\client.ovpn

#新增此行

tls-auth ta.key 1

#客户端重新连接即可

2.8.2 设置客户端私钥密码

新建一个用户 spike,并设置证书密码,以提高安全性

[root@vpn-server ~]# cd /etc/openvpn/easy-rsa/

#创建私钥,并生成证书申请文件

[root@vpn-server easy-rsa]# ./easyrsa gen-req spike

#签发证书

[root@vpn-server easy-rsa]# ./easyrsa sign client spike

#配置客户端

[root@vpn-server easy-rsa]# cd /etc/openvpn/client/

[root@vpn-server client]# mkdir spike

[root@vpn-server client]# cp /etc/openvpn/easy-rsa/pki/private/spike.key

./spike/ #用户私钥

[root@vpn-server client]# cp /etc/openvpn/easy-rsa/pki/issued/spike.crt ./spike/

#用户证书

[root@vpn-server client]# cp /etc/openvpn/server/ca.crt ./spike/

#CA证书

[root@vpn-server client]# cp /etc/openvpn/server/ta.key ./spike/

#ta

#生成客户端配置文件

[root@vpn-server client]# vim spike/client.ovpn

#打包,并下载到 windows 主机

[root@vpn-server client]# tar zcvf spike.tar.gz spike/

将客户端配置下载到 windows 主机中,放到 OpenVPN config 目录中,再次使用客户端连接,要求输入密码

2.8.3 账户证书管理

对于客户端使用者的变更,以及时间的推移,都会涉及到证书的创建和吊销。

证书自动过期

每一份己签发的证书都有时期,超过时间节点后会自动过期

#证书时效配置

[root@openvpn-server ~]# grep EASYRSA_CERT_EXPIRE /etc/openvpn/easy-rsa/vars

set_var EASYRSA_CERT_EXPIRE 180

#在服务端证书索引文件中查看每个证书的过期时间,该时间是UTC时间

2.8.4 实现客户端用户名密码验证

在证书的基础上可以再新增用户名密码校验,以提高安全性

修改服务端配置

#添加三行

[root@openvpn-server ~]# vim /etc/openvpn/server.conf

2.9 部署 Linux 客户端

 

 

2.10 部署 Mac OS 客户端

由于官方并没有提供基于Mac OSOpenVPN的客户端软件,可以使用第三方 OpenVPN 客户端

链接地址

https://tunnelblick/downloads.html

#需要科学上网

第28天-日志服务管理

内容概述

日志介绍

日志服务管理

日志管理工具 journalctl

基于 MySQL 的日志

Logrotate 日志转储

1 系统日志管理

1.1 常用日志服务介绍

在现实生活中,记录日志非常重要﹐比如:银行转账时会有转账记录﹔飞机飞行过程中的黑盒子(飞行数据记录器)记录着飞机的飞行过程. 那么将系统和应用发生的事件记录至日志中,也很意义,常可以助于排错和分析使用。

日志记录的内容包括:

历史事件:时间,地点,人物,事件

日志级别:事件的关键性程度,Loglevel

1.1.1 sysklogd 系统日志服务

 CentOS5 以及之前的发行版中,其采用的 sysklogd 服务来记录和管理系统日志的。

sysklogd 服务有两个模块:

klogd 用于记录 linux kernel 相关的日志

syslogd:用于记录用户空间应用日志

1.1.2 rsyslog 系统日志服务

RSYSLOG is the rocket-fast system for log processing.

rsyslog  CentOS6 以后的版本中使用的日志管理程序,是一个默认安装的服务,并且默认开机启动。

rsyslog 特性

支持输出日志到各种数据库,如 MySQLPostgreSQLMongoDB ElasticSearch,实现使用第三方服务对日志进行存储和分析;

精细的输出格式控制以及对日志内容的强大过滤能力,可实现过滤记录日志信息中的指定部份;

通过 RELP + TCP 实现数据的可靠传输

支持数据的加密和压缩传输等

多线程

1.1.3 ELK 日志服务

ELK 是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。在后续发展的过程中增加了一个 FileBeat,这几款软件通常在一起配合使用,各司其职。ELK 主要用于部署在企业架构中,收集多台设备上多个服务的日志信息,并将其统一整合后提供给用户。

rsyslog 日志服务与 ELK 日志服务的区别:

rsyslog 主要用于单机日志管理,ELK 主要用于分布式集群环境中的日志管理。

1.2 rsyslog 日志管理

1.2.1 系统日志相关概念

facility: 设施,从功能或程序上对日志进行归类

在一台主机上会同时运行多个服务和软件,每个服务或软件都有可能会产生大量的日志,如果每个服务或软件产生的日志都独立存放管理,那文件数量就太多了,如果都放到一个文件中,似乎也不是很合适,所以 syslog 将日志进行了分类,相同类型的日志放一个文件,这样便于管理。

rule 配置规则

每一行 rule 由两列组成,分别是选择器和处理动作,选择器将过滤后的日志交由处理动作处理;

选择器可以同时有多个,用分号分隔,处理动作也可以同时有多个,用 & 分隔,处理动作中可以指定模板,不同的模板会生成不同的日志内容,模板可以自定义。

选择器有以下几种定义方式:

用分类和优先级来过滤,同一条 rule 中,分类和优先级都可以有多个,用逗号分隔

基于日志内容中的指定字段来过滤

基于表达式构建脚本来过滤

处理动作有以下几种:

输出到日志文件或某个特定设备

保存到数据库

发送给指定用户,该用户必须己登录,可以同时指定多个用户,用逗号分隔

传送到远程主机

通过管道传送给其它命令

丢弃日志,不处理

selector action

1.2.4 rsyslog 日志内容和模板

日志内容由 template 决定,如果没有显式指定,默认使用 RSYSLOG_TraditionalFileFormat

除了使用内置模板外,我们还可以自定义模板。

自定义模板可以直接写在配置文件中

生成的日志内容模板决定,而模板是由 rsyslog 中的相关属性组成,这些属性在生成日志内容时会被替换成具体内容。所谓属性是指rsyslog 中的一些特殊关键字,在模板语法中,使用 %属性名% 来表示一个字段。

1.2.5 常见日志及相关工具

Rocky 中常见日志说明

[root@rocky ~]# cat /etc/rsyslog.conf | grep -Ev "^#|^$"​​​​​​​

dmesg 命令

dmesg 命令用来查看主机硬件相关日志

logger 命令

logger 命令可以手动生成相关日志

1.2.6 在本机自定义服务日志

#sshd服务日志默认是归属于 AUTH 分类,默认级别是 INFO

[root@ubuntu ~]# cat /etc/ssh/sshd_config | grep -i log

# Logging

#SyslogFacility AUTH

#LogLevel INFO

#根据配置,此日志记录在 /var/log/auth.log 

[root@ubuntu ~]# cat /etc/rsyslog.d/50-default.conf | grep "^auth"

1.2.7 使用日志网络转发

可以使用 rsyslog 服务中的远程转发功能,通过 TCP  UDP 协议将当前主机的日志转发到远程日志服务器上,进行集中存储,方便统一管理。​​​​​​​

1.2.8 使用MySQL 数据库转储日志

在上一节网络转发的基础上,将日志转储到 MySQL 数据库中

1.3 服务日志管理工具 journalctl

 systemd  1号进程的系统版本中,systemd 提供了一个集中的方式来处理所有来自进程,应用程序等的操作系统日志,所有这些日志事件都由 systemd  journald 守护进程来处理。journald 守护进程收集所有来自 Linux 操作系统的各种日志,并将其作为二进制数据存储在文件中。

以二进制数据集中记录事件、系统问题的好处有很多。例如,由于系统日志是以二进制而不是文本形式存储的,你可以以文本、JSON 对象等多种方式进行转译,以满足各种需求。另外,由于日志是按顺序存储的,通过对日志的日期/时间操作,超级容易追踪到单个事件。

1.4 Logrotate 日志转储

1.4.1 Logrotate 介绍

 Linux 系统中,能够帮助使用者定位问题的有效手段之一就是查日志。

如果一个服务或一个程序的日志,一直只写一个文件,则会导致该日志文件越来越大,无论是查看还是搜索内容,备份等,都会特别不方便,而且如果服务器数量较多,日志文件大小增长较快,也会很容易触发告警。

为了解决这种情况,我们可以使用日志转储服务,对服务日志进行分割,按照一定的规则将日志保存在不同的文件中,这样更便于管理和归档。

当前服务器上的日志转储

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行

工作原理:系统计划任务每天执行一次脚本文件,在脚本中再执行 /usr/sbin/logrotate

/etc/logrotate.conf ,即调用 logrotate 程序再配合定义好的转储规则对日志文件进行转储。

1.4.2 Logrotate 配置

在配置文件中定义转储规则,配置文件中的主要配置项

#查看帮助

[root@log-server ~]# man logrotate.conf

常用配置项

1.4.3 Logrotate 自定义规则实现

第28天-网络文件共享和实时同步

内容概述

存储类型

NFS服务

网络数据同步

1 存储介绍

IT 基础设施有三个主要组成,分别是 计算,存储,网络

1.1 常见存储类型

直连式存储:Direct-Attached Storage (DAS)

可以理解为本地文件系统。这种设备直接连接到计算机主板总线上,通常是SCSI  FC 连接,计算机将其识别为一个块设备,例如常见的硬盘,U盘等,也可以连到一个磁盘阵列柜,里面有很多块磁盘。

DAS 只能连接一台服务器,其它服务器无法共享该存储。

存储区域网络:Storage Area Network (SAN)

存储区域网络,这个是通过光纤通道或以太网交换机连接存储阵列和服务器主机,最后成为一个专用的存储网络。SAN经过十多年历史的发展,已经相当成熟,成为业界的事实标准(但各个厂商的光纤交换技术不完全相同,其服务器和SAN存储有兼容性的要求)。SAN提供了一种与现有LAN连接的简易方法,并且通过同一物理通道支持广泛使用的SCSIIP协议。SAN不受现今主流的、基于SCSI存储结构的布局限制。特别重要的是,随着存储容量的爆炸性增长,SAN允许企业独立地增加它们的存储容量。

SAN的结构允许任何服务器连接到任何存储阵列,这样不管数据置放在那里,服务器都可直接存取所需的数据。因为采用了光纤接口,SAN还具有更高的带宽。如今的SAN解决方案通常会采取以下两种形式:光纤信道以及iSCSI或者基于IPSAN,也就是FC SANIP SAN。光纤信道是SAN解决方案中大家最熟悉的类型,但是,最近一段时间以来,基于iSCSISAN解决方案开始大量出现在市场上,与光纤通道技术相比较而言,这种技术具有良好的性能,而且价格低廉。一般通过在主机上安装HBA(Host Bus Adapter 主机总线适配器),再通过光纤连接到光纤交换机,再连接至SAN存储上。

网络附加存储:Network-Attached Storage (NAS)

NAS存储也通常被称为附加存储,顾名思义,就是存储设备通过标准的网络拓扑结构(例如以太网)添加到一群计算机上。与DAS以及SAN不同,NAS是文件级的存储方法。采用NAS较多的功能是用来进行文件共享。而且随着云计算的发展,一些NAS厂商也推出了云存储功能,大大方便了企业和个人用户的使用。NAS产品是真正即插即用的产品。

NAS设备一般支持多计算机平台,用户通过网络支持协议可进入相同的文档,因而NAS设备无需改造即可用于混合Unix/Windows NT局域网内,同时NAS的应用非常灵活。

三种存储类型比较

传输类型

DAS: SCSIFC

NAS: IP

SAN: IPFCSAS

数据类型

DAS: 数据块

NAS: 文件

SAN: 数据块

典型应用

DAS: 任何

NAS: 文件服务器

SAN: 数据库服务器

优点

DAS: 磁盘与服务器分离,便于管理

NAS: 不占用服务器资源,广泛支持操作系统,扩展较容易,即插即用,安装简单方便

SAN: 高扩展性,高可用性,数据集中,易管理

缺点

DAS: 连接距离短,数据分散,共享困难,存储利用率不高,扩展性有限

NAS: 不适合存储量大的块级应用数据,备份及恢复占用网络带宽

SAN: 相比NAS成本较高,安装和升级比NAS复杂

应用场景

DAS: 适用于那些数据量不大,对磁盘访问速度要求较高的中小企业

NAS: 多适用于文件服务器,用来存储非结构化数据,虽然受限于以太网的速度,但是部署灵活,成本低

SAN: 适用于大型应用或数据库系统,缺点是成本高、较为复杂

1.2 常见存储方式

块存储

块存储(Block Storage Service)设备不能被操作系统直接访问,需要创建分区或逻辑卷,再创建文件系统 (EXT3, EXT4, NTFS ),然后再经过挂载,才能使用。对于主机而言,其并不能识别出存储设备是真正的物理设备还是二次划分的逻辑设备(RAID等),块存储不仅仅是直接使用物理设备,间接使用物理设备的也叫块设备。比如虚拟机上创建的虚拟磁盘。

块存储大多数时候是本地存储,读写速度很快,但不利于扩展,数据不能被共享。

文件存储

文件存储(File Storage Service)可以分为本地文件存储和网络文件存储。文件存储最明显的特征是支持POSIX的文件访问接口,例如 openreadwriteseekclose  (这几个是常用的文件操作API接口 ),与块存储不同,主机不需要再对文件存储进行格式化和创建文件系统,文件管理功能已由文件存储自行管理。

文件存储的特点是便于扩展和共享,但读写速度较慢。

对象存储

对象存储(Object Storage Service)也叫基于对象的存储,是一种解决和处理离散单元的方法,可提供基于分布式系统之上的对象形式的数据存储服务。对象存储和我们经常接触到的块和文件系统等存储形态不同,它提供 RESTful API数据读写接口及丰富的 SDK 接口,并且常以网络服务的形式提供数据的访问。

对象存储不支持随机读写,只能进行全读和全写操作(无法直接在存储上进行数据更改,只能以文件为单位进行获取和删除),如果要修改数据,需要先在本地编辑完成后整文件上传。

1.3 分布式存储

在海量数据和文件的场景下,单一服务器所能连接的物理介质有限,能提供的存储空间和IO性能也是有限的,所以可以通过多台服务器协同工作,每台服务器连接若干物理介质,再配合分布式存储系统和虚拟化技术,将底层多个物理硬件设备组合成一个统一的存储服务。一个分布式存储系统,可以同时提供块存储,文件存储和对象存储这三种存储方式。​​​​​​​

2 NFS 服务

2.1 NFS 工作原理

网络文件系统:Network File System (NFS) 是由 SUN 公司研制的 UNIX 表示层协议,配合客户端和服务端软件,可以在本地挂载远程的存储空间,让本地用户和程序直接访问本地目录从而实现数据和存储空间的共享。

NFS 中的远程访问是基于 RPC ( Remote Procedure Call Protocol,远程过程调用) 来实现的。

RPC采用C/S模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行

2.2 NFS 安装和配置

NFS 基于 C/S 模式实现,所以有客户端软件和服务端软件​​​​​​​

2.3 NFS常用工具

rpcinfo

rpcinfo 可以访问指定的 RPC 服务器,显示其响应信息,从而查询出在该服务器上注册的RPC服务

如果不指定主机,则默认是当前主机

exportfs

exportfs 命令用于管理本机 NFS 文件系统,默认配置文件是 /etc/exports

showmount

shoumount 可以查看远程主机的共享设置

mount.nfs

客户端 NFS 服务挂载命令,将远程NFS 服务器上共享出来的目录挂载到本机,可以直接写成 mount

2.3 NFS 共享实现

在服务端配置共享

ubuntu 客户端配置

用户映射

统一用户映射

统一客户端主机用户和权限的方法

1. 保证客户端主机使用相同的用户(相同的用户ID)对共享目录进行读写

2. NFS 服务器上统一映射

3. 使用 LDAP 服务进行集中的帐号管理

3 数据实时同步

在生产环境中,某些场景下,要将数据或文件进行实时同步,保证数据更新后其它节点能立即获得最新的数据。

数据同步的两种方式

PULL:拉,使用定时任务的方式配合同步命令或脚本等,从指定服务器上将数据同步到本地,一般是周期性定时同步

PUSH:推,如果当前机器上的数据或文件发生更新了,立即推送到指定的节点上,可以做到实时同步​​​​​​​

3.1 实时同步的实现方式

inotify + rsync

sersync

3.2 inotify + rsync 实现数据实时同步

实现原理

利用内核中的 inotify 监控指定目录,当目录中的文件或数据发生变化时,立即调用 rsync 服务将数据推送到远程主机上。

3.2.1 inotify 服务

inotify 是一个内核用于通知用户空间程序文件系统变化的机制,在监听到文件系统发生变化后,会向相应的应用程序发送事件,如文件增加,修改,删除等事件发生后可以立即让用户空间知道。

安装软件

inotify 是内核中的功能模块,只能通过调用API接口的形式使用其功能,我们可以通过相关软件来对其进行操作,能实现内核中 inotify 调用的软件主要有以下几个:

inotify-toolssersynclrsyncd

范例:只监控一个事件

范例:持续监控

范例:递归监控

范例:将结果输出到文件

范例:从文件中读取要监控的内容

范例:后台守护执行,并指定输出格式

范例:指定输出格式,且只记录特定事件

3.2.2 rsync 服务

rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合 inotify 或sersync,可以实现触发式的实时数据同步

rsync 有三种工作方式

1. 本地文件系统上实现同步。命令行语法格式为上述 "Local" 段的格式

2. 本地主机使用远程shell和远程主机通信。命令行语法格式为上述 "Access via remote shell" 段的格式,使用的用户名和密码是 Linux系统的用户名和密码

3. 本地主机通过网络套接字连接远程主机上的 rsync daemon。命令行语法格式为上述 "Access via

rsync daemon" 段的格式,使用的用户名和密码是 rsync 服务中配置的用户名和密码

前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行 rsyncd 服务,使其监听在一个端口上,等待客户端的连接,此种方式使用的 rsync 的专有协议。

实现 rsync daemon 服务

#修改密码文件权限

[root@ubuntu ~]# chmod 600 /etc/rsyncd.pwd

[root@ubuntu ~]# ll /etc/rsyncd.pwd

-rw------- 1 root root 15 Jul 13 08:58 /etc/rsyncd.pwd

3.2.3 inotify + rsync 实现数据实时同步

#客户端同步脚本
[root@ubuntu data]# cat ./www_rsync.sh
#!/bin/bash
SRC='/data/www/'
DEST='rsyncer@10.0.0.208::dir1'
dpkg -V inotify-tools &>/dev/null || apt install inotify-tools -y




 
dpkg -V rsync &>/dev/null || apt install rsync -y
#不间断监控指定目录中的特定事件,当目录中有事件发生变化时,调用 rsync 命令进行同步
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T
%w %f' -e create,delete,moved_to,close_write,attrib ${SRC} | while read DATE
TIME DIR FILE;do
              FILEPATH=${DIR}${FILE}
              rsync -az --delete --password-file=./www_rsync.pwd $SRC $DEST && echo
"At ${TIME} on ${DATE}, file ${FILEPATH} was backup via rsync" >>
./www_rsync.log
done
#查看客户端
[root@ubuntu ~]# tree /data/
/data/
├── www
├── www_rsync.pwd
└── www_rsync.sh
1 directory, 2 files
#测试,客户端运行脚本
[root@ubuntu data]# ./www_rsync.sh
#在另一个终端中创建文件
[root@ubuntu ~]# touch /data/www/f1
[root@ubuntu ~]# cp /etc/fstab /data/www/
[root@ubuntu ~]# dd if=/dev/zero of=/data/www/test.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.00923138 s, 1.1 GB/s
[root@ubuntu ~]# mkdir -pv /data/www/dira/dirb/dirc
mkdir: created directory '/data/www/dira'
mkdir: created directory '/data/www/dira/dirb'
mkdir: created directory '/data/www/dira/dirb/dirc'
#在服务湍查看
[root@ubuntu ~]# tree /data/dir1/
/data/dir1/
├── dira
│
│
└── dirb
└── dirc
├── f1
├── fstab
└── test.img
3 directories, 3 files


3.3 sersync 实现数据实时同步

sersync 类似 inotify,同样用于监控,但它克服了 inotify 的缺点,inotify 最大的不足是会产生重复事件,或者同一个目录下多个文件的操作会产生多个事件,例如,当监控目录中有5个文件时,删除目录时会产生6个监控事件,从而导致重复调用 rsync 命令。另外比如:vim 文件时,inotify 会监控到临时文件的事件,但这些事件相对于 rsync 来说是不应该被监控的。

sersync 特点

sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤,

所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。

sersync 配置很简单,其中提供了静态编译好的二进制文件和 xml 配置文件,直接使用即可

sersync 使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态

sersync 有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对

同步失败的文件重新同步sersync 不仅可以实现实时同步,另外还自带 crontab 功能,只需在 xml 配置文件中开启,即也可以 按要求隔一段时间整体同步一次,而无需再额外配置 crontab 功能

sersync 可以二次开发

2023SRE线上班全程班(202309改版)

2024Linux云计算SRE工程师万老师

第1天-行业介绍和计算机基础

1-计算机基础和Linux安装

内容概述

计算机系统

计算机硬件组成

操作系统

Linux相关介绍

Linux哲学思想

虚拟机

Linux 安装

1 计算机系统

1.1计算机硬件

计算机发展历史:

电子管时代:第一代计算机(1945-1957)

晶体管时代:第二代计算机(1958-1964)

集成电路时代:第三代计算机(1965-1970)

大规模集成电路时代:第四代计算机(1972-至今)

量子计算机/生物计算机:第五代计算机(可能已经开始了)

冯诺依曼体系结构

其主要内容如下:

1.计算机处理的数据和指令一律用二进制数表示;

2.顺序执行程序的每一条指令;

3.计算机由运算器,控制器,存储器,输入设备和输出设备五大部份组成;

1.1.6 服务器硬件组成 存储器的层次结构

1.2 操作系统和Linux

什么是操作系统: 操作系统( operating system ,简称 OS )是管理计算机硬件与软件资源的计算机程序。操作系统需要处 理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。 linux unix 1.2.7 Linux Linux 的内核版本组成

2 Linux 安装

虚拟化软件,建议使用 Vmware Workstation

linux虚拟机安装

第2天-Linux基础入门和帮助

内容概述

用户 终端 Shell 介绍 执行命令 简单命令 Tab 键补全 命令行历史 bash 快捷键 帮助用法

1 Linux 基础

1.1 用户类型 root 用户 一个特殊的管理帐户 也被称为超级用户 root 已接近完整的系统控制 对系统损害几乎有无限的能力 除非必要,不要登录为 root 普通( 非特权 )用户 权限有限 造成损害的能力比较有限 1.3.2   什么是 shell

Shell Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行 

1.3.3 各种Shell

1.3.4 bash shell

GNU Bourne-Again Shell(bash)GNU计划中重要的工具软件之一,目前也是 Linux 标准的 shell,与sh兼容

显示当前使用的 shell

root@ubuntu2204:~# echo ${SHELL}

/bin/bash

显示当前系统使用的所有shell

root@ubuntu2204:~# cat /etc/shells

# /etc/shells: valid login shells

/bin/sh

/bin/bash

/usr/bin/bash

/bin/rbash

/usr/bin/rbash

/usr/bin/sh

/bin/dash

/usr/bin/dash

/usr/bin/tmux

/usr/bin/screen

1.4 设置主机名

#临时生效

hostname NAME

#持久生效,支持CentOS7Ubuntu18.04以上版本

hostnamectl set-hostname NAME

1.6.2 shell中可执行的两类命令

内部命令:由shell自带的,而且通过某命令形式提供,用户登录后自动加载并常驻内存中

外部命令:在文件系统路径下有对应的可执行程序文件,当执行命令时才从磁盘加载至内存中,执

行完毕后从内存中删除

1.7 常见命令

1.7.1 查看硬件信息

1.7.1.1 查看 cpu

lscpu 命令可以查看cpu信息

cat /proc/cpuinfo也可看查看到

1.7.1.2 查看内存大小

[root@ubuntu2204 ~]# free
total
used
353580
0
free
844332
shared buff/cache available
1328 791616 1479600
Mem:
1989528
2097148
Swap:
2097148
[root@ubuntu2204 ~]# cat /proc/meminfo
MemTotal:
MemFree:
MemAvailable:
.....

1.7.1.3 查看硬盘和分区情况

[root@centos8 ~]# lsblk

[root@centos8 ~]# cat /proc/partitions

1.7.2 查看系统版本信息

1.7.2.1 查看系统架构

[root@ubuntu2204 ~]# arch

x86_64

1.7.2.2 查看内核版本

[root@rocky8 ~]# uname -r

4.18.0-372.9.1.el8.x86_64

1.7.2.3 查看操作系统发行版本

#CentOS8 查看发行版本

[root@centos8 ~]#cat /etc/redhat-release

CentOS Linux release 8.1.1911 (Core)

[root@centos8 ~]#cat /etc/os-release

[root@centos8 ~]#lsb_release -a

1.7.3 日期和时间

Linux的两种时钟

系统时钟:由Linux内核通过CPU的工作频率进行的

硬件时钟:主板

[root@ubuntu2204 ~]# date
Mon May 8 02:21:33 AM UTC 2023
#显示时区信息
[root@ubuntu2204 ~]# date -R
Mon, 08 May 2023 02:21:40 +0000
#时间戳
[root@ubuntu2204 ~]# date +%s
1683512505
[root@ubuntu2204 ~]# date -d @`date +%s`
Mon May 8 02:21:51 AM UTC 2023
[root@ubuntu2204 ~]# date -d @1683512505
Mon May 8 02:21:45 AM UTC 2023
[root@ubuntu2204 ~]# date -d @1683512505 +%F_%T
2023-05-08_02:21:45
[root@ubuntu2204 ~]# date -d "2023-05-08" +%s
1683504000

clockhwclock 显示硬件时钟

[root@centos8 ~]# ll /usr/sbin/clock
lrwxrwxrwx. 1 root root 7 Oct 14 2021 /usr/sbin/clock -> hwclock
#对钟
[root@rocky86 ~]# clock -s
[root@ubuntu2204 ~]# ll /usr/sbin/clock
ls: cannot access '/usr/sbin/clock': No such file or directory
[root@ubuntu2204 ~]# ll /usr/sbin/hwclock
-rwxr-xr-x 1 root root 51704 Feb 21 2022 /usr/sbin/hwclock*

关机:

halt

poweroff

init 0

shutdown -h now

重启:

reboot

init 6

shutdown -r now

#ctrl+alt+delete 三键

关机或重启:shutdown

shutdown 程序会广播己登录的用户,被看作是安全的关机命令

是一个计划关机任务,可撤销

1.7.5 用户登录信息查看命令

whoami: 显示当前登录有效用户

who: 系统当前所有的登录会话

w: 系统当前所有的登录会话及所做的操作

1.7.6 文本编辑

nano 工具可以实现文本的编辑,上手容易,适合初学者

gedit 工具是图形工

1.7.7 会话管理

终端复用器软件就是会话与窗口的"解绑"工具,将它们彻底分离。

1. 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。

2. 它可以让新窗口"接入"已经存在的会话。

3. 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。

4. 它还支持窗口任意的垂直和水平拆分。

类似的终端复用器还有ScreenTmux

1.7.8 输出信息 echo

1.7.8.1 echo 基本用法

echo 命令可以将后面跟的字符进行输出

1.8 字符集和编码及语言环境

1.9 命令行扩展和被括起来的集合

1.9.1 命令行扩展:``  $()

[root@ubuntu2204 ~]# echo "echo $HOSTNAME"

echo ubuntu2204

[root@ubuntu2204 ~]# echo 'echo $HOSTNAME'

echo $HOSTNAME

[root@ubuntu2204 ~]# echo `echo $HOSTNAME`

ubuntu2204

#结论:

单引号:强引用,六亲不认,变量和命令都不识别,都当成了普通的字符串,"最傻"

双引号:弱引用,不能识别命令,可以识别变量,"半傻不精"

反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容

当成命令进行执行后,再交给调用反向单引号的命令继续,"最聪明"

1.9.2 括号扩展:{ }

{} 可以实现打印重复字符串的简化形式

{元素1,元素2,元素3}

{元素1..元素2}

echo file{1,3,5} 结果为:file1 file3 file5

[root@ubuntu2204 ~]# echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
[root@ubuntu2204 ~]# echo {a..z..2}
a c e g i k m o q s u w y
[root@ubuntu2204 ~]# echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i
j k l m n o p q r s t u v w x y z
[root@ubuntu2204 ~]# echo {a..z} {A..Z}
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z
[root@ubuntu2204 ~]# echo {a..z}{1..3}
a1 a2 a3 b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3 h1 h2 h3 i1 i2 i3
j1 j2 j3 k1 k2 k3 l1 l2 l3 m1 m2 m3 n1 n2 n3 o1 o2 o3 p1 p2 p3 q1 q2 q3 r1 r2 r3
s1 s2 s3 t1 t2 t3 u1 u2 u3 v1 v2 v3 w1 w2 w3 x1 x2 x3 y1 y2 y3 z1 z2 z3

1.10 tab 键补全

tab 键可以实现命令及路径等补全,提高输入效率,避免出错

1.11 命令行历史

命令:history

1.13 bash的快捷键

2 获得帮助

whatis & whereis 命令

command --help 选项

man 手册

程序自带文档 /usr/share/doc

项目官网文档

行业网站

搜索引擎

第3天-Linux文件管理和I0重定向

文件管理和IO重定向

内容概述

文件系统目录结构

创建和查看文件

复制、转移和删除文件

软和硬链接

IO 重定向和管道

文件系统目录结构

1.1 文件系统的目录结构

文件和目录被组织成一个单根倒置树结构

文件系统从根目录下开始,用“/”表示

根文件系统(rootfs)root filesystem

标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL

 . 开头的文件为隐藏文件

路径分隔的 /

文件名最长255个字节

包括路径在内文件名称最长4095个字节

蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件  ->其他文件

除了斜杠和NUL,所有字符都有效,但使用特殊字符的目录 和文件不推荐使用,有些字符需要用引

号来引用

每个文件都有两类相关数据:元数据:metadata,即属性,  data,即文件内容

1.2 常见的文件系统目录功能

1.3 应用程序的组成部分

不同类型文件常用的目录

1.5 Linux 下的文件类型 linux 系统中的文件类型标识符

2

文件操作命令

2.1 显示当前工作目录

显示当前shell CWD的绝对路径

pwd命令: printing working directory

2.2 绝对和相对路径

#
[
走绝对路径,从根目录出发
root@ubuntu2204 ~]# cd /etc/apt/
[
/
root@ubuntu2204 apt]# pwd
etc/apt
#
走相对路径,从当前目录出发
[
/
root@ubuntu2204 apt]# pwd
etc/apt
[
root@ubuntu2204 apt]# ls
apt.conf.d keyrings
sources.list
sources.list
auth.conf.d preferences.d sources.list.curtin.old trusted.gpg.d
[
root@ubuntu2204 apt]# cd apt.conf.d/
[
root@ubuntu2204 apt.conf.d]# pwd
etc/apt/apt.conf.d
/
#
[
走相对路径,从当前目录出发
root@ubuntu2204 apt.conf.d]# cd ../../.
[
root@ubuntu2204 ~]# pwd
root

2.3 更改目录

cd

2.4 列出目录内容

2.5 查看文件状态 stat

一个文件有两部份信息:元数据和具体内容

#查看文件元数据

[root@ubuntu2204 ~]# stat /etc/fstab

2.6 确定文件内容

文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用

[root@ubuntu2204 ~]# file test.sh

test.sh: Bourne-Again shell script, ASCII text executable

2.7 文件通配符模式 wildcard pattern

文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件

通配符采用特定的符号,表示特定的含义,此特定符号称为元 meta 字符

常见的通配符如下:

2.8 创建空文件和刷新时间

touch命令可以用来创建空文件或刷新文件的时间

2.9 复制文件和目录

利用 cpcopy)命令可以实现文件或目录的复制

2.10 移动和重命名文件

mv 命令可以实现文件或目录的移动和改名

同一分区移动数据,速度很快,数据位置没有变化

不同分区移动数据,速度相对慢,数据位置发生了变化

利用 rename 可以批量修改文件名

2.11 删除文件

使用 rm 命令可以删除文件和目录

注意:此命令非常危险,慎重使用,建议使用 mv 代替 rm

范例:避免误删除,定义别名

[root@ubuntu2204 ~]# alias rm='mv -t /tmp'

2.12 目录操作

2.12.1 显示目录树 tree

2.12.2 创建目录 mkdir

2.11.3 删除空目录 rmdir

rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树

3 文件元数据和节点表结构

3.1 inode 表结构

Linux系统中,一切皆文件,

每个文件,又分为文件元数据和具体内容两部份,

一个文件元数据和其具体内容数据,在磁盘分区上,是分开存放的。

这种存储文件元数据的区域就叫 inode,中文译作 "索引节点"

每一个inode表记录对应的保存了以下信息:

inode number(索引节点编号)

文件类型

权限

属主属组

链接数

文件大小

各时间戳

指向具体数据块的指针

有关文件的其他数据

3.2 (hard)链接

hard link

硬链接的作用是允许一个文件拥有多个有效的路径名,

新增一个文件,指向某个文件的inode,这样,这两个文件就互为硬链接,

也就是多个文件名,都是指向同一个inode,这是硬链接的本质。

3.3 符号 symbolic (或软 soft)链接

symbolic link,也称为符号链接,类似于windows 中的快捷方式,

软链接是建立一个独立的文件,这个文件的指向的是目标的文件名。

软链接特点

一个符号链接的内容是它引用文件的名称

可以对目录创建软链接

可以跨分区的文件实现

指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode

引用计数

软链接如果使用相对路径,是相对于源文件的路径,而非相对于当前目录

删除软链接本身,不会删除源目录内容

删除源目录的文件,不会删除链接文件

格式:

ln -s filename linkname

范例:删除软链接

3.4 硬链接和软链接区别总结

3.5 生产案例

3.5.1 案例1:提示空间满 No space left on device,但 df 可以看 到空间很多,为什么?

3.5.2 案例2:提示空间快满,使用 rm 删除了很大的无用文件后,df 仍然看到空间不足,为什么?如何解决?

4 IO 重定向和管道

4.1 标准输入和输出

Linux系统中有三个最基本的IO设备

1. 标准输入设备(stdin):对应终端键盘

2. 标准输出设备(stdout):对应终端的显示器

3. 标准错误输出设备(stderr):对应终端的显示器

4.2 I/O重定向 redirect

重定向:redirect

I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标

4.2.1 标准输出和错误重新定向

STDOUTSTDERR默认是使用当前终端,但也可以重定向到指定终端或指定文件

4.2.2 标准输入重定向

4.2.2.1 tr 命令

用于转换字符、删除字符和压缩重复的字符。它从标准输入读取数据并将结果输出到标准输出

4.2.2.1 标准输入重定向

标准输入重定向是使用文件来代替键盘的输入,

从文件中读取数据,代替当前终端的输入设备输入的数据,

此处要严格区分命令是否支持标准输入,标准输入和参数是两个概念;

怎么判断命令能使用标准输入重定向?

不跟任何选项参数,直接回车,看是否等待标准输入,如果是,则该命令可以使用标准输入重定向

[root@ubuntu2204 ~]# cat a.txt
1+2+3+4+5+6+7+8+9+10
#标准输入重定向
[root@ubuntu2204 ~]# bc < a.txt
55
#标准输入输出重定向
[root@ubuntu2204 ~]# bc < a.txt > rs.txt
[root@ubuntu2204 ~]# cat rs.txt
55
#多行执行
[root@ubuntu2204 ~]# seq -s + 10 > a.txt;bc<a.txt>rs.txt


4.2.2.2 标准输入多行重定向

使用 "<<终止词" 命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN

有时被称为就地文本(here documents,其中终止词可以是任何一个或多个符号,比如:!@$

EOFEnd Of File等,其中EOF比较常用

4.2.2.4 高级重定向写法

4.2.2.4.1 cmd <<< "string"

含义是 here-string ,表示传给给cmdstdin的内容从这里开始是一个字符串。

4.2.2.4.2 cmd1 < <(cmd2)

名称为 Process substitution ,是由两个部分组成

<(cmd2) 表示把cmd2的输出写入一个临时文件, 注意:< 符号 与( 符号之间没有空格

cmd1 < 这是一个标准的stdin重定向

把两个合起来,就是把cmd2的输出stdout传递给cmd1作为输入stdin, 中间通过临时文件做传递

范例:

[root@ubuntu2204 ~]# bc < <(echo 1+2+3)

6

[root@ubuntu2204 ~]# bc < <(seq -s + 3)

6

[root@ubuntu2204 ~]# tr 'a-z' 'A-Z' < <(hostname)

ROCKY86

4.3 管道

4.3.1 管道

(pipe):名顾思义,水管,从一端进去,再从另一端出来。

shell 中,可以将两个或多个命令(程序|进程)连接起来,将前一个命令的输出作为后一个命令的输入,

就像拿水管将两个命令连起来;

使用管道,要求前一个命令必须支持标准输出,后一个命令必须支持标准输入;

格式

COMMAND1|COMMAND2|COMMAND3|...

功能说明:

将命令1STDOUT发送给命令2STDIN,命令2STDOUT发送到命令3STDIN

所有命令会在当前shell进程的子shell进程中执行

组合多种工具的功能

注意:STDERR默认不能通过管道转发,可利用2>&1  |& 实现,格式如下

COMMAND1 2>&1 | COMMAND2

COMMAND1 |& COMMAND2

范例:

[root@ubuntu2204 ~]# echo 1+2+3|bc

6

4.3.2 tee 命令

将标准输入复制到每个指定文件,并显示到标准输出

第4天-用户和权限管理

内容概述

Linux的安全模型

用户和组相关文件

用户和组管理命令

理解并设置文件权限

默认权限

特殊权限

文件访问控制列表

1 Linux安全模型

资源分派:

Authentication:认证,验证用户身份

Authorization:授权,不同的用户设置不同权限

Accouting:审计 ,事后行为

Linux系统中,当用户登录成功时,系统会自动分配令牌 token,包括:用户标识和组成员等信息。

3A认证:又称AAA认证,是一套针对网络设备的网络访问控制策略安全模型。

1.1 用户

Linux系统是多用户系统,可以同时存在多个用户,每个用户之间都是互相隔离的。

Linux系统中,每个用户是通过User Id UID)来唯一标识的。

1.2 用户组

Linux中可以将一个或多个用户加入用户组中,组就是包含0个或多个用户的集合,用户组是通过Group ID(GID 来唯一标识的。

1.4 安全上下文

Linux安全上下文Context

Linux系统中,运行中的程序(即进程process),都是以进程发起者的身份运行;

进程所能够访问的资源权限取决于进程的运行者的身份;

首先,什么是程序

一个程序或一个命令,本质上也是一个可执行的二进制文件或一个可执行的脚本文件;

在服务器上有很多文件,只有那些特定的,可以被执行的二进制文件,才能被称为程序;

其次,什么是进程

运行中的程序,就是进程;

第三,程序,进程,用户之间的关系是怎样的

只有可以被执行的文件,才能叫作程序;

对于同一个程序,也不是所有用户都可以运行的,这要取决于当前用户对该程序有没有可执行权限;

第四,进程的访问资源

一个进程能不能访问某些资源,是由进程发起者决定的(跟进程本身的程序文件无关),比如某进程要

读写某个文件,则要看该进程发起者有没有权限读取该文件;

2 用户和组的配置文件

2.1 用户和组的主要配置文件

/etc/passwd:用户及其属性信息(名称、UID、主组ID等)

/etc/shadow:用户密码及其相关属性

/etc/group:组及其属性信息

/etc/gshadow:组密码及其相关属性

4 文件权限管理

4.1 Linux中的权限体系介绍

Linux系统中,一切皆文件;

对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户;

而每个角色用户,对该文件的权限,也分三种,分别是读,写,执行;

范例:面试题

执行 cp /etc/issue /data/dir/ 所需要的最小权限?

/bin/cp 需要x权限

/etc/ 需要x权限

/etc/issue 需要r权限

/data 需要x权限

/data/dir 需要w,x权限

4.6 访问控制列表 ACL

4.6.1 ACL权限功能

rwx 权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成;

ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制;

ACL生效顺序:

所有者,自定义用户,所属组,自定义组,其他人

4.6.2 ACL相关命令

setfacl 可设置ACL权限

getfacl 可查看设置的ACL权限

第5天-文本处理工具和正则表达式

内容概述

文本编辑工具VIM

各种文本工具

基本正则表达式和扩展正则表达式

文本处理三剑客之grep

1 文本编辑工具之神VIM

文本编辑种类:

全屏编辑器:nano(字符工具), gedit(图形化工具)vivim

行编辑器:sed

VIM 小抄

1.2.2 三种主要模式和转换

vim 是一个模式编辑器,击键行为是依赖于 vim 模式

三种模式:

命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本

插入(Insert)或编辑模式:用于修改文本

扩展命令(extended command )或命令()行模式:保存,退出等

1.8 vim 总结图

2 文本常见处理工具

2.1 文件内容查看命令

2.1.1 查看文本文件内容

2.1.1.1 cat

cat 可以查看文本内容

2.2 分页查看文件内容

2.2.1 more

可以实现分页查看文件,可以配合管道实现输出信息的分页

2.3 显示文本前面或后面的行内容

2.3.1 head

可以显示文件或标准输入的前面行

2.3.2 tail

tail head 相反,查看文件或标准输入的倒数行

2.3.3 head  tail 总结

2.4 按列抽取文本 cut

cut 命令可以提取文本文件或STDIN数据的指定列

2.5 合并多个文件 paste

paste 合并多个文件同行号的列到一行

2.6 分析文本的工具

文本数据统计:wc

整理文本:sort

比较文件:diffpatch

3 正则表达式

REGEXP Regular Expressions,由一类特殊字符及文本字符所编写的模式;其中有些字符(元字符)

不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能;但与通配符不同,通配

符功能是用来处理文件名,而正则表达式是处理文本内容中字符;

正则表达式被很多程序和开发语言所广泛支持:vim, lessgrepsedawk, nginxmysql ;

正则表达式分两类:

基本正则表达式:BRE Basic Regular Expressions

扩展正则表达式:ERE Extended Regular Expressions

3.1 基本正则表达式元字符

3.1.1 字符匹配

3.2 扩展正则表达式元字符

3.2.1 字符匹配

3.2.2 匹配次数

3.2.3 位置锚定

4 文本处理三剑客

grep 命令主要对文本的(正则表达式)行基于模式进行过滤

sedstream editor,文本编辑工具

awkLinux上的实现gawk,文本报告生成器

第6天-文件查找和打包压缩

内容概述

locate

find

xargs

compressuncompress

gzipgunzip

bzip2bunzip2

xzunxz

zipunzip

tar

1 文件查找

在文件系统上查找符合条件的文件

文件查找:

非实时查找(数据库查找)locate

实时查找:find

2 压缩和解压缩

主要针对单个文件压缩,而非目录

2.1 compress  uncompress

此工具来自于ncompress包,此工具目前已经很少使用

对应的文件是 .Z 后缀

3 打包和解包

3.1 tar

tar  Tape ARchive 磁带归档,可以对目录和多个文件打包成一个文件进行归档;

其本身不具备压缩功能,但可以使用参数调用相应的压缩命令进行压缩;

此命令可以保留文件属性,推荐使用;

对应的文件是 .tar 后缀

第7天-shell脚本编程-基础

内容概述

编程基础

脚本基本格式

变量

运算

条件测试

配置用户环境

流程控制

函数

脚本工具

数组

字符串处理

高级变量

1 编程基础

2 shell 脚本语言的基本用法

2.1 shell 脚本的用途

将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率

减少手工命令的输入,一定程度上避免人为错误

将软件或应用的安装及配置实现标准化

用于实现日常性的,重复性的,非交互式的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

2.6 shell 脚本调试

写一个脚本,获取主机系统信息,包括CPU型号,内存大小,硬盘大小,操作系统版本这四个指标

root@ubuntu2204 ~]# vim sysinfo-v1.sh
#!/bin/bash
lscpu | sed -nr 's/^Model name: +(.*)/\1/p'
cat /proc/meminfo | head -n 1 | tr -s " " | cut -d" " -f2,3
lsblk /dev/sda | grep "^sda" | tr -s " " | cut -d" " -f4
cat /etc/os-release | sed -nr "s/^VERSION=\"(.*)\"/\1/p"
[root@ubuntu2204 ~]# bash sysinfo-v1.sh

第二个版本

#!/bin/bash
echo -e "CPU
\c"
lscpu | sed -nr 's/^Model name: +(.*)/\1/p'
echo -e "Mem
\c"
cat /proc/meminfo | head -n 1 | tr -s " " | cut -d" " -f2,3
echo -e "DISK
\c"
lsblk /dev/sda | grep "^sda" | tr -s " " | cut -d" " -f4
echo -e "OS
\c"
cat /etc/os-release | sed -nr "s/^VERSION=\"(.*)\"/\1/p"
[root@ubuntu2204 ~]# bash sysinfo-v2.sh
第三个版本
#!/bin/bash
echo -e "========================= sysinfo begin ================\n"
echo -e "CPU
\c"
echo -e "\E[1;32m `lscpu | sed -nr 's/^Model name: +(.*)/\1/p'` \E[0m"
echo -e "Mem
\c"
echo -e "\E[1;32m `cat /proc/meminfo | head -n 1 | tr -s " " | cut -d" " -f2,3` \E[0m"
echo -e "DISK
\c"
echo -e "\E[1;32m `lsblk /dev/sda | grep "^sda" | tr -s " " | cut -d" " -f4` \E[0m"
echo -e "OS
\c"
echo -e "\E[1;32m `cat /etc/os-release | sed -nr 's/^VERSION=\"(.*)\"/\1/p'` \E[0m"
echo -e "\n========================= sysinfo end =================="
[root@ubuntu2204 ~]# bash sysinfo-v3.sh

2.7 变量

2.7.1 变量

变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据

数据要存在内存空间中,而内存空间又是通过内存地址来访问的,但内存地址一般是16进制的编号;

为了方便使用,就有了变量名,当访问一个变量时,实际是访问其对应的内存地址的那块内存空间;

练习:

1. 编写脚本 sysinfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核版 本,CPU型号,内存大小,硬盘大小

2. 编写脚本 backup.sh,可实现每日将 /etc/ 目录备份到 /backup/etcYYYY-mm-dd

3. 编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值

4. 编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

2.8 格式化输出 printf

相当于增强版的 echo, 实现丰富的格式化输出

2.9 算术运算

2.10 逻辑运算

2.10.1 与或非

2.12 关于 ()  {}

( cmd1;cmd2;... )  { cmd1;cmd2;...; } 都可以将多个命令组合在一起,批量执行

( list ) 会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境

{ list; } 不会开启子shell, 在当前shell中运行,会影响当前shell环境,左侧要有空格,右侧要有; 结束

2.13 组合测试条件

2.13.1 第一种方式

练习

1. 编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户至少应该给 一个参数,并立即退出;如果参

数个数不小于1,则显示第一个参数所指向的文件中的空白行数

2. 编写脚本 hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提 示用户IP地址可访问;如果不

ping通,则提示用户IP地址不可访问

3. 编写脚本 checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满

4. 编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写

5. 编写脚本 excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限, 否则提示用户非脚本文件

6. 编写脚本 nologin.sh login.sh,实现禁止和允许普通用户登录系统

2.14 使用read命令来接受输入

使用read来把输入值分配给一个或多个shell变量,read从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个

变量,如果变量名没有指定,默认标准输入的值赋值给系统内置变量REPLY

3 bash shell 的配置文件

3.1 按生效范围划分两类

全局配置:针对所有用户皆有效

/etc/profile

/etc/profile.d/*.sh

/etc/bashrc

个人配置:只针对特定用户有效

~/.bash_profile

~/.bashrc

3.2 shell登录两种方式分类

3.2.1 交互式登录

直接通过终端输入账号密码登录

使用 su - UserName 切换的用户

3.2.2 非交互式登录

su UserName

图形界面下打开的终端

执行脚本

任何其它的bash实例

3.5 Bash 退出任务

保存在~/.bash_logout文件中(用户),在退出登录shell时运行

功能:

创建自动备份

清除临时文件

练习

1. 让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin

2. 用户 root 登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm -i’ cdnet=‘cd /etc/sysconfig/network-scripts/’

editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’ editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736  ifcfg-

ens33  (如果系统是 CentOS7)

3. 任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous

4. 编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等

4 流程控制

4.1 条件选择

4.1.1 条件判断分绍

4.1.1.1 单分支条件

4.1.1.2 多分支条件

4.1.1.2 多分支条件

4.2 循环

4.2.1 循环执行介绍

练习

1. 每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记 录于日志/var/log/login.log,并退

出脚本

2. 随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出 k

3. 用文件名做为参数,统计所有参数文件的总行数

4. 用二个以上的数字为参数,显示其中的最大值和最小值

5 函数 function

5.1 函数介绍

函数 function

是由若干条shell命令组成的语句块,实现代码重用和模块化编程

它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分

5.8 函数递归

函数递归:

函数直接或间接调用自身,注意递归层数,可能会陷入死循环

递归特点:

函数内部自已调用自已

必须有结束函数的出口语句,防止死循环

练习

1. 编写函数,实现OS的版本判断

2. 编写函数,实现取出当前系统eth0IP地址

3. 编写函数,实现打印绿色OK和红色FAILED

4. 编写函数,实现判断是否无位置参数,如无参数,提示错误

5. 编写函数,实现两个数字做为参数,返回大值

6. 编写服务脚本/root/bin/testsrv.sh,完成如下要求

6 其它脚本相关工具

6.1 信号捕捉 trap

trap 命令可以捕捉信号,修改信号原来的功能,实现自定义功能

在脚本或程序的执行过程中,我们可以通过发送信号的方式,打断或终止程序的执行过程,为了避免这种情况,我们可以使用信号捕捉,来

自定义信号处理。

6.2 创建临时文件 mktemp

mktemp 命令用于创建并显示临时文件,可避免冲突

6.3 安装复制文件 install

install 功能相当于cpchmodchownchgrp mkdir 等相关工具的集合

7 数组 array

7.1 数组介绍

变量:存储单个元素的内存空间

数组:存储多个元素的连续的内存空间,相当于多个变量的集合

数组名和索引

索引的编号从0开始,属于数值索引

索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

bash的数组支持稀疏格式(索引不连续)

7.7 数组数据处理

数组切片

${ARRAY[@]:offset:number}
${ARRAY[*]:offset:number}
offset
number
#要跳过的元素个数
#要取出的元素个数
#取偏移量之后的所有元素
{ARRAY[@]:offset}
{ARRAY[*]:offset}

8 字符串处理

8.1 字符串切片

8.1.1 基于偏移量取字符串

9 高级变量

9.1 高级变量赋值

$str 为变量名,expr 为具体字符串

这些组合可以省掉一些 ifelse 的判断代码

9.3 变量间接引用

9.3.1 eval命令

eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描

第8天-软件管理

内容概述

软件运行环境

软件包基础

rpm包管理

yumdnf管理

定制yum仓库

编译安装

Ubuntu软件管理

1 软件运行和编译

1.1 软件相关概念

2 软件包和包管理器

2.1 软件包介绍

开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软

件。用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一个管理工具

dpkg也就应运而生,可用来管理deb后缀的""文件。从而著名的“package”概念第一次出现在

GNU/Linux系统中,稍后Red Hat才开发自己的rpm包管理系统。

3 包管理器rpm

CentOS系统上使用rpm命令管理程序包

功能:安装、卸载、升级、查询、校验、数据库维护

4 yumdnf

CentOS使用 yum, dnf 解决 rpm 的包依赖关系

YUM: Yellowdog Update Modififierrpm的前端程序,可解决软件包相关依赖性,可在多个库之间定

位软件包,up2date的替代工具

CentOS 8 dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的

5 Ubuntu 软件管理

Debian 软件包通常为预编译的二进制格式的扩展名“.deb”,类似 rpm 文件,因此安装快速,无需编译

软件。包文件包括特定功能或软件所必需的文件、元数据和指令

dpkgpackage manager for Debian,类似于rpm dpkg是基于Debian的系统的包管理器。可

以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项

aptAdvanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基

于客户/服务器架构(c/s)

5.4 snap 工具

Snap 包是 Ubuntu 16.04 LTS 发布时引入的新应用格式包。目前已流行在 Ubuntu 且在其他如

DebianArch LinuxFedoraKaili LinuxopenSUSERed Hat  Linux 发行版上通过 snapd 来安装使用 snap 应用。

6 程序包编译

序包编译安装:

源代码-->预处理-->编译-->汇编-->链接-->执行

多文件:文件中的代码之间,很可能存在跨文件依赖关系

虽然有很多开源软件将软件打成包,供人们使用,但并不是所有源代码都打成包,如果想使用开源软件,可能需要自已下载源码,进行编译安装。另外即使提供了包,但是生产中需要用于软件的某些特性,仍然需要自行编译安装。但是利用源代码编译安装是比较繁琐的,庆幸的是有相关的项目管理工具可以大大减少编译过程的复杂度。

6.4 C语言源代码编译安装过程

利用编译工具,通常只需要三个大的步骤

1. ./configure

(1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefifile.in

文件生成Makefile

(2) 检查依赖到的外部环境,如依赖的软件包

2. make 根据Makefifile文件,构建应用程序

make -j N

#并行编译,Ncpu 核数

3. make install 复制文件到相应路径

注意:安装前可以通过查看READMEINSTALL获取帮助

第9天-磁盘存储和文件系统

内容概述

磁盘结构

分区类型

管理分区

管理文件系统

挂载设备

管理swap空间

RAID管理

LVM管理

LVM快照

1 磁盘结构

1.1 设备文件

Linux 哲学思想:一切皆文件

对于硬件设备,在Linux系统中,也是以文件的形式呈现出来的

磁盘设备的设备文件命名

设备类型

设备文件命名

备注

1.2 硬盘类型

硬盘接口类型

IDE:133MB/s,并行接口,早期家用电脑

SCSI640MB/s,并行接口,早期服务器

SATA6GbpsSATA数据端口与电源端口是分开的,即需要两条线,一条数据线,一条电源线

SAS6GbpsSAS是一整条线,数据端口与电源端口是一体化的,SAS中是包含供电线的,而

SATA中不包含供电线。SATA标准其实是SAS标准的一个子集,二者可兼容,SATA硬盘可以插入

SAS主板上,反之不行

USB480MB/s

M.2

注意:速度不是由单纯的接口类型决定,支持Nvme协议硬盘速度是最快的

硬盘存储术语 CHS

2 管理存储

使用磁盘空间过程

1. 设备分区

2. 创建文件系统

3. 挂载新的文件系统

2.1 磁盘分区

2.1.1 为什么分区

优化I/O性能

实现磁盘空间配额限制

提高修复速度

隔离系统和程序

安装多个OS

采用不同文件系统

2.1.2 分区方式

两种分区方式:MBRGPT

2.2 文件系统

2.2.1 文件系统概念

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的

方法。

操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统

从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进

行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的

存取,安全控制,日志,压缩,加密等。

2.2.2 文件系统类型

Linux 常用文件系统

Windows 常用文件系统

Unix常用文件系统

网络文件系统

集群文件系统

分布式文件系统

RAW

裸文件系统,未经处理或者未经格式化产生的文件系统

2.3 挂载

挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问

入口的行为

卸载:为解除此关联关系的过程

把设备关联挂载点:mount Point

挂载点下原有文件在挂载完成后会被临时隐藏,因此,挂载点目录一般为空 进程正在使用中的设备无法被卸载

2.3.1 挂载文件系统 mount

2.3.2 卸载文件系统 umount

卸载时:可使用设备,也可以使用挂载点

2.3.3 查看挂载情况

查看挂载

2.3.4 持久挂载

将挂载保存到 /etc/fstab 中可以下次开机时,自动启用挂载

2.3.5 重新挂载

修改了/etc/fstab 文件中的挂载规则,无法通过 mount -a 生效,要执行执行挂载

mount -o remount MOUNTPOINT

2.4 处理交换文件和分区

2.4.1 swap 介绍

swap交换分区是系统RAM的补充,swap 分区支持虚拟内存。当没有足够的 RAM 保存系统处理的数据

时会将数据写入 swap 分区,当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。

配置过多 swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄

注意:为优化性能,可以将swap 分布存放,或高性能磁盘存放

2.5 移动介质

挂载意味着使外来的文件系统看起来如同是主目录树的一部分,所有移动介质也需要挂载,挂载点通常

/media /mnt

访问前,介质必须被挂载

摘除时,介质必须被卸载

按照默认设置,非根用户只能挂载某些设备(光盘、DVD、软盘、USB等等)

2.6 磁盘常见工具

2.6.1 文件系统查看工具 df

2.6.2 目录统计工具 du

2.6.3 文件工具 dd

dd 命令:convert and copy a file

3 RAID

3.1 什么是RAID

"RAID"一词是由David Patterson, Garth A. Gibson, Randy Katz 1987年在加州大学伯克利分校发明的。在19886SIGMOD会议上提交的文"A Case for Redundant Arrays of Inexpensive Disks"

(中文翻译:廉价磁盘冗余阵列案例) 中提出。为了提升磁盘系统性能,他们提出用许多块廉价的磁盘做成一个磁盘组,在性能上超过昂贵的大型机上的单个大容量磁盘。

文中同时定义了RAID5个级别:RAID 1RAID 2RAID 3RAID 4RAID 5,这些都被沿用至今。

旧称廉价磁盘冗余阵列 Redundant Array of Inexpensive Disks

现称独立硬盘冗余阵列( Redundant Array of Independent Disks

简称磁盘阵列

利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。

RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如:RAID 0RAID 1RAID 5RAID 6RAID 7RAID 01RAID 10RAID 50RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。

4 逻辑卷管理器(LVM

4.1 LVM介绍

LVM: Logical Volume Manager 可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小,

允许在多个物理设备间重新组织文件系统

LVM可以弹性的更改LVM的容量

实现过程

将设备指定为物理卷

用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent

PE)来定义的

在物理卷上创建的逻辑卷, 是由物理区域(PE)组成

可以在逻辑卷上创建文件系统并挂载

4.3 逻辑卷快照

4.3.1 逻辑卷快照原理

快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝,对于需要备份或者复制的现有数据

临时拷贝以及其它操作来说,快照是最合适的选择,快照只有在它们和原来的逻辑卷不同时才会消耗空

间, 建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照

逻辑卷管理器快照

快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移

动到快照区,没有改动的区域则由快照区和文件系统共享

逻辑卷快照工作原理

在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间

当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中

快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据

第10天-网络协议和通信

内容概述

网络概念

OSI模型

网络设备

TCP/IP

IP地址规划

1 网络基础

1.1 网络概念

计算机网络是一组计算机或网络设备通过有形的线缆或无形的媒介如无线,连接起来,按照一定的规则,进行通信的集合。

网络功能和优点

数据和应用程序

资源

网络存储

备份设备

1.2 常见的网络物理组件

1.3 网络应用程序

1.3.1 各种网络应用

1.3.2 应用程序对网络的要求

不同类型的应用程序对网络的要求有区别

1.4 网络的特征

速度、成本、安全性、可靠性、可用性、可扩展性、拓扑

在计算机网络或者是网络运营商中,一般宽带速率的单位用bps(b/s)表示;

bpsbits per second的缩写,表示比特/秒;即表示每秒钟传输多少位信息;

所以运营商所说的1M带宽的意思是 1Mbps(兆比特每秒,不是兆字节每秒);

1.4.2 网络拓扑

拓扑结构一般是指由点和线排列成的几何图形

计算机网络的拓扑结构是指一个网络的通信链路和计算机结点相互连接构成的几何图形

拓扑分类

物理拓扑

物理拓扑描述了物理设备的布线方式。

网络的物理拓扑指的是设备和电缆的物理布局。必须选择与需要安装的电缆类型匹配的恰当的物理拓扑。

逻辑拓扑

逻辑拓扑描述了信息在网络中流动的方式。

网络的逻辑拓扑表示信号从网络一个点传输到另一个点的逻辑路径。也就是说,数据访问网络介质,并通过网络介质传输数据包的方式。

拓扑结构分类

拓扑结构图

各拓扑结构的特点

总线拓扑

总线拓扑通常也称为线性总线,总线拓扑中的所有设备均由一条线缆进行连接。

在总线拓扑中,一条线缆从一台设备延伸到另一设备,类似于城市中的公交线路。主线缆段的末端必须采用终结端,当信号到达线路或线缆末端时,终结端将吸收信号。如果不具备终结端,表示数据的电子信号将在线缆末端弹回,导致网络出错。

环形拓扑

在这种拓扑结构中,网络上的所有设备都以环的形式连接。环形拓扑不需要终止的开始端或结束端。数据的传输方式不同于总线拓扑。其中一种实施形式为:“令牌沿环移动,并在每台设备处停止。如果一台设备希望传输数据,则会在令牌中添加数据和目标地址。随后,令牌继续沿环移动,直至最终找到目标设备,目标设备将从令牌中获取数据。这类方法的优势在于,数据包不会发生冲突。环形拓扑分为两种:单环和双环

单环拓扑

在单环拓扑中,网络上的所有设备共用一条线缆,数据单向传输。各设备等候轮到自己时再通过网络发送数据。但是,单环拓扑可能存在单一故障点的问题,一个故障就可能导致整个环形拓扑停止工作。

双环拓扑

在双环拓扑中,两个环形允许双向传输数据。这种设置能提供冗余(容错能力)。也就是说,如果一个环发生故障,数据仍可在另一个环上传输。

星形和扩展星形拓扑

星形拓扑是以太网LAN中最常见的物理拓扑。在星形网络扩展为包含连接主要网络设备的附加网络设备时,即称其为扩展星形拓扑。

星形拓扑

星形拓扑将表现为车轮轮辐的形式。它包含一个中央连接点,该点是集线器、交换机或路由器等设备,所有线缆段均汇集于这一点。网络上的所有设备均使用自己的线缆连接到中央设备。

扩展星形拓扑

扩展星形拓扑的一种常见部署方式就是分层设计,例如WAN、企业LAN或园区LAN

纯粹的扩展星形拓扑的问题在于,如果中央节点发生故障,大部分网络就会被隔离。因此,大多数扩展星形拓扑都采用一组独立连接设备之外的冗余连接,以避免在设备发生故障时造成隔离。

网状和部分网状拓扑

网状拓扑提供了星形拓扑中设备间的冗余。网络可以是完全网状的,也可以是部分网状的,具体取决于所需冗余级别。这种类型的拓扑有助于提高网络的可用性和可靠性。但是,这会提高成本,也会制约可扩展性。

全网状拓扑

全网状拓扑将所有设备(节点)彼此相连,以实现冗余和容错能力。其实施成本高、难度大。但这种拓扑的容错能力最强,因为任何一条链路的故障都不会影响网络的连通性。

连通线路计算公式:n(n-1)/2

部份网状拓扑在这种拓扑中,只有重要节点的设备与其它设备具有直接一一相连的线路,对于其它设备的数据传输,需要从其它节点中继,这种设计有一定的冗余和容错能力,也降低了全网状拓扑结构的成本和实施难度。

1.5 网络标准

1.5.1 网络标准和分层

旧模型:专有产品,由一个厂商控制应用程序和嵌入的软件

基于标准的模型:多厂商软件,分层方法

1.5 网络标准

1.5.1 网络标准和分层

旧模型:专有产品,由一个厂商控制应用程序和嵌入的软件

基于标准的模型:多厂商软件,分层方法

层次划分的必要性

计算机网络是由许多硬件、软件和协议交织起来的复杂系统。由于网络设计十分复杂,如何设计、组织

和实现计算机网络是一个挑战,必须要采用科学有效的方法。

层次划分的方法

网络的层应当具有相对独立的功能

梳理功能之间的关系,使一个功能可以为实现另一个功能提供必要的服务,从而形成系统的层次结

为提高系统的工作效率,相同或相近的功能仅在一个层次中实现,而且尽可能在较高的层次中实现

每一层只为相邻的上一层提供服务

层次划分的优点

各层之间相互独立,每一层只实现一种相对独立的功能,使问题复杂程度降低

灵活性好,各层内部的操作不会影响其他层

结构上可分割开,各层之间都可以采用最合适的技术来实现

易于实现和维护,因为整个系统已被分解成相对独立的子系统

能促进标准化工作,因为每一层的功能及其提供的服务都有了精确的说明

OSI 七层的记忆口诀

All People Seem To Need Data Process(物数网传会表应)

OSI 模型的七层结构

7 应用层

应用层(Application Layer)提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如:

HTTPHTTPSFTPTELNETSSHSMTPPOP3MySQL

6 表示层

表示层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式

5 会话层

会话层(Session Layer)负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。

4 传输层

传输层(Transport Layer)把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议

等发送信息。例如:传输控制协议(TCP)等。

3 网络层

网络层(Network Layer)决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成报文。

网络表头包含了网络数据。例如:互联网协议(IP)等。

2 数据链接层

数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形

成信息框(Data Frame)。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表

尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务

GPRS)等。分为两个子层:逻辑链路控制(logical link controlLLC)子层和介质访问控(Media

access controlMAC)子层。

1 物理层

物理层(Physical Layer)在局部局域网上传送数据帧(Data Frame),它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、主机接口卡等。

1.5.3 网络的通信过程

1.5.3.1 数据封装和数据解封

1.5.3.2 协议数据单元 PDU

PDU: Protocol Data Unit,协议数据单元是指对等层次之间传递的数据单位

发送方和接收方各层之间的PDU

1.5.3.3 三种通讯模式

三种通讯方式的区别在于目标,而不在于源

1.5.3.4 冲突域和广播域

冲突域

两个网络设备同时发送数据,如果发生了冲突,则两个设备处于同一个冲突域,反之,则各自处于不同的冲突域

广播域

一个网络设备发送广播,另一个设备收到了,则两个设备处于同一个广播域,反之,则各自处于不同的广播域

1.5.3.5 三种通讯机制

2 局域网 Local Area Network

2.1 概述

2.1.1 特点

网络为一个单位所拥有

地理范围和站点数目均有限

2.1.2 主要功能

资源共享和数据通信

2.1.3 优点

能方便地共享昂贵的外部设备、主机以及软件、数据。从一个站点可以访问全网

便于系统的扩展和逐渐演变,各设备的位置可灵活的调整和改变

提高系统的可靠性、可用性和易用性

2.1.4 标准

局域网标准

无线网络标准

中国国家无线网络标准:WAPI

Wi-Fi:无线保真(Wireless Fidelity),是Wi-Fi联盟制造商的商标做为产品的品牌认证,是一个创建于IEEE 802.11标准的无线局域网技术,Wi-Fi联盟成立于1999年,当时的名称叫做Wireless Ethernet Compatibility AllianceWECA)。在200210月,正式改名为Wi-Fi Alliance

2.2 组网设备

常见组网设备包括路由器(Router),交换机(Switch),集线器(Hub),中继器(Repeater),线缆等

2.2.1 网络线缆和接口

常见的网络线缆包括双绞线,同轴线,光纤线等;

双绞线就是我们常说的网线,又分为屏蔽双绞线(Shielded Twisted PairSTP)与非屏蔽双绞线

Unshielded Twisted PairUTP

2.2.2 网络适配器

网卡作用

进行串行/并行转换数据缓存

很短的等待时间

价格便宜

突破线缆的距离限制来扩展局域网段的距离

可用来连接不同的物理介质

缺点

采用中继器连接网络分支的数目要受具体的网络体系结构限制

中继器不能连接不同类型的网络

中继器没有隔离和过滤功能,无路由选择、交换、纠错/检错功能,一个分支出现故障可能会影响

到其他的每一个网络分支

使用中继器扩充网络距离是最简单最廉价的方法,但当负载增加时,网络性能急剧下降,所以只有

当网络负载很轻和网络时延要求不高的条件下才能使用

2.2.4 网桥和交换机

2.2.4.1 网桥 Bridge

网桥(Bridge)也叫桥接器,是连接两个局域网的一种存储/转发设备,根据MAC地址表对数据帧进行转发,可隔离碰撞域网桥将网络的多个网段在数据链路层连接起来,并对网络数据帧进行管

优点

缺点

过滤通信量

扩大了物理范围

提高了可靠性

可互连不同物理层、不同 MAC 子层和不同速率(如10 Mb/s  100 Mb/s 以太网)的局域网

存储转发增加了时延

MAC 子层并没有流量控制功能

具有不同 MAC 子层的网段桥接在一起时时延更大

网桥只适合于用户数不太多(不超过几百个)和通信量不太大的局域网,否则有时还会因传播过多的

广播信息而产生网络拥塞。这就是所谓的广播风暴

2.2.4.2 交换机 switch

交换机是工作在OSI参考模型数据链路层的设备,外表和集线器相似

它通过判断数据帧的目的MAC地址,从而将数据帧从合适端口发送出去

交换机是通过MAC地址的学习和维护更新机制来实现数据帧的转发

2.2.5 路由器 router

路由:把一个数据包从一个设备发送到不同网络里的另一个设备上去。这些工作依靠路由器来完成。路由器只关心网络的状态和决定网络中的最佳路径。路由的实现依靠路由器中的路由表来完成。

路由器功能:

工作在网络层

分隔广播域和冲突域

选择路由表中到达目标最好的路径

维护和检查路由信息

连接广域网

2.2.6 对比与总结

2.3 以太网技术

2.3.1 概述

以太网(Ethernet)是一种产生较早且使用相当广泛的局域网,由美国Xerox(施乐)公司的Palo Alto研究中心(简称为PARC)于20世纪70年代初期开始研究并于1975年研制成功。

2.3.2 以太网MAC帧格式

2.3.3 MAC地址

在局域网中,硬件地址又称为物理地址或MAC地址(因为这种地址用在MAC帧中)

IEEE 802标准为局域网规定了一种48位的全球地址(一般都简称为地址”),是局域网中每一台计算机固化在网卡ROM中的地址

IEEE 的注册管理机构 RA 负责向厂家分配地址字段的前三个字节(即高位 24 )

地址字段中的后三个字节(即低位 24 )由厂家自行指派,称为扩展标识符,必须保证生产出的适配器没有重复地址

2.3.4 冲突检测的载波侦听多路访问 CSMA/CD

主要用在早期的Hub环境中,用来解决冲突域的问题,现在主流的交换机上不再使用

2.4 虚拟局域网 VLAN

2.4.1 VLAN 原理

此技术可以用交换机来进行网络隔离,但要求交换机具有网络管理功能。

虚拟局域网 VLAN 是由一些局域网网段构成的与物理位置无关的逻辑组这些网段具有某些共同的需求。

每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的工作站是属于哪一个 VLAN。虚拟局域网

其实只是局域网给用户提供的一种服务,而并不是一种新型局域网

优点

1. 更有效地共享网络资源。如果用交换机构成较大的局域网,大量的广播报文就会使网络性能下降。

VLAN能将广播报文限制在本VLAN范围内,从而提升了网络的效能

2. 简化网络管理。当结点物理位置发生变化时,如跨越多个局域网,通过逻辑上配置VLAN即可形成网络设备的逻辑组,无需重新布线和改变IP地址等。这些逻辑组可以跨越一个或多个二层交换机

3. 提高网络的数据安全性。一个VLAN中的结点接收不到另一个VLAN中其他结点的帧

虚拟局域网的实现技术

1. 基于端口的VLAN

2. 基于MAC地址的VLAN

3. 基于协议的VLAN

4. 基于网络地址的VLAN

2.4.2 IEEE 802.1Q 帧结构

2.5 分层的网络架构

3 TCP/IP 协议栈

3.1 TCP/IP 标准

3.1.1 TCP/IP 介绍

Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议

TCP/IP是一个Protocol Stack,包括TCPIPUDPICMPRIPTELNETFTPSMTPARP等许多协议

最早发源于1969年美国国防部(缩写为DoD)的因特网的前身ARPA网络项目,198311日,TCP/IP

取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护

3.1.2 TCP/IP 分层

共定义了四层,和OSI参考模型的分层有对应关系

RFC文档:

https://www.ietf/rfc/rfc1122#section-1.3.3

RFC官方分为四层:

Application Layer

Transport Layer

Internet Layer

Link Layer(media-access)

TCP/IP 应用层

3.1.3 TCP/IP 通信过程

3.1.4 TCP/IPOSI模型的比较

相同点

两者都是以协议栈的概念为基础

协议栈中的协议彼此相互独立

下层对上层提供服务

不同点

OSI是先有模型;TCP/IP是先有协议,后有模型

OSI是国际标准,适用于各种协议栈;TCP/IP实际标准,只适用于TCP/IP网络

层次数量不同

3.2 transport 

TCPUDP对比

3.2.1 TCP

TCP:传输控制制协议 ( Transmission Control Protocol )

3.2.1.1 TCP特性

工作在传输层

面向连接协议

全双工协议

半关闭

将数据打包成段,排序

确认机制

数据恢复,重传

错误检查

流量控制,滑动窗口

拥塞控制,慢启动和拥塞避免算法

3.2.1.4 三次握手和四次挥手

TCP三次握手

seq 序号; ack 确认号

TCP四次挥手

MSL :Maximum Segment Lifetime

查看 MSL

[root@ubuntu2204 ~]# sysctl net.ipv4.tcp_fin_timeout

net.ipv4.tcp_fin_timeout = 60

[root@ubuntu2204 ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout

60

3.2.1.6 sync半连接和accept全连接队列

半连接:还没有完成3次握手的连接

全连接:己经完成三次握手,但没有被应用层提走的连接

注意,监听的 Socket 和真正用来传数据的 Socket 是两个:

一个叫作监听 Socket

一个叫作已连接 Socket

C/S 网络通信过程

3.2.1.5 有限状态机 FSM

3.2.1.7 TCP超时重传

异常网络状况下(开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传策略

3.2.1.8 拥塞控制

网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可承受的能力,网络的性能就会变坏。此情况称为拥塞

TCP为提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。即所谓的拥塞控制TCP拥塞控制的标准文档是RFC 5681,其中详细介绍了拥塞控制的四个部分:慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)拥塞控制算法在Linux下有多种实现,比如reno算法、vegas算法和cubic算法等。它们或者部分或者全部实现了上述四个部分

3.2.2 UDP

UPD:用户数据报协议 ( User Datagram Protocol )

3.2.2.1 UDP特性

工作在传输层

提供不可靠的网络访问

非面向连接协议

有限的错误检查

传输性能高

无数据恢复特性

3.3 Internet

3.3.2 Address Resolution Protocol

3.3.2.1 ARP

ARP地址解析协议由互联网工程任务组(IETF)198211月发布的RFC 826中描述制定,是根据IP地址获取物理地址的一个TCP/IP协议。

主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存。

3.3.3 Reverse Address Resolution Protocol

RARP 反向ARP,即将MAC转换成IP

3.3.4 internet 协议

3.3.4.1 Internet 协议特征

运行于 OSI 网络层

面向无连接的协议

独立处理数据包

分层编址

尽力而为传输

无数据恢复功能

3.4 主机到主机的包传递完整过程

3.5 IP地址

3.5.1 IP地址组成

它们可唯一标识 IP 网络中的每台设备 ,每台主机(计算机、网络设备、外围设备)必须具有唯一的地址

mac 属于物理地址,mac 地址不可变,一出厂就写死,标识惟一设备

ip 属于逻辑地址,逻辑地址可修改,人为赋予,可以修改,使用灵活,便于管理

ipv4 32位二进制,以十进制显示

ipv6 128位二进制,以十六进制显示

3.5.2 IP地址分类

各类IP特点

3.5.3 公共和私有IP地址

公共IP地址:互联网上设备拥有的唯一地址

私有IP地址:不直接用于互联网,通常在局域网中使用

3.5.4 特殊地址

3.5.5 保留地址

在一个IP地址中,如果主机ID全为0,或主机ID全为1,则该地址是保留地址

如在B127.16 网段中,172.16.0.0  172.16.255.255 为保留地址

3.5.6 子网掩码

CIDR:无类域间路由,目前的网络已不再按ABC类划分网段,可以任意指定网段的范围

CIDR 无类域间路由表示法:IP/网络ID位数,如:172.16.0.100/16

netmask子网掩码:32位或128位(IPv6)的数字,和IP成对使用,用来确认IP地址中的网络ID和主机ID,对应网络ID的位为1,对应主机ID的位为0,范例:255.255.255.0 ,表现为连续的高位为1,连续的低位为0

范例:

IP地址

172.16.0.0

子网掩码

11111111.11111111.00000000.00000000

255.255.0.0

子网掩码十进制表示

子网掩码的八位

相关公式

一个网络的最多的主机数 2 ^ 主机ID位数 - 2

网络(段)数 = 2 ^ 网络ID中可变的位数

网络ID = IP  netmask

用不同命令查看ipnetmask

[root@ubuntu2204 ~]# ifconfig eth0

不同ip类型对应netmask

判断对方主机是否在同一个网段:

用自已的子网掩码分别和自已的IP及对方的IP相与,比较结果,相同则同一网络,不同则不同网段

#10.0.0.100/24, 10.0.1.100/24

#上述两个IP地址不在同一个网段,netmask都是24,则表示ip前三段是网络ID,两个网络ID不一样,所以

不是同一个网段

#10.0.0.100/16, 10.0.1.100/16

#上述两个IP地址在同一个网段,netmask都是16,则表示ip前两段是网络ID,两个网络ID一样,所以是同一个网段

#10.0.0.100/24, 10.0.1.100/16

#上述两个IP是否在同一个网段,要分情况

#10.0.0.100/24 ----> 10.0.1.100/16 

#10.0.0.100/24 = 10.0.0.100/255.255.255.0

#00001010.00000000.00000000.01100100  IP 

#11111111.11111111.11111111.00000000   netmask

#00001010.00000000.00000000.00000000  网络ID 10.0.0.0

#此处也要和前面的netmask与运算,而不是自己的

#10.0.1.100/24 = 10.0.1.100/255.255.255.0

#00001010.00000000.00000001.01100100  IP

#11111111.11111111.11111111.00000000 netmask

#00001010.00000000.00000001.00000000 网络ID 10.0.1.0

#结论:10.0.0.0 != 10.0.1.0,所以两者不在同一个网段

#10.0.1.100/16 ----> 10.0.0.100/24 

#结论,不用算,是同一个网段

#IP AIP B通信时,都是用IP Anetmask去算IP Bnetmask,因为在通信前,IP A不知道IP B的netmask值,只能用自己IP与运算

3.5.7 划分子网

划分子网:将一个大的网络(主机数多)划分成多个小的网络(主机数少),主机ID位数变少,网络ID位数变多,网络ID位向主机ID位借n,将划分2^n个子网

3.5.9 跨网络通信

跨网络通信:路由, 选择路径

路由分类:

主机路由

网络路由

默认路由

优先级:精度越高,优先级越高

3.5.10 动态主机配置协议 DHCP

第11天-网络属性及相关配置工具

内容概述

统一网卡名称

网卡配置

常用网络管理命令

软路由

软交换

多网卡绑定

网络测试工具

1 网络配置

1.1 NAT和仅主机

VMware 中的网络模式

1.2 统一网卡名称

CentOS 6之前,网络接口使用连续号码命名:eth0eth1等,但是,如果再新增硬件设备,也有可能会

被识别成 eth0eth1 等;

CentOS 7开始,改变了网卡设备命名规则,基于硬件生成网卡名,例如 ens33ens160 等,可以保证

网卡名称稳定且唯一;但是在批量环境中,没办法统一;

出于批量管理,以及脚本的通用性等方面的考虑;

在某些情况下,需要将新的网卡命名规则改成传统的命名方式;即将 ens33ens160等名称改为eth0,eth1 这样;

1.3 网络配置

将主机接入到网络,需要进行网络配置,每个网卡,都需要有对应的配置文件,才能永久生效

1.3.1 网络配置的两种方式

静态指定:

static,写在配置文件中,不会根据环境的改变而发生变化

动态分配:

DHCPDynamic Host Configuration Protocol,根据动态主机配置协议生成相应的配置

1.4 网络配置命令

1.4.1 主机名

hostname

hostname是临时有效,重启后消失

hostnamectl

写配置文件,永久有效

1.4.2 ifconfig 命令

该命令来自于net-tools包,建议使用 ip 代替

1.4.3 route 命令

该命令来自于net-tools包,建议使用 ip 代替

用主机实现软路由

用主机模拟路由器,打通多个网段,实现跨网段连通

拓扑图

常见路由协议算法

由上可知,从一个路由器要到达某个网段或主机,是通过路由接力的方式来实现的,网络一段段传输,

经由不同的路由器,最终到达目标网段或主机,而要去到某个地址,则路由器上必须要存有到达该地址

的路由表,根据实际情况,网络上有无数主机,一个路由器上不可能存有到达所有网段或主机的路由

表,这种情况也无法维护;

现实中的路由器上的路由表,都是由路由算法自动维护

常用的算法有 OSPFRIPMPLSBGP

1.4.5 netstat 命令

来自于net-tools包,建议使用 ss 代替

面试题:如何查看是哪个程序在监听端口

[root@ubuntu ~]# netstat -tunlp | grep ":22"

[root@ubuntu ~]# ss -ntulp | grep ":22"

[root@ubuntu ~]# lsof -i:22

1.4.7.2 管理路由

ip route 用法

1.4.8 ss 命令

来自于iproute包,代替netstatnetstat 通过遍历 /proc来获取 socket信息,ss 使用 netlink与内核

tcp_diag 模块通信获取 socket 信息

1.4.9 网络配置工具 nmcli

NetworkManager

NetworkManager 2004年由RedHat启动的项目,目的是让用户能更轻松的管理Linux中的网络,

1.5 网络配置文件

1.5.1 网络基本配置文件

CentOS 系列

IPMASKGWDNS相关的配置文件

/etc/sysconfig/network-scripts/ifcfg-IFACE

常用配置

1.5.3 本地主机名和IP地址的映射

优先于使用DNS前检查

getent hosts 查看/etc/hosts 内容

/etc/hosts

1.5.4 DNS域名解析

DNS 负责将域名转换成IP地址

#该文件内容根据网卡设备自动生成

/etc/resolv.conf

nameserver DNS_SERVER_IP1

nameserver DNS_SERVER_IP2

nameserver DNS_SERVER_IP3

search DOMAIN

1.6 网卡别名

将多个IP地址绑定到一个MAC

每个IP绑定到独立逻辑网卡,即网络别名,命名格式: ethX:Y,如:eth0:1 eth0:2eth0:3

1.7 多网卡 bonding

将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址

1.7.1 Bonding 聚合链路工作模式

1.8 网络组 Network Teaming

1.8.1 网络组工作模式

网络组:是将多个网卡聚合在一起方法,从而实现冗错和提高吞吐量

网络组不同于旧版中bonding技术,提供更好的性能和扩展性

常用工作模式

broadcast

roundrobin

random

activebackup

loadbalance

lacp (implements the 802.3ad Link Aggregation Control Protocol)

1.8.2 网络组实现

先添加两块仅主机模式的网卡

1.9 网桥(交换机)

1.9.1 桥接原理

此处的网桥是逻辑上的网桥,说的是网络上的一个桥梁,打通网路,而不是硬件设备。

桥接:把一台机器上的若干个网络接口连接起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。网桥就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。与网桥相连的主机就能通过交换机的报文转发而互相通信。

网络测试诊断工具

第12天-shel脚本编程-进程

第13天-进程-系统性能和计划任务

内容概述

进程相关概念

进程工具

系统性能相关工具

计划任务

1 进程和内存管理

1.1 什么是进程

进程是运行中的程序

Process: 运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位

进程IDProcess IDPID)号码被用来标记各个进程

UIDGID、和SELinux语境决定对文件系统的存取和访问权限

通常从执行进程的用户来继承

存在生命周期

进程创建:

init:第一个进程,从 CentOS7 以后为 systemd

进程:都由其父进程创建,fork(),父子关系,CoWCopy On Write (读时共享,写时复制)

每个进程都有自己的资源,由操作系统分配,内存,栈,文件描述符

进程,线程

进程

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。

进程的组成:进程一般由程序、数据集合和进程控制块三部分组成。

程序用于描述进程要完成的功能,是控制进程执行的指令集;

数据集合是程序在执行时所需要的数据和工作区;

程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。

进程具有的特征:

动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;

并发性:任何进程都可以同其他进程一起并发执行;

独立性:进程是系统进行资源分配和调度的一个独立单位;

结构性:进程由程序、数据和进程控制块三部分组成。

线程

在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。

后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程。

线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)

一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。

进程与线程的区别

进程是操作系统分配资源的最小单位;

线程是程序执行的CPU调度的最小单位;

一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;

进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;

调度和切换:线程上下文切换比进程上下文切换要快得多。

面试题: 查看进程中的线程

grep -i threads /proc/PID/status

查看进程的二进制文件

ll /proc/PID/exe

查看进程打开的文件

/proc/PID/fd/

并行和并发

1.3.4 进程使用内存问题

1.3.4.1 内存泄漏:Memory Leak

指程序中用mallocnew申请了一块内存,但是没有用freedelete将内存释放,导致这块内存一直处于占用状态。

1.3.4.2 内存溢出:Memory Overflow

指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出。

1.3.4.3 内存不足:OOM

OOM  Out Of Memory内存用完了,这种情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到类似下面的提示

Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child

JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error,因为这个问题已经严重到不足以被应用处理)。

原因:

给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。

应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。

使用的解决办法:

1. 限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用

2. 给系统增加swap空间

1.4 进程状态

进程的基本状态

创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态;

就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行;

执行状态:进程处于就绪状态被调度后,进程进入执行状态;

阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用;

终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行;

状态之间转换六种情况

运行——>就绪:1:主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;

2:在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态;

就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求;

阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列;

以下两种状态是不可能发生的:

阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取;

就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态;

进程更多的状态:

运行态:running

就绪态:ready

睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable

停止态:stopped,暂停于内存,但不会被调度,除非手动启动

僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死

态的子进程

1.5 LRU 算法

LRULeast Recently Used 近期最少使用算法(喜新厌旧),释放内存

1.6 IPC 进程间通信

IPC: Inter Process Communication

同一主机:

不同主机:socket=IP和端口号

1.7 进程优先级

linux2.6内核将任务优先级进行了一个划分,实时优先级范围是0MAX_RT_PRIO-1(0-99),而普通进程的静态优先级范围是从MAX_RT_PRIOMAX_PRIO-1(100-139)

1.8 进程分类

操作系统分类:

协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用CPU,否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU ,主动放弃使用。

抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是

否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU

使用权,把它排在询问队列的最后,再去询问下一个任务。

进程类型:

守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程

前台进程:跟终端相关,通过终端启动的进程

注意:两者可相互转化

按进程资源使用的分类:

CPU-BoundCPU 密集型,非交互

IO-BoundIO 密集型,交互

2 进程管理和性能相关工具

Linux系统状态的查看及管理工具:

pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill,

job, bg, fg, nohup

2.1 进程树 pstree

pstree 可以用来显示进程的父子关系,以树形结构显示

2.2 进程信息 ps

ps: process state,可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中

2.3 查看进程信息 prtstat

可以显示进程信息,来自于psmisc

此命令显的数据,都来自于 /proc/PID/ 目录,此命令加以整理,以格式化形式显示

2.4 设置和调整进程优先级

进程优先级调整

静态优先级:100-139

进程默认启动时的nice值为0,优先级为120

只有根用户才能降低nice值(提高优先性)

nice命令

以指定的优先级来启动进程

2.5 搜索进程

进程搜索的常用命名:

ps options | grep 'pattern'

2.5.1 pgrep

2.5.2 pidof

2.6 负载查询 uptime

2.7 显示CPU相关统计 mpstat

2.8 查看进程实时状态 top  htop

2.9 内存空间 free

free 可以显示内存空间使用状态

2.10 进程对应的内存映射 pmap

查看进程的内存占用情况

2.11 虚拟内存信息 vmstat

虚拟内存

虚拟内存是操作系统提供的一种内存管理技术,操作系统会为每个进程分配一套独立的,连续的,私有的内存空间,让每个程序都以为自己独享所有主存的错觉,这样做的目的是方便内存管理。

程序所使用的内存是虚拟内存(Virtual Memory)

CPU使用的内存是物理内存(Physical Memory) MMU LTB

虚拟内存地址和物理内存地址之间的映射和转换由CPU中的内存管理单元(MMU)进行管理​​​​​​​

2.12 统计CPU和设备IO信息 iostat

iostat 可以提供更丰富的IO性能状态数

2.13 监视磁盘I/O iotop

iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括PID、用

户、I/O、进程等相关信息,可查看每个进程是如何使用IO

2.14 显示网络带宽使用情况 iftop

2.15 查看网络实时吞吐量 nload

2.16 查看进程网络带宽的使用情况 nethogs

2.17 网络监视工具iptraf-ng

来自于iptraf-ng包,可以进网络进行监控,对终端窗口大小有要求

2.18 系统资源统计 dstat

dstatpcp-system-tools包提供,但安装dstat包即可, 可用于代替 vmstatiostat功能

2.19 综合监控工具 glances

CentOS 系统通过 epel 源安装,glances 可查看当前主机相关信息,也可运行于C/S模式查看远程主机信息

2.20 查看进程打开文件 lsof

lsoflist open files,查看当前系统文件的工具。在linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等,

系统在后台都为该应用程序分配了一个文件描述符

2.22 CentOS 8 新特性 cockpit

cockpit包提供,当前UbuntuCentOS7也支持此工具

Cockpit CentOS 8 取入的新特性,是一个基于 Web 界面的应用,它提供了对系统的图形化管理

监控系统活动(CPU、内存、磁盘 IO 和网络流量)

查看系统日志条目

查看磁盘分区的容量

查看网络活动(发送和接收)

查看用户帐户

检查系统服务的状态

提取已安装应用的信息

查看和安装可用更新(如果以 root 身份登录)并在需要时重新启动系统

打开并使用终端窗口

2.23 信号发送 kill

kill:内部命令,可用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写

2.24 作业管理

Linux的作业控制

前台作业:通过终端启动,且启动后一直占据终端

后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

让作业运行于后台

运行中的作业: Ctrl+z

尚未启动的作业: COMMAND &

后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系

nohup COMMAND &>/dev/null &

screenCOMMAND

tmuxCOMMAND

Ctrl+z 使占据终端的进程暂停,让出终端

2.25 并行运行

利用后台执行,实现并行功能,即同时运行多个进程,提高效率

3 计划任务

通过任务计划,可以让系统自动的按时间或周期性任务执行任务

计划任务时间表示法:

面试题:11月每天的6-12点之间每隔2小时执行/app/bin/test.sh

#6,8,10,12点整共4次分别执行test.sh

0 6-12/2 * 11 * /app/bin/test.sh

第14天-Linux启动流程和内核管理及AWK

内容概述

CentOS 6 之前版本的启动流程

服务管理

Grub管理

启动排错

CentOS 7 以后版本启动流程

Unit 介绍

服务管理和查看

启动排错

破解口令

修复Grub2

内核优化

1 CentOS 6 的启动管理

1. 加载BIOS的硬件信息,获取第一个启动设备

2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息

3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

4. 核心执行init程序,并获取默认的运行信息

5. init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统

6. 启动核心的外挂模块

7. init执行运行的各个批处理文件(scripts)

8. init执行/etc/rc.d/rc.local

9. 执行/bin/login程序,等待用户登录

10. 登录之后开始以Shell控制主机

1.1 硬件启动POST

1.2 启动加载器 bootloader

init进程

init进程是一个由内核启动的用户级进程。

/sbin/init 程序的功能之一就是要挂载整个根文件系统, /sbin/init 这个程序的可执行文件,它自

己也是在根文件系统里面,

也就是说,得先运行 /sbin/init 程序才有文件目录结构树,但是得先有目录结构,才能通过

/sbin/init 这个路径找到可执行文件

1.2.3 grub 管理

启动界面的grub管理

该界面的默认项由 /boot/grub/grub.conf 中的配置项决定,用户可在此界面输入命令进行操作。

1.3 加载 kernel

1.4 init初始化

/sbin/init 程序是内核启动之后的第一个进程,也是进程树中的树根,所以其进程ID始终为1 

1.4.1 运行级别

运行级别:为系统运行或维护等目的而设定;0-67个级别,一般使用3, 5做为默认级别

1.4.2 初始化脚本 sysinit

系统初始化脚本功能

1. 设置主机名

2. 设置欢迎信息

3. 激活udevselinux

4. 挂载/etc/fstab文件中定义的文件系统

5. 检测根文件系统,并以读写方式重新挂载根文件系统

6. 设置系统时钟

7. 激活swap设备

8. 根据/etc/sysctl.conf文件设置内核参数

9. 激活lvmsoftware raid设备

1.4.5 开机启动文件 rc.local

正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向

/etc/rc.d/rc.local脚本

不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置

/etc/rc.d/rc.local文件中

/etc/rc.d/rc.local在指定运行级别脚本后运行

注意:默认Ubuntu  /etc/rc.local 文件,需要手动创建并添加可执行权限,首行必须有shebang机制

1.5 CentOS 6 启动过程总结

2 systemd和启动流程

2.1 systemd 特性

Systemd:从 CentOS 7 版本之后开始用 systemd 实现init进程,系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程​​​​​​​

Systemd 新特性

系统引导时实现服务并行启动

按需启动守护进程

自动化的服务依赖关系管理

同时采用socket式与D-Bus总线式激活服务

socket与服务程序分离

向后兼容sysv init脚本

使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务,

systemctl无法与之通信和控制

系统状态快照

systemd 中的 unit

unit表示不同类型的systemd对象,通过配置文件进行标识和配置;

文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息

查看Unit类型

#查看unit类型

[root@ubuntu ~]# systemctl -t help

2.2 service 系统服务管理

2.3 service unit 文件格式

2.4 运行级别

centOS7开始,使用 target 来定义运行级别

查看所有target

[root@ubuntu ~]# ll /usr/lib/systemd/system/*target

......

......

[root@ubuntu ~]# systemctl list-unit-files --type target --all

......

......

centOS7之后的 runlevel 不再定义在 /etc/inittab 文件中,且 ubuntu 中没有该文件

[root@rocky86 ~]# cat /etc/inittab

# inittab is no longer used.

2.5 修改启动参数

#无限重启,这样设置后将无法进系统

[root@rocky86 ~]# systemctl set-default reboot.target

Removed /etc/systemd/system/default.target.

Created symlink /etc/systemd/system/default.target 

/usr/lib/systemd/system/reboot.target.

2.6 CentOS 7之后版本引导顺序

1. UEFiBIOS初始化,运行POST开机自检

2. 选择启动设备

3. 引导装载程序, centos7grub2,加载装载程序的配置文件: /etc/grub.d/

/etc/default/grub /boot/grub2/grub.cfg

4. 加载initramfs

2.7 破解 root 密码

破解CentOS87root密码

方法一

启动时任意键暂停启动

e键进入编辑模式

将光标移动linux 开始的行,添加内核参数 rd.break

ctrl+x启动

mount –o remount,rw /sysroot

chroot /sysroot

passwd root

#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行

touch /.autorelabel

exit

reboot

方法二

#此方式也适用于ubuntu18.04

启动时任意键暂停启动

e键进入编辑模式

将光标移动linux 开始的行,添加 rw init=/sysroot/bin/sh

ctrl+x启动

chroot /sysroot

passwd root

#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行

touch /.autorelabel

exit

reboot

2.8 grub2 安全

3 内核参数管理

sysctl 命令用来配置linux 系统内核参数,这些参数以文件的形式显示在 /proc/sys/ 目录中,

配置项就是目录名加文件名,值就是该文件中的内容

注意:不是所有内核参数都是可以被修改的

查看所有配置项

#内核参数配置目录

[root@ubuntu ~]# ll /proc/sys

total 0

1 root root 0 May 21 08:48 abi/

1 root root 0 May 21 08:48 debug/

1 root root 0 May 21 08:48 dev/

1 root root 0 May 21 08:43 fs/

1 root root 0 May 21 08:42 kernel/

1 root root 0 May 21 08:43 net/

1 root root 0 May 21 08:48 sunrpc/

1 root root 0 May 21 08:48 user/

1 root root 0 May 21 08:43 vm/

[root@ubuntu ~]# ll /proc/sys/net/ipv4/ip_forward

-rw-r--r-- 1 root root 0 May 21 08:48 /proc/sys/net/ipv4/ip_forward

[root@ubuntu ~]# cat /proc/sys/net/ipv4/ip_forward

0

sysctl 格式

sysctl [options] [variable[=value] ...]

第15天-加密和安全

内容概述

安全机制

对称和非对称加密

散列算法

PKICA

openssl

证书管理

ssh服务

权限授权管理 Sudo

PAM模块

时间同步服务

1 安全机制

如果这件事情有可能会出问题,那么它就一定会出问题

1.2 信息安全防护的目标

信息安全最终要达到的目标如下:

1.3 安全防护环节

1.4 常见的安全攻击 STRIDE

1.5 安全设计基本原则

使用成熟的安全系统

以小人之心度输入数据

外部系统是不安全的

最小授权

减少外部接口

缺省使用安全模式

安全不是似是而非

STRIDE思考

在入口处检查

从管理上保护好你的系统

1.6 常用安全技术

认证

授权

审计

安全通信

1.7 加密算法和协议

古代曾出现凯撒密码的加密方式,用于军事信息的加密处理;

近代战争中有用到摩斯密码发电报,传送信息;

发展到现在,加密技术己经越来越先进,手段也越来越多样化了;

常用的加密算法包括:对称加密,非对称加密,单向加密

1.7.1 对称加密算法

对称加密:加密和解密使用同一个密钥

特性:

加密、解密使用同一个密钥,效率高;

将原始数据分割成固定大小的块,逐个进行加密

缺陷:

密钥过多

密钥分发

数据来源无法确认

常见对称加密算法:

DESData Encryption Standard56bits

3DES

AESAdvanced (128, 192, 256bits)

BlowfishTwofish

IDEARC6CAST5

1.7.2 非对称加密算法

1.7.2.1 非对称加密算法介绍

非对称加密:密钥是成对出现

公钥:public key,公开给所有人,主要给别人加密使用

私钥:secret keyprivate key 自己留存,必须保证其私密性,用于自已加密签名

特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然

功能:

数据加密:适合加密较小数据,比如: 加密对称密钥

数字签名:主要在于让接收方确认发送方身份

缺点:

密钥长,算法复杂

加密解密效率低下

常见算法:

RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,可实现加密和数字签名

DSADigital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准)

ECCElliptic Curves Cryptography):椭圆曲线密码编码学,比RSA加密算法使用更小的密钥,

提供相当的或更高等级的安全

1.7.2.2 非对称加密实现加密

1.7.2.3 非对称加密实现数字签名

1.7.2.4 RSADSA

RSA:公钥加密算法是1977年由Ron RivestAdi ShamirhLenAdleman在(美国麻省理工学院)开发的,RSA取名来自开发他们三者的名字,后成立RSA数据安全有限公司。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥

DSA (Digital Signature Algorithm)1991726日提交,并归属于David W. KravitzNSA员工,

DSASchnorrElGamal签名算法的变种,被美国NISTSS(DigitalSignature Standard) DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多

1.7.3 单向哈希算法

哈希算法:也称为散列算法,将任意数据缩小成固定大小的 指纹,称为digest,即摘要

特性:

任意长度输入,固定长度输出。

若修改数据,指纹也会改变,且有雪崩效应,数据的一点微小改变,生成的指纹值变化非常大。

无法从指纹中重新生成数据,即不可逆,具有单向性。

功能:数据完整性

常见算法:

算法不一样,得到的摘要长度也不一样

md5: (128bits)sha1: (160bits)sha224sha256sha384sha512

#md5 16进制显示, 32*4=128

[root@ubuntu ~]# md5sum /etc/issue

d5faf84af6529c6e6a364f164e953ff6 /etc/issue

常用工具

md5sum,sha1sum,sha256sum,sha512sum,openssl,gpg,rpm -V

1.7.4 综合应用多种加密算法

1.7.4.1 实现数据加密

实现数据加密,无法验证数据完整性和来源

Key(data)+Pb(key)

1.7.4.2 实现数字签名

不加密数据,可以保证数据来源的可靠性、数据的完整性和一致性

data+Sa(hash(data))

1.7.4.3 综合加密和签名

即实现数据加密,又可以保证数据来源的可靠性、数据的完整性和一致性

方法1Pb{Sa[hash(data)]+data}

方法2:对称key{Sa[hash(data)]+data}+Pb(对称key)

1.7.5 密码交换

密钥交换:IKE Internet Key Exchange 

公钥加密:用目标的公钥加密对称密钥

DH (Deffie-Hellman):生成对称(会话)密钥

DH 介绍

这个密钥交换方法,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin

Edward Hellman)在1976年发表

它是一种安全协议,让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密

钥,这个密钥一般作为对称加密的密钥而被双方在后续数据传输中使用。

DH数学原理是base离散对数问题。做类似事情的还有非对称加密类算法,如:RSA

其应用非常广泛,在SSHVPNHttps...都有应用,勘称现代密码基石

DH 实现过程:

A: g,p 协商生成公开的整数g, 大素数p

B: g,p

A:生成隐私数据:a (a<p),计算得出 g^a%p,发送给B

B:生成隐私数据:b,(b<p),计算得出 g^b%p,发送给A

A:计算得出 [(g^b%p)^a]%p = g^ab%p,生成为密钥

B:计算得出 [(g^a%p)^b]%p = g^ab%p,生成为密钥

DH 特点

泄密风险:私密数据ab在生成K后将被丢弃,因此不存在ab过长时间存在导致增加泄密风险。

中间人攻击:由于DH在传输pg时并无身份验证,所以有机会被实施中间人攻击,替换双方传输时的数据

​​​​​​​1.8 CA和证书

1.8.1 中间人攻击

Man-in-the-middle,简称为 MITM,中间人

1.8.2 CA和证书

证书类型

证书授权机构的证书

服务器证书

用户证书

获取证书两种方法

自签名的证书: 自已签发自己的公钥

使用证书授权机构:1 生成证书请求 csr2 将证书请求csr 发送给CA3 CA 颁发签名证书

1.8.3 安全协议 SSL/TLS

主要功能

机密性

认证

完整性

重放保护

1.8.4 HTTPS

HTTPS 协议:就是“HTTP 协议“SSL/TLS 协议的组合。HTTP over SSL  HTTP over TLS ,对http协议的文本数据进行加密处理后,成为二进制形式传输

1.8.4.2 HTTPS 工作的简化过程

1. 客户端发起HTTPS请求

用户在浏览器里输入一个https网址,然后连接到服务器的443端口。

2. 服务端的配置

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是

自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹

出提示页面。这套证书其实就是一对公钥和私钥。

3. 传送服务器的证书给客户端

证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等。

4. 客户端解析验证服务器证书

这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间

等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成

一个随机值。然后用证书中公钥对该随机值进行非对称加密。

5. 客户端将加密信息传送服务器

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务

端的通信就可以通过这个随机值来进行加密解密了。

6. 服务端解密信息

服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值。

7. 服务器加密信息并发送信息

服务器将数据利用随机值进行对称加密,再发送给客户端。

8. 客户端接收并解密信息

客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容。

2 OpenSS

2.2 Base64 编码

Base64是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法

2.3.1 openssl 单向哈希加密

2.3.2 openssl passwd 生成用户密码

2.3.3 openssl 生成随机数

2.3.4 openssl 实现密钥对

生成私钥,再从私钥中提取公钥

2.4 建立私有CA实现证书申请颁发

建立私有CA

OpenCAOpenCA开源组织使用PerlOpenSSL进行二次开发而成的一套完善的PKI免费软件

openssl:相关包 opensslopenssl-libs

证书申请及签署步骤:

1. 生成证书申请请求

2. RA核验

3. CA签署

4. 获取证书

3 ssh服务

3.1.1 公钥交换原理

1. 客户端发起链接请求

2. 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)

3. 客户端生成密钥对 ----- 没有实体文件

4. 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密

5. 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res

6. 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)

7. 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

3.1.2 ssh加密通讯原理

3.2 openssh 服务

3.2.2 客户端scp命令

scp 命令利用ssh协议在两台主机之间复制文件

3.2.3 rsync命令

scp 命令在复制文件时是全量复制,不管文件有没有改动,都是复制,速度慢,消耗资源

rsync工具可以基于sshrsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传

输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync

注意:通信两端主机都需要安装 rsync 软件

格式:

rsync [OPTION]... SRC [SRC]... DEST

#常用选项

-n|--dry-run

-v|--verbose

-r|--recursive

-p|--perms

#只测试,不执行

#显示详细过程

#递归复制

#保留权限属性

-t|--times

#保留修改时间戳

-g|--group

#保留组信息

-o|--owner

#保留所有者信息

-l|--links

#将软链接文件本身进行复制(默认)

#将软链接文件指向的文件复制

#如果接收者的文件比发送者的文件较

-L|--copy-links

-u|--update

新,将忽略同步

-z|--compress

-a|--archive

selinux

#压缩,节约网络带宽

#保留所有属性,但不包括acl

--delete

#如果源数据中的文件被删除,则目标

中的对应文件也要被删除,配合-r使用

--progress

#显示进度

--bwlimit=5120

#限速以KB为单位,5120表示5MB

范例:

[root@ubuntu ~]# ls -l ./0525/*

-rw-r--r-- 1 123 456 657 May 25 15:46 ./0525/fstab

-rw-r--r-- 1 123 456 24 May 25 15:46 ./0525/issue

[root@ubuntu ~]# rsync -av /root/0525 root@10.0.0.161:/tmp/

root@10.0.0.161's password:

sending incremental file list

0525/

0525/fstab

0525/issue

sent 884 bytes received 58 bytes 209.33 bytes/sec

total size is 681 speedup is 0.72

#查看目标机,属性保持一致

root@ubuntu:~# ls -l /tmp/0525/

3.2.4 自动登录 ssh工具 sshpass

EPEL源提供,ssh登陆不能在命令行中指定密码。sshpass的出现,解决了这一问题。sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码(本机known_hosts文件中有的主机才能生效)。它允许你用 -p 参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环境变量中读取。

3.2.5 ssh登录验证方式介绍

ssh服务登录的常用验证方式有两种,分别是基于用户/口令的方式验证和基于密钥的方式验证

基于用户和口令登录验证

1. 客户端发起ssh请求,服务器会把自己的公钥发送给用户

2. 用户会根据服务器发来的公钥对密码进行加密

3. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功

基于密钥的登录方式

1. 首先在客户端生成一对密钥(ssh-keygen

2. 并将客户端的公钥ssh-copy-id 拷贝到服务端

3. 当客户端再次发送一个连接请求,包括ip、用户名

4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:magedu

5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端

7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

3.2.6 实现基于密钥的登录方式

在客户端生成密钥对

把公钥文件传输至远程服务器对应用户的家目录

用脚本实现公钥批量部署

[root@ubuntu ~]# cat ssh_push.sh
#!/bin/bash
HOST="
10.0.0.161
10.0.0.210
"
PASS=123456
ssh-keygen -P "" -f /root/.ssh/id_rsa &>/dev/null
dpkg -l sshpass &>/dev/null || apt install -y sshpass &>/dev/null
for i in $HOST;do
{
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $i &>/dev/null
}&
done
wait

 多机互相打通

#先生成密钥对
[root@ubuntu ~]# ls .ssh/
[root@ubuntu ~]# ssh-keygen
......
......
[root@ubuntu ~]# ls .ssh/
id_rsa id_rsa.pub




 
#然后将公钥复制到本机
[root@ubuntu ~]# ssh-copy-id 127.1
......
......
[root@ubuntu ~]# ls .ssh/
authorized_keys id_rsa id_rsa.pub known_hosts known_hosts.old
#将 .ssh 目录整体复制到其它主机,这样表示多机共用密钥对
[root@ubuntu ~]# rsync -a .ssh 10.0.0.157:/root/
[root@ubuntu ~]# rsync -a .ssh 10.0.0.154:/root/
windows客户端工具 xshell 也可以配置公钥远程连接
3.2.7 ssh服务器配置
ssh 服务端常用配置
[root@ubuntu ~]# cat /etc/ssh/sshd_config
Port 22
#远程端口,生产建议修改
ListenAddress ip
LoginGraceTime 2m
PermitRootLogin yes
StrictModes yes
MaxAuthTries 6
#默认ubuntu不允许root远程ssh登录
#检查.ssh/文件的所有者,权限等
#一次连接,最多可以输错6次密码
#同一个连接最大会话,就是xshell上
MaxSessions 10
的复制ssh隧道,修改后对新连接生效
PubkeyAuthentication yes
PermitEmptyPasswords no
PasswordAuthentication yes
MaxStartups 10:30:100
PrintMotd no
#开启基于key验证
#不允许空密码连接
#开启基于用户名和密码连接
#未认证连接最大值,默认值10
#是否输出motd信息,改成yes 则
motd 会输出两次
PrintLastLog yes
UseDNS yes
#是否输出上次登录信息
#是否需要解析主机名,no可加快连接
速度
GSSAPIAuthentication yes
度可改为no
#是否开启客户端对IP反解析,提高速
#远程连接时的登录前提示
Banner /path/file



3.2.7 ssh服务器配置

[root@ubuntu ~]# cat /etc/ssh/sshd_config

ssh 服务的最佳实践

1. 建议使用非默认端口

2. 禁止使用protocol version 1

3. 限制可登录用户

4. 设定空闲会话超时时长

5. 利用防火墙设置ssh访问策略

6. 仅监听特定的IP地址

7. 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12|

xargs

8. 使用基于密钥的认证

9. 禁止使用空密码

10. 禁止root用户直接登录

11. 限制ssh的访问频度和并发在线数

12. 经常分析日志

第16天-加密和安全及时间同步服务

​​​​​​​4 利用 sudo 实现授权

sudo特性

1. sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员

2. sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器

3. sudo使用时间戳文件来执行类似的检票系统。当用户调用sudo并且输入它的密码时,用户获得

了一张存活期为5分钟的票

4. sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440

4.4 sudo 授权规则配置

配置文件:

/etc/sudoers

/etc/sudoers.d/*

5 PAM认证机制

PAM(Pluggable Authentication Modules) 插件式的验证模块

5.2 PAM架构

PAM提供了对所有服务进行认证的中央机制,适用于本地登录,远程登录等程序。

如:telnetrloginfshftp,点对点协议PPPsu等应用程序中。

5.4 PAM工作原理

PAM认证一般遵循这样的顺序:Service(服务)PAM(配置文件)pam_*.so

PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d/) 后调用认证文

(位于/lib64/security/)进行安全认证

ulimit命令

ulimitlinux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。

使用ulimit对参数进行修改,会立即生效,但其修改是临时性的,重新登录后无效。

而且ulimit 的修改,只影响当前的shell进程及其子进程,每个进程都有自己独有的limits 值。

如果想永久生效,可以写在 profile 文件中。

5.7.3 pam_google_authenticator 模块

MFAMulti-Factor Authentication ( 多因子验证)

是一种简单有效的最佳安全实践方法,它能够在用户名和密码之外再额外增加一层安全保护

pam_google_authenticator 功能:实现SSH登录的两次身份验证,先验证APP的数字码,再验证root用户的密码,都通过才可以登录。

6 时间同步服务

[root@ubuntu ~]# timedatectl set-ntp 0

[root@ubuntu ~]# date -s "+10 year"

Mon May 30 08:02:48 AM CST 2034

6.1 计时方式

Centos7上使用 ntpdate 对钟

Centos7上使用 rdate 对钟

可用定时任务实现周期性对钟

[root@c7 ~]# crontab -e

*/10 * * * * /usr/sbin/ntpdate ntp.aliyun

ntpdate 程序在 centos8之后取消了,而且这种对钟方式,在最近一个10分钟的周期内,如果出现了误差,则这10分钟内都是有问题的。

6.2 时间同步服务

多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等。

利用NTPNetwork Time Protocol 协议使网络中的各个计算机时间达到同步。

目前NTP协议属于运维基础架构中必备的基本服务之一。

主流的时间同步有两种实现方案

ntp

将系统时钟和世界协调时UTC同步,精度在局域网内可达0.1ms,在互联网上绝大多数的地方精度可以达到1-50ms

ntp 是使用渐进性同步机制,如果本地时间与标准时间相差较大,则需要一定的时间才能同步完成;该项目属于早期项目,在Centos8 后不再使用。

chrony

实现NTP协议的的自由软件。

可使系统时钟与NTP服务器,参考时钟(例如GPS接收器)以及使用手表和键盘的手动输入进行同步。

还可以作为NTPv4RFC 5905)服务器和对等体运行,为网络中的计算机提供时间服务。

设计用于在各种条件下良好运行,包括间歇性和高度拥挤的网络连接,温度变化(计算机时钟对温度敏感),以及不能连续运行或在虚拟机上运行的系统。

centos8中以后的源中,只有chrony,且默认己经安装

6.3 chrony

6.3.5 公共NTP服务

常用的公共ntp服务地址

6.3.6 时间工具

timedatectl :时间查看和设置工具

6.3.7 实现私有时间服务

在同一个网络内,如果有多个需要进行时间同步的服务器,则我们可以在内网自建NTP Server

这样可以节约访问外网的网络资源;另一方面,如果外网不可用,则至少可以保证,内网的NTP服务还是可用的。

架构图

实现

主机

第17天-域名解析DNS服务

内容概述

DNS 基础知识

在公有云上配置DNS解析

DNS相关命令

自建DNS

智能DNS解析介绍

1 DNS服务基础知识

1.1 相关基础概念

DNSDomain Name System (域名系统)

DNS 是互联网上解决网络中机器命名的一种系统。在网络中,一台主机去访问另外一台主机时,必须要知道目标主机的IP地址,虽然网络上的节点都可以用IP地址来标识,并且可以通过IP地址被访问。但对于自然人而言,一组组由数字组成的IP地址,是难以被理解和记忆的。于是设计出了域名系统,用一组有意义的字符来表示某个特定主机或某个网络,再将网络中主机IP地址和域名之间做成一个映射表。

DNS 就是负责维护主机IP地址和域名映射关系的服务,同时也提供域名解析服务,即人类通过域名访问某个主机或节点时,由DNS服务将人类可读的域名转换为机器可读的IP地址,再通过IP地址找到对应的主机。

在互联网时代,日常的工作和生活,只要涉及到网络,都己经离不开DNS服务了。

域名的管理

域名由因特网域名与地址管理机构(ICANNInternet Corporation for Assigned Names and Numbers)

管理,这是为承担域名系统管理、IP地址分配、协议参数配置,以及主服务器系统管理等职能而设立的

非盈利机构。

ICANN为不同的国家或地区设置了相应的顶级域名,这些域名通常都由两个英文字母组成。例如:.uk

表英国、.fr代表法国、.jp代表日本。中国的顶级域名是下的域名由CNNIC进行管理。

根域:全球共有13IPV4根域名服务器,其中10台在美国,2台在欧洲,1台在亚洲

一级域名:又称顶级域名,可分为三类,一类代表国家和地区(cnhk......),一类代表各类组织

(comedu......),以及反向域

二级域名:某个具体组织,单位,机构,商业公司或个人使用,需要向域名管理机构申请(付费)才能获得使用权

二级域名以下的域名,由使用该域名的组织自行分配

13IPV4根域名服务器,并不是说只有13台服务器,而是指有13IP地址向外提供一级域名的DNS解析服务,每个IP地址对应的,都是多机集群。

像根服务器这种公共DNS,一般都是使用任播(Anycast)技术来实现的。其原理比较复杂,简单来说,将多台服务器对外广播为同一个IP地址,然后网络上的主机在请求这个公共IP地址时,在路由过程中会被路径上最近的拥有该IP的服务器收到,如此,用户的请求总是会分配给最近的服务器。

为什么只有13台根服务器

这是由DNS服务的工作模式所决定的​​​​​​​

DNS服务工作于C/S模式下,使用UDP协议在客户端和服务端传送数据,为了更好的性能,DNS服务需要将服务端的响应内容限制在一个响应报文内返回给客端,而网络中的设备繁多,不同的设备设定的MTU值(传输控制单元)可能也是不一样的,为了保证在经过不同设备时,DNS的响应报文不会被重组(ipv4协议规定ip层的最小重组缓冲区大小为576),所以在DNS响应报文中,真正能用来传输数据的的空间大小为512字节,这个大小,限制了根服务器的数量和名字。

当我们查询根域(.)的NS记录时,512字节只够返回包含13个由A-M命名的根域名服务器的NS记录和A记录的响应。NS记录在回答区段中,A记录在额外信息区段中,A记录用于帮助你接下来向根域名服务器进一步查询。

实际上DNS同时占据了UDPTCP53端口,TCP 53端口主要用于主从DNS之间的数据同步。

1.2 DNS服务工作原理

主机中DNS客户端配置

当一台主机接入互联网时,在配置网络时,通常有两种方式,一种是从DHCP服务自动获得IP地址,另外一种是手动指定静态地址;

DHCP服务自动获取IP时,通常也会自动获得DNS服务器地址,手动配置静态地址时,也需要手动配置DNS服务器地址;

当用户使用主机 发送/接收 邮件,或浏览网页时,就是由主机上配置的DNS服务器地址负责将域名转换成对应的IP地址。

DNS服务解析域名流程

1.3 DNS查询类型

递归查询

是指DNS服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果DNS服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。

一般客户机和本地DNS服务器之间属于递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到最终的肯定或否定的结果后转交给客户机。

此查询的源和目标保持不变,为了查询结果只需要发起一次查询。

递归算法:客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->但它知道谁知道->他代为帮客户端去查找-->最后再返回最终结果。

迭代查询

是指DNS服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台DNS服务器的地址,用户再向这台DNS服务器提交请求,这样依次反复,直到返回查询结果。

一般情况下(有例外)本地的DNS服务器向其它DNS服务器的查询属于迭代查询,如:若对方不能返回权威的结果,则它会向下一个DNS服务器(参考前一个DNS服务器返回的结果)再次发起进行查询,直到返回查询的结果为止。此查询的源不变,但查询的目标不断变化,为查询结果一般需要发起多次查询。

迭代算法:客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->但它知道谁知道并推荐客户端应该找谁-->客户端自己去找它。

DNS缓存

DNS缓存是将解析数据存储在靠近发起请求的客户端的位置,也可以说DNS数据是可以缓存在任意位置,最终目的是以此减少递归查询过程,可以更快的让用户获得请求结果。

1.4 DNS解析类型

DNS服务器里面有两个区域,即 正向查找区域  反向查找区域

正向解析:将域名解析成IP地址

反向解析:根据IP地址得到该IP地址指向的域名

1.5 hosts文件

hosts文件是一个没有扩展名的系统文件,可以直接用文本编辑工具修改,在该文件中直接定义域名与IP地址的对应关系,当主机访问某个域名时,会先从hosts文件中寻找与该域名对应的IP地址,如果找到,则直接请求该IP地址,如果找不到,才会将该域名提交DNS服务请求解析该域名对应的IP地址。

操作系统规定,在进行DNS请求以前,先检查系统自己的Hosts文件中是否有这个域名和IP的映射关系。

如果有,则直接访问这个IP地址指定的网络位置,如果没有,再向已知的DNS服务器提出域名解析请求。也就是说HostsIP解析优先级比DNS要高。

hosts文件是引入DNS服务之前的解析方案

早期的 internet 网络规模非常小,一个hosts文件就可以定义所有的域名与IP地址的映射关系,管理机构提供该文件下载地址,并定期更新文件内容,以此来反映网络上的变化。

但随着时间的推移,接入 internet 的主机和域名越来越多,通过一个中心文件管理所有域名与IP地址映射关系己经不再可取,于是便引入了DNS服务

1.6 完整的查询请求流程

当主机请求一个域名时

1 先查询本地 hosts 文件,是否有对应IP地址,如果有,则直接访问该IP地址,域名解析服务结束;

2 如果本地 hosts 文件中没有对应IP地址,则查询本地DNS缓存,如果本地DNS缓存中有对应IP地址,则直接访问该IP地址,域名解析服务结束;

3 如果没有本地DNS缓存,或本地DNS缓存中没有该域名的IP地址,则请求主机配置的DNS服务器来解析该域名;

4 DNS服务器经过迭代查询,将查询结果返回给主机,主机根据返回结果访问对应IP地址;

2 在公有云上配置DNS解析

3 DNS检测工具

3.1 dig命令

dig(Domain Information Groper) 域名信息查询工具

dig 命令不会查询本地 hosts文件中定义的域名和IP对应关系

3.2 host命令

host 命令可以根据域名查询得到对应的服务器IP地址

host 命令不会查询本地 hosts文件中定义的域名和IP对应关系

3.3 nslookup 命令

nslookup(name server lookup),一个命令行下的网络工具,主要用来查询DNS记录,查看域名解析是否正常,也可用来诊断网络问题

nslookup 支持交互式和非交互式两种执行方式,在Windows系统中和Linux系统中都可以使用

nslookup 命令不会查询本地 hosts文件中定义的域名和IP对应关系,也不能查询dns的递归或者迭代

3.4 rndc命令

rndc  bind 程序的客户端工具,默认使用 TCP 953 端口连接 bind 服务器,进行管理

[root@ubuntu ~]# dpkg -S /usr/sbin/rndc

3.5 whois 命令

whois 命令可以查询域名注册信息

4 自建DNS服务

4.1 ubuntu 中的 systemd-resolved 服务

 ubuntu 系统中,虽然在网卡中配置了 DNS 服务器的IP地址,但在使用相关命令进行 DNS 解析时,默认的 DNS 服务器使用的是 127.0.0.53,而并不是我们在网卡上配置的DNS 服务器地址。

[root@ubuntu ~]# cat /etc/netplan/00-installer-config.yaml

systemd-resolved 服务为本地应用程序提供了网络名字解析服务, 系统通过它对外进行 dns 请求。

[root@ubuntu ~]# ll /etc/resolv.conf

lrwxrwxrwx 1 root root 39 Apr 21 2022 /etc/resolv.conf ->

../run/systemd/resolve/stub-resolv.conf

[root@ubuntu ~]# cat /etc/resolv.con

设置全局DNS

[root@ubuntu ~]# vim /etc/systemd/resolved.conf

网卡配置中再加上

[root@ubuntu ~]# cat /etc/netplan/00-installer-config.yaml

4.2 bind安装和配置

能实现DNS功能的软件有很多,像 bindpowerdnsdnsmasqunboundcoredns

bind(Berkeley Internet Name Domain)

bind 是一款实现DNS服务的开放源码软件,由伯克利大学开发,能够提供双向解析,转发,子域授权,view 等功能,使用广泛,目前Internet上半数以上的DNS服务器都是由Bind来实现的。

安装

[root@ubuntu ~]# apt install -y bind9

启动服务

[root@ubuntu ~]# systemctl enable --now named.service

4.2.1.1 配置文件解析流程

bind 配置文件

4.2.1.2 主配置文件 /etc/bind/named.conf

[root@ubuntu bind]# cat /etc/bind/named.conf

4.2.2 A 记录  AAAA记录

A 记录也称主机记录,是将主机域名解析到指定的物理机IPV4地址上

AAAA 记录是IPV6地址的主机记录,是将主机域名解析到指定物理机的IPV6地址上

A 记录是DNS解析服务中最常见的资源记录

4.2.3 CNAME 别名记录

记录别名,将域名解析到另一个域名

4.2.4 MX 记录

邮件交换 (MX) 记录将一个域的电子邮件定向到托管该域用户帐号的服务器(SMTP服务器)

一个域可以定义多条MX记录,但每条MX记录的优先级不同,如果邮件通过最高优先级记录无法递送,

则采用第二优先级,以此类推。

每个MX记录的value之前有一个数字(0-99),表示此服务器的优先级,数字越小优先级越高;

MX记录而言,任何一个MX记录后面的服务器名字,都应该在后续有一个A记录

4.2.5 NS 记录

域名服务器 (NS) 记录用于确定哪些服务器为一个网域提供DNS解析服务。

一般来说,为了服务的安全可靠,一个域名,至少应该有两条NS记录,保证服务的冗余,防止出现单点失败。

4.2.6 PTR 记录

PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域

4.2.7 SOA 记录

SOA记录是起始授权记录,用于设置当前DNS服务器的某些规则,SOA记录要放在整个文件的最开始。

SOA 记录表示此DNS是该域名的权威解析服务器,当在查询的过程中,各级缓存都没有要查询的内容时,最后会通过递归查询的方式到达此DNS服务器,并请求此域名的SOA记录。

4.2.8 TXT 记录

TXT记录是对域进行标识和说明的一种方式,一般用于验证记录,该记录的值可以是人工可读文本,也可以是机器可读文本,也可为空。

使用场景:做SPF(反垃圾邮件)记录,验证域名所有权

4.3 实现DNS自解析

在自建的DNS服务中实现域名的自解析

DNS SERVER 上实域名解析

新增 zones 记录

[root@ubuntu ~]# vim /etc/bind/named.conf.default-zones

设置具体解析规则

[root@ubuntu ~]# cat /etc/bind/db.linuxxxx

4.4 实现DNS自解析的主从

在现实环境中,一台主机通常需要配置多个DNS服务器,如果只有单个DNS服务器,则有可能会出现因为DNS服务当机,而无法解析域名的情况出现。

我们在实现DNS自解析的基础上,来实现DNS的主从

DNS主从同步的原理

主从服务之间数据同步,有两种方式

1. 主服务器向从服务器推送数据(PUSH)

2. 从服务器向主服务器拉取数据(PULL)

4.5 实现DNS自解析的反向解析

反向解析是指根据IP地址解析域名

4.6 实现DNS缓存

在客户端实现DNS缓存,可以保证在DNS服务不可用时,还能使用DNS在本地的缓存数据。

另外,本地缓存的存在,也加快了DNS的查询速度。

4.7 实现DNS自解析的子域

将子域委派给其它的DNS服务器解析,实现分布式DNS服务

4.8 实现DNS自解析的转发

当前我们配置的DNS,如果在自己无法解析后,将直接请求根域的DNS服务器解析。

在某些特定环境下,我们可以设置DNS转发服务,将当前无法解析的域名,转发给另外的DNS解析,如果还是无法解析,再提交互联网。

4.9 实现DNS自解析的视图

在同一台DNS服务器上,根据不同客户端,实现返回不同的解析结果。

这样可以做到将客户端解析到距离其物理地址最近的机房内,以达到加快访问速度,以及分流的目的

5 智能DNS解析介绍

5.1 GLSB 全局负载均衡

GLSBGlobal Server Load Balance,全局负载均衡。

GLSB 是在广域网上,对不同地域的服务器间的流量进行调度,通过判断服务器的负载,带宽的负载等,决定服务器的可用性,同时判断客户端与服务器之间的链路状况,选择与客户端最佳匹配的服务器,并将客户端请求调度到该服务器上。

因此GSLB是对服务器和链路进行综合判断来决定由哪个机房的服务器来提供服务,实现异地服务器群服务质量的保证。

GLSB 的实现有三种方式:基于DNS实现、基于重定向实现、基于路由协议实现,其中最通用的是基于DNS的实现。

GLSB 的使用范围:常用于有异地机房的WEB系统,或在CDN系统中作为核心的流量调度系统。

 5.2 内容分发网络 CDN

 CDN:(Content Delivery Network)内容分发网络

CDN 工作原理

1. 客户端请求 www.a ,如果是第一次请求,则需要向DNS服务器请求解析

2. www.a 的运维人员设置了CNANME 解析,将 www.a 解析到 www.acdn

3. www.acdn 会根据客户端IP地址,返回一个响应速度最快的IP节点给客户端

4. 客户端根据DNS解析得到的IP地址,访问该节点,该节点一般都是CDN服务器节点

5. 如果该CDN节点被访问时没有相关数据,则会将客户端请求通过内部网络转发到原站点获取数据,同时该CDN节点会将此次请求的内容缓存起来,这样下次该节点被访问时,就不用再去请求源站点​​​​​​​

第18天-Linux防火墙

内容概述

网络安全技术基础

防火墙的分类

Linux中的防火墙技术

iptables基础

iptables基本语法

iptables 匹配条件

iptables 优化实践

iptables 持久化保存

NAT网络转换原理

iptables中的NAT实现网络转换

firewalld介绍和基本使用

公有云中的安全组

1 网络安全技术基础

1.1 网络安全技术

目前主流的网络安全产品(技术)包括以下几类

1.1.1 入侵检测系统 IDS

IDSIntrusion Detection Systems (入侵检测系统)

其特点是不阻断任何网络访问,而是依照一定的安全策略,通过软,硬件,对网络,系统的运行状况进行监控,尽可能发现各种攻击企图,攻击行为或攻击结果,以保证网络系统资源的机密性,完整性和可用性。

本质上,IDS 是监听设备(系统),不用直接接入网络链路,网络流量也不用经过IDS。所以IDS一般以旁路部署的形入接入系统,然后在网络上收集它所关心的报文即可。对于收集到的报文数据,IDS会进行清洗统计,并与内置的规则进行比对和分析,从而得出哪些网络数据是入侵和攻击。根据模型和部署方式不同,IDS 可分为基于主机的IDS,基于网络的IDS,以及新一代的分布式IDS

基于主机的IDS

在每个要保护的主机上运行一个代理程序,一般只能检测该主机上发生的入侵。主要部署在重要的系统服务器,工作站上。IDS代理程序监控操作系统或系统事件级别的可疑活动(如尝试登录等)。在使用时需要清楚的定义哪些是不合法的活动,然后根据这些定义的规则来做检测。

基于网络的IDS

该类系统一般被动地在网络上监听整个网段上的信息流,通过捕获网络数据包,进行分析,能够检测该网络段上发生的网络入侵。

分布式IDS

一般由多个部件组成,分布在网络的各个部分,每个部件完成相应功能,分别进行数据采集、数据分析等。通过中心的控制部件,进行数据汇总、分析、产生入侵警报等。在这种 "分布式IDS(入侵检测系统)” 的结构下,不仅可以检测到针对单独主机的入侵,同时也可以检测到针对该网段上的主机的入侵。

1.1.2 入侵防御系统 IPS

IPS Intrusion Prevention System (入侵防御系统)

IPS 以串行的方式接入系统,IPS系统可以深度感知并检测经流的数据报文,可以根据预先设定的安全策略,对流经的每个报文进行深度检测(包括协议分析跟踪、特征匹配、流量统计分析、事件关联分析等),如果发现藏匿于其中的网络攻击,可以根据该攻击的威胁级别立即采取措施,这些措施包括中断连接,丢弃报文,隔离文件,向管理员告警等。

IPS可以分为 主机入侵防御系统,网络入侵防御系统,无线入侵防御系统等几类。

主机 IPS

主机IPS部署在终端主机节点上,主要用来保护单台主机,主机IPS与网络IPS结合使用效果更佳,对于能够规避网络IPS的威胁,主机IPS可以看是防御系统的最后一道防线。

网络 IPS

网络IPS一般部署在系统的战略位置上,所有进出的流量和报文,都要经由网络IPS,其作用在整个网络上。

无线 IPS

此类的入侵防御系统可以扫描无线网络,进行寻找未经授权的访问,并可以将未授权的设备移出网络。

1.1.3 防火墙 FW

FWFirewall

防火墙系统是在内部网络和外部网络之间,专用网络与公共网络之间,可信网络和不可信网络之间建立屏障。它是一种隔离技术,是在两个网络通讯时执行的一种访问控制尺度,它能允许经你 同意的个人和数据进入你的网络,同时将你 不同意 的个人和数据拒之门外,最大限度的阻止非法的流量和数据进入系统或网络。同时防火墙也可以根据规则禁止本地网络向外发送数据报文,以及根据规则转发网络流量等。

防火墙以串行的方式接入系统,所有流入流出的网络报文都要经由防火墙。根据工作模式不同,防火墙可以分为 网络层防火墙,应用层防火墙等。

1.1.4 防水墙 WW

WWWaterwall

与防火墙相对,防水墙是一种防止内部信息泄漏的安全产品。它利用透明加解密,身份认证,访问控制和审计跟踪等技术手段,对涉密信息,重要业务数据和技术专利等敏感信息的存储,传播和处理过程,实施安全保护;最大限度地防止敏感信息泄漏、被破坏和违规外传,并完整记录涉及敏感信息的操作日志,以便日后审计。

1.2 防火墙的分类

1.2.1 按照保护范围来划分

按照保护范围来划分,可以分为主机防火墙和网络防火墙。

主机防火墙

主机防火墙对单个主机进行防护,运行在终端主机上,主机防火墙可以阻止未授权的程序和数据出入计算机,WindowsLinux 系统都有自带的主机防火墙。

网络防火墙

网络防火墙部署在整个系统的主线网路上,对整个系统的出入数据进行过滤。

1.2.2 按实现方式划分

按实现方式来划分,可以分为硬件防火墙和软件防火墙。

硬件防火墙

硬件防火墙以独立硬件设备的形式提供服务,独立供电,独立部署,其软件是单独运行在硬件里面的,所有硬件资源都只给防火墙这一个程序使用。

常见的硬件防火墙生产厂商有 华为,天融信,启明星辰,绿盟,深信服等。

软件防火墙

没有独立硬件,一般以应用程序的形式提供,运行于通用硬件平台,寄生于操作系统中,是通过纯软件的方式提供服务。

1.2.3 按网络协议划分

按网络协议划分,可以分为网络层防火墙和应用层防火墙。

网络层防火墙工作在OSI七层模型中的网络层,又称包过滤防火墙。

应用层防火墙工作在OSI七层模型中的应用层,又称网关防火墙或代理服务器防火墙。

网络层防火墙

网络层防火墙对流经的数据包中的源地址,目标地址,端口号及协议等内容做出分析,依据事先设定好的过滤规则,对数据包作出不同的处理(包括拒绝,丢弃,放行,转发等)。这些过滤规则,被称为访问控制列表(ACL)

网络层防火墙只能根据数据包头部的协议端口号等进行过滤,无法过滤应用层的具体数据

应用层防火墙

应用层网只针对特别的网络应用服务协议来确定数据过滤逻辑。应用层网关防火墙是内部网和外部网的隔离点,它部署在主链路上,将系统分为两部份,起到内外部网络通讯时的中间转接作用。

1.3 网络架构

2 Linux 防火墙基础知识

2.1 netfilter 基础

netfilter/iptables 有三部分组成,分别是netfilter 框架/iptables(内核空间)/iptables 命令行工具(用户空间)

内核中netfilter相关的模块

[root@ubuntu ~]# grep -i netfilter /boot/config-5.15.0-73-generic

2.2 防火墙工具

2.2.1 iptables

由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包。

2.2.2 firewalld

redhat 系列的发行版中,从CentOS 7 版本开始,引入了新的前端管理工具。

2.2.3 nftables

此软件是 CentOS 8的新特性,Nftables 最初在法国巴黎的 Netfilter Workshop 2008 上发表,后由

netfilter核心团队成员和项目负责人Patrick McHardy 20093月发布。并于2013年末合并到Linux内核中,自2014年开始,己经在 3.13版本以以后的版本的内核中可用。

它重用了 netfilter框架的许多部份,例如连接跟踪和NAT功能。它还保留了命名法和基本iptables设计的几个部份,例如表,链和规则。就像iptables一样,充当链的容器,并且链包含单独的规则,这些规则可以执行操作,例如丢弃数据包,移至下一个规则或跳至新链。

从用户角度来看,nftables添加了名为 nft 的新工具,该工具是iptables及其衍生指令 (ip6tables

arptablesebtables)的超集,替代了iptables 及其衍生指令的中的所有工具。从体系结构的角度来看,它还替换了内核中处理数据包过滤规则集运行时评估的那些部分。

2.3 netfilter 工作原理

netfilter 在内核中某些位置放置了五个勾子函数(hook function),分别是 INPUTOUTPUT

FORWARDPREOUTINGPOSTROUTING,管理员可以通过配置工具配置规则,让这五个函数按照自定义的规则进行工作,达到防火墙的功能。

2.4 iptables 的组成

netfilter 在内核中设置了五个勾子函数,管理员在用户空间,通过程序设置过滤规则,内核中的勾子函数根据预设的规则进行工作,达到对流经的数据包进行过滤,拒绝,转发等功能。

iptables中有五个链(chain)对应内核中的五个勾子函数。除此之外,iptables中还有五个表

table),一起来配合工作。

表的优先级(从高到低)

security --> raw --> mangle --> nat --> filter

链和表的对应关系(不是每个链都能支持五个表)

数据包过滤匹配流程

当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要传送出去;

如果数据包是进入本机的,则会进入INPUT链,然后交由本机的应用程序处理;

如果数据包是要转发的,且内核允许转发,则数据包在PREROUTING链之后到达FORWARD链,再经由POSTROUTING链输出

本机的应用程序往外发送数据包,会先进入OUTPUT链,然后到达POSTROUTING链输出

数据流入:PREROUTING --> INPUT

数据流出:OUTPUT --> POSTROUTING

数据转发:PREROUTING --> FORWARD --> POSTROUTING

3 iptables

3.1 前置工作

 ubuntu 中,在用iptables命令设置防火墙之前,先关闭自带的 ufw 服务,因为 ufw 服务中也有一套自定义的规则,如果在开启 ufw 服务的情况下再用 iptables 设置或删除规则,容易发生冲突。

[root@ubuntu ~]# systemctl is-active ufw

[root@ubuntu ~]# systemctl disable --now ufw

 redhat 系中要先停用 firewalld 服务

[root@rocky86 ~]# systemctl is-active firewalld

active

#在开启firewalld服务情况下的 iptables 规则

[root@rocky86 ~]# iptables -L

停用firewalld服务

#centOS7,8

[root@rocky86 ~]# systemctl disable --now firewalld.service

再次查看,规则为空

[root@rocky86 ~]# iptables -L

3.2 iptables 命令组成

iptables 完整命令由四部份组成

完整格式示例

iptables -t filter -A INPUT -s 192.168.0.1 -j DROP

iptables 命令格式

iptables [-t table] {-A|-C|-D} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain target

iptables [-t table] -E old-chain-name new-chain-name

rule-specification = [matches...] [target]

match = -m matchname [per-match-options]

target = -j targetname [per-target-options]

#指定表

-t|--table table

用抓包工具分析

[root@ubuntu ~]# tcpdump -i ens33 -nn icmp

iptables 防火墙中的规则,在生效时会按照顺序,从上往下生效,当前一条规则命中后,不再继续往下匹配。

如果多条规则里面,匹配条件中有交集,或者有包含关系,则这些规则,要注意前后顺序,范围小的,需要精确匹配的,要往前放,范围大的,往后放,负责兜底的,放在最后。

如果多条规则里面,匹配条件没有交集,彼此不会互相影响,则无所谓前后顺序,但是从效率上来讲,更容易命中的要放在前面。

3.3 iptables 匹配条件

iptables 中的匹配条件分为基本匹配和扩展匹配两种,当一条 iptables 规则中有多个匹配条件时,默认是  ,即要同时满足。

3.4 target

3.5 规则优化最佳实践

安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高

谨慎放行入站的新请求有特殊目的限制访问功能,要在放行规则之前加以拒绝

同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理

不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更

高。应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率

设置默认策略,建议白名单(只放行特定连接)

默认规则(iptables -P)是 ACCEPT,不建议修改,容易出现 自杀 现象

规则的最后定义规则做为默认策略,推荐使用,放在最后一条

3.6 iptables 规则保存

使用iptables 命令定义的规则,手动删除之前,其生效期限为 kernel 存活期限,当系统重启之后,定义的规则会消失。

持久化保存规则

[root@ubuntu ~]# iptables -t filter -A INPUT -s 10.0.0.1 -j ACCEPT

[root@ubuntu ~]# iptables -L

3.7 网络防火墙

3.7.1 NAT 网络转换原理

当我们从运营商接入宽带之后,经过路由器,防火墙,交换机等各种设备,后面再接入终端机,包括打印机,手机,电脑等,在大多数情况下,我们在接入运营商的宽带后,会在使用(公司,学校,工厂,家庭)范围内组建一个局域网。

以我现在的工作机为例。

物理机的IP地址是 192.168.1.101,在物理机上运行着两台虚拟机,它们的IP 分别是 10.0.0.150 

10.0.0.151

但是这三台主机,在访问互联网时,互联网上得到的这三台主机的IP都是 219.143.130.7

NAT

NAT:(Network Address Translation) 网络地址转换

局域网中的主机都是分配的私有IP地址,这些IP地址在互联网上是不可达的,局域网中的主机,在与互联网通讯时,要经过网络地址转换,去到互联网时,变成公网IP地址对外发送数据。服务器返回数据时,也是返回到这个公网地址,再经由网络地址转换返回给局域网中的主机。

一个局域网中的主机,想要访问互联网,在出口处,应该有一个公网可达的IP地址,应该能将局域网中的IP地址通过NAT转换成公网IP

3.8 iptables 中的自定义链

iptables 中除了系统自带的五个链之外,还可以自定义链,来实现将规则进行分组,重复调用的目的。自定义链添加规则之后,要作为系统链的 target 与之关联,才能起到作用。

[root@ubuntu ~]# iptables -L

#添加自定义链

[root@ubuntu ~]# iptables -t filter -N web_chain

#查看

[root@ubuntu ~]# iptables -L

4 firewalld

4.1 firewalld 介绍

firewalld  CentOS 7.0 新推出的管理 netfilter 的用户空间软件工具,也被 ubuntu18.04 版以上所支持 (apt install firewalld)

firewalld 是配置和监控防火墙规则的系统守护进程,可以实现 iptablesip6tablesebtables 的功

能。

firewalld 服务由 firewalld 包提供。

firewalld 中有多个系统自带的 Zone,每个zone都对应不同的防火墙规则,使用不同的 Zone,就表使用不同的防火墙规则,每个Zone的具体规则可以进行修改,也可以自定义Zone

firewalld 三种配置方法

firewall-config 图形工具:需要安装 firewall-config 

firewall-cmd 命令行工具:来自于 firewalld 包,默认己安装

/etc/firewalld/* 配置文件:一般不直接修改配置文件来管理firewalld

4.2 firewall-config 工具

4.3 firewall-cmd 工具

firewall-cmd  firewalld 服务的命令行编辑工具

4.4 firewall rich rule

当基本 firewalld 语法不能满足需求时,可以使用更为复杂的规则

rich rules:富规则

相对于基本的 firewalld 语法规则,rich 规则能实现更丰富的功能,比如拒绝/允许,日志,端口转发,伪装和限制速率等。​​​​​​​

第19天-Linux防火墙和MySQL基础

5 公有云中的安全组

在公有云环境中,可以使用安全组来配置出入栈规则,来起到防火墙的作用

第20天-MySQL数据库-SQL语言

第21天-MySQL数据库-SQL语言和LAMP项目实现


 

第22天-运维自动化工具Ansible

内容概述

运维自动化发展历程及技术应用

Ansible 工作原理和基础命令

Ansible 常用模块

Ansible playbook 基础

Ansible playbook 进阶

Ansible 中的 Roles

公有云中的批量管理

1 自动化运维应用场景

1.1 云计算运维工程师核心职能

运维工程师的基本职责就是保障系统和服务的稳定性,稳定压倒一切,确保服务一年365天,每天24小时不间断的为用户提供服务,在此基础上运维工程师的工作内容还有很多:

提升效率:使用自动化的平台或工具,来提升项目在研发生命周期内的效率。

控制成本:通过技术手段对服务架构进行优化,或采用新的产品或技术,来达到降低成本,提升效

益的作用。

发布管理:构建自动化运维平台,来确保每次发版都安全可控。

变更管理:通过技术手段,对每次变更做要记录在案,有迹可循。

备份恢复:对重要数据采用定时备份机制,以便能在发生问题时能及时恢复数据。

灾难演练:定期对预定义方案进行演练,确保是可行的。

系统分析:通过采集并分析各类日志,定位并分析出系统可能存在的风险点,及时修正,以及做好

预案。

技术选型:根据当前服务的业务情况,选用不同的产品和架构,以达到业务与经济的平衡。

从项目的生命周期来讲,运维工程师的工作主要包括四个阶段:

项目首次上线:平台架构组建,基础环境和服务部署

日常运行维护:负责保障项目的稳定运行,版本迭代升级等

性能效率优化:当项目发展到一定阶段后,需要一些新的技术或方案来实现性能提升,成本优化等

项目下线:备份数据,释放资源

1.2 运维工程师的发展路线

运维工程师的打怪升级之路:从入门到进厂

运维的未来是什么?

一切皆自动化

运维的未来是,让研发人员能够借助工具、自动化和流程,并且让他们能够在运维干预极少的情况下部署和运营服务,从而实现自助服务。每个角色都应该努力使工作实现自动化。----------《运维的未来》

1.3 企业实际应用场景分析

开发环境

又称 Dev Env / Development Environment 环境

开发环境是位于安全服务器或者本地机器的软件或者网络应用的一个工作备份。开发者可以对于源代码进行修改以及上传独立的功能。由于工作版本 the working version 通常和编译器、debugging、测试工具一同工作,因此工作版本只在这个环境下起作用。开发人员通常会用一个精简版的数据库来检查特定的功能。

开发环境一般是开发工程师使用和管理

测试环境

又称 QA Env / Test Environment 环境

测试环境帮助我们测试产品的某一个特定部分。它要求不同的配置和数据配置,因此测试环境没有一个一键生成式的配置方法(不同于 staging environment)。测试环境的分支一般是develop分支,部署到公司私有的服务器或者局域网服务器上,主要用于测试是否存在bug,一般会不让用户和其他人看到。

测试环境一般是测试工程师使用和管理

生产环境

又称 Prod/ Production Environment 环境

生产环境是指正式提供对外服务的环境,一般连接上互联网即可访问。一般会关掉错误报告,打开错误日志。部署分支一般为master分支。开发人员在这个时点不会再做任何的修改,因为之前对于源代码的工作复制已经在运转中的服务器上了。源代码在经过详尽地测试以后,可以被 push 出来了。

生产环境一般由运维工程师负责管理。

除了上述三个主要环境之外,对于一些较为复杂的项目,还会有 回归环境,预发布环境,灰度环境等场景。

1.4 程序发布流程

发版前提:要发布的分支己进行充分测试,所有BUG己修复完成,所有预期功能都己经实现。测试结果通过。

发版时间:避开业务高峰期,避开节假日。

发版流程:

1. 在调度器上下线一批主机

2. 关闭服务

3. 部署新版本的应用程序

4. 启动服务

5. 观察和验证

6. 重新接入调度器

7. 观察和验证

对于重大版本更新或大型项目,我们可以采用灰度发布或蓝绿发布的模式进行更新,一次更新一部份,待验证完成后,再进行批量更新,以减少出现问题的概率。

1.5 自动化运维应用场景

1.6 常用的自动化运维工具

有代理和无代理

有代理是指需要在被管理的机器上预先安装客户端软件,类似于C/S架构。

无代理是指预先不需要在被管理的机器上做任何操作,只需要被管理机器的远程连接用户名和密码即可。

2 Ansible 基础

Ansible 是一个自动化运维工具,基于Python开发,集合了众多运维工具(puppetcfenginechef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

2.2 Ansible 的功能和特点

Ansible 的主要功能

批量执行远程命令,可以对远程的多台主机同时进行命令的执行批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务编排高级的企业级复杂的IT架构任务,Ansible  Playbook  role 可以轻松实现大型的IT复杂架构

提供自动化运维工具的开发 API 有很多运维工具,如 jumpserver 就是基于 ansible 实现自动化

管理功能

Ansible 的主要优点

部署简单方便,在对多机进行批量管量时,只需要在主控机上部署 Ansible 服务,被管理的机器不

用部署;

默认通过 SSH 协议进行通信,只要保证主控端和被控机 ssh 通道畅通,就能保证服务可用;

配置简单,上手快,功能强大;

 python 开发,打开源文件,所见即所得,对二次开发的支持非常友好;

大量常规运维操作己经内置;

对于较复杂的需求,可以通过 playbook 功能和 role 功能来实现;

还提供了操作方便,功能强大的的 web 管理界面;

是一个己经商业化很久的项目了,生态成熟,社区活跃,文档完善

Ansible 的不足

在管理的主机数量较多时,性能略差,执行效率不如 saltstack 

不支持事务回滚

2.3 Ansible 工作原理

执行流程

1. 加载配置文件,读取配置;

2. 加载对应的模块文件;

3. 根据命令或模块,生成一个临时的 py 文件,再将该文件传送至对应的被管理的机器上

($HOME/.ansible/tmp/ansible-tmp-xxx/xx.py)

4. 给远程的 py 文件加可执行权限

5. 执行该文件,并将结果抓取回当前的主机显示;

6. 删除远端的临时 py 文件

2.4 Ansible 命令执行来源

系统用户直接执行:系统用户登录终端后直接在命令行下执行单条命令

 playbooks 中间接执行,playbook中编写多条 ansible 命令,ansible 根据playbook文件的内容

依次执行

执行流程

1. 加载配置文件,读取配置;

2. 加载对应的模块文件;

3. 根据命令或模块,生成一个临时的 py 文件,再将该文件传送至对应的被管理的机器上

($HOME/.ansible/tmp/ansible-tmp-xxx/xx.py)

4. 给远程的 py 文件加可执行权限

5. 执行该文件,并将结果抓取回当前的主机显示;

6. 删除远端的临时 py 文件

2.4 Ansible 命令执行来源

系统用户直接执行:系统用户登录终端后直接在命令行下执行单条命令

 playbooks 中间接执行,playbook中编写多条 ansible 命令,ansible 根据playbook文件的内容

依次执行

 web 管理界面上执行

使用 API 调用执行:配置API接口,让第三方应用或程序调用接口执行 ansible 命令

2.5 使用注意事项

执行ansible的主机一般称为管理端, 主控端,中控,master 或堡垒机

主控端Python版本需要2.6或以上

被控端Python版本小于2.4,需要安装python-simplejson

被控端如开启SELinux需要安装libselinux-python

windows 不能做为主控端,只能做为被控制端

3 Ansible 安装和基本使用

3.1 Ansible 安装

官方安装文档

https://docs.ansible/ansible/latest/installation_guide/index.html

Rocky中安装 ansible

#需要先安装 epel 

[root@rocky ~]# yum install -y epel-release

[root@rocky ~]# yum install -y ansible

#rocky9

[root@rocky ~]# rpm -q ansible

ansible-7.2.0-1.el9.noarch

[root@rocky ~]# ansible --version

ansible [core 2.14.2]

3.2 Ansible 配置文件

3.2.1 查看 ansible 配置文件

3.2.2 主配置文件

Ansible 的主配置文件可以有多个,分别存放于不同目录,其优先级如下

3.2.3 主机清单配置文件

ansible 的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在 inventory 主机清单文件中将其分组组织主机定义支持 ip 地址和主机名两种方式,写法多种多样。

注意:

生产建议在每个项目目录下创建项目独立的hosts文件

通过项目目录下的ansible.cfg文件中的 inventory = ./hosts 实现

3.3 Ansible 工具

[root@ubuntu ~]# ls /usr/bin/ansible*

3.4 ansible-doc 命令用法

ansible-doc 工具用来查看 ansible 文档

3.5 ansible-console 命令用法

ansible-console 用来交互式执行命令,支持 tab 键补齐

格式

3.6 ansible 命令用法

3.6.1 ansible 命令基础用法

ansible 工具一般用来执行单条命令,使用频率较高

3.6.2 host-pattern 规则

host-pattern 用于匹配被管理的主机列表

范例:所有主机

[root@ubuntu ~]# ansible all --list

3.6.3 执行结果状态说明

绿色 执行成功,此次执行远程主机没有写行为发生(修改文件,删除文件,新增文件等)

黄色 执行成功,有发生变改

红色 执行失败

4 Ansible 常用模块

4.1 command 模块

此模块为 ansible 默认模块,可以省略 -m 选项,该模块用来在远程主机上执行 shell 命令,但有些操作不支持,比如管道,重定向,通配符等,如果要实现这些功能,可以用 shell 模块实现。

此模块不具有幂等性

#查看帮助

[root@ubuntu ~]# ansible-doc -s command

4.2 shell 模块

此模块用法和 command 模块类似,都是用来执行 shell 命令,但功能比 command 模块强大,对于在command 模块中不支持的功能,此处均可使用。此模块也不具有幂等性。

在调用shell模块执行命令时,复杂的命令也有可能会执行失败,类似于包含多重管道,正则表达式这些,这种情况下,我们需要写成 shell 脚本,用 copy 模块直接推送到远程执行。

#查看帮助

[root@ubuntu ~]# ansible-doc -s shell

4.3 script 模块

script 模块可以在远程主机上运行 ansible 机器上的脚本(而且脚本文件可以没有执行权限),这里的脚本并不仅仅只是 shell脚本,只要远程主机上能执行的,都可以,包括但不限于 php, sh, py 等。

此模块不具有幂等性。

#查看帮助

[root@ubuntu ~]# ansible-doc -s script

4.4 copy 模块

copy 模块将 ansible 主机上的文件复制到远程主机,此模块具有幂等性。

查看帮助

[root@ubuntu ~]# ansible-doc -s copy

4.5 get_url 模块

该模块可以将网络上的资源下载到指定主机,支持 httphttpsftp 协议

#查看帮助

[root@ubuntu ~]# ansible-doc -s script

4.6 fetch 模块

从远程主机提取文件至 ansible 的主控端,copy 相反,不支持目录

#查看帮助

[root@ubuntu ~]# ansible-doc -s fetch

4.7 file 模块

file 模块主要提供文件管理功能,比如创建文件和目录,修改文件和目录,设置文件权限和属性,设置链接等

#查看帮助

[root@ubuntu ~]# ansible-doc -s file

4.8 stat 模块

stat 模块用来获取目标文件的状态,对于 windows 主机,要使用 win_stat 模块

#查看帮助

[root@ubuntu ~]# ansible-doc -s stat

4.9 unarchive 模块

unarchive 模块主要用来解压缩或解包,将 ansible 主机或其它主机上的压缩包复制到指定主机,再解压到某个目录

在使用此模块时,要保证远程主机能解压对应的压缩包

#查看帮助

[root@ubuntu ~]# ansible-doc -s unarchive

4.10 archive 模块

archive 模块在远程主机上执行压缩打包命令,此模块的源和目标都在远程主机上

[root@ubuntu ~]# ansible-doc -s archive

4.11 hostname 模块

此模块主要用于修改远程主机的主机名,修改后永久生效

[root@ubuntu ~]# ansible 10.0.0.206 -m hostname -a "name=test-name"

4.12 cron 模块

cron 模块用于管理远程主机上的 crontab 定时任务

#查看帮助

[root@ubuntu ~]# ansible-doc -s cron

4.13 yum 模块和 apt 模块

yum 模块和 apt 模块用于在远程主机上管理软件包,yum 模块适用于 redhat 系列,apt 适用于 debian系列

#查看帮助

[root@ubuntu ~]# ansible-doc -s yum

apt 模块

#查看帮助

[root@ubuntu ~]# ansible-doc -s apt

4.14 yum_repository 模块

此模块用来对远程主机上的 yum 仓库配置进行管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s yum_repository

4.15 service 模块

service 模块主要用于对远程主机的服务进行管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s service

4.16 user 模块

此模块用于对远程主机进行用户管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s user

4.17 group 模块

此模块用于对远程主机的组管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s group

4.18 lineinfile 模块

lineinfile 模块主要用于修改远程主机上的文件。

ansible 提供了两个常用的文件修改模块,其中 lineinfile 主要对文件单行进行替换修改,replace 模块主要进行多行替换和修改。

如果使用 ansible 调用 sed 进行文件修改时,经常会遇到需要转义的情况,而且在对特殊符号进行替换时,有可能会失败。

#查看帮助

[root@ubuntu ~]# ansible-doc -s lineinfile

4.19 replace 模块

该模块功能与 lineinfile 模块功能类似,也是基于正则匹配的模式来修改文件,但与 lineinfile 不同的是replace 模块用于多行匹配和修改

#查看帮助

[root@ubuntu ~]# ansible-doc -s replace

4.20 selinux 模块

selinux 模块用作对远程主机的 selinux 机制进行管理

#查看帮助

[root@ubuntu ~]# ansible-doc -s selinux

4.21 reboot 模块

reboot 模块主要用于对远程主机进行重启操作

#查看帮助

[root@ubuntu ~]# ansible-doc -s reboot

4.22 mount 模块

mount 模块用于管理远程主机的挂载

#查看帮助

[root@ubuntu ~]# ansible-doc -s mount

4.23 setup 模块

此模块主要用来从远程主机上收集相关信息在 ansible 主机上显示,由于需要收集的信息较多,此模块执行较慢。

#查看帮助

[root@ubuntu ~]# ansible-doc -s setup

4.24 debug 模块

此模块可以用于输出信息,并且通过 msg 定制输出的信息内容,功能类似于 echo 命令

#查看帮助

[root@ubuntu ~]# ansible-doc -s debug

4.25 sysctl 模块

sysctl 模块用来修改远程主机上的内核参数

#查看帮助

[root@ubuntu ~]# ansible-doc -s sysctl

4.26 pam_limits 模块

此模块主要用于管理远程主机上的资源限制

#查看帮助

[root@rocky86 ~]# ansible-doc -s pam_limits

4.27 apt_repository 模块

此模块实现 apt 仓库的配置管理,仅于用 debian 系列的环境中

#查看帮助

[root@ubuntu ~]# ansible-doc -s apt_repository

4.28 apt_key 模块

此模块实现 apt 仓库的key 的配置管理,仅于用 debian 系列的环境中

#查看帮助

[root@ubuntu ~]# ansible-doc -s apt_key

4.29 其它模块

除了上述模块之外,ansible 还提供了很多其它的模块,在我们需要使用时,可以再进行查询

ansible-doc -l | grep "模块关键字"

ansible-doc 模块名

5 Ansible 中的 Playbook

5.1 Playbook 基础

Playbook 的定义

字面意思,剧本,编剧写的,导演定的,演员按照剧本来表演,自行想象春晚

 ansible 中,我们写好 playbook,服务器作演员,由服务器根据我们编排的剧本,完成环境安装,服务部署,系统搭建,状态检测等各种各样的功能。

为什么要使用 Playbook

 ansible 中,较简单的任务,我们可以直接调用单个模块来完成,但是,如果遇到复杂的需求,需要调用大量模块才能完成一个需求,或多个任务间有依赖的时候,使用单条命令就特别不方便,这种情况下,我们就可以使用 playbook 来实现这种需求。

module (模块)  Playbook 的区别

Playbook 是对多个 AD-Hoc 的一种编排组合的实现方式

Playbook 能控制任务执行的先后顺序

Playbook 可以持久保存到文件中从而方便多次调用运行,而 Ad-Hoc 只能临时运行

Playbook 适合复杂的重复性的任务,而 Ad-Hoc 适合做快速简单的一次性任务

playbook 文件规范

扩展名为 yaml  yml

第一行用 “---” (英文输入法下的中划线) 表示 yaml 的开始,一般不写,如果有多个 yaml 文件合

并,则可用此标识每个 yaml 文件内容

使用#作为注释

大小写敏感

缩进符要统一,用空格键缩进,不要用 tab

缩进空格的数量不重要,但是,相同层级的左边缩进,要保持一致,要对齐,就是说,同样的缩

进,代表同样的级别

使用 “-”(英文输入法下的中划线)+一个空格来表示单个列表项

使用 ”:”(冒号)+空格来表示一个键值对

使用“{}”(花括号) 来表示一个键值表

一个 name 只能有一个 task

5.2 YAML 语言

5.2.1 YAML 语言基础和特性

YAML: YAML Ain't Markup LanguagYAML不是一种标记性语言,实际上在开发这种语言的时候,YAML 的意思其实是:Yet Another Markup Language (YAML仍然是一种标记性语言)

YAML 是一个可读性高的用来表达资料序列的格式。是目前较流行的配置文件格式,很多新的项目或者软件都采用 yaml 文件来保存配置信息,例如 ubuntuansibledokerkubernets 等。

YAML 语言特点

YAML的可读性好

YAML和脚本语言的交互性好

YAML使用实现语言的数据类型

YAML有一个一致的信息模型

YAML易于实现

YAML可以基于流来处理

YAML表达能力强,扩展性好

5.2.2 YAML 语言语法

在单一文件第一行,用连续三个连字号 "-" 开始,还有选择性的连续三个点号( ... )用来表示文件的

结尾

次行开始正常写 Playbook 的内容,一般建议写明该 Playbook 的功能

使用#号注释代码

缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换

行来实现的

缩进不支持 tab,必须使用空格进行缩进

缩进的空格数不重要,只要相同层级的元素左对齐即可

YAML文件内容是区别大小写的,key/value 的值均需大小写敏感

多个 key/value 可同行写也可换行写,同行使用,分隔

key 后面冒号要加一个空格 比如 key: value

value 可是个字符串,也可是另一个列表

YAML 文件扩展名通常为 yml  yaml

5.2.3 YAML 中的数据类型

YAML 支持以下常用几种数据类型

Dictionary 字典

一个字典是由一个或多个keyvalue构成

key  value 之间用冒号 :分隔

冒号 : 后面有一个空格

所有 k/v 可以放在一行,每个 k/v 之间用逗号分隔

所有每个 k/v 也可以分别放在不同行,一对 k/v 放在独立的一行

List 列表

列表由多个元素组成

每个元素放在不同行,每个元素一行,且元素前均使用中横线 - 开头,并且中横线 - 和元素之间有

一个空格

也可以将所有元素用 [ ] 括起来放在同一行每个元素之间用逗号分隔

5.2.4 三种常见的数据格式

XMLExtensible Markup Language,可扩展标记语言,可用于数据交换和配置

JSONJavaScript Object NotationJavaScript 对象表记法,主要用来数据交换或配置,不支持

注释

YAMLYAML Ain't Markup LanguageYAML 不是一种标记语言, 主要用来配置,大小写敏

感,不支持 tab

5.3 Playbook 的构成

playbook 是由一个或多个 “play” 组成的列表。playbook 的主要功能在于,将多个 play 组织在一个

playbook 文件中,让多台预定义的主机按照 playbook 中编排的内容来完成一系列复杂的功能。

一个 playbook 至少要包含 name  tasks 两部份。

主要有以下几部份构成

facts 默认会自动调用的模块,获取远程主机的一些信息,可以在下面的任务中使用,相当于构造

函数,可以禁用;

hosts 指定要执行任务的远程主机,其值可以是通配符,主机或组,但一定是要在主机清单中定义

过的(/etc/ansible/hsots),可以用 -i 选项指定自定义的主机清单文件;

remote_user 指定任务在远程主机上执行时,所使用的用户,可以是任意用户,也可以 sudo,但

前提是用户是存在的,默认 root,可以不写;

variables 定义 playbook 运行时需要的使用的变量,有多种定义方式;

templates 模板模块,配合变量,模板文件,可以实现批量执行时,在不同主机上用同一个模板生

成不同配置文件的功能;

tasks 定义要在远程主机上执行的任务列表,各任务按顺序在 hosts 中指定的主机上执行,即所有

主机做完当前任务,才会开始下一个任务。task 的模式是执行指定模块,后面跟上预定的参数,参

数中可以使用变量,模块的执行是幂等的,这意味着多次执行是安全的,因为其结果均一致,如果

在执行过程中发生错误,则会全部回滚(包括前面己执行成功的);每个task 都应该定义name,用

于执行结果的输出,如果没有指定 name ,则 action 的结果将用于输出;

tags 定义哪些代码内容可以被忽略,就是用 tags 跳过部份代码;

notify/handlers 一般配合使用, 可以达到一种触发调用的效果,(类似于函数调用或触发器)​​​​​​​

5.4 Playbook 命令

5.4.1 ansible-playbook 命令

ansible-playbook <filename.yml> ... [options]

5.4.3 ansible-vault 文档加解密命令

5.6 Playbook 中的 nofify  handlers

5.6.1 notify  handlers

Handlers 本质上也是 task list,也定义了一系列的 task,每个 task 中同样调用指定模块执行操作,只不过 Handlers 中定义的 task,不会主动执行,需要配合 notify,让 notify 通知相应的 Handers 中的task,该 task 才会执行,而且,Handers 中的 task,是在 playbook tasks 中所有的 task 都执行完成之后才调用,这样是为了避免多次触发同一个 Hander 导致多次调用。

notify 配合 handlers,可以实现在特定条件下触发某些操作,特别适用于类似于服务重启,重载等场景。

注意

如果多个 task 通知了相同的 handlers  handlers 仅会在所有 task 结束后运行一 次。

只有 notify 对应的 task 发生改变了才会通知 handlers 没有改变则不会触发 handlers

handlers 是在所有前面的 tasks 都成功执行才会执行,如果前面任何一个 task 失败,会导致

handler 跳过执行

第23天-运维自动化工具Ansible(二)

5.6.2 force_handlers 强制执行 handlers

 task 中使用 notify 来调用 handlers 中的任务,如果该 task 执行失败,或者在该 task 之前的其它task 执行失败,则会导致 notify 通知的 handlers 中的任务不会被调用,想要保证 handlers 中的 task一定会被调用,则可以用 force_handlers 强制指定。

注意:force_handlers 是以整个 playbook 的角度来理解的,在 playbook 中,如果有 task 执行失败,那整个 playbook 也执行失败,即使有部份 task 执行成功,这部份 task 对应的 handlers 也不会被执行,force_handlers 保证的是己成功执行的 task 对应的 handlers 一定会被执行。

#shell 模块不具有幂等性,总是返回 changed,用来测试最好

[root@ubuntu ~]# cat force_handlers.yaml

5.7 忽略错误 ignore_erros

在同一个 playbook中,如果一个 task 出错,则默认不会再继续执行后续的其它 task,利用

ignore_errors: yes 可以忽略此 task 的错误,继续执行其它 task,此项也可以配置为全局选项。

[root@ubuntu ~]# cat ignore_errors.yaml

5.8 Playbook 中的 tags

默认情况下, Ansible 在执行一个 playbook 时,会执行 playbook 中所有的任务在 playbook 文件中,可以利用 tags 组件,为特定 task 指定标签,当在执行 playbook 时,可以只执行特定 tags  task,而非整个 playbook 文件。

可以一个 task 对应多个 tag,也可以多个 task 对应同一个 tag

还有三个内置的 tagall 表示所有任务,tagged 表示所有被 tag 标记的任务,untagged 表示所有没有被标记的任务。

tags 主要用于调试环境

5.9 Playbook 中的变量

playbook 支持变量的定义与引用

playbook 中的变量名由数字字母下划线组成,区分大小写,且只能以字母开头;

变量定义

var1=value

var2: value

#范例

http_port=80

ssh_port: 22

使用变量

通过 {{ variable_name }} 调用变量,且变量名前后建议加空格,在某些情况下需要加双引号,写成 "{{variable_name }}" 才生效

变量来源

1. 使用 setup facts 获取的远程主机的信息都是放在变量中的,可以直接使用

2. 在命令行执行 ansible-playbook 时,可以使用 -e 选项设置变量,这种变量的优先级最高

3.  playbook 文件中定义变量

4. 在单独的变量文件中定义变量,再在 playbook 中引用该文件

5. 在主机清单文件中定义,当单独主机的变量与分组的变量有冲突时,单独定义的主机的变量,优先级更高

6. 在主机变量目录(host_vars)和主机分组目录(group_vars)中创建以主机名或分组名为文件名的文

件,在该文件中定义

7. 使用 register 将其它 task 或模块的执行的输出内容保存到变量中,供别的 task 来使用

8.  role 中定义

5.9.1 使用 setup 模块中的变量

在命令行下,可以通过指定 setup 模块的方式获取目标主机信息

[root@ubuntu ~]# ansible 127.0.0.1 -m setup

 playbook 中,可以使用 gather_facts 选项来获得目标主机的信息,该选项默认是 yes ,每次执行都需要消耗一定的资源和时间,在不需要时可以禁用该项来加快 playbook 的执行效率,另外,目标主机的信息也可以保存在本地做缓存,以便在频繁执行时减少资源消耗。

[root@ubuntu ~]# cat facts-v1.yaml

5.9.3  playbook 文件中定义变量

 playbook 文件中定义的变量,只能在当前 playbook 中使用,属于私有变量

5.9.4 在单独文件中定义变量

在单独的变量文件中定义变量,再在 playbook 中引用该文件,在单独文件中定义的变量优先级比在playbook 中定义的变量优先级高

5.9.5 在主机清单中定义变量

[root@ubuntu ~]# vim /etc/ansible/hosts

[all:vars]

var1=all-var1

var2=all-var1

var3=all-var1

[group1]

10.0.0.166

10.0.0.157

[group1:vars]

ansible_python_interpreter=/usr/bin/python3

ansible_ssh_password='123456'

var2=group1-var2

var3=group1-var3

#在使用了分组的情况下,这两条单独写无法获取

10.0.0.157 ansible_python_interpreter=/usr/bin/python3

ansible_ssh_password='123456' var1=single-var1 var2=signle-var2 var3=signle-

var3

10.0.0.184 ansible_python_interpreter=/usr/bin/python3

ansible_ssh_password='123456' var1=single-var1 var2=signle-var2 var3=signle-

var3

[root@ubuntu ~]# cat var5.yaml

--- #var5

- hosts: all

  gather_facts: no

  tasks:

   - name: show-vars

      debug: msg={{ var1 }}---{{ var2 }}---{{ var3 }}

[root@ubuntu ~]# ansible-playbook var5.yaml --list-hosts

playbook: var5.yaml

5.9.6 在项目目录中定义变量

在不同的项目中添加 host_varsgroup_vars 目录,在 host_vars 目录下添加主机名或 ip 命名的文

件,将该主机的变量写在此文件中,在 group_vars 目录中添加以分组命名的文件,将该组的变写在此文件中。

5.9.7 register 注册变量

 playbook 中可以使用 register 将捕获命令的输出保存在临时变量中,方便后续调用此变量。

6 Ansible 中的 Templates

模板 templates:简历模板,ppt模板

Ansible 中的模板

狭义来讲,就是一个特定后缀的文本文件,在使用时,可以根据此文件,将部份关健内容进行替换,生成新的文件,以达到在不同主机中,使用不同配置的作用,其中的逻辑部份或动态代码,用 jinja2 来实现。

广义来讲,要模板文件,变量,变量文件,参数,条件判断,流程控制,playbook 中的 template 模块调用时相互配合,来实现预期的效果。

6.1 Jinjia2 语言

Jinja2  Python下一个被广泛应用的模版引擎,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能。

Jinjia2 的特点

沙箱中执行

强大的 HTML 自动转义系统保护系统免受 XSS

模板继承

及时编译最优的 python 代码

可选提前编译模板的时间

易于调试。异常的行数直接指向模板中的对应行。

可配置的语法

jinjia2 中的数据类型

6.2 Template 的使用规范

template 文件建议存放在和 playbook 文件同级目录的 templates 目录下,且以 .j2 结尾,这样在

playbook 中使用模板文件时,就不需要指定模板文件的路径。

6.3 Template 的基本替换

6.3 Template  for 循环和 if 判断

7 Ansible 中的流程控制

 ansible  task 中,如果要重复执行相同的模块,则可以使用循环的方式来实现

7.1 loop (with_items) 迭代

对于迭代项的引用,要使用内置变量 item 来引用,这是固定写法。

迭代元素使用 with_items 来锚定列表,列表中可以是单项元素,也可以是字典。

 ansible2.5 以后的版本中,使用 loop 来代替 with_items

7.2 until 循环

使用 until 也可以控制一个 task 重复执行,until 后面的值或表达式为 true 的时候,才退出重试,即在task 没有获得预期值的情况下,会一直重复执行,直到得到预期结果。

until 默认重试三次,每次重试之间间隔 5S,可自定义修改。

7.3 with_lines 逐行处理

with_lines 可以将一条命令的执行结果逐行调用同一个 task 进行处理

7.4 条件判断 when

when 语句可以实现选择执行,即根据条件判断的结果决定是否执行 task,条件判断的数据来源可以是变量,前面的 task 的执行结果等

范例:判断变量是否被定义

7.5 block 分组

使用 block 可以对 task 任务进行分组,将多个 task 任务放到一个 block 下,可以在写一个 when 判断的情况下调用多个 task 任务​​​​​​​

7.6 changed_when

只有在 task 的执行结果返回状态为 changed 的时候,我们才认为该 task 是真实执行了,在远程主机上产生了数据变化,但是在 ansible 中,不是所有模块都具有幂等性,对于某些不会产生数据变化的 task,ansible 也会给出 changed 输出,我们可以使用 changed_when 来避免这一情况。

#对于此 playbooktask-1 不会在远程主机上产生任何变化,task-2 总会产生变化,但每次执行,都会产生 changed 的提示

[root@ubuntu ~]# cat changed_when-1.yaml

7.7 滚动执行

默认情况下, ansible 从上到下执行,如果一个 playbook 中有多个 task,在有多台远程主机的情况下,需要在所有远程主机上执行完当前的 task 之后才执行下一个 task,如果主机过多,或者需要执行的task 比较消耗时间,则会导致所有主机都处于一个执行中状态。

滚动执行,深度优先

7.8 委派执行

利用委派执行可以在非指定的主机上执行 task

7.9 run_once 只执行一次

利用 run_once 指令可以让 task 只执行一次,而非在所有被控主机都执行。

7.10 修改环境变量

使用 environment 选项可以修改目标主机的环境变量,environment 配置的环境变量只在当前的 task中有效

7.11 Yaml 文件互相调用

include_tasks 包含

利用 include  include_tasks 可以在某个 task 中调用其它的只有 task 内容的 yaml 文件,include 在2.16 版本之后被弃用,建议使用 include_tasks 来实现包含。include_tasks 一次只能引用一个 yaml 文件

8 Ansible 中的 Role

role(角色) 用来实现代码的组织管理功能,将实现各种不同功能的 playook 文件,变量文件,模板文件,handlers 文件根据约定,分别放置在不同的目录,分门别类的管理起来,使其看起来更像一个项目,其主要用来解决多文件之间的相互包含,引用,组合等问题,将各个功能模块进行拆分,使其原子化,要实现一个大型复杂需求时,再用 include 指令来引用不同的功能。

角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中,复杂的场景中,建议使用 roles,代码复用度高。​​​​​​​

8.1 Role 工作原理和组成

在使用 ansible 实现复杂配置时,难免需要配置不同的主机分组,配置各种变量和和模板,使用各种功能模块等。那我们就可以将这种大型的复杂度高的任务进行分解,拆分成角色(role),来实现。

例如:需要在 A 主机上配置 LNMP 环境,在 B 主机上配置 LAMP 环境,在 C 主机上配置 MySQL,在 D主机上 Redis,则我们可以将各种不同的服务定义成 Role,然后根据需求搭配不同的 Role 来实现不同的需求,达到代码复用,灵活配置的目的。

默认roles存放路径

/root/.ansible/roles

/usr/share/ansible/roles

/etc/ansible/roles

role 的组成

role 的目录结构

tasks 任务文件目录,至少有一个名为 main.yaml 文件,该文件通过 include 来引用目录下的其它

文件files  role 使用过程中要用到的文件,比如安装包,比如 copy 要用到的文件

vars 变量文件目录,至少有一个名为 main.yaml 的文件,该文件通过 include 来引用目录下的其

它文件templates 模板文件目录,如果没有特别指定,则在该role 中其它文件要引用模板文件都默认存放在此目录

handlers 触发器目录,至少要有一个名为main.yaml的文件,该文件通过include 来引用目录下

的其它文件default 在该 role 中会用到的默认变量,此处的变量优先级比 vars 中的变量优先级更高

meta 额外信息需要用到的一些数据,至少有一个名为 main.yaml 的文件,该文件通过 include 

引用目录下的其它文件

8.2  playbook 中调用 role

直接调用

8.3  role 实现 LNMP

#创建目录

[root@ubuntu ~]# mkdir -pv

roles/{mysql,nginx,php,service,wordpress}/{tasks,files,templates}

[root@ubuntu ~]# tree roles/

8.2.1 nginx role 实现

[root@ubuntu ~]# tree roles/nginx/

roles/nginx/

8.2.2 php role 实现​​​​​​​

[root@ubuntu ~]# tree roles/php/

roles/php/

8.2.3 wordpress role 实现

8.2.4 service role 实现

8.2.5 mysql role 实现

8.2.6 playbook 中配置 role

#测试

[root@ubuntu ~]# cd lnmp_wp/

[root@ubuntu lnmp_wp]# ansible-playbook mysql.yaml

[root@ubuntu lnmp_wp]# ansible-playbook lnmp_wp.yaml

8.4 ansible-galaxy

ansible-galaxy 用来管理官方在云端提供的 role

​​​​​​​

9 Ansible Tower 介绍

Ansible Tower 是一个图形化基于 WEB 的任​​​​​​​务调度,复杂服务部署,IT自动化的一个管理平台,属于发布配置管理系统,支持 Api 及界面操作,基于 Django 编写。Tower 允许对用户进行权限控制,即使某用户不能传送某 SSH 凭证,你也可以通过 Tower 来对该用户共享该凭证。我们可以通过图形化界面来管理 Inventory,也可以对各种各样的云资源做同步。Tower可以记录所有 job 的日志,也可以与LDAP集成,并且拥有强大的可浏览的 REST APITower 也提供了命令行工具,可以与 Jenkins 轻松集成。

但是 ansible tower 是商业产品,仅适用于 redhat 企业版 Linux 中。

公有云中有也有以 Web 界面提供的批量管理主机的功能。

以阿里云为例,在 ECS 实例列表菜单页面,可以点击 批量管理 导航进入该功能。

第24天-MySQL性能优化和日志管理


 

第25天-MySOL备份还原和主从复制集群


 

第26天-MySQL读写分离和高可用集群


 

第27天-MySQL高可用和OpenVPN服务

内容概述

VPN 基础知识

OpenVPN 部署

OpenVPN 管理

1 VPN 基础知识

1.1 VPN 介绍

VPN: (Virtual Private Network) 虚拟专用网络

VPN 是虚拟专用网络,是专用网络的一种延伸,属于远程访问技术的一种。

VPN 可以在公用网络的基础上建立专用网络,但其并不是物理意义上的专线,而是在公共的互联网的基础上虚拟出一个专用网络,所以被称为虚拟专用网络。

VPN 技术在现在的网络环境中有着广泛的使用。VPN网关通过对数据包的加密和数据包目标地址的转换实现远程访问。VPN可通过服务器、硬件、软件等多种方式实现。

例如在企业中,员工出差到外地,所使用的终端不处于企业内网中,又需要访问企业内网,就可以使用VPN 技术来实现。

网络上所谓的 "翻墙软件",其实也是使用 VPN 相关的技术,绕过相关的IP限制,内容过滤,域名劫持等,实现对网络内容的访问。

VPN 是一种网络通信技术,并不同等于翻墙软件。​​​​​​​

1.2 VPN 常见应用模式

1.2.1点对站点 peer to site

1.2.2 站点对站点 site to site]

2 OpenVPN 实现

2.1 OpenVPN 介绍

OpenVPN  Linux下开源的 VPN 应用,它提供了良好的性能和友好的用户 GUI

OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。OpenVPN 提供了多种身份验证方式,用以确认参与连接双方的身份,包括:共享私钥,第三方证书以及用户名/密码组合。共享密钥最为简单,但同时它只能用于建立点对点的 VPN;基于 PKI 的第三方证书提供了最完善的功能,但是需要额外的精力去维护一个 PKI 证书体系。 OpenVPN2.0 后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍有一份服务器证书需要被用作加密。

2.2 部署环境说明

架构图

配置说明:

在阿里云上购买三台主机,设置为同一个内网网段,模拟公司内网,其中一台添加一个公网IP,在该机器上部署 OpenVPN 服务,以便让不在公司内网的远程主机可以连进公司内网的目的。

2.3 部署流程

1. 准备阿里云主机,其中一台配置公网IP

2. 在阿里云安全组中放行 1194 端口

3. 在有公网IP的阿里云主机上部署 OpenVPN Server

4.  xxx 内网主机上部署 OpenVPN Client

5. 测试OpenVPN 网络

2.4 配置 OpenVPN 证书

2.4.1 安装相关软件

#安装openvpn,安装证书管理工具

[root@vpn-server ~]# apt update;apt install openvpn easy-rsa

[root@vpn-server ~]# dpkg -l openvpn

[root@vpn-server ~]# dpkg -l easy-rsa

[root@vpn-server ~]# tree /etc/openvpn/

2.4.2 配置CA证书

准备证书环境

#准备证书环境,让证书和 openvpn 配置处于一个目录,方便迁移

[root@vpn-server ~]# cp -r /usr/share/easy-rsa/ /etc/openvpn/

[root@vpn-server ~]# tree /etc/openvpn/

vars 文件中相关配置说明

[root@openvpn-server ~]# cat /etc/openvpn/easy-rsa/vars

脚本工具使用说明

[root@vpn-server ~]# cd /etc/openvpn/easy-rsa/

[root@vpn-server easy-rsa]# mv vars.example vars

#vars 文件中相关配置说明

[root@vpn-server easy-rsa]# cat vars

[root@vpn-server easy-rsa]# ./easyrsa

初始化证书目录

[root@vpn-server easy-rsa]# ./easyrsa init-pki

生成CA机构证书

#生成CA机构证书,不使用密码

[root@vpn-server easy-rsa]# ./easyrsa build-ca nopass

2.4.3 配置OpenVPN服务器证书

生成证书申请文件

# server 表示文件前缀

[root@vpn-server easy-rsa]# ./easyrsa gen-req server nopass

审核申请文件,颁发机构证书

#查看命令帮助

[root@vpn-server easy-rsa]# ./easyrsa help sign

#颁发机构证书,第一个 server 指证书类型,第二个server 指申请文件

[root@vpn-server easy-rsa]# ./easyrsa sign-req server server

查看证书内容

# openssl 命令查看

[root@vpn-server easy-rsa]# openssl x509 -in pki/issued/server.crt -noout -text

创建 Diffie-Hellman 密钥

Diffie-Hellman 密钥交换方法是迪菲(Whitefield Diffie)和赫尔曼(Martin Hellman)在1976年公布的一种秘钥交换算法,它是一种建立秘钥的方法,而不是加密方法,所以秘钥必须和其他一种加密算法结合使用。这种密钥交换技术的目的在于使两个用户安全地交换一个密钥,用此密钥做为对称密钥来加密后续的报文传输。

#创建参数文件

[root@vpn-server easy-rsa]# ./easyrsa gen-dh

 openssl 命令也可以创建

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

2.4.4 配置OpenVPN客户端证书

客户端证书交由具体使用者作为登录 VPN 服务器的凭证,有效期不能太长

#修改配置文件,将证书有效时长改为180

[root@vpn-server easy-rsa]# vim vars

#set_var EASYRSA_CERT_EXPIRE

set_var EASYRSA_CERT_EXPIRE

825

180

#生成客户证书申请文件

[root@vpn-server easy-rsa]# ./easyrsa gen-req tom nopass

#签发客户端证书

[root@vpn-server easy-rsa]# ./easyrsa sign-req client tom

#openssl 命令查看

[root@vpn-server easy-rsa]# openssl x509 -in pki/issued/tom.crt -noout -text

重复上述步骤,为用户 jerry 创建证书

[root@vpn-server easy-rsa]# ./easyrsa gen-req jerry nopass

[root@vpn-server easy-rsa]# ./easyrsa sign-req client jerry

2.4.5 整理目录

 openVPN 服务端相关证书文件复制到 server 目录中

[root@vpn-server ~]# ls -lh /etc/openvpn/server/

total 0

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/issued/server.crt

/etc/openvpn/server/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/private/server.key

/etc/openvpn/server/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/

[root@vpn-server ~]# ls -lh /etc/openvpn/server/

total 20K

-rw------- 1 root root 1.2K Jun 26 16:28 ca.crt

-rw------- 1 root root 424 Jun 26 16:29 dh.pem

-rw------- 1 root root 4.6K Jun 26 16:29 server.crt

-rw------- 1 root root 1.7K Jun 26 16:29 server.key

为客户端用户创建目录,并将相关文件放到指定目录

[root@vpn-server ~]# ls -lh /etc/openvpn/client/

total 0

[root@vpn-server ~]# mkdir /etc/openvpn/client/{tom,jerry}

[root@vpn-server ~]# ls -lh /etc/openvpn/client/

total 8.0K

drwxr-xr-x 2 root root 4.0K Jun 26 16:30 jerry

drwxr-xr-x 2 root root 4.0K Jun 26 16:30 tom

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/ca.crt

/etc/openvpn/client/tom/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/private/tom.key

/etc/openvpn/client/tom/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/issued/tom.crt

/etc/openvpn/client/tom/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/ca.crt

/etc/openvpn/client/jerry/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/private/jerry.key

/etc/openvpn/client/jerry/

[root@vpn-server ~]# cp /etc/openvpn/easy-rsa/pki/issued/jerry.crt

/etc/openvpn/client/jerry/

[root@vpn-server ~]# tree /etc/openvpn/client/

2.5 OpenVPN 服务端配置

2.5.1 服务端配置文件说明

配置文件默认不存在,需要手动创建

[root@vpn-server ~]# cp /usr/share/doc/openvpn/examples/sample-config-

files/server.conf /etc/openvpn/

#配置文件中以 #开头或 ; 开头的都是注释

[root@vpn-server ~]# cd /etc/openvpn/

[root@vpn-server openvpn]# cat server.conf

2.5.2 设置服务端配置文件

[root@vpn-server openvpn]# mv server.conf server.conf.bak

#新建配置文件

[root@vpn-server openvpn]# vim server.conf

2.5.3 查看日志目录

[root@vpn-server ~]# ll /var/log/openvpn/ -d

drwxr-xr-x 2 root root 4096 Jul 14 2022 /var/log/openvpn//

[root@vpn-server ~]# tree /var/log/openvpn/

2.5.4 设置 service 服务脚本文件

此处仅限于 centos8 系列,因为 CentOS8  openvpn 服务脚本不可用

2.5.5 启动服务并查看状态

2.6 OpenVPN 客户端配置

2.6.1 客户端配置文件说明

[root@vpn-server ~]# cat /usr/share/doc/openvpn/examples/sample-config-

files/client.conf | grep -Ev "^#|^$"

2.6.2 为不同用户设置配置文件

[root@openvpn-server openvpn]# vim client/tom/client.ovpn

[root@openvpn-server openvpn]# vim client/jerry/client.ovpn

remote 项对应的服务端IP可以写成域名,将域名解析到对应的IP即可,这样即使以后服务端IP发生了变化,也只需要修改域名解析,而不用修改此处的配置文件。

2.7 部署 OpenVPN 客户端

2.7.1 部署 Windows 客户端

下载

https://openvpn/community-downloads/

下载后在Windows 中完成安装

将客户端配置下载到 windows 中,将相关文件放到 C:\Program Files\OpenVPN\config 目录下

[root@vpn-server openvpn]# cd client/

[root@vpn-server openvpn]# ls

jerry tom

[root@vpn-server openvpn]# tar zcvf tom.tar.gz tom/

tom/

tom/tom.key

tom/tom.crt

tom/ca.crt

tom/client.ovpn

[root@vpn-server openvpn]# ls

jerry tom tom.tar.gz

[root@vpn-server openvpn]# sz tom.tar.gz

查看 windows 目录

查看此时windows主机上的IP

C:\Program Files\OpenVPN\config>ipconfig

Windows 桌面上找到 OpenVPN 图标,以管理员身份运行连接成功后,在Windows 主机的右下角会出现绿色图标。

再次查看windows主机上的IP

C:\Program Files\OpenVPN\config>ipconfig

可以看到,此时windows主机多出来了一个 10.8.0.6 IP地址,而且生成了一条指向指向

172.30.0.0/255.255.255.0的路由记录。

PS C:\WINDOWS\system32> route print -4 |findstr 172.30

该路由记录是从OpenVPN服务端推送过来的。

[root@vpn-server ~]# cat /etc/openvpn/server.conf | grep route

push "route 172.30.0.0 255.255.255.0"

也可以在客户端日志中查到该信息

查看服务端连接状态

[root@vpn-server ~]# ss -tnp | grep openvpn

查看服务端日志

[root@vpn-server ~]# tail /var/log/openvpn/openvpn.log

客户端测试,此时无法ping  OpenVPN 服务器后端内网主机,但可以 ping  OpenVPN 服务器。

#OpenVPN服务器上的内网IP

PS C:\WINDOWS\system32> ping 172.30.0.66

#在服务端抓包,数据都是走 tun0 网卡

[root@vpn-server ~]# tcpdump -i tun0 -nn icmp

#OpenVPN服务器上的虚拟IP

PS C:\WINDOWS\system32> ping 10.8.0.1

#在服务端抓包,数据都是走 tun0 网卡

[root@vpn-server ~]# tcpdump -i tun0 -nn icmp

2.7.2 配置后端主机转发

当前客户端主机还是无法连通后端内网主机

PS C:\WINDOWS\system32> ping 172.30.0.100 -t

 OpenVPN server 主机上可以看到数据

[root@vpn-server ~]# tcpdump -i tun0 -nn icmp

但在后端主机上看不到数据

[root@node-1 ~]# tcpdump -i eth0 -nn icmp

OpenVPN 服务端开启 ip_forward 转发

[root@vpn-server ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf

[root@vpn-server ~]# sysctl -p

[root@vpn-server ~]# sysctl -p | grep ip_forward

net.ipv4.ip_forward = 1

OpenVPN server 主机上设置 SNAT 转发,将从 10.8.0.0/24 网段主机请求的源IP转换成本机

IP(172.30.0.66)

[root@vpn-server ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d

10.8.0.0/24 -j MASQUERADE

[root@vpn-server ~]# iptables -t nat -vnL POSTROUTING

 OpenVPN server 主机的 iptables 规则设置为开机加载,保证重启后有效

[root@vpn-server ~]# echo 'iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d

10.8.0.0/24 -j MASQUERADE' >> /etc/rc.d/rc.local

[root@vpn-server ~]# chmod a+x /etc/rc.d/rc.local

[root@vpn-server ~]# ll /etc/rc.d/rc.local

-rwxr-xr-x. 1 root root 550 Feb 25 21:17 /etc/rc.d/rc.local

除了在 OpenVPN server 主机主机上配置 SNAT 规则之外,也可以修改后端主机的网关,将

10.8.0.0/24 网段的网关指向 172.30.66

此方法理论可行,但在此处不行,因为我们设置的是点对点网络,后端主机并不是处于 OpenVPN 的客户端角色,所以在配置了网关的基础上,也无法使用 OpenVPN 的相关功能。

#将后端172.30.0.200主机的网关指向 172.30.0.66

[root@node-2 ~]# route -n

2.8 OpenVPN 管理

OpenVPN 的管理功能主要关于安全加强及客户端的证书管理,用户密码验证等

2.8.1 启用安全增强功能

服务端配置

[root@vpn-server ~]# openvpn --genkey --secret /etc/openvpn/server/ta.key

[root@vpn-server ~]# ll /etc/openvpn/server/ta.key

-rw------- 1 root root 636 Jun 28 14:32 /etc/openvpn/server/ta.key

#修改服务端配置文件

[root@vpn-server ~]# vim /etc/openvpn/server.conf

tls-auth /etc/openvpn/server/ta.key 0 #增加此行,服务端后面要跟数字0,客户端后面数字是

1

#重启服务端,客户端会断开连接,小图标会变成黄色

[root@vpn-server ~]# systemctl restart openvpn.service​​​​​​​

客户端配置

#key文件下载到本地,到到 C:\Program Files\OpenVPN\config 目录下

[root@vpn-server ~]# sz /etc/openvpn/server/ta.key

#修改客户端配置文件 C:\Program Files\OpenVPN\config\client.ovpn

#新增此行

tls-auth ta.key 1

#客户端重新连接即可

2.8.2 设置客户端私钥密码

新建一个用户 spike,并设置证书密码,以提高安全性

[root@vpn-server ~]# cd /etc/openvpn/easy-rsa/

#创建私钥,并生成证书申请文件

[root@vpn-server easy-rsa]# ./easyrsa gen-req spike

#签发证书

[root@vpn-server easy-rsa]# ./easyrsa sign client spike

#配置客户端

[root@vpn-server easy-rsa]# cd /etc/openvpn/client/

[root@vpn-server client]# mkdir spike

[root@vpn-server client]# cp /etc/openvpn/easy-rsa/pki/private/spike.key

./spike/ #用户私钥

[root@vpn-server client]# cp /etc/openvpn/easy-rsa/pki/issued/spike.crt ./spike/

#用户证书

[root@vpn-server client]# cp /etc/openvpn/server/ca.crt ./spike/

#CA证书

[root@vpn-server client]# cp /etc/openvpn/server/ta.key ./spike/

#ta

#生成客户端配置文件

[root@vpn-server client]# vim spike/client.ovpn

#打包,并下载到 windows 主机

[root@vpn-server client]# tar zcvf spike.tar.gz spike/

将客户端配置下载到 windows 主机中,放到 OpenVPN config 目录中,再次使用客户端连接,要求输入密码

2.8.3 账户证书管理

对于客户端使用者的变更,以及时间的推移,都会涉及到证书的创建和吊销。

证书自动过期

每一份己签发的证书都有时期,超过时间节点后会自动过期

#证书时效配置

[root@openvpn-server ~]# grep EASYRSA_CERT_EXPIRE /etc/openvpn/easy-rsa/vars

set_var EASYRSA_CERT_EXPIRE 180

#在服务端证书索引文件中查看每个证书的过期时间,该时间是UTC时间

2.8.4 实现客户端用户名密码验证

在证书的基础上可以再新增用户名密码校验,以提高安全性

修改服务端配置

#添加三行

[root@openvpn-server ~]# vim /etc/openvpn/server.conf

2.9 部署 Linux 客户端

 

 

2.10 部署 Mac OS 客户端

由于官方并没有提供基于Mac OSOpenVPN的客户端软件,可以使用第三方 OpenVPN 客户端

链接地址

https://tunnelblick/downloads.html

#需要科学上网

第28天-日志服务管理

内容概述

日志介绍

日志服务管理

日志管理工具 journalctl

基于 MySQL 的日志

Logrotate 日志转储

1 系统日志管理

1.1 常用日志服务介绍

在现实生活中,记录日志非常重要﹐比如:银行转账时会有转账记录﹔飞机飞行过程中的黑盒子(飞行数据记录器)记录着飞机的飞行过程. 那么将系统和应用发生的事件记录至日志中,也很意义,常可以助于排错和分析使用。

日志记录的内容包括:

历史事件:时间,地点,人物,事件

日志级别:事件的关键性程度,Loglevel

1.1.1 sysklogd 系统日志服务

 CentOS5 以及之前的发行版中,其采用的 sysklogd 服务来记录和管理系统日志的。

sysklogd 服务有两个模块:

klogd 用于记录 linux kernel 相关的日志

syslogd:用于记录用户空间应用日志

1.1.2 rsyslog 系统日志服务

RSYSLOG is the rocket-fast system for log processing.

rsyslog  CentOS6 以后的版本中使用的日志管理程序,是一个默认安装的服务,并且默认开机启动。

rsyslog 特性

支持输出日志到各种数据库,如 MySQLPostgreSQLMongoDB ElasticSearch,实现使用第三方服务对日志进行存储和分析;

精细的输出格式控制以及对日志内容的强大过滤能力,可实现过滤记录日志信息中的指定部份;

通过 RELP + TCP 实现数据的可靠传输

支持数据的加密和压缩传输等

多线程

1.1.3 ELK 日志服务

ELK 是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。在后续发展的过程中增加了一个 FileBeat,这几款软件通常在一起配合使用,各司其职。ELK 主要用于部署在企业架构中,收集多台设备上多个服务的日志信息,并将其统一整合后提供给用户。

rsyslog 日志服务与 ELK 日志服务的区别:

rsyslog 主要用于单机日志管理,ELK 主要用于分布式集群环境中的日志管理。

1.2 rsyslog 日志管理

1.2.1 系统日志相关概念

facility: 设施,从功能或程序上对日志进行归类

在一台主机上会同时运行多个服务和软件,每个服务或软件都有可能会产生大量的日志,如果每个服务或软件产生的日志都独立存放管理,那文件数量就太多了,如果都放到一个文件中,似乎也不是很合适,所以 syslog 将日志进行了分类,相同类型的日志放一个文件,这样便于管理。

rule 配置规则

每一行 rule 由两列组成,分别是选择器和处理动作,选择器将过滤后的日志交由处理动作处理;

选择器可以同时有多个,用分号分隔,处理动作也可以同时有多个,用 & 分隔,处理动作中可以指定模板,不同的模板会生成不同的日志内容,模板可以自定义。

选择器有以下几种定义方式:

用分类和优先级来过滤,同一条 rule 中,分类和优先级都可以有多个,用逗号分隔

基于日志内容中的指定字段来过滤

基于表达式构建脚本来过滤

处理动作有以下几种:

输出到日志文件或某个特定设备

保存到数据库

发送给指定用户,该用户必须己登录,可以同时指定多个用户,用逗号分隔

传送到远程主机

通过管道传送给其它命令

丢弃日志,不处理

selector action

1.2.4 rsyslog 日志内容和模板

日志内容由 template 决定,如果没有显式指定,默认使用 RSYSLOG_TraditionalFileFormat

除了使用内置模板外,我们还可以自定义模板。

自定义模板可以直接写在配置文件中

生成的日志内容模板决定,而模板是由 rsyslog 中的相关属性组成,这些属性在生成日志内容时会被替换成具体内容。所谓属性是指rsyslog 中的一些特殊关键字,在模板语法中,使用 %属性名% 来表示一个字段。

1.2.5 常见日志及相关工具

Rocky 中常见日志说明

[root@rocky ~]# cat /etc/rsyslog.conf | grep -Ev "^#|^$"​​​​​​​

dmesg 命令

dmesg 命令用来查看主机硬件相关日志

logger 命令

logger 命令可以手动生成相关日志

1.2.6 在本机自定义服务日志

#sshd服务日志默认是归属于 AUTH 分类,默认级别是 INFO

[root@ubuntu ~]# cat /etc/ssh/sshd_config | grep -i log

# Logging

#SyslogFacility AUTH

#LogLevel INFO

#根据配置,此日志记录在 /var/log/auth.log 

[root@ubuntu ~]# cat /etc/rsyslog.d/50-default.conf | grep "^auth"

1.2.7 使用日志网络转发

可以使用 rsyslog 服务中的远程转发功能,通过 TCP  UDP 协议将当前主机的日志转发到远程日志服务器上,进行集中存储,方便统一管理。​​​​​​​

1.2.8 使用MySQL 数据库转储日志

在上一节网络转发的基础上,将日志转储到 MySQL 数据库中

1.3 服务日志管理工具 journalctl

 systemd  1号进程的系统版本中,systemd 提供了一个集中的方式来处理所有来自进程,应用程序等的操作系统日志,所有这些日志事件都由 systemd  journald 守护进程来处理。journald 守护进程收集所有来自 Linux 操作系统的各种日志,并将其作为二进制数据存储在文件中。

以二进制数据集中记录事件、系统问题的好处有很多。例如,由于系统日志是以二进制而不是文本形式存储的,你可以以文本、JSON 对象等多种方式进行转译,以满足各种需求。另外,由于日志是按顺序存储的,通过对日志的日期/时间操作,超级容易追踪到单个事件。

1.4 Logrotate 日志转储

1.4.1 Logrotate 介绍

 Linux 系统中,能够帮助使用者定位问题的有效手段之一就是查日志。

如果一个服务或一个程序的日志,一直只写一个文件,则会导致该日志文件越来越大,无论是查看还是搜索内容,备份等,都会特别不方便,而且如果服务器数量较多,日志文件大小增长较快,也会很容易触发告警。

为了解决这种情况,我们可以使用日志转储服务,对服务日志进行分割,按照一定的规则将日志保存在不同的文件中,这样更便于管理和归档。

当前服务器上的日志转储

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行

工作原理:系统计划任务每天执行一次脚本文件,在脚本中再执行 /usr/sbin/logrotate

/etc/logrotate.conf ,即调用 logrotate 程序再配合定义好的转储规则对日志文件进行转储。

1.4.2 Logrotate 配置

在配置文件中定义转储规则,配置文件中的主要配置项

#查看帮助

[root@log-server ~]# man logrotate.conf

常用配置项

1.4.3 Logrotate 自定义规则实现

第28天-网络文件共享和实时同步

内容概述

存储类型

NFS服务

网络数据同步

1 存储介绍

IT 基础设施有三个主要组成,分别是 计算,存储,网络

1.1 常见存储类型

直连式存储:Direct-Attached Storage (DAS)

可以理解为本地文件系统。这种设备直接连接到计算机主板总线上,通常是SCSI  FC 连接,计算机将其识别为一个块设备,例如常见的硬盘,U盘等,也可以连到一个磁盘阵列柜,里面有很多块磁盘。

DAS 只能连接一台服务器,其它服务器无法共享该存储。

存储区域网络:Storage Area Network (SAN)

存储区域网络,这个是通过光纤通道或以太网交换机连接存储阵列和服务器主机,最后成为一个专用的存储网络。SAN经过十多年历史的发展,已经相当成熟,成为业界的事实标准(但各个厂商的光纤交换技术不完全相同,其服务器和SAN存储有兼容性的要求)。SAN提供了一种与现有LAN连接的简易方法,并且通过同一物理通道支持广泛使用的SCSIIP协议。SAN不受现今主流的、基于SCSI存储结构的布局限制。特别重要的是,随着存储容量的爆炸性增长,SAN允许企业独立地增加它们的存储容量。

SAN的结构允许任何服务器连接到任何存储阵列,这样不管数据置放在那里,服务器都可直接存取所需的数据。因为采用了光纤接口,SAN还具有更高的带宽。如今的SAN解决方案通常会采取以下两种形式:光纤信道以及iSCSI或者基于IPSAN,也就是FC SANIP SAN。光纤信道是SAN解决方案中大家最熟悉的类型,但是,最近一段时间以来,基于iSCSISAN解决方案开始大量出现在市场上,与光纤通道技术相比较而言,这种技术具有良好的性能,而且价格低廉。一般通过在主机上安装HBA(Host Bus Adapter 主机总线适配器),再通过光纤连接到光纤交换机,再连接至SAN存储上。

网络附加存储:Network-Attached Storage (NAS)

NAS存储也通常被称为附加存储,顾名思义,就是存储设备通过标准的网络拓扑结构(例如以太网)添加到一群计算机上。与DAS以及SAN不同,NAS是文件级的存储方法。采用NAS较多的功能是用来进行文件共享。而且随着云计算的发展,一些NAS厂商也推出了云存储功能,大大方便了企业和个人用户的使用。NAS产品是真正即插即用的产品。

NAS设备一般支持多计算机平台,用户通过网络支持协议可进入相同的文档,因而NAS设备无需改造即可用于混合Unix/Windows NT局域网内,同时NAS的应用非常灵活。

三种存储类型比较

传输类型

DAS: SCSIFC

NAS: IP

SAN: IPFCSAS

数据类型

DAS: 数据块

NAS: 文件

SAN: 数据块

典型应用

DAS: 任何

NAS: 文件服务器

SAN: 数据库服务器

优点

DAS: 磁盘与服务器分离,便于管理

NAS: 不占用服务器资源,广泛支持操作系统,扩展较容易,即插即用,安装简单方便

SAN: 高扩展性,高可用性,数据集中,易管理

缺点

DAS: 连接距离短,数据分散,共享困难,存储利用率不高,扩展性有限

NAS: 不适合存储量大的块级应用数据,备份及恢复占用网络带宽

SAN: 相比NAS成本较高,安装和升级比NAS复杂

应用场景

DAS: 适用于那些数据量不大,对磁盘访问速度要求较高的中小企业

NAS: 多适用于文件服务器,用来存储非结构化数据,虽然受限于以太网的速度,但是部署灵活,成本低

SAN: 适用于大型应用或数据库系统,缺点是成本高、较为复杂

1.2 常见存储方式

块存储

块存储(Block Storage Service)设备不能被操作系统直接访问,需要创建分区或逻辑卷,再创建文件系统 (EXT3, EXT4, NTFS ),然后再经过挂载,才能使用。对于主机而言,其并不能识别出存储设备是真正的物理设备还是二次划分的逻辑设备(RAID等),块存储不仅仅是直接使用物理设备,间接使用物理设备的也叫块设备。比如虚拟机上创建的虚拟磁盘。

块存储大多数时候是本地存储,读写速度很快,但不利于扩展,数据不能被共享。

文件存储

文件存储(File Storage Service)可以分为本地文件存储和网络文件存储。文件存储最明显的特征是支持POSIX的文件访问接口,例如 openreadwriteseekclose  (这几个是常用的文件操作API接口 ),与块存储不同,主机不需要再对文件存储进行格式化和创建文件系统,文件管理功能已由文件存储自行管理。

文件存储的特点是便于扩展和共享,但读写速度较慢。

对象存储

对象存储(Object Storage Service)也叫基于对象的存储,是一种解决和处理离散单元的方法,可提供基于分布式系统之上的对象形式的数据存储服务。对象存储和我们经常接触到的块和文件系统等存储形态不同,它提供 RESTful API数据读写接口及丰富的 SDK 接口,并且常以网络服务的形式提供数据的访问。

对象存储不支持随机读写,只能进行全读和全写操作(无法直接在存储上进行数据更改,只能以文件为单位进行获取和删除),如果要修改数据,需要先在本地编辑完成后整文件上传。

1.3 分布式存储

在海量数据和文件的场景下,单一服务器所能连接的物理介质有限,能提供的存储空间和IO性能也是有限的,所以可以通过多台服务器协同工作,每台服务器连接若干物理介质,再配合分布式存储系统和虚拟化技术,将底层多个物理硬件设备组合成一个统一的存储服务。一个分布式存储系统,可以同时提供块存储,文件存储和对象存储这三种存储方式。​​​​​​​

2 NFS 服务

2.1 NFS 工作原理

网络文件系统:Network File System (NFS) 是由 SUN 公司研制的 UNIX 表示层协议,配合客户端和服务端软件,可以在本地挂载远程的存储空间,让本地用户和程序直接访问本地目录从而实现数据和存储空间的共享。

NFS 中的远程访问是基于 RPC ( Remote Procedure Call Protocol,远程过程调用) 来实现的。

RPC采用C/S模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行

2.2 NFS 安装和配置

NFS 基于 C/S 模式实现,所以有客户端软件和服务端软件​​​​​​​

2.3 NFS常用工具

rpcinfo

rpcinfo 可以访问指定的 RPC 服务器,显示其响应信息,从而查询出在该服务器上注册的RPC服务

如果不指定主机,则默认是当前主机

exportfs

exportfs 命令用于管理本机 NFS 文件系统,默认配置文件是 /etc/exports

showmount

shoumount 可以查看远程主机的共享设置

mount.nfs

客户端 NFS 服务挂载命令,将远程NFS 服务器上共享出来的目录挂载到本机,可以直接写成 mount

2.3 NFS 共享实现

在服务端配置共享

ubuntu 客户端配置

用户映射

统一用户映射

统一客户端主机用户和权限的方法

1. 保证客户端主机使用相同的用户(相同的用户ID)对共享目录进行读写

2. NFS 服务器上统一映射

3. 使用 LDAP 服务进行集中的帐号管理

3 数据实时同步

在生产环境中,某些场景下,要将数据或文件进行实时同步,保证数据更新后其它节点能立即获得最新的数据。

数据同步的两种方式

PULL:拉,使用定时任务的方式配合同步命令或脚本等,从指定服务器上将数据同步到本地,一般是周期性定时同步

PUSH:推,如果当前机器上的数据或文件发生更新了,立即推送到指定的节点上,可以做到实时同步​​​​​​​

3.1 实时同步的实现方式

inotify + rsync

sersync

3.2 inotify + rsync 实现数据实时同步

实现原理

利用内核中的 inotify 监控指定目录,当目录中的文件或数据发生变化时,立即调用 rsync 服务将数据推送到远程主机上。

3.2.1 inotify 服务

inotify 是一个内核用于通知用户空间程序文件系统变化的机制,在监听到文件系统发生变化后,会向相应的应用程序发送事件,如文件增加,修改,删除等事件发生后可以立即让用户空间知道。

安装软件

inotify 是内核中的功能模块,只能通过调用API接口的形式使用其功能,我们可以通过相关软件来对其进行操作,能实现内核中 inotify 调用的软件主要有以下几个:

inotify-toolssersynclrsyncd

范例:只监控一个事件

范例:持续监控

范例:递归监控

范例:将结果输出到文件

范例:从文件中读取要监控的内容

范例:后台守护执行,并指定输出格式

范例:指定输出格式,且只记录特定事件

3.2.2 rsync 服务

rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合 inotify 或sersync,可以实现触发式的实时数据同步

rsync 有三种工作方式

1. 本地文件系统上实现同步。命令行语法格式为上述 "Local" 段的格式

2. 本地主机使用远程shell和远程主机通信。命令行语法格式为上述 "Access via remote shell" 段的格式,使用的用户名和密码是 Linux系统的用户名和密码

3. 本地主机通过网络套接字连接远程主机上的 rsync daemon。命令行语法格式为上述 "Access via

rsync daemon" 段的格式,使用的用户名和密码是 rsync 服务中配置的用户名和密码

前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行 rsyncd 服务,使其监听在一个端口上,等待客户端的连接,此种方式使用的 rsync 的专有协议。

实现 rsync daemon 服务

#修改密码文件权限

[root@ubuntu ~]# chmod 600 /etc/rsyncd.pwd

[root@ubuntu ~]# ll /etc/rsyncd.pwd

-rw------- 1 root root 15 Jul 13 08:58 /etc/rsyncd.pwd

3.2.3 inotify + rsync 实现数据实时同步

#客户端同步脚本
[root@ubuntu data]# cat ./www_rsync.sh
#!/bin/bash
SRC='/data/www/'
DEST='rsyncer@10.0.0.208::dir1'
dpkg -V inotify-tools &>/dev/null || apt install inotify-tools -y




 
dpkg -V rsync &>/dev/null || apt install rsync -y
#不间断监控指定目录中的特定事件,当目录中有事件发生变化时,调用 rsync 命令进行同步
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T
%w %f' -e create,delete,moved_to,close_write,attrib ${SRC} | while read DATE
TIME DIR FILE;do
              FILEPATH=${DIR}${FILE}
              rsync -az --delete --password-file=./www_rsync.pwd $SRC $DEST && echo
"At ${TIME} on ${DATE}, file ${FILEPATH} was backup via rsync" >>
./www_rsync.log
done
#查看客户端
[root@ubuntu ~]# tree /data/
/data/
├── www
├── www_rsync.pwd
└── www_rsync.sh
1 directory, 2 files
#测试,客户端运行脚本
[root@ubuntu data]# ./www_rsync.sh
#在另一个终端中创建文件
[root@ubuntu ~]# touch /data/www/f1
[root@ubuntu ~]# cp /etc/fstab /data/www/
[root@ubuntu ~]# dd if=/dev/zero of=/data/www/test.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.00923138 s, 1.1 GB/s
[root@ubuntu ~]# mkdir -pv /data/www/dira/dirb/dirc
mkdir: created directory '/data/www/dira'
mkdir: created directory '/data/www/dira/dirb'
mkdir: created directory '/data/www/dira/dirb/dirc'
#在服务湍查看
[root@ubuntu ~]# tree /data/dir1/
/data/dir1/
├── dira
│
│
└── dirb
└── dirc
├── f1
├── fstab
└── test.img
3 directories, 3 files


3.3 sersync 实现数据实时同步

sersync 类似 inotify,同样用于监控,但它克服了 inotify 的缺点,inotify 最大的不足是会产生重复事件,或者同一个目录下多个文件的操作会产生多个事件,例如,当监控目录中有5个文件时,删除目录时会产生6个监控事件,从而导致重复调用 rsync 命令。另外比如:vim 文件时,inotify 会监控到临时文件的事件,但这些事件相对于 rsync 来说是不应该被监控的。

sersync 特点

sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤,

所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。

sersync 配置很简单,其中提供了静态编译好的二进制文件和 xml 配置文件,直接使用即可

sersync 使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态

sersync 有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对

同步失败的文件重新同步sersync 不仅可以实现实时同步,另外还自带 crontab 功能,只需在 xml 配置文件中开启,即也可以 按要求隔一段时间整体同步一次,而无需再额外配置 crontab 功能

sersync 可以二次开发

发布评论

评论列表 (0)

  1. 暂无评论