linux总复习(二)

二、进阶与原理
(1)make和makefile
6.1 Linux C语言程序的编译和运行
确保已安装有gcc
-o选项用于指定编译后的文件名
如不指定则默认生成a.out
./用于指定路径
Linux C头文件
基本头文件在/usr/include,附加头文件一般在/usr/include/sys或/usr/include/linux中
使用gcc的-I选项可以引入不在默认路径中的头文件
Linux C库文件
标准库文件一般位于/lib或/usr/lib
库文件可以分为静态库(.a)和共享库(.so)
库文件的命名规范:以lib开头,后面部分指明库功能,后缀名说明库类型
make工具可以解决上述问题,会在必要时重新编译所有受影响的文件。
6.2makefile文件语法
makefile文件由一组依赖关系和规则构成;
每个依赖关系由一个目标(将要创建的文件)和一组该目标所依赖的源文件组成;
而规则描述了如果通过这些依赖关系创建目标;
make命令通过读取makefile文件的内容,先确定目标文件或要创建的文件,然后比较所依赖源文件的日期和时间决定该用哪条规则来构造目标。
(2)包管理工具
6.3软件包管理
Linux平台下的软件都是以源代码的方式进行发布的;
一般采用归档压缩文件的方式(.tar.gz),被称为软件包;
对这类软件包的安装方法为:

  1. ./configure:检查各种配置文件、参数,生成makefile;
  2. make:编译并链接成二进制文件;
  3. make install:执行并安装到系统中
    6.4两大主流的软件包管理器

RPM:RedHat Package Manager的缩写,由RedHat公司开发和维护,适用于RedHat家族的发行版,Fedora,CentOS等;
DPKG:Debian Packager的缩写,最早由Debian社区所开发,适用于Debian家族的发行版,B2D,Ubuntu等;
6.4.1`使用RPM安装软件
[root@localhost ~]# rpm -ivh 软件包名
参数:
-i:安装RPM包
-v:查看安装过程中的详细信息
-h:显示安装、升级、卸载的进度
-U:升级RPM包
-F:升级本机已安装的组件

全称为 Yellow dog Updater, Modified是一个基于RPM的前端软件包管理器,其主要特点为:
从指定服务器自动下载RPM包并且安装
自动处理包依赖关系
引入仓库和容器的概念
6.5 YUM

使用YUM主要包括使用YUM查询软件版本、信息和通过YUM进行软件的更新、维护。
YUM采用分段配置的方式,即主配置+分段配置
CentOS 7下主配置文件为/etc/yum.conf
CentOS 7下分段配置文件为/etc/yum.repos.d/*.repo

6.5.2yum的使用

使用方法一:查询
[root@localhost ~]# yum [list|info|search|provides] 参数
范例
#列出所有已安装的软件
[root@localhost ~]# yum list
#查询某类或某个软件的详细信息
[root@localhost ~]# yum info raid
使用方法二:安装、升级、卸载
[root@localhost ~]# yum [install|update|remove] 参数
范例
#安装名称为pam-devel的软件
[root@localhost ~]# yum install pam-devel
#更新Java版本
[root@localhost ~]# yum update java
(3)Linux进程基本原理
6.6fork函数`
fork函数可以启动一个新进程,其方法是复制当前进程。
fork函数在进程表中创建一个新的表项,新表项的许多属性与当前进程是相同的,执行的代码也完全相同;但新进程有自己的数据空间、环境和文件描述符。
基本语法
#include #include<
pid t fork (void)
父进程的fork调用返回的是新的子进程的pid,新子进程继续执行,就像原进程一样;
不同之处在于,子进程中fork调用返回的是0,父子进程就是通过这一点来区分彼此的;
如果fork调用失败将返回-1。
fork操作:复制父进程

6.7exec系列函数

exec系列函数由一组相关的函数组成,用于把当前进程替换为新进程,新进程由path或file参数指定。

6.8system函数system函数:fork-and-exec

(4)Linux进程同步问题
6.9fork函数使用进阶

当用fork启动一个子进程时,子进程就有了其自身的生命周期并将独立运行。
可以通过wait函数,让父进程等待子进程结束后再结束。

6.10僵尸进程
子进程终止时,其与父进程之间的关联还会保持,直到父进程也正常终止或父进程调用wait()方法才告结束。
因此,进程表中代表子进程的表项不会立即删除(虽然子进程已经不再运行),因为它的退出码还需要保存起来,以备父进程中可能的wait()方法使用。
这样的进程被称为死(defunct)进程或僵尸(zombie)进程

6.11信号机制
信号是由于某些错误条件而生成的,如内存段冲突、浮点处理器错误或非法指令等;
术语生成(raise)表示一个信号的产生,术语捕获(catch)表示接收到一个信号
接收到信号的进程会进行相信的处理,默认情况是立刻终止进程;
信号可以由shell和终端生成,来引起中断;也可以作为进程间传递消息和修改行为的一种方式(明确的由一个进程发送给另一个进程)。
信号机制
信号的名称在头文件signal.h中定义,都以SIG开头,如下表所示:

Linux中使用signal()函数来处理信号

6.12发送信号
调用kill函数向包括本身在内的其他进程发送一个信号,该函数和同名的shell命令功能一样

6.13发送信号
Linux中还提供一个用于定时发送信号的alarm函数和用于挂起进程的pause函数

信号使用范例(该范例通过fork、sleep、signal来模拟alarm函数的功能)

6.14使用alarm函数使编程变简单
功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。

2引导和服务
(5)init机制
7.1Linux系统的启动过程为:
BIOS:硬件启动(EFI)
MBR:Master Boot Record(GPT)
GRUB:操作系统引导程序

加载内核
init:第一个进程(systemd)
runlevel:相关应用程序(target)
7.2BIOS
BIOS:Basic Input Output System,基本输入输出系统
POST:Power-On Self-Test,通电/硬件自检
初始化:读取CMOS中的设置进行初始化
引导:根据CMOS设置寻找引导程序,并加载到内存
EFI/UEFI:Unified Extensible Firmware Interface,统一可扩展固件接口
7.3MBR:主引导记录
主引导记录是装有Linux系统的硬盘的第一个扇区,即C/H/S地址的0柱面0磁头1扇区,也叫做MBR扇区。
7.4GRUB
GRUB是Linux发行版中普遍使用的引导程序,GRUB相关文件保存在/boot/grub目录中,其中主要的配置文件为/boot/grub/grub.conf。
7.5/boot/grub/grub.conf

default:选择哪个启动项 timeout:停留的秒数 splashimage:背景图片 hiddenmenu:隐藏菜单 titil: 一个启动项 root (hd0,0): 操作系统所在硬盘 kernel: 指定内核及相关参数
initrd: 驱动模块
7.6加载内核
加载内核一般是将/boot 目录下的相关内核文件加载到内存中。
7.7 init进程——第一个进程
init进程的主要工作是初始化操作系统,其主要功能包括:
调用/etc/rc.d/rc.sysinit文件对系统进行初始化
挂载文件系统
根据运行级别启动相关守护进程
init进程的流程可以概括为:

7.8守护进程(Daemon)/系统服务
Linux系统中的服务是通过常驻内存的守护进程来实现的
Linux系统启动过程中会加载一系列的守护进程来完成各种功能,提供服务
守护进程一般以d结尾进行命名,如atd、crond、httpd等
守护进程的实现原理有两种方式:
init机制
systemd机制
7.9init机制
init.d守护进程机制是源自Unix的System V版的系统中,大部分Linux发行版和CentOS 7.x以前的版本一直使用该机制进行守护进程的管理和维护。
该机制有以下主要特点:
将守护进程分为三种类型:init进程、独立启动进程(stand alone)和超级守护进程(super daemon)
系统分为7个运行级别,每个级别对应不同的默认启动守护进程
针对三种类型的进程需要不同的管理方式(init、chkconfig和service等)
7.10运行级别(Run Level)
0:关机
1:单用户模式
2:不带网络模式的多用户
3:普通多用户模式
4:未使用
5:图形化界面
6:重新启动
通过/etc/inittab修改默认运行级别
每个级别对应的启动服务保存在/etc/rc.d/*.d中
使用runlevel命令可以查看当前和上一次运行级别
使用init命令可以改变当前运行级别
7.11init机制启动服务范例

(6)systemd机制
7.12init机制的缺点
启动时间长:init进程是串行启动,只有前一个进程启动完,才会启动下一个进程
启动脚本复杂:init进程只是执行启动脚本,每个守护进程或服务需要自己处理各种情况,这往往使得脚本变得很长
systemd试图提供一套完整的系统进程或服务的启动和管理机制。
systemd取代init成为系统的第一个进程
Cent OS 7+和其他较新的发行版均采用该机制
7.13systemd的主要特点
守护进程被称为unit(服务单元),unit按功能被分为多种不同类型(service、socket等),多个unit可以组合成一个服务组(target)
所有守护进程全部并行处理,加速开机启动流程,同时自动完成多个守护进程的依赖性检查
使用systemctl主命令进行守护进程的统一管理
向下兼容init.d管理机制
7.14systemd常见服务类型

7.15systemd管理单一服务

7.16管理所有服务
语法:systemctl [命令] [–type=类型][–all]
命令:list-units: 列出所有已启动的服务;
list-unit-files: 列出所有已启动的服务及相关文件列表;
(7)计划服务
7.18计划任务定义
计划任务也被称为例行性工作,在Linux系统中是指由系统在某一时间或周期性自动执行的程序或应用。
计划任务可以分为两种类型:
例行性任务(cron):按照设定的周期自动循环多次执行的工作,周期的时间单位可以设置为分钟、小时、周、月、年等,在Linux中可以通过crontab命令和设置/etc/crontab文件来实现,例行性工作功能依赖于crond服务。
单次计划任务(at):按照设定的某一时间只执行一次的工作,Linux中通过at命令来实现,单次计划任务依赖于atd服务。
7.19计划任务常用场景
日志轮替(log rotate)
定期将老的日志文件备份到特定目录,将新的日志文件放置在日志目录,以提高日志管理的性能。
日志分析(log watch)
定期检测某些重要日志文件的改动时间和内容,进行分析并将结果发送给管理员。
重建文件索引(locate)
查找文件、软件和帮助文档等都依赖于特定的数据库,当文件、软件和文档修改时需要重建数据库和索引。
删除临时文件(tmpwatch)
定期清除由系统或软件产生的临时文件,保证磁盘空间可用。
Web分析
定期对Web网站的相关日志进行分析,将结果告知管理员。
7.20单次执行计划任务at
at任务与atd系统服务
at任务的工作依赖于名为atd的系统服务,使用at任务需确保系统中atd服务可用。
语法:systemctl status atd #查看系统中at服务的状态
systemctl restart atd #重启系统的at服务器
systemctl enable atd #设置开机自动启动atd服务
at任务的运行原理
每一个at任务在/var/spool/at/目录内都会对应一个文件,该文件保存at任务需要执行的脚本和对应的时间,atd进程通过读取该文件完成at任务。
为了控制at任务的权限,在/etc/目录下保存两个文件,分别白名单用户文件/etc/at.allow和黑名单用户文件/etc/at.deny,其中白名单文件优先级高于黑名单文件,如果这两个文件均不存在,则只有root用于有权限设置at任务。
at任务的管理:at、atq和atrm命令
语法:at [-mldv] TIME
at -c 作业编号
作用: at命令两种用法,第一种为设置at任务,执行命令后进入at命令行模式,Ctrl+D退出
该模式,表示设置完成;第二种为查看已有at任务的内容。
选项:
-m: 当at工作完成后,以email通知用户计划任务完成情况
-l: 相当于atq命令,列出目前系统上的所有at任务
-d: 相当于atrm命令,可以取消一个at任务
-v: 用更详细的时间参数列出at任务的时间
-c: 查看指定编号的at任务的内容
参数:TIME: Linux系统中兼容的时间格式,如HH:MM、HH:MM YYYY-MM-DD等。
7.21例行性计划任务cron
cron任务和crond服务
cron任务的工作也依赖于名为crond的系统服务,和at任务不同的是该系统服务默认开启,且常驻内存。
Linux系统自身的很多例行性工作也都是通过cron计划任务来完成的。因此使用cron计划任务有两种方式
设置用户计划任务通过crontab命令,结合/var/spool/cron目录和/etc/cron.allow、/etc/cron.deny文件。
设置系统计划任务则通过编辑/etc/crontab配置文件来完成。
crontab命令
语法:crontab [-elr] [-u 用户名]
作用: crontab命令会进入到vi的文本编辑模式,同样Ctrl+D退出设置;-u参数用
于root管理员给其他用户编辑和设定cron计划任务。
选项:
-e: 进入cron任务编辑模式,设置计划任务时,该选项不可省略
-l: 查看已经设置好的计划任务
-r: 删除计划任务
-u: 给其他用户设置计划任务
[root@www ~]# crontab -e
0 12 * * * mail test -s “at 12:00” 7.22crontab命令的时间表示法

系统cron任务通过编辑配置文件实现。
一般而言,通过编辑/etc/crontab文本文档进行系统cron任务的设定。
CentOS 7.x发行版还提供其他的配置文件。
/etc/crontab配置文件
batch:用于设置系统空闲时间才执行的at任务,且在后台运行。
anacron:用于设置可被唤醒的cron任务,因为有些cron任务因为某些原因(关机、网络等原因)没有执行成功。
(8)日志
7.23日志定义
日志功能是Linux系统中非常重要的功能,是Linux管理员和使用者必须要熟练使用的功能。
Linux系统中常用的日志文件有:
/var/log/cron:记录计划任务crontab的相关信息
/var/log/messages:记录系统发生错误或异常等重要信息
/var/log/httpd/*:记录Web服务器相关信息
/var/log/dmesg:记录系统启动过程中相关信息
/var/log/lastlog:记录最后账号登录的相关信息
/var/log/secure:记录与密码及权限提升相关信息
7.24日志相关的服务和程序
常用的Linux发行版中日志功能一般由以下三个系统服务完成:
rsyslogd(rsyslog.service):完成系统与网络等常用日志功能
logrotate:完成日志文件的轮替功能
systemd-journald.service:CentOS7.x中新增的统一日志处理服务
7.25日志文件内容的一般格式:
事件发生的日期和时间
事件相关的主机名
事件相关进程或函数
事件详细的内容或数据
7.26日志的配置文件
日志配置文件的功能是:规定哪些服务的什么等级信息需要被记录在哪个文件。
日志的配置文件保存在/etc/日志服务.conf的配置文件中,如/etc/rsyslog.conf
7.27日志配置

(9)权限三部曲
8.1概述
Linux服务器的安全可以分为系统安全和网络安全两部分:
系统安全:保障用户、文件和进程的访问安全
权限三部曲:基本的UGO模型、特殊权限SUID|SGID|SBIT和ACL权限)
附加组件:SELinux
网络安全:主要通过防火墙技术,对服务器的网络访问进行控制
CentOS的Netfilter、iptables和firewall
Ubuntu的ufw
8.2默认权限
默认权限与umask命令
umask命令用于查看或设定新建文件和目录时的默认权限。
umask命令设定的权限值为权限掩码,即:
新建文件的默认权限=666 - umask值;
新建目录的默认权限=777 - umask值。

8.3特殊权限SUID、SGID和SBIT
SUID和SGID用于设定二进制程序执行时的用户的特殊权限,用s表示。
SBIT用于设定组内共享目录中用户自建目录的特殊权限,用t表示。
如:
8.4SUID、SGID用户特殊权限
仅对二进制文件有效、且仅在运行时有效;
执行者在拥有该程序的x权限的前提下,将拥有该程序所有者的权限。
SGID作用和SUID类似,区别是作用于组用户。
8.5SBIT目录特殊权限
SBIT用于设置目录的特殊权限,其作用是:当用户拥有某目录的写入权限时(同时具有w和x权限),在该目录下创建的文件只有该用户和root用户才能进行更名、移动、删除操作。
8.6设置和修改三种特殊权限
数字方法:SUID、SGID和SBIT分别对应4、2、1,即在权限数字前添加一个数字
字符方法:SUID为u+s、SGID为g+s、SBIT为o+t
8.7ACL(Access Control List)
ACL,访问控制列表,用于在传统的UGO模型之上提供更加细粒度的权限管理。
ACL可以针对单一用户、单一文件或目录进行r、w、x的权限管理。
ACL的实现需要文件系统的支撑,CentOS 7.x的xfs文件系统默认支持。
8.8setfacl和getfacl命令
语法:setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
作用: 给目标文件或目录设定ACL特殊权限
参数:
-m: 设置指定的acl参数给文件使用
-x: 删除文件上指定acl参数
-b: 删除所有的acl参数
-R: 如果目标文件为目录,则递归设置
说明:acl参数有三种表现形式,分别针对用户、组和有效权限(权限上限)
u:[用户账号列表]:[rwx]
g:[用户组列表]:[rwx]
m:[rwx]
getfacl命令的使用和参数与setfacl命令类似。
8.9使用ACL

(10)SELinux
8.10SELinux定义
SELinux是由NSA(美国国家安全局)开发一个Linux模块,该模块的设计目标为解决Linux系统权限管理缺陷导致的“内部员工误用”问题;
这一缺陷的核心问题是:权限管理主要针对用户和文件,而真正运行的却是进程;
传统Linux权限管理机制——DAC,自主访问控制
Discretionary Access Control,即根据进程的所有者与文件的rwx权限来控制
SELinux权限管理机制——MAC,委托访问控制
Mandatory Access Control,即针对特定的进程和特定的文件进行专门的权限控制
8.11SELinux相关概念
主体:运行中的程序,进程;
目标:即进程想要访问的资源/文件;
策略:指SELinux针对不同类型应用设置的一系列规则,可以分为限制较少的targeted规则和更为严格的strict规则;
安全上下文:SELinux中安全上下文相当于传统权限中的rwx。
8.12SELinux安全上下文
[root@www ~]# ls -Z
drwxr-xr-x root root root:object_r:user_home_t Desktop
-rw-r–r-- root root root:object_r:user_home_t install.log
-rw-r–r-- root root root:object_r:user_home_t install.log.syslog

identify:role:type

identify: 身份标识,分为三种类型root,system_u,user_u,用于表示目标文件的账号标识,root表示该文件属于root主文件夹下的文件,system_u表示系统进程文件,user_u表示文件与普通用户相关。
role: 文件角色,分为object_r,system_r,用于表示目标文件的类型,object_r表示目标文件是一个普通数据文件,system_r则表示目标文件为进程或设备文件。
type: SELinux匹配字段,一般情况下SELinux就是以这一字段来判断安全上下文的,该字段在文件上被称为类型,在主体(进程)上也会有对应的字段,被称为操作域,只有当操作域和类型两字段匹配时才能进行相关操作。
8.13SELinux使用范例
[root@www ~]# ll -Zd
/usr/sbin/httpd /var/www/html
-rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpd
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t /var/www/html
(11)Linux防火墙的基本原理
8.14Linux防火墙定义
防火墙是一种隔离系统内部网络和外部网络的过滤技术。
通过实现方式可以分为硬件防火墙和软件防火墙;
软件防火墙按技术原理可以分为包过滤防火墙和代理服务防火墙。
包过滤防火墙采用数据包过滤技术,在网络层(IP层)依据预设的过滤规则对数据包进行选择,检查每个数据包的源地址、目标地址、端口号、协议状态等信息。
代理服务防火墙也称为链路级网关,将所有跨越防火墙的网络通信分为两段,中间由代理服务进行转发,从而实现过滤的目的。
8.15Linux防火墙组成
Linux在内核2.4.x引入Netfilter框架,提供一个通用的、抽象的包过滤框架;通过Netfilter可以实现完整的、基于hook技术的包过滤防火墙。
iptables是Cent OS 6.x发行版中提供的一套进行防火墙管理的命令接口。
firewall是Cent OS 7.x发行版基于iptables改进的一套操作更便捷的命令接口。
Cent OS 7.x中默认不安装iptables命令接口,使用firewall进行操作。
ufw是Ubuntu 16.x+发行版中基于iptables和Netfilter的命令操作接口。
8.16Netfilter框架简介
Netfilter是Linux内核中进行数据包过滤、连接跟踪、地址转换等功能的实现框架。
包过滤防火墙中相关的过滤特定的数据包或者需要修改数据包的内容再转发等功能,都是通过Netfilter在内核中完成的。
Netfilter的实质是通过定义一系列的hook点(钩子),每个hook点上可以挂载多个hook函数,hook函数中就实现对数据包的处理(包括对容做怎样的修改、以及要将数据包放行还是过滤掉等)。
8.18数据包处理流程

8.19Netfilter、iptables和firewall三者关系

8.20iptables基本原理
iptables基本原理——四表五链
iptables表:即用来存储过滤规则的表,包括filter表、nat表、mangle表和raw表
filter表:保存数据包是否放行的规则,iptables机制中的默认表
nat表:保存在进行网络地址转换时的规则,依据该表修改需要nat的ip数据包
mangle表:保存对数据包头部其他内容进行修改的规则
raw表:保存数据包是否被跟踪的规则,后续版本新增表,优先级高
iptable链:即数据包进入到网卡后流向的五个阶段,包括路由前prerouting、入站input、转发forward、出站output、路由后postrouting。
iptables的基本原理就是在数据包进入到网卡后的不同阶段,查找对应表,用相关的规则对数据包进行处理。
(12)firewall的使用
8.21iptables基本原理——四表五链

8.22firewall在iptables的基础上有如下改进:
firewall可以热部署,即可以动态修改规则,不需要整体重写;
firewall新增zone概念,将网络连接分为多种可信等级,不同等级已经配置好一些默认操作,比如工作zone、家庭zone、限制zone、信任zone等,方便使用和配置;
由于可以热部署,所以firewall的规则设定可以分为临时(runtime)和永久(permanent)两种方式,区别是重启(reload)防火墙服务后是否有效;
firewall还提供可视化图形界面进行设置,firewall-config程序;
Cent OS 6.x默认使用iptables,Cent OS 7.x默认使用firewall,iptables需自行安装。
8.23firewall常用操作——开启、关闭
firewall-cmd --state #查看防火墙状态
systemctl stop firewalld.service #关闭防火墙
systemctl start firewalld.service #开启防火墙
systemctl enable|disable firewalld.service #设置开机启动或禁止防火墙
8.24firewall常用操作——开放或关闭端口
firewall-cmd [–zone=zone] --list-port #查看所有打开的端口
#打开端口
firewall-cmd [–zone=zone] --add-port=port/tcp --permanent|runtime
#使用范例
firewall-cmd --zone=public --add-port=80/tcp --permanent
#重新加载服务
firewall-cmd --reload

三、环境与应用
(1)SSH安全通信原理
9.1Telnet
Telnet是计算机网络早期使用的客户端连接服务器协议,默认使用23端口。
Telnet协议的主要特点是简单易用和高效,缺点是明文传输,不安全。
9.2SSH
SSH是Secure Shell的缩写,是一种基于加密机制的安全连接远程服务器Shell的协议。
SSH协议通过对传输数据进行加密保证安全性,同时对传输数据也进行一定程度的压缩,能提高传输效率。
SSH的用途除了提供远程登录服务器和使用Shell外,还可以作为ftp等其他传输协议的通道。
SSH协议有很多实现版本,包括商业版本和开源版本,目前使用广泛的是开源实现OpenSSH。
9.3安全/加密传输的基本原理
9.4对称加密Symmetric-Key Encryption
对称加密,是对称密钥加密的简称,是密码学中的一种基本的加密方式。
对称加密算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。
9.5非对称加密(Asymmetric cryptography)
非对称加密,也称为公开密钥加密(Public-key cryptography),这种加密机制需要两个密钥:公钥和私钥。
顾名思义,公钥可以任意对外发布;而私钥必须由用户自行严格保管,绝不透过任何途径向任何人提供,也不会透露给要通信的另一方,即使被信任。
非对称加密有两个重要的特征:
加密的双向性:即公钥和私钥中的任一个均可用于加密,此时另一个则用于解密。
公钥无法推导出私钥
具有上述两种性质的算法,就可以称为是非对称加密算法。
目前比较常用的非对称加密算法有RSA算法(由Rivest、Shamir 和 Adleman发明)和椭圆曲线算法等。
非对称加密的主要用途有:
加密通信
数字签名
数字证书
9.6SSH的安全通信原理
SSH协议结合使用非对称加密和对称加密两种加密机制,首先使用非对称加密方式交换未来用于对称加密的密钥,然后采用对称加密方式进行安全通信。
由于非对称加密的加解密效率远低于对称加密,所以为了在保证通信安全性的同时,也能有不错的通信和加解密效率,采用上述通信方式。
详细流程如以下图示(绿色表示公钥,红色表示私钥):
9.7SSH的安全通信流程
第一步服务器发送公钥到客户机,同时服务器保存私钥
第二步客户机用获得的公钥来加密自己的对称加密密钥
第三步用加密后的密钥来通信,这个密钥得用私钥解开
第四步客户机用私钥解秘
9.8以上过程存在的漏洞—中间人攻击
黑客装作服务器给客户机发公钥,则同时获得解密的私钥
(2)使用SSH进行远程连接
9.9使用SSH进行远程登录
使用SSH进行远程登录首先需要在服务器和客户端都安装OpenSSH的相关软件。
现有的各Linux发行版一般都默认安装有OpenSSH的Server端软件。
不同客户端的SSH软件:
Linux:自有终端
Mac:自有终端或其他软件(如iTerms、SecureCRT等)
Windows:PuTTY、XShell、SecureCRT等。
9.10SSH远程登录的方式——口令登录
ssh命令的用法
ssh user@host
ssh [email protected]
ssh -p 220 [email protected]
第一次登录有如下提示:
The authenticity of host 'host (202.197.64.6)’ can’t be established.
RSA key fingerprint is 98:2e:d7:e09f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
9.11SSH远程登录的方式——公钥登录
为了省去每次登录输入密码的繁琐,SSH还提供基于客户端公钥的登录方式。
公钥登录的基本原理为:
用户将自己的公钥储存在远程主机上。登录时,远程主机向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
(3)wget、scp、ftp和sftp
9.12Linux文件传输
9.13wget:下载文件
wget命令用于在Linux系统中的下载文件,具体用法为:
#命令语法
wget [参数] [URL地址]
#使用范例
wget http://www.centos.org/…iso
#常用参数
-c 断点续传
9.14scp:网间拷贝
scp 是Secure CoPy 的缩写,表示“安全拷贝”,其作用是把文件从一台计算机拷贝到网络上的另一台计算机,采用类似SSH协议的方式保证文件传输的安全性。
#命令语法
scp source_file destination_file
#使用范例
scp image.png [email protected]:/root/images/
9.15ftp和sftp:文件传输协议
ftp:File Transfer Protocol,是TCP/IP网络上两台计算机传送文件的协议。
FTP是在TCP/IP网络和互联网上最早使用的协议之一,属于网络协议簇的应用层。
FTP客户端可以给服务器发出命令来下载或上传文件,创建或改变服务器上的目录。
FTP协议相比较于其他应用层协议(如HTTP)要更复杂,因为要建立两条TCP数据传输链路,因此工作模式也响应的可以分为:
PORT主动模式
Passive被动模式
sftp是Secure File Transfer Protocol的缩写,即安全的文件传输协议(基于SSH)。
9.16搭建FTP服务器
目前在各服务器上常用的FTP服务器软件为VSFTP。
VSFTP:Very Secure FTP,基于GPL开源发布。
VSFTP具有如下特征:
安全、高速、稳定的FTP服务器软件
支持多IP的虚拟FTP主机的实现
支持匿名访问和匿名访问目录的设置
支持多种认证方式 、带宽限制等。
9.17使用FTP和服务器进行文件传输
(4)Git
9.18什么是Git?
Git是一个开源的分布式版本控制系统,用于敏捷高效对项目源码等内容进行管理。
Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个版本控制软件。
Git与常用的版本控制工具CVS, Subversion等不同,采用了分布式版本库的方式。
9.19关于版本控制
9.20本地版本控制
9.21集中化版本控制
9.22分布式版本控制
9.23Git基本原理
9.24Git的第一个主要特点是保存数据/文件的方式。
基于差异(delta-based)的版本控制
Git保存数据的方式为快照流
Git项目的三个阶段:工作区、暂存区和Git仓库。
结合远程仓库的完整使用
分支管理
切换和合并分支
解决分支冲突

(5)Apache的安装和配置
10.1WWW服务器(Web服务器)
HTTP协议中基于“请求-响应”模式,客户端发出请求,服务端进行响应,客户端一般指浏览器,服务端是指安装了处理HTTP请求的软件的服务器,就称为WWW服务器或Web服务器;
服务端软件的主要功能包括网络Socket处理、多线程处理、HTML数据流的封装和解析、HTTP请求和响应头的处理等;
常用的HTTP服务端软件有Apache、Tomcat、Nginx、IIS、WebSphere、Weblogic、Jboss等。
10.2什么是Apache?
Apache是Apache HTTP Server的简称,是Apache软件基金会的一个开放源码的Web服务端软件;
Apache使用C语言基于模块化进行开发,简单、高效,是目前使用最广泛的Web服务端软件;
其主要优点有:跨平台、稳定性高、按需加载、支持协议广泛、集成代理服务器和虚拟主机等;
但由于内核架构是采用基于进程的fork模式,进程的系统消耗要高于线程,故Apache不适合多处理器环境的分布式部署。

10.3基于Apache的Web服务器架构
10.4安装和部署Apache服务器

10.5配置Apache服务器

(6)Apache的其他用途
10.6虚拟主机的基本概念
虚拟主机:是指在只拥有一个真实IP的物理服务器虚拟出多个服务器的技术,多个虚拟服务器上可以多个网站;对用户而言即在一台服务器上可以访问多个站点。
Apache配置虚拟主机有三种实现方式:
基于IP的虚拟主机:通过配置虚拟多个IP地址,用户通过IP访问网站;
基于端口的虚拟主机:通过配置将多个不同网站映射多个不同的端口上;
基于域名的虚拟主机:最常用的方式,通过配置将多个网站的域名映射到不同的网站目录。
10.7HTTPS(服务器):HTTP+SSL/TLS+CA证书

10.10中间人劫持问题
10.8使用CA证书
10.9完整流程
(7)反向代理的基本概念
10.10代理服务器
10.11正向代理
正向代理服务器:一般而言的代理服务器是指正向代理服务器,是一个位于客户端和目标服务器之间的服务器,该服务器根据客户端的请求,从原始服务器获取网页或资源然后转发给客户端。
正向代理服务器的典型应用场景是为在防火墙内的局域网客户端提供Internet访问,同时也可以实现队列、缓存等功能。
正向代理的主要特点:客户端非常明确要访问的服务器地址、服务器只清楚请求来自某代理服务器而不清楚来自哪个具体的客户端、正向代理模式隐藏了真实客户端信息、客户端必须进行特殊的设置才可以使用正向代理。
10.12反向代理
反向代理服务器:反向代理代理的是客户端,根据客户端的请求,将请求根据某种策略分发到不同的服务器上,某台服务器提供响应后,反向代理服务器将响应转发给客户端。
反向代理服务器的典型应用场景是服务器端利用分布式部署来完成高并发的场景,同时实现数据缓存、负载均衡等功能。
反向代理的主要特点:服务端非常明确请求来自哪个客户端、客户端一般只有域名而不清楚响应来自哪台具体的服务器、反向代理模式隐藏了服务端的详细信息、对客户端完成透明。
10.13反向代理的工作流程
用户通过域名发出Web请求,该域名被DNS服务器解析为反向代理服务器的IP地址;
反向代理服务器接受用户的请求;
反向代理服务器在本地缓存中查找请求的内容,找到后直接把内容发送给用户;
如果本地缓存没有用户请求内容,反向代理服务器按策略对真实服务器发出请求,接收响应后处理缓存,然后发送给用户。
反向代理的优点
隐藏了真实的Web服务器,有效的保证了服务器资源的安全;
节约了有限的IP地址资源,分布式部署的服务器可以共用一个公网地址;
减少Web服务器的压力,提高相应速度和实现高并发;
动静内容分离、负载均衡、Ajax跨域问题。。。
(8)Nginx简介
10.14Nginx简介
Nginx是一款轻量级的Web服务器、反向代理服务器及电子邮件代理服务器。
由Igor Sysoev程序员于2004年给俄罗斯大型门户和搜索引擎Rambler开发,初始目标是解决高并发问题,遵守GNU下的BSD-like协议发行。
目前市场总占有率为15%左右,中国主流互联网公司BAT、字节跳动、360等均采用Nginx作为Web服务器,中国市场占有率超过70%。
阿里巴巴基于Nginx设计和开发了自有的Tengine,http://tengine.taobao.org。
Nginx的主要特点可以简单概括为:低消耗、高并发、强配置、可扩展。
10.15Nginx工作原理
Nginx由内核(master)和模块(worker)组成,其中内核非常微小和简洁,主要功能式通过查找配置文件将客户端请求映射到一个location block,location中所配置的每个指令将会启动不同的模块去完成相应的工作。
Nginx模块从结构上可以分为:
核心模块:包括HTTP模块、EVENT模块和MAIL模块
基础模块:HTTP Access模块、HTTP Fast CGI模块、HTTP Proxy模块和HTTP Rewrite模块
第三方模块:HTTP Upstream Request Hash模块、 Notice模块和 HTTP Access Key模块
10.16Nginx高并发原理
服务器端程序都需要使用I/O复用技术(一种一个进程同时为多个客户端连接服务的技术),目前常用的I/O复用技术有select、poll和epoll三种。
select:一个数组保存所有文件描述符(客户端连接即套接字),然后轮询数组;
poll:和select方法类似,只是将数据结构从数组改为链表;
epoll:采用基于内核的事件回调机制,而不是轮询机制。
Nginx采用epoll方法实现I/O复用,异步非阻塞,依赖于Linux内核2.6,能较好的解决连接数高而活跃度不高的高并发业务场景。
10.17Nginx负载均衡原理
负载均衡可以分为硬负载均衡和软负载均衡;
Nginx负载均衡的策略包括三种自带策略和两种第三方策略:
RR:按照轮询方式进行负载均衡,每个请求按时间顺序逐一分配到不同的后端服务器;
权重:指定轮询概率,weight和访问率成正比,用于后端服务器性能不均的情况;
IP哈希:IP哈希的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器;
fair(第三方策略):按后端服务器的响应时间来分配请求,响应时间短的优先分配;
URL哈希(第三方策略):按访问URL的hash结果来分配请求。
10.18Nginx安装和配置
Nginx作为HTTP或HTTPs服务器
Nginx作为反向代理服务器实现负载均衡
其他用途,如动静分离Web服务器
(9)缓存和Redis
为什么需要缓存?
“在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。另外,超过一弹指的耗时操作要有进度提示,并且可以随时中止或取消。”
10.19什么是缓存?
缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,在复杂的软件设计和大型网站架构设计中都使用了缓存技术。
缓存技术的使用前提是数据不均衡和数据有效时间可用。
四种常见的缓存方法:
CDN:即内容分发网络,是部署在距离终端用户最近的网络服务商,在CDN上缓存网站的一些静态资源和访问量最大的热点内容;
反向代理:反向代理属于数据中心服务器架构的一部分,用户的请求最先到达反向代理服务器上,在此服务器上缓存数据;
本地缓存:在应用服务器的本地缓存热点数据,应用程序直接在本机内存中访问数据,无需访问数据库;
分布式缓存:大型网站的数据量非常庞大,即使只缓存小部分数据,单机的内存也无法承受,所以就需要分布式缓存,应用程序通过网络访问缓存数据。
10.20缓存技术的实现原理
缓存的本质是一个内存Hash表。
10.21NoSQL
NoSQL,即非关系型数据库,使用键值对进行数据存储的数据库。
常用的NoSQL数据库
10.22Redis简介
Redis是Remote Dictionary Server的缩写,使用键值对存储数据,并允许其他应用通过TCP协议读写字典中的内容。
Redis数据库的所有数据都存储在内存中。在一台普通的笔记本电脑上,Redis可以在1秒内读写超过十万个键值。Redis也提供持久化的支持,即将内存中的数据异步写入硬盘中,同时不影响继续提供服务。
Redis功能丰富,可以将其用作缓存、队列系统,可以为每个键设置生存时间,还支持“发布/订阅”的消息模式等。
Redis使用命令来读写数据,就相当于关系型数据库中的SQL语句,同时对主流的多种编程语言提供支持。
10.23Redis数据结构举例
字符串:简单动态字符串(simple dynamic string ,SDS)。
10.24Redis持久化
RDB: RDB持久化通过将服务器某个时间点上的数据库状态(非空数据库以及相关键值对)保存到一个RDB文件中,Redis服务器可以用它来还原数据库状态 。
AOF: AOF持久化通过保存Redis服务器所执行的写命令来记录数据库状态的。被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,Redis的命令请求协议保存为纯文本格式。AOF持久化功能的实现分为命令追加、文件写入、文件同步三个步骤 。
10.25使用Redis常见问题
redis和数据库双写一致性问题
一致性问题是分布式常见问题,可以分为最终一致性和强一致性,如果对数据有强一致性要求,应尽量避免使用缓存技术,采取正确更新策略能降低不一致性发生的概率。
缓存穿透和缓存雪崩
缓存穿透,即故意去请求缓存中不存在的数据,导致所有的请求直接到数据库上,从而数据库连接异常;缓存雪崩,即缓存同一时间大面积的失效,如果继续有请求到达,将直接访问数据库,从而数据库连接异常。
并发竞争key问题
锁和事务
Nginx进阶和体系结构
(10)Nginx的配置和使用
11.1正确理解反向代理
正向代理以请求端也就是客户端的角度为正向,用户发出请求经过的代理,用户主动选择使用代理服务器。
反向代理是由代理服务器选择服务端节点,由于控制权的反转,所以称为反向代理。
11.2反向代理的优点
保护服务器安全
隐藏服务节点的IP
将服务节点置于防火墙之后,避免直接攻击业务节点服务器
服务器更专注于业务和性能
由反向代理服务器去实现比如https、gzip压缩等与业务无关的功能
提供动静态分离,将静态文件发往静态服务器或本地文件系统,避免业务节点处理这些与业务无关的请求
提供缓存机制,将一些短时间内不会变化的动态内容,在反向代理服务器这层增加缓存,降低业务服务器的请求量
由于控制权在代理服务这边,完全可以根据服务节点的性能动态分配请求,做到服务节点性能最佳
11.3Nginx目录由三部分组成:
/usr/local/nginx/conf:配置文件目录,重要的有nginx.conf
/usr/local/nginx/html:静态页面根目录
/usr/local/nginx/sbin:可执行文件目录
11.4Nginx原理流程

11.5运行的Nginx服务器包含两种进程:
master进程:主进程,一个Nginx只有一个master进程,负责接收操作者指令,并分发到各worker
worker进程:工作进程,默认一个,可以配置多个,负责执行操作指令,并处理客户端连接
11.6Nginx采用多进程而非多线程的方式有如下特点:
master和worker进程都相互独立,有独立的数据空间,不用考虑数据和线程安全问题
多进程采用Linux的fork机制,能实现动态部署、热部署等功能,也能提高可靠性
但多进程方式的系统消耗高于多线程方式
11.7为解决进程消耗大和多请求时可能导致的惊群问题,Nginx引入基于锁的抢占机制:
accept_mutex为互斥锁,不管目前有多少个worker进程,只有一个获取锁;
而worker进程采用Linux系统的epoll事件处理机制,提高并发性。
11.8反向代理的使用和配置
配置一个单节点的反向代理
配置一组反向代理的服务节点
11.9Nginx的负载均衡策略
第一类:最佳实践,轮询和随机
第二类:性能优先,weight权重、fair响应时间和least_conn最少连接
第三类:保持稳定,ip哈希、url哈希
哈希策略中的一致性问题:
在生产环境下,业务节点经常会出现增加或减少的情况将对hash结果产生影响
此外,即使业务节点不变化,哈希策略也有可能出现分配不均衡的问题
解决分配不均的一致性方法:构建虚拟节点,扩大哈希范围
解决节点动态变化的一致性方法:将哈希映射从点扩展到线(哈希环),提高可用性
故障节点的摘除与恢复

(11)Nginx+Tomcat集群环境
11.10非集群Nginx+Tomcat架构
11.11Nginx+Tomcat集群架构设想
11.12单机多Tomcat的配置和使用
11.13单机多Tomcat的配置和使用

11.14Session共享问题
11.15服务器集群的Session问题的解决方案
请求精确定位
Session复制共享
基于高速缓存数据库的Session共享
11.16 Tomcat服务器集群的Session问题的解决方案
使用Tomcat自带的Cluster方式
使用Nginx的基于访问IP地址的Hash路由策略
基于Memcached实现
基于Redis实现
(12)体系架构演进概述
11.17 ALL-IN_ONE
11.18按功能分离服务器
11.19使用缓存服务器
11.20应用服务器集群+负载均衡
11.21应用服务器集群的会话管理
11.22数据库服务器的读写分离
11.23CDN的反向代理服务器
11.24数据库采用专库才用
11.25添加搜索引起和NoSQL数据库
(13)相关技术
Keepalived+LVS+Nginx

你可能感兴趣的:(linux总复习(二))