一、SSH服务
1.1 作用
SSH 全称 Secure Shell(安全外壳协议),是一套加密的远程登录 / 文件传输协议,安装在服务器上,负责接收远程客户端连接。
- 核心作用
- 远程安全登录服务器
本地电脑 / 另一台机器远程登录操作 Linux 服务器,所有账号密码、操作指令全程加密,不会被抓包窃取。 - 加密传输文件
配套工具:scp、sftp、rsync,例如rsync底层就是走 SSH 加密通道传输文件。 - 端口转发 / 隧道代理
可做内网穿透、本地端口映射,安全访问内网服务。
bash
systemctl status sshd #检测服务状态
systemctl start sshd #开启服务

1.2 连接远程服务器
当第一次进行远程连接时,会生成密钥,以便下次连接使用
参数:-l 指定用户
例:
bash
[root@server1 ~]# ssh -l zs server2
执行逻辑:在 server1 本地发起连接,登录 server2 上的 zs 用户
本地 server1 有没有 zs 用户完全不影响这条命令。
bash
[root@server3 ~]# ssh root@localhost

1.3 ssh免密访问
例:server3免密登录server1
对server1的配置:
bash
[root@server1 ~]# vim /etc/hosts #写入server3的IP地址
[root@server1 ~]# ping server3 #解析


对server3的配置:
bash
[root@server3 ~]# vim /etc/hosts #写入server1的IP地址
[root@server3 ~]# ping server1 #解析


生成 SSH 非对称密钥对
bash
[root@server3 ~]# ssh-keygen

把公钥上传到 server1
bash
[root@server3 ~]# ssh-copy-id server1

公钥内容会追加到目标机器的 ~/.ssh/authorized_keys

此时即可直接免密登录server1

1.4 多个机器实现双向免密
所有机器用一对密钥
例:
bash
[root@server1 ~]# rm -fr .ssh/ #删除server1存放密钥的文件夹
[root@server3 ~]# ssh-copy-id server3 #server3连接它本身,生成密钥
[root@server3 ~]# cd ~/.ssh #密钥所在文件夹
[root@server3 .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
[root@server3 ~]# scp -rp .ssh/ server1: #将密钥拷贝到server1的用户主目录下

此时server1和server3访问自己或对方均免密


注意:如果未在/etc/hosts文件写入每台机器的IP和hostname进行解析,那么每次操作时必须写上IP,否则会报错
bash
ssh root@192.168.40.133
scp file root@192.168.40.141:/tmp
ssh-copy-id root@192.168.40.143

免密后可以在server3上对server2执行命令,执行结果转发到server3
bash
[root@server3 ~]# ssh server2 "命令"

1.5 配置文件
路径:/etc/ssh/sshd_config
修改后重载生效:systemctl reload sshd
常用配置参数
Port 2222设定端口为 2222
PermitRootLogin yes|no 是否禁止超级用户登陆
PasswordAuthentication yes|no 是否开启原始密码认证方式
AllowUsers 用户 用户白名单,多个用户用空格隔开即可
DenyUsers 用户 用户黑名单
二、远程文件同步
2.1 scp
scp = secure copy,基于 SSH 加密协议的远程文件拷贝工具,用来在两台 Linux 主机之间安全传输文件 / 文件夹。
格式:scp 参数 源文件/目录 目标地址
| 常用参数 | 作用 |
|---|---|
| -p | 保留原文件的修改时间,访问时间和访问权限 |
| -r | 递归复制整个目录 |
注意:为防止出错,目标地址必须为绝对路径!
例:将server3的/etc/passwd文件远程拷贝到server2的/tmp文件夹下
bash
[root@server3 ~]# scp /etc/passwd server2:/tmp

将server2的/etc/passwd拷贝到当前目录
bash
[root@server3 ~]# scp server2:/etc/passwd .

2.2 rsync
rsync 是增量同步工具,主要用于本地 / 远程之间文件、目录同步备份;只传文件修改过的部分,不变内容跳过,大幅节省带宽和时间;支持本地同步、远程 ssh 同步、定时备份。同步文件/目录的机器均需安装此服务才能使用。
格式:rsync -a 源目录/文件 user@主机:/目标路径
| 参数 | 作用 |
|---|---|
| -r | 同步目录 |
| -p | 同步权限 |
| -o | 同步文件所有人 |
| -g | 同步文件所有组 |
| -l | 同步链接 |
| -D | 同步设备文件 |
| -t | 同步文件时间戳 |
例:在server3建立文件夹dir1,放入passwd文件

bash
[root@server3 ~]# rsync -a dir1/ server2:/tmp #只传输dir1中的文件
[root@server3 ~]# rsync -a dir1 server2:/tmp #传输整个dir1文件夹


注意:执行命令 rsync -a dir1/ server2:/tmp 时,本地 server3 上的 dir1 内文件是源文件,远端 server2 /tmp 目录下的文件是目标文件;rsync 属于单向同步,只会以源文件为准覆盖目标文件:
- 若仅源文件(server3)内容发生修改,再次同步后,目标文件(server2)会同步更新为新内容;
- 若仅目标文件(server2)内容发生修改、源文件(server3)保持不变,再次同步后,server2 的修改会被覆盖还原,改动不会反向同步到 server3。
2.3 scp与rsync区别
-
传输机制
scp :完整复制,每次传输都把整个文件从头传到尾,哪怕文件只改了 1 个字节,全部重传;适合小文件、一次性拷贝。
rsync :增量校验,先对比文件校验码,只传输改动的块,大文件 / 频繁同步场景效率极高。
-
目录同步逻辑
scp
-r:单纯复制目录,目标旧文件不会清理,只会新增覆盖;rsync
--delete:可自动删除目标目录里源不存在的文件,实现两边目录完全镜像。 -
性能场景区分
| 场景 | 推荐工具 |
|---|---|
| 一次性少量小文件拷贝 | scp(简单快捷) |
| 大文件、定时备份、频繁同步 | rsync(增量省流量) |
| 服务器集群定期同步数据 | rsync |
- 功能差异
- 权限保留:
- scp
-p仅保留基础时间权限; - rsync
-a完整保留所有者、组、软硬链接、设备文件。
- scp
- 断点续传:
- scp 中断后只能重新全量传输;
- rsync 中断后再次执行,只会补传未同步部分。
- 压缩:
- scp 无内置传输压缩;
- rsync
-z传输时实时压缩。
- 限速:rsync 支持
--bwlimit限制传输速度,scp 不支持。
三、系统日志及其管理
3.1 作用及存储配置
进程和操作系统内核需要能够为发生的事件记录日志,这些日志可用于系统审核和问题的故障排除,一般这些日志永久存储/var/log目录中。
系统文件记录信息如下表:
| 文件 | 作用 |
|---|---|
| /var/log/messages | 大多数系统日志信息记录在此处 |
| /var/log/secure | 安全和身份认证相关的消息和错误的日志文件 |
| /var/log/maillog | 与邮件服务器相关的日志文件 |
| /var/log/cron | 与定时任务相关的日志文件 |
| /var/log/boot.log | 与系统启动有关的日志文件 |
/etc/rsyslog.conf 里的规则,定义了各类日志分别存到上表列出的这几个 /var/log/ 文件里,配置文件是规则,log 文件是最终存放日志的载体。
下图为/etc/rsyslog.conf 里的规则:

- 配置行:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
关系:这条规则规定,系统绝大多数普通日志,排除邮件、认证、定时任务,全部写到/var/log/messages。 - 配置行:
authpriv.* /var/log/secure
关系:所有登录、sudo、密码认证类日志,统一写入/var/log/secure。 - 配置行:
mail.* -/var/log/maillog
关系:所有邮件服务运行日志,写入/var/log/maillog。 - 配置行:
cron.* /var/log/cron
关系:所有定时任务执行、报错日志,写入/var/log/cron。 - 配置行:
local7.* /var/log/boot.log
关系:系统开机启动过程的日志,写入/var/log/boot.log。
3.2 systemd-journald服务
服务提供一种改进的日志管理服务,可以收集来自内核、启动过程、标准输出、系统日志及守护进程启动和运行期间错误的消息,它将这些消息写入到一个结构化事件日志中。
默认日志存放路径: /run/log 临时存储,重启清空
system.journal是 systemd-journald 生成的二进制日志库文件,用来存放本机系统、服务、内核全部日志,是数据文件,不能用cat直接查看,需用程序读取。

3.3 journalctl命令
bash
[root@server2 ~]# journalctl #查看本次开机全部日志
[root@server2 ~]# journalctl -n 5 #查看最近生成的5条日志
[root@server2 ~]# journalctl -p err #查看系统报错
[root@server2 ~]# journalctl --since "起始时间" --until "结束时间" #查看某个时间段生成的日志
[root@server2 ~]# journalctl -o verbose #查看日志能够使用的条件参数
#执行后会输出 _PID、_UID、_SYSTEMD_UNIT 等所有过滤字段
[root@server2 ~]# journalctl _PID=进程PID #按进程 PID 过滤
[root@server2 ~]# journalctl _UID=进程UID #按进程 UID 过滤
[root@server2 ~]# journalctl _SYSTEMD_UNIT=sshd.service #按系统服务过滤
[root@server2 ~]# journalctl _COMM=sshd #按程序名过滤
[root@server2 ~]# journalctl _HOSTNAME=server3 #过滤指定主机 server3 产生的日志
3.4 systemd-journald日志持久化
默认情况下,systemd日志保存在/run/log/journal中,这意味着系统重启时会被清除,如果将日志保存在/var/log/journal目录,启动后就可以利用历史数据,形成永久日志。
bash
[root@server2 ~]# mkdir /var/log/journal
[root@server2 ~]# chown root.systemd-journal /var/log/journal/
[root@server2 ~]# chmod 2755 /var/log/journal/
[root@server2 ~]# systemctl restart systemd-journald
[root@server2 ~]# ls /run/log/journal/ #存在文件夹,代表持久化已生效
3.5 rsyslog服务
rsyslog是一个开源工具,被广泛用于Linux系统以通TCP/UDP协议转发或接收日志消息。
主配置文件/etc/rsyslog.conf
| 日志类型 | |
|---|---|
| auth | 用户认证 |
| authpriv | 服务认证 |
| cron | 时间任务 |
| kern | 内核类型 |
| 邮件 | |
| news | 系统更新信息 |
| user | 用户 |
| 日志级别 | |
|---|---|
| debug | 程序排错信息 |
| info | 程序常规运行信息 |
| notice | 重要信息的普通日志 |
| waring | 程序警告 |
| err | 程序报错 |
| crit | 严重级别会导致系统软件不能正常工作 |
| alert | 系统中立即要更改的信息 |
| emerg | 系统的严重问题日志 |
| none | 不采集 |
远程日志同步
例:将server1的日志汇总到server3上
日志发送方即server1:
bash
[root@server1 ~]# vim /etc/rsyslog.conf
*.* @日志接收方ip
[root@server1 ~]# systemctl restart rsyslog

日志接收方即server3:
bash
[root@server3 ~]# vim /etc/rsyslog.conf
编辑内容如下图
[root@server3 ~]# systemctl restart rsyslog
[root@server3 ~]# tail -f /var/log/messages
此时已经可以在server3看到server1的日志


出现的问题:
两台主机防火墙必须关闭!包括firewalld和iptables服务!
两个机器的配置文件都没问题的情况下,server3始终无法查看server1,经多次排查,发现只关闭了firewalld服务,而iptables服务仍然开启,导致日志无法同步。
四、at------系统延时任务
作用:at 命令可以指定某一任务在将来的特定时间运行,设置只执行一次的定时任务,到指定时间运行,执行完自动失效。在将某一 at 作业设置为运行之后 , 可以通过使用 atq 命令列出作业编号。
格式:at 时间
例:
bash
[root@server3 ~]# at now+2min
at> echo "helloworld" >/dev/pts/0
# 按 Ctrl+D 保存退出
[root@server3 ~]# atq

五、cron------管理定期任务
5.1 基本用法
作用:管理定期任务,按计划定期重复运行的程序,系统管理员可以在系统范围配置文件中设置任务
格式:* * * * * 操作命令
| 字段 | 范围 | 说明 |
|---|---|---|
| 第 1 位 分钟 | 0~59 | 一小时内第几分钟 |
| 第 2 位 小时 | 0~23 | 一天内第几小时 |
| 第 3 位 日期 | 1~31 | 一月内第几天 |
| 第 4 位 月份 | 1~12 | 一年中第几月 |
| 第 5 位 星期 | 0~7 | 0/7 = 周日,1 = 周一...6 = 周六 |
示例:
| 语法 | 命令何时运行 |
|---|---|
| 05 * * * * | 每小时整点过 5 分钟 |
| 05 02 * * * | 每天 2:05 am |
| 30 08 01 * * | 每月 1 日 8:30 am |
| 00 07 25 12 * | 12 月 25 日 7:00 am |
| 30 16 * * 5 | 每个星期五 4:30 pm |
| */5 * * * * | 每 5 分钟(0、5、10...45、50、55 分执行) |
| */10 9-17 1,15 * * | 每月 1 日、15 日,上午 9 点至下午 5 点之间,每隔 10 分钟执行;下午 5 点不会运行,最后一次为 16:50 |
| 0 0 1 jan 0 | 1 月 1 日零点,以及 1 月里所有星期日 |
单个用户使用称为 crontab ( cron 表 ) 的文本文件登记任务
bash
[root@server3 ~]# crontab -l #查看当前用户定时任务
[root@server3 ~]# crontab -r #清空当前用户所有定时任务
[root@server3 ~]# crontab -e #新增/修改定时任务,默认使用vi编辑器
设置每隔一分钟发送一次系统时间

每隔一分钟会收到一封邮件,内容是当前的时间
bash
[root@server3 ~]# cat /var/spool/mail/root

注意:
- 属于系统的任务通常保存在
/etc/crontab文件中,而不是使用crontab -e编辑保存在个人文件中。更好的做法是用文本编辑器创建crontab文件并保存到/etc/cron.d中 ,避免更新系统软件包 cronie 时出现问题。/etc/cron.d/是全局公共定时目录,所有用户都能放任务,系统无法默认判断执行身份,因此语法强制/etc/cron.d/crontab文件在时间字段后增加「用户名」字段,用来指定这条任务以哪个用户权限运行;可以填任意存在的系统用户:root、centos、nginx等。 - 对于需要每天、每周或每月运行一次的脚本 , 可以直接将其设置为可执行文件 , 并保存在
/etc/cron.{daily,weekly,monthly}中相应目录下。这些任务由/etc/anacrontab 配置的系统 anacron 服务运行
5.2 权限设定
两个核心控制文件
- 白名单:
/etc/cron.allow(默认不存在,需手动创建) - 黑名单:
/etc/cron.deny(系统自带,默认存在)
优先级规则
- 只要
cron.allow文件存在,只认白名单 ,黑名单直接失效;只有名单内用户才能执行crontab,其他全部禁止。 - 无
cron.allow时,才读取cron.deny:名单内用户禁止,其余所有用户均可使用。 root用户永远不受限制,无论黑白名单。- 用户名一行一个,修改文件无需重启 crond,即时生效。
例:禁止user1使用crontab
bash
[root@server3 ~]# vim /etc/cron.deny
在文档中写入user1
[root@server3 ~]# su - user1
[user1@server3 ~]$ crontab -e

六、NFS服务
NFS(Network File System 网络文件系统),Linux 专用文件共享协议,可以把服务器的文件夹共享给多台客户端挂载,像本地目录一样读写文件。使用服务的双方必须都安装此服务,并且解析对方的IP。使用前需启动服务并关闭防火墙。
-
优点:
- 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。
- 用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。
- 一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。
-
服务端配置
bash
[root@server3 ~]# yum install -y nfs-utils
[root@server3 ~]# systemctl start nfs
[root@server3 ~]# mkdir -p /nfs
[root@server3 ~]# chmod 777 /nfs
[root@server3 ~]# vim /etc/exports
[root@server3 ~]# exportfs -rv #刷新
文件编辑的内容如下

注意:也可以使用通配符和网段来放权


- 客户端配置
bash
[root@server1 ~]# yum install -y nfs-utils
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# showmount -e server3 #查看服务端发布的所有 NFS 共享目录
[root@server1 ~]# mkdir /nfs
[root@server1 ~]# mount server3:/nfs /nfs #前一个nfs为服务端共享目录,后一个为客户端的本地挂载目录
[root@server1 ~]# df -h

客户端新建一个文件file

注意:客户端用 root 用户读写 NFS 共享文件时,NFS 服务端会把客户端 root 身份强制映射为匿名用户 nfsnobody;所以新建 / 修改的文件,在服务端看属主、属组都会变成 nfsnobody。
若想以root身份新建文件,在/etc/exports中编辑如下内容即可:

此时在服务端的共享文件夹/nfs中可查看

例:server3上有一用户user1,将/home/user1共享给server1,编辑/etc/exports,可以指定以user1的身份读写,创建文件的属主和属组也是user1,而server1上可以没有user1这个用户。
注意:此项服务也需要关闭防火墙!包括firewalld和iptables服务!否则无法挂载!
bash
[root@server3 ~]# vim /etc/exports
编辑内容如下图
[root@server3 ~]# exportfs -rv

bash
[root@server1 ~]# mount server3:/home/user1 /home/user1
[root@server1 ~]# cd /home/user1
[root@server1 user1]# touch file
[root@server1 user1]# ll

利用NFS 可实现免密登录。例如:server3连接自身,生成公钥,放到 NFS 共享目录,server1挂载该共享目录,即可实现双向免密。
七、autofs服务
autofs服务在客户端安装,可以使客户端在需要使用服务端的共享文件时自动挂载服务端的共享内容,在不需要使用的时候自动卸载,避免在不用的时候浪费磁盘空间。
使用前依旧需要关闭防火墙服务!
/etc/auto.master是 autofs 主映射配置文件,用于定义「父挂载目录」关联对应的子映射规则

/misc /etc/auto.misc
/misc:父目录(陷阱目录)/etc/auto.misc:普通间接映射子配置文件
含义:
当有人访问/misc/xxx下面的子目录时,autofs 去读取/etc/auto.misc文件,查找匹配规则,自动完成挂载。
典型用途:自动挂载光驱/misc/cd。
客户端
bash
[root@server1 ~]# yum install -y autofs
[root@server1 ~]# systemctl start autofs
[root@server1 ~]# cd /net #根下并没有此文件,autofs 服务启动,内核把 /net 注册成autofs虚拟文件系统
[root@server1 net]# cd server3 #可以看到共享的文件夹
[root@server1 server3]# ls
home

可以尝试自己写路径进行挂载,这里的/nfs是本地客户端上创建的父陷阱目录
bash
[root@server1 ~]# vim /etc/auto.master
编辑的路径后缀自定义,但必须是`auto.`格式

bash
[root@server1 ~]# vim /etc/auto.nfs

server1在访问/nfs/data时会自动挂载,可以共享server3的共享文件夹。
- 修改autofs卸载时间间隔
bash
# vim /etc/sysconfig/autofs
TIMEOUT=5 #设置时间间隔为5秒
- 如果用/etc/fstab文件挂载,要告诉系统:这个挂载属于网络设备文件系统

八、iscsi服务
全称是 Internet 小型计算机系统接口,是一个基于 TCP/IP 的协议,主要用于通过 IP 网络仿真 SCSI,从而为远程块存储设备提供数据传输和管理。说白了,就是通过网络由专门的服务器提供存储管理,以实现数据的远程储存,便于数据的集中管理,从而简化了数据复制、迁移和容灾。但是出于性能的考虑,通过 iSCSI 进行的网络流量通常是未加密的,这就需要在应用服务器和存储服务器之前的布线和网络设备都是单独布线和单独使用,或者使用 VPN 进行网络数据传输。不要与其他网络进行混杂,以免造安全问题和成网络传输性能的损耗。
服务端
bash
[root@server3 ~]# yum install -y targetcli
[root@server3 ~]# systemctl start target
[root@server3 ~]# targetcli
/backstores/block create demo /dev/sdb
/iscsi create iqn.2026-07.com.example:storage1
/iscsi/iqn.2026-07.com.example:storage1/tpg1/acls create iqn.2026-07.com.example:demokey
/iscsi/iqn.2026-07.com.example:storage1/tpg1/luns create /backstores/block/demo
exit

客户端
bash
[root@server1 ~]# yum install -y iscsi-initiator-utils.x86_64
[root@server1 ~]# vim /etc/iscsi/initiatorname.iscsi #名称改为在server3中定义的名称
[root@server1 ~]# iscsiadm -m discovery -t st -p server3 #发现设备
[root@server1 ~]# iscsiadm -m node -l #登录设备


登录设备后,即可查看/dev/sdb盘,要使用需要先进行分区、格式化和挂载
bash
[root@server1 ~]# fdisk /dev/sdb
[root@server1 ~]# mkfs.xfs /dev/sdb1
[root@server1 ~]# mkdir /iscsi
[root@server1 ~]# mount /dev/sdb1 /iscsi

此时在/iscsi中写的文件实际是写在服务端的sdb中。
若想实现开机自动挂载,也必须加入_netdev,否则系统将无法启动。

若不想再使用:
bash
[root@server1 ~]# vim /etc/fstab #删除挂载配置
[root@server1 ~]# umount /iscsi
[root@server1 ~]# iscsiadm -m node -u
[root@server1 ~]# iscsiadm -m node -o delete #若不删除会有缓存在/var/lib/iscsi/nodes下,重启服务会自动挂载
九、systemd服务
systemd 是 Linux 的初始化系统(init 系统),负责系统开机引导用户空间、全程管理后台用户进程。
- 特点
- 并行化启动能力
传统 init 串行依次启动服务,开机慢;systemd 基于依赖分析,无依赖的服务可以同时并行启动,大幅缩短开机时间。 - 按需启动守护进程(懒加载)
不会开机一次性启动所有服务;部分服务等到有请求访问时才自动拉起,节省系统资源。 - 利用 Linux cgroup(控制组)跟踪进程
不依赖 PID 管理进程,通过 cgroup 分组管控服务所有子进程;服务停止时能一次性杀死全部相关进程,避免僵尸残留。 - 统一管理挂载与自动挂载点
接管/etc/fstab挂载逻辑,支持.mount、.automount单元,开机自动挂载、按需自动挂载磁盘 / 网络存储。 - 基于依赖关系的服务调度逻辑
通过[Unit]段的After/Before/Wants/Requires定义服务依赖;
明确服务启动先后顺序、强弱依赖,解决传统脚本启动顺序混乱问题
9.1 管理 systemd 单元
- 查询所有单元的状态以验证系统启动情况
bash
[root@server3 ~]# systemctl --all

- 仅查询服务单元的状态
bash
[root@server3 ~]# systemctl --type=service

- 查询当前服务状态(以下以ssh服务为例)
bash
[root@server3 ~]# systemctl is-active sshd #查询服务当前是否运行
[root@server3 ~]# systemctl is-enabled sshd #查询服务是否开机自启

- 查看所有服务类单元的开机启用 / 禁用配置
bash
[root@server3 ~]# systemctl list-unit-files --type=service

9.2 服务状态
bash
[root@server3 ~]# systemctl status sshd
#loaded: 单元配置文件已处理
#active (running): 运行一个或多个持续进程
#active (exited): 成功完成一次性配置
#active (waiting): 正在运行但等待某个事件
#inactive: 未运行
#enabled: 将在开机时启动
#disabled: 不会在开机时启动

9.3 启动和停止服务
bash
[root@server3 ~]# systemctl stop sshd #停止
[root@server3 ~]# systemctl start sshd #启动
[root@server3 ~]# systemctl restart sshd #先杀进程再全新启动
[root@server3 ~]# systemctl reload sshd #平滑热重载配置,不杀死原有进程
9.4 管理开机自启服务
bash
[root@server3 ~]# systemctl enable sshd
[root@server3 ~]# systemctl disable sshd
9.5 屏蔽服务
系统可能安装了冲突的服务,例如:network and NetworkManager;iptables and firewalld。
为防止管理员意外启动某项服务,可以将该服务屏蔽:
bash
[root@server3 ~]# systemctl mask firewalld
注意:禁用的服务不会在启动时或由其他单元文件自动启动,但可以手动启动。被屏蔽的服务既不能手动启动也不能自动启动。
9.6 管理服务 - 单元文件
维护者文件 : /usr/lib/systemd/system/
管理员文件 : /etc/systemd/system/
/etc 下的单元文件将优先于 /usr 下的单元文件。
十、系统引导
10.1 破坏/boot/grub2/grub.cfg文件
/boot/grub2/grub.cfg是GRUB2引导程序的主配置文件,系统开机启动菜单、内核参数、启动项全部由此文件控制。
bash
[root@server4 grub2]# mv grub.cfg /mnt
[root@server4 grub2]# reboot
虚拟机出现如下界面:

在相似的克隆机上寻找配置文件


引导成功,可重新登录

10.2 破坏/boot

reboot进入挽救模式,需要光盘引导,所以确保虚拟机使用ISO映像文件


点击发送选项,重启的瞬间点击虚拟机,按住F2进入如下页面


在boot选项下把光驱引导放在第一位:"shift" + "+"

保存退出

选择Troubleshooting

挽救系统

真实的根文件系统将被放在/mnt/sysimage下

改变程序的根目录,进程只能看到这个目录内部,无法访问外面真实系统的文件

发现未联网,修改网卡配置
bash
mv ifcfg-eth0 ifcfg-ens33
vim ifcfg-ens33

重新加载+启动,可以看到IP地址

但安装kernel显示DNS域名解析失败

临时修复 DNS,即可成功安装
bash
echo "nameserver 223.5.5.5" > /etc/resolv.conf
#223.5.5.5 是阿里云免费公共 DNS,用来解析域名,解决 "无法解析主机" 的报错
yum install -y kernel
但目录下还缺少grub2文件,安装对应资源包

grub2/下无文件,需要在硬盘 MBR(主引导记录)中安装 GRUB2 引导代码:grub2-install /dev/sda,安装好后发现缺少配置文件,扫描系统内所有可用内核、系统分区,自动生成 GRUB2 启动菜单配置文件 grub.cfg:grub2-mkconfig -o /boot/grub2/grub.cfg

输入两次exit进入如下界面

点击发送选项,重启的瞬间点击虚拟机,按住F2进入如下页面

恢复硬盘到第一位

保存退出后,系统可正常启动。
十一、防火墙
11.1 iptables
iptables 是 unix/linux 自带的一款优秀且开源的,基于包过滤(对 OSI 模型的四层或者是四层以下进行过滤)的防火墙工具对流入和流出服务器的数据包进行很精细的控制,主要针对网络访问。
iptables 不是真正的防火墙,为一个客户端的代理,用户是通过 iptables 这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙。这个框架叫做 netfilter 。
- netfilter :内核空间,真正实现防火墙的功能。
- iptables :用户空间,在
/sbin/iptables存在的防火墙,通过 iptables 提供管理、修改、删除或者插入规则;用户和内核交互的工具就是 iptables。简单理解为iptables 是真正实现用户防火墙规则的桥梁。 - 缺点:
(1)防火墙虽然可以过滤互联网的数据包,但却无法过滤内部网络的数据包。因此若有人从内部网络攻击时,防火墙没有作用。
(2)电脑本身的操作系统亦可能因一些系统漏洞,使入侵者可以利用这些漏洞绕过防火墙过滤,从而入侵电脑。
(3)防火墙无法有效阻挡病毒攻击,尤其是隐藏在数据中的病毒。 - 工作原理分类
(1)主机防火墙:主要是用来防范单台主机的进出报文------filter表 INPUT链
(2)网络防火墙: 能够实现对进出本网络的所有主机报文加以防护------nat表
11.1.1 iptables---tables---chains---Policy
- 什么是iptables
举个例子,如果把 Netfilter 看成是某个小区的一栋楼。那么表( tables )就是楼里的其中的一套房子。这套房子"表( tables )"属于这栋楼" Netfilter / Iptables "。 - 什么是表(tables )
表( tables )是链的容器,即所有的链( chains )都属于其对应的表( tables )如上,如果把Netfilter看成是某个小区的一栋楼,那么表( tables )就是楼里的其中的一套房子。
3 什么是链(chains )
链( chains )是规则( Policys )的容器。如果把表( tables )当作一套房子,那么链( chains )就可以说是房子里的家具(柜子等)。
4 什么是规则(Policy )
规则( Policy )是iptables系列过滤信息的规范和具体方法条款,可以理解为柜子如何增加并摆放柜子东西等。
匹配规则:提供了需要执行对应动作的目标匹配机制。通常可以匹配协议类型、目的地址、源地址、目的端口、源端口、目的网段、源网段、接收数据包的网卡、发送数据包的网卡、协议头、连接状态等。
动作目标:又称为 Target 。是数据包满足匹配规则时触发的相应的动作。 Target 分为两种类型:终止目标和非终止目标。
11.1.2 四张表
| 表类别 | 作用 |
|---|---|
| raw表 | 用于对数据包进行连接跟踪前的处理。 |
| mangle表 | 用于修改数据包的IP头或其他信息。 |
| nat表 | 用于网络地址转换,如源地址转换和目标地址转换。 |
| filter表 | 用于执行包过滤,是最常用的表,决定数据包是否被接受、丢弃或拒绝。 |
11.1.3 五条链
-
INPUT 链
INPUT 链用于处理进入本机的流量。当数据包的目标是本机时,它会经过 INPUT 链。这个链决定了哪些数据包可以进入本机,哪些应该被拒绝或丢弃。用于防止未经授权的访问,控制哪些外部数据包能够访问本机服务。
-
OUTPUT 链
OUTPUT 链用于处理从本机发出的流量。当本机向外发送数据包时,这些数据包会经过 OUTPUT 链。这个链用于控制本机如何向外部网络发送流量。 用于限制本机发送的流量,防止恶意程序或错误的配置向外部网络发送不安全的数据包。
-
FORWARD 链
FORWARD 链用于处理经过本机转发的流量。当数据包不是发送给本机,而是要通过本机转发到其他网络时,它会经过 FORWARD 链。这个链通常在路由器和网关上使用,用于控制流量是否可以从一个接口转发到另一个接口。 用于路由器或网关,控制数据包是否可以从一个网络转发到另一个网络。
-
PREROUTING 链
PREROUTING 链用于处理进入本机的数据包,并且在路由决策之前进行处理。通常用于目标地址转换( DNAT ),即将外部的请求转发到内网的某个特定设备。 将来自外部的请求转发到内部网络中的不同服务,或进行目标地址转换( DNAT )。
-
POSTROUTING 链
POSTROUTING 链用于处理离开本机的数据包,并且在路由决策之后进行处理。它通常用于源地址转换( SNAT ),即将内网设备的源 IP 地址修改为路由器的公共 IP 地址,通常用于共享公网 IP 地址的情况。
-
各链的工作顺序
PREROUTING :首先处理进入本机的数据包,用于目标地址转换( DNAT )。
INPUT :如果数据包的目标是本机,数据包会进入 INPUT 链,决定是否允许本机接受该数据包。
FORWARD :如果数据包不属于本机(即目标是其他网络),数据包会进入 FORWARD 链,决定是否允许转发。
POSTROUTING :在数据包离开本机之前,源地址转换( SNAT )会在此链中进行。
OUTPUT :如果数据包是从本机发出的,数据包会经过 OUTPUT 链,决定是否允许本机向外发送该数据包。

11.1.4 工作流程
- 防火墙是一层层过滤的。按照配置规则的顺序从上到下,从前到后进行过滤的。此时,第一条规则匹配成功。则不会继续匹配。
- 如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。匹配到即停止继续匹配。
- 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
- 防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。
11.1.5 服务安装及使用
bash
[root@server3 ~]# yum install -y iptables-services
[root@server3 ~]# systemctl disable --now firewalld
[root@server3 ~]# setenforce 0
[root@server3 ~]# systemctl enable --now iptables
- 参数:
| 参数 | 作用 |
|---|---|
| -L | 列出一个链或所有链中的规则信息 |
| -n | 以数字形式显示地址、端口等信息 |
| -v | 以更详细的方式显示规则信息 |
| --line-numbers: | 查看规则时,显示规则的序号(方便之处,通过需要删除规则-D INPUT 1 |
| -F: | 清空所有的规则(-X是清理自定义的链,用的少;-Z清零规则序号) |
| -D | 删除链内指定序号(或内容)的一条规则 |
| -P | 为指定的链设置默认规则 |
| -A | 在链的末尾追加一条规则 |
| -I | 在链的开头(或指定序号)插入一条规则 |
| -t | 指定表名 |
- 参数使用
bash
[root@server3 ~]# iptables -t nat -L #查看指定表规则
[root@server3 ~]# iptables -L #如果不写 -t 默认使用 filter 表

bash
[root@server3 ~]# iptables -nL #以数字的形式显示ip和端口与协议
[root@server3 ~]# iptables -nL --line #显示规则行号

bash
[root@server3 ~]# iptables -F #清空规则
[root@server3 ~]# iptables -F 链名 #清空单独的某一个链里面的规则
[root@server3 ~]# iptables -t nat -F INPUT #清空单独的某一个表里的,某一个链里面的规则
[root@server3 ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT #插入规则到最后一行
[root@server3 ~]# iptables -I INPUT 4 -p udp -j ACCEPT #插入规则到第4行
[root@server3 ~]# iptables -t filter -D INPUT 5 #删除Filter表INPUT链中第5行规则
[root@server3 ~]# iptables-save > /etc/sysconfig/iptables #保存规则
11.2 firewalld
CentOS7/RHEL7 默认防火墙服务,全名 firewalld.service,是动态防火墙管理工具。它不是 Linux 内核真正的防火墙,内核真正的防火墙模块是 netfilter。
- 特点:
1.引入 Zone(区域)概念,按网络信任等级管理规则,使用简单;
2.区分临时规则(实时生效,重启丢失)和永久规则(需要 reload 加载);
3.支持规则动态更新,不用像老式 iptables 那样清空全部规则重载。
11.2.1 服务的启动与停用
bash
[root@server3 ~]# systemctl stop --now iptables
[root@server3 ~]# systemctl start --now firewalld
11.2.2 域zone相关的命令
bash
[root@server3 ~]# firewall-cmd --get-active-zones #显示当前正在使用的区域与网卡名称
[root@server3 ~]# firewall-cmd --get-zones #显示总共可用的区域
[root@server3 ~]# firewall-cmd --get-default-zone #查看默认区域
[root@server3 ~]# firewall-cmd --set-default-zone=区域名称 #更改默认区域


11.2.3 services管理的命令
bash
[root@server3 ~]# firewall-cmd --permanent --add-service=服务名称 --zone=区域名称 #向区域添加服务
[root@server3 ~]# firewall-cmd --permanent --remove-service=服务名称 --zone=区域名称 #删除服务
只要带 `--permanent`(永久模式),执行完必须重载才生效
如果不加 `--permanent`,就是临时删除,reload 或者重启服务后规则会恢复
[root@server3 ~]# firewall-cmd --reload
11.2.4 端口相关的命令
bash
[root@server3 ~]# firewall-cmd --permanent --add-port=8080/tcp --zone=public #永久在public区域放行TCP 8080端口
[root@server3 ~]# firewall-cmd --permanent --remove-port=8080/tcp --zone=public #永久删除public区域TCP 8080放行规则
[root@server3 ~]# firewall-cmd --permanent --add-port=80/tcp --zone=public #以添加端口的方式向 pubic 区域添加服务
[root@server3 ~]# firewall-cmd --permanent --add-source=192.168.246.201/24 --zone=drop #指定 IP 地址为 192.168.246.201/24 的客户端进入 drop 区域
[root@server3 ~]# firewall-cmd --permanent --remove-source=192.168.246.201/24 --zone=drop #将 192.168.246.201/24 移除 drop 区域
11.3 firewalld 和 iptables 的关系
1.底层同源
内核:netfilter(四表五链机制)
iptables:直接向 netfilter 下发规则的原生命令工具;firewalld:上层封装工具,内部最终还是调用 iptables 命令去操作 netfilter。
通俗比喻:
netfilter = 大楼安保系统(内核真正干活的)
iptables = 直接手动写安保规则
firewalld = 一套可视化管理平台,平台底层自动帮你生成 iptables 规则
2. 两者不能同时启用!
firewalld 和 iptables-services 两套服务都会操作内核 netfilter,同时开启规则会互相覆盖、冲突。
日常二选一使用:
- 默认:开启
firewalld - 传统运维:关闭 firewalld,安装启用
iptables-services
3.核心区别
- iptables(iptables-services)
直接操作四表五链,没有区域概念;
规则默认临时生效,保存规则需要手动执行service iptables save;
适合熟悉四表五链、需要复杂 NAT、流量调度场景。 - firewalld
封装 iptables,新增 Zone 模型;
语法更简单,适合普通服务器放行端口、限制 IP 访问;
动态重载,不需要中断现有网络连接。
十二、Apache服务
12.1 简介
Apache HTTP Server,常简称 Apache,是一款开源、跨平台、免费的 Web 服务器软件,由 Apache 软件基金会维护,是全球最早普及的 Web 服务程序之一。默认端口号:80
-
作用:
接收客户端(浏览器)HTTP/HTTPS 请求,分发网页、文件、图片等资源,对外提供网站访问服务。
-
特点
- 开源免费,源代码开放,商用无版权费用;
- 跨平台:支持 Linux(CentOS/RHEL/Ubuntu)、Windows 等主流操作系统;
- 模块化架构:核心程序小巧,功能依靠模块加载(如 ssl 模块实现 HTTPS、rewrite 实现 URL 重写、proxy 实现反向代理),按需开启,灵活扩展;
- 稳定性强,成熟可靠,长期大量网站使用;
- 支持多种功能:虚拟主机、访问控制、URL 重写、SSL 加密、反向代理、CGI/PHP 解析。
12.2 服务配置
12.2.1 安装与启动
bash
[root@server3 ~]# yum install -y httpd
[root@server3 ~]# systemctl start httpd
[root@server3 ~]# firewall-cmd --permanent --add-service=http #防火墙放行http服务端口
[root@server3 ~]# firewall-cmd --reload
[root@server3 ~]# cd /var/www/html #默认发布目录
[root@server3 html]# vim index.html #新建默认发布页面
[root@server1 ~]# curl -I server3 #在客户端测试是否可用

12.2.2 基本配置参数
主配置文件 : /etc/httpd/conf/httpd.conf
bash
ServerRoot "/etc/httpd" #用于指定 Apache 的运行目录
Listen 80 #监听端口
User apache #运行 apache 程序的用户和组
Group apache
DocumentRoot "/var/www/html" #网页文件的存放目录
ErrorLog "logs/error_log" #错误日志存放位置
AddDefaultCharset UTF-8 #默认支持的字符集
IncludeOptional conf.d/*.conf #加载其它配置文件
DirectoryIndex index.html #默认主页名称
语句块自定义目录权限
bash
<Directory "/var/www"> # 对 /var/www 目录配置访问规则
AllowOverride None # 不允许使用.htaccess覆盖Apache主配置
# Allow open access: # 允许开放访问权限
Require all granted # 放行所有客户端访问此目录
</Directory>

12.3 主机访问控制
服务端:
bash
[root@server3 ~]# cd /var/www/html
[root@server3 html]# mkdir admin
[root@server3 html]# cd admin
[root@server3 admin]# echo admin page > index.html

客户端查看是否配置成功:
bash
[root@server1 ~]# curl -I server3:80/admin/index.html
[root@server1 ~]# curl server3:80/admin/index.html

此时再回到服务端,配置文件,禁止客户端访问:
bash
[root@server3 admin]# vim /etc/httpd/conf/httpd.conf
[root@server3 admin]# systemctl restart httpd

客户端被禁止访问:

12.4 用户认证
服务端:
bash
[root@server3 ~]# htpasswd -cm /etc/httpd/conf/htpasswd admin
[root@server3 ~]# vim /etc/httpd/conf/httpd.conf #编辑内容如下图
[root@server3 ~]# systemctl restart httpd


访问服务端网址,登录成功后即可看见之前设置的展示内容


12.5 Apache虚拟主机
在一个Apache服务器上可以配置多个虚拟主机(实质上是一个站点),实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录。
- Apache虚拟主机配置有3种方法:
1.基于IP配置
2.基于域名配置
3.基于端口配置
基于域名的虚拟主机
定义默认发布站点
bash
#vim /etc/httpd/conf.d/default.conf
<VirtualHost _default_:80> #指定默认虚拟主机
DocumentRoot "/var/www/html"
</VirtualHost>
传统规则:不使用 _default_ 时,配置文件里第一个出现的 <VirtualHost> 就是默认站点。
使用 _default_:80 显式定义后,不再依赖顺序,谁写 _default_ 谁就是默认站点,不一定写在最前面
在服务端新建一个虚拟机主机,不使用默认发布目录
bash
vim /etc/httpd/conf.d/vhost.conf #文件名vhost自定义,后缀必须为.conf
提示:可以在此文件中添加多个虚拟机,也可以在此文件中添加用户认证,仅需要单独定义。

/www/www.linux.org 就是网站网页根目录(文件夹),系统默认不存在,必须手动创建
bash
[root@server3 ~]# cd /etc/httpd/conf.d
[root@server3 conf.d]# mkdir -p /www/www.linux.org
[root@server3 conf.d]# systemctl restart httpd
[root@server3 conf.d]# cd /www/www.linux.org/
[root@server3 www.linux.org]# echo www.linux.org > index.html
客户端添加解析,测试是否配置成功
bash
[root@server1 ~]# vim /etc/hosts
[root@server1 ~]# curl www.linux.org


十三、SELinux
13.1 简介
Selinux是一种控制服务安全,是内核上面的一个插件,叫做安全加强型linux,它是一套强制访问控制(MAC)安全机制。CentOS / RHEL 系列系统默认开启。
13.2 两种访问控制概念
- 自主访问控制 DAC(传统 Linux 权限)
就是我们熟悉的rwx文件权限、属主 / 属组。
文件所有者可以随意修改权限,权限一旦泄露风险很高。 - 强制访问控制 MAC(SELinux)
系统策略统一规定进程能访问哪些资源,不受 rwx 权限约束 。
哪怕文件 777 全开,如果 SELinux 策略不允许,进程依旧无法读取。
13.3 三种运行模式
bash
# 查看当前模式
getenforce
- Enforcing 强制模式(默认)
违反策略的操作直接阻止,同时记录日志。 - Permissive 宽容模式
不阻止操作,只把违规行为记录日志,常用于排错。 - Disabled 关闭模式
完全不加载 SELinux 安全机制。
⚠️注意:从 Disabled 切换到 Enforcing必须重启服务器;Enforcing ↔ Permissive 可以在线切换。
临时切换为宽容模式(重启失效):
bash
setenforce 0
# setenforce 1 改回强制模式
永久修改配置文件 /etc/selinux/config或/etc/sysconfig/selinux,两者存在软链接关系,修改后必须重启系统才能生效。
bash
SELINUX=enforcing
# SELINUX=permissive
# SELINUX=disabled
13.4 Kernel arguments(内核启动参数,优先级最高)
在 GRUB 启动菜单增加内核参数,可以开机强制控制 SELinux 状态:
selinux=0→ 直接禁用 SELinux(等同于 Disabled)selinux=1→ 启用 SELinuxenforcing=0→ SELinux 启用,但工作在 Permissive 宽容模式enforcing=1→ SELinux 启用,工作在 Enforcing 强制模式
优先级:内核启动参数 >
/etc/sysconfig/selinux文件配置。
13.5 管理SELinux Context
查询服务端SELinux状态,如是disabled状态,需要在配置文件中修改后重启才能生效
bash
[root@server3 ~]# vim /etc/sysconfig/selinux
[root@server3 ~]# reboot
[root@server3 ~]# getenforce

生效后在客户端server1测试 Apache 虚拟主机能否正常访问,显示失败

服务端查看文件的安全上下文,httpd服务的默认目录可以访问,自主创建的无法访问。
bash
ls -Z 文件/目录
ps -efZ | grep httpd #查看 httpd 进程运行时的 SELinux 上下文
安全上下文是SELinux 给系统每一个文件、进程、端口打上一组标签,用来做访问控制的,即使文件权限 777,上下文不对依旧会被拦截。
格式:user:role:type:level
我们重点关心 type :可以看到,在上图中,默认目录的 type 是标准网站目录标签:httpd_sys_content_t,而新建目录默认标签是 default_t,不是网站类型,故开启 SELinux 后,Apache 无法读取。
可以临时修改文件/目录类型:chcon -R -t httpd_sys_content_t 文件/目录
bash
[root@server3 ~]# chcon -R -t httpd_sys_content_t /www
客户端测试,此时可正常连接。

若想永久修改
在客户端:
bash
[root@server3 ~]# yum install -y policycoreutils-python #安装 SELinux 管理工具包
[root@server3 ~]# semanage fcontext -l |grep /var/www #列出系统所有永久 SELinux 文件上下文策略库

可以看出,我们可以对自定义网站目录手动添加策略,永久保存目录标签规则,使得新创建文件也能自动继承安全上下文,更改后刷新安全上下文,不然修改不生效。
bash
[root@server3 ~]# semanage fcontext -a -t httpd_sys_content_t '/www(/.*)?' #向SELinux永久策略库新增规则;匹配/www目录以及目录下所有子目录、文件,赋予httpd可读安全标签httpd\_sys\_content\_t
# -a :add,新增一条上下文策略
# -t httpd_sys_content_t :指定安全类型,允许 httpd 读取静态网页
# /www(/.*)? 正则含义:匹配 /www 目录,以及 /www 下所有子目录、所有文件
[root@server3 ~]# restorecon -vvFR /www #依据SELinux策略库规则,递归刷新/www目录、所有子目录以及全部文件的安全上下文
13.6 CGI程序
CGI 是一套标准通信规范 ,实现 Web 服务器(httpd/nginx) 和 外部可执行程序 之间的数据交互。
浏览器请求到达 Apache,Apache 调用外部程序(shell、C、python、perl 脚本)处理动态逻辑,再把程序输出的内容返回给浏览器。
这个外部程序,就叫做 CGI 程序 。
脚本放在 /var/www/cgi-bin 下就可以被执行(≠ 丢进去就能直接执行)
示例:
请求通过网络送达server3的httpd;Apache匹配内置cgi-bin别名,读取本地/var/www/cgi-bin/test.cgi
Apache不会直接读取文件源码,而是将该文件作为程序在服务端server3执行,运行脚本,标准输出的内容传回服务端server1并打印在终端
服务端:
bash
[root@server3 ~]# cd /var/www/cgi-bin
[root@server3 cgi-bin]# vim test.cgi
[root@server3 cgi-bin]# chmod a+x test.cgi #为CGI脚本增加全局执行权限,若无执行权限,Apache无法拉起该脚本运行
[root@server3 cgi-bin]# ll
[root@server3 cgi-bin]# ./test.cgi #在server3本机终端直接运行CGI脚本

客户端:
bash
[root@server1 ~]# curl server3/cgi-bin/test.cgi

13.7 SELinux booleans布尔值开关
SELinux 布尔值(boolean)是可切换的策略开关 ,用来在不重新编译策略包的前提下,灵活放开 / 收紧特定权限,控制域之间的访问行为。
只有两种状态:on(开启) / off(关闭)。
bash
getsebool -a # 查看所有布尔开关
getsebool httpd_enable_cgi # 查询布尔开关httpd_enable_cgi的状态
getsebool -a | grep httpd # 过滤httpd相关布尔值
setsebool httpd_enable_cgi on # 临时修改布尔值(重启失效)
setsebool -P httpd_enable_cgi on # 永久修改布尔值(加上-P,写入策略库)
SELinux 存在端口绑定限制,不可以随便改端口。
查询SELinux策略库中全部端口标签映射规则:semanage port -l

http_port_t类型对应的合法TCP端口清单(80,81,443,488,8008,8009,8443,9000)