1. 总结openssh服务安全加固和总结openssh免密认证原理,及免认证实现过程。

 openssh 服务安全加固总结
协议版本限制
尽量使用较新且安全的 SSH 协议版本,如 OpenSSH 8.0 及以上版本。在配置文件中可以通过Protocol指令指定允许的协议版本,一般建议禁用版本 1,仅保留版本 2(Protocol 2),因为 SSH 协议版本 1 存在较多安全漏洞。
监听地址设置
通过ListenAddress指令指定 SSH 服务监听的 IP 地址。避免在不必要的网络接口上监听,以减少潜在的攻击面。例如,如果服务器有多个网卡,只在需要提供 SSH 服务的特定网卡 IP 上监听。
端口修改
更改默认的 SSH 端口(22)。选择一个高位端口(例如在 1024 - 65535 之间),可以在一定程度上减少自动化扫描工具对 SSH 服务的探测。修改配置文件中的Port指令,并确保防火墙规则相应地更新以允许新端口的通信。
用户认证限制
禁止 root 用户直接登录:在sshd_config中设置PermitRootLogin no。这可以防止攻击者直接尝试以拥有最高权限的 root 用户登录,迫使用户以普通用户登录后再通过sudo等机制提升权限。
限制特定用户登录:使用AllowUsers和DenyUsers指令来精确控制允许或禁止登录的用户名单。例如,AllowUsers user1 user2只允许 user1 和 user2 登录,DenyUsers user3则禁止 user3 登录。
使用强密码策略:如果使用基于密码的认证方式,结合系统的密码策略,如设置密码长度、复杂度要求等,确保用户密码难以被暴力破解。同时,可以考虑使用 PAM(Pluggable Authentication Modules)来进一步增强密码认证的安全性。
密钥认证优化
强制使用密钥认证:将PasswordAuthentication设置为no,这样可以只允许基于密钥的认证方式,大大提高安全性。同时,要妥善保管用户的私钥,并设置合适的权限(私钥文件权限应设置为 600,所属用户为对应的用户)。
登录尝试限制
使用MaxAuthTries指令:设置允许的最大认证尝试次数,例如MaxAuthTries 3,防止暴力破解攻击。当用户尝试认证次数超过此限制时,SSH 连接将被断开。
利用DenyHosts或 `Fail2ban:这些工具可以自动检测和阻止频繁尝试登录失败的 IP 地址,进一步增强对暴力破解的防护能力。
日志记录增强
设置详细的日志记录:通过LogLevel指令设置合适的日志级别,如LogLevel VERBOSE,可以记录更多关于 SSH 连接和认证的详细信息,便于审计和故障排查。同时,确保将 SSH 服务的日志发送到集中的日志服务器进行统一管理和监控。

OpenSSH免密认证原理

OpenSSH免密认证主要通过公钥和私钥的方式实现,其原理如下:

生成密钥对:
在客户端机器上,使用ssh-keygen命令生成一对公钥和私钥。公钥用于加密信息,私钥用于解密信息。
复制公钥到服务器:
使用ssh-copy-id命令或手动将客户端的公钥复制到服务器上的指定位置(通常是用户家目录下的.ssh/authorized_keys文件)。
认证过程:
当客户端尝试连接到服务器时,服务器会要求客户端提供用户名。
服务器在收到用户名后,会到authorized_keys文件中查找与该用户名对应的公钥。
如果找到匹配的公钥,服务器会生成一个随机的字符串(通常称为“挑战”),并使用客户端提供的公钥进行加密后发送给客户端。
客户端收到加密的挑战后,使用自己的私钥进行解密,并将解密后的字符串(通常称为“响应”)发送回服务器。
服务器将收到的响应与之前的挑战进行对比,如果一致,则允许客户端免密码登录。
这种认证方式的安全性在于私钥的保密性。只要私钥不被泄露,即使公钥被公开,攻击者也无法伪造有效的认证信息。因此,在使用OpenSSH免密认证时,务必妥善保管私钥文件,避免将其泄露给未经授权的用户或系统。

ssh当前主机登录其它主机免登录

ssh客户端登录免登录

生成公钥id_rsa_2048.pub

将生成公钥id_rsa_2048.pub写入文件.ssh/authorized_keys

验证是否可以免密登录

             

2. 总结sudo配置文件格式,总结相关示例。

sudo的配置文件主要是/etc/sudoers,它用于集中管理用户的使用权限和使用的主机。以下是对sudo配置文件格式的详细总结及相关示例:

一、sudo配置文件格式
文件位置与权限
sudo配置文件默认位于/etc/sudoers。
该文件的属性必须为0440,以确保其安全性。
基本结构
配置文件由一系列规则组成,每行算一个规则。
以#开头的行为注释行,不会被执行。
如果规则较长,可以使用\进行续行。
别名定义
别名定义包括四种类型:User_Alias(用户别名)、Runas_Alias(运行身份别名)、Host_Alias(主机别名,尽管在问题中未直接提及,但它是sudo配置文件的一部分)、Cmnd_Alias(命令别名)。
别名定义的格式一般为:Alias_Type NAME = item1, item2, ...。其中,Alias_Type为别名类型,NAME为别名,item为成员,成员之间通过半角逗号分隔。
授权规则
授权规则指定了哪些用户(或用户组)可以以哪些身份执行哪些命令。
授权规则的一般格式为:user ALL=(runas) command。其中,user为用户(或用户别名),ALL表示该规则适用于所有主机(也可以指定特定的主机或主机别名),runas为运行身份(或运行身份别名),command为要执行的命令(或命令别名)。
还可以添加额外的限制,如NOPASSWD:标签,表示执行该命令时无需输入密码。


二、相关示例
别名定义示例
用户别名定义:User_Alias ADMINS = alice, bob, charlie。这表示定义了一个用户别名ADMINS,它包含了三个用户:alice、bob和charlie。
运行身份别名定义:Runas_Alias DB_ADMINS = mysql, postgresql。这表示定义了一个运行身份别名DB_ADMINS,它包含了两个数据库用户:mysql和postgresql。
命令别名定义:Cmnd_Alias SYSTEM_COMMANDS = /sbin/shutdown, /sbin/reboot, /bin/mount。这表示定义了一个命令别名SYSTEM_COMMANDS,它包含了三个系统命令。
授权规则示例
允许特定用户执行特定命令:alice ALL=(ALL) /usr/bin/apt update, /usr/bin/apt upgrade。这表示用户alice可以以任何用户的身份执行apt update和apt upgrade命令。
限制用户只能以特定用户身份执行命令:bob ALL=(www-data) /usr/sbin/apache2ctl restart。这表示用户bob只能以www-data用户的身份执行apache2ctl restart命令来重启Apache服务。
允许用户无需输入密码即可使用sudo执行特定命令:charlie ALL=(ALL) NOPASSWD: /usr/bin/ls, /usr/bin/cat。这表示用户charlie可以以任何用户的身份执行ls和cat命令,且无需输入密码。
允许用户组执行特定命令:%developers ALL=(ALL) /usr/bin/gcc, /usr/bin/make。这表示用户组developers的所有成员都可以以任何用户的身份执行gcc和make命令。
复杂示例
结合别名定义和授权规则:
User_Alias SYSAD = admin1, admin2
Cmnd_Alias ADMIN_CMDS = /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd
SYSAD ALL=(ALL) ADMIN_CMDS
这表示定义了一个用户别名SYSAD,它包含了两个用户:admin1和admin2。同时定义了一个命令别名ADMIN_CMDS,它包含了三个系统管理命令。最后,授权规则允许SYSAD别名下的所有用户以任何用户的身份执行ADMIN_CMDS别名下的所有命令。

三、注意事项
在编辑/etc/sudoers文件时,应使用visudo命令而不是直接编辑文件。visudo命令会检查语法错误,并提供一些基本的帮助信息,以确保配置的正确性。
在配置用户权限时,应遵循最小权限原则,即只授予用户执行所需任务所需的最小权限。这有助于减少潜在的安全风险。
sudo命令的执行记录会保存在系统日志中(如/var/log/secure或/var/log/auth.log),这些记录对于审计和故障排除非常有用。
综上所述,sudo配置文件格式灵活且功能强大,通过合理的配置可以实现精细化的用户权限控制。在实际使用中,应遵循最小权限原则,并定期检查和维护sudo的配置和日志记录,以确保系统的安全性和稳定性。

3. 搭建时间同步服务器,详细总结配置和搭建过程

1、NTP服务器配置,安装和配置NTP服务器

#在rocky上安装和配置NTP服务器(cc-rocky)

#安装chrony
yum -y install chrony


#编辑chrony配置文件
vim /etc/chrony.conf

# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server ntp.aliyun.com  iburst
server ntp1.aliyun.com  iburst
server ntp2.aliyun.com  iburst

# Allow NTP client access from local network.
allow  0.0.0.0/0

# Serve time even if not synchronized to a time source.
local stratum 10

#启动chrony
systemctl start chronyd

2、NTP客户端配置

#在rocky上安装和配置NTP客户端(cc-rocky0)

#安装chrony
yum -y install chrony

#编辑chrony配置文件
vim /etc/chrony.conf

# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 10.0.0.8  iburst

#启动chrony
systemctl start chronyd

#在rocky上安装和配置NTP客户端(cc-ubuntu、cc-ubuntu0)

#安装chrony
apt -y install chrony

#编辑chrony配置文件
vim /etc/chrony.conf

# See http://www.pool.ntp.org/join.html for more information.
server 10.0.0.8  iburst

#重新启动chrony
systemctl restart chronyd

3、测试同步结果

#测试同步结果
chronyc sources -v

NTP服务器与Internet的时间同步结果

NTP客户端与NTP服务器的同步结果


4. 总结常见的日志服务管理的常见日志服务和

日志服务管理扮演着至关重要的角色,它帮助系统管理员监控系统的运行状态、诊断问题并采取相应的解决措施。以下是日志服务管理中常见的日志服务总结:

1. rsyslog
简介:rsyslog是Linux系统中广泛使用的日志服务之一,它是syslog的增强版,提供了更高的性能、更好的安全性和模块化设计。
特点:
支持多种输入和输出模块,可以灵活地将日志发送到不同的目的地,如文件、数据库、远程服务器等。
提供了强大的过滤和格式化功能,可以根据需要筛选和格式化日志信息。
配置灵活,支持通过配置文件和命令行参数进行定制。
2. systemd-journal
简介:systemd-journal是systemd提供的日志服务,它采用二进制格式存储日志信息,并支持高效的查询和过滤功能。
特点:
可以存储更多的元数据,如时间戳、主机名、优先级等,便于后续的分析和查询。
提供了强大的日志查询和过滤功能,可以快速定位到所需的日志信息。
与systemd紧密集成,可以方便地管理systemd服务的日志。
3. ELK Stack(Elasticsearch, Logstash, Kibana)
简介:ELK Stack是一个开源的日志收集、分析和可视化解决方案,由Elasticsearch、Logstash和Kibana三个组件组成。
特点:
Elasticsearch是一个分布式搜索引擎,可以高效地存储和检索日志数据。
Logstash用于日志收集和处理,支持多种输入和输出插件,可以灵活地配置日志的收集和处理流程。
Kibana提供了一个友好的Web界面,方便用户进行日志的查询、分析和可视化。
4. Splunk
简介:Splunk是一款商业化的日志管理和分析软件,广泛应用于企业日志管理和安全分析领域。
特点:
提供了实时的日志收集、索引、搜索和分析功能。
支持多种数据源和日志格式,可以方便地接入各种系统的日志数据。
提供了丰富的可视化图表和告警功能,可以帮助用户快速发现潜在的问题。
5. Graylog
简介:Graylog是一个开源的日志管理系统,提供了日志收集、处理、分析和可视化功能。
特点:
具有灵活的日志收集和处理能力,支持多种输入和输出插件。
提供了强大的查询和过滤功能,可以根据需要筛选和定位日志信息。
支持Web界面和REST API,方便用户进行远程管理和自动化操作。
综上所述,Linux日志服务管理中常见的日志服务包括rsyslog、systemd-journal、ELK Stack、Splunk和Graylog等。这些服务各具特点,适用于不同的应用场景和需求。在选择合适的日志服务时,需要根据实际需求和系统环境进行综合考虑。

5. 总结日志分类, 优先级别。图文并茂解释应用如何将日志发到rsyslog,并写到目标。

日志是记录系统事件、用户操作、程序运行等信息的重要文件。这些日志信息对于系统管理员来说至关重要,因为它们可以帮助管理员监控系统状态、诊断问题、追踪用户行为等。以下是Linux日志的分类和优先级别的总结:
一 、Linux 日志分类
系统日志(/var/log/messages)
内容:记录 Linux 系统运行过程中的各种常规信息,包括系统启动和关闭信息、内核消息、服务守护进程的启动和停止消息等。例如,当系统启动时,会记录各个硬件设备的初始化情况;在系统运行期间,会记录网络服务(如 SSH、HTTP 等)的连接与断开信息。
用途:用于监控系统的整体运行状态,通过查看这些日志,可以了解系统是否正常运行,及时发现系统级别的异常情况,如硬件故障或服务异常。
安全日志(/var/log/secure)
内容:主要涉及系统安全相关的信息。其中包括用户登录(成功和失败的登录尝试)、用户认证过程(如使用 SSH 密钥认证或密码认证)、权限变更(如用户被添加到某个特权组)等内容。例如,当有用户通过 SSH 远程登录系统时,会记录登录的 IP 地址、登录时间以及使用的认证方式等信息。
用途:是安全审计的重要依据,通过分析安全日志,可以检测到未经授权的访问尝试、暴力破解密码等安全威胁,有助于加强系统的安全性。
应用程序日志(不同应用程序有不同的日志位置)
内容:由各种应用程序自行生成的日志。以常见的 Web 服务器软件 Apache 为例,它的日志通常位于/var/log/httpd/目录下,包括访问日志(记录客户端对 Web 服务器的访问请求,如访问的 URL、客户端 IP 地址、访问时间等)和错误日志(记录服务器在处理请求过程中出现的错误,如文件不存在、权限不足等错误信息)。
用途:用于调试和监控应用程序的运行情况,帮助开发人员和运维人员定位应用程序的问题,了解用户对应用程序的使用模式。
系统引导日志(/var/log/dmesg)
内容:记录系统启动过程中的内核消息。包括硬件检测信息(如检测到的 CPU 型号、内存大小、硬盘设备等)、加载的内核模块信息(如加载的文件系统模块、网络驱动模块等)。例如,当系统启动时,会显示识别到的 USB 设备、加载的网卡驱动等信息。
用途:用于排查系统启动过程中的问题,特别是与硬件和内核模块相关的问题,如硬件无法识别或者内核模块加载失败等情况。
用户日志(/var/log/wtmp、/var/log/btmp)
内容:/var/log/wtmp记录所有用户的登录和注销信息,包括登录时间、注销时间、登录终端等。/var/log/btmp则专门记录失败的登录尝试信息,如登录的用户名、尝试登录的时间和来源 IP 地址等。
用途:用于追踪用户的活动情况,以及检测可能的非法登录尝试,是用户行为分析和安全监控的重要资源。


二、Linux日志优先级别
Linux日志优先级别用于表示日志信息的重要性和紧急程度。常见的日志优先级别包括以下几种(按优先级从高到低排序):

EMERG(0):紧急,会导致主机系统不可用的情况。这是最高优先级的日志级别,通常用于记录系统崩溃、硬件故障等严重问题。
ALERT(1):警告,必须马上采取措施解决的问题。这个级别用于记录需要立即关注并处理的问题,如非法入侵、账号被篡改等。
CRIT(2):严重,较为严重的情况。这个级别用于记录可能影响系统正常运行但尚未导致系统崩溃的问题,如磁盘满了、内存不够等。
ERR(3):错误,运行出现错误。这个级别用于记录程序运行时的错误信息,需要尽快修复。
WARNING(4):提醒,可能影响系统功能,需要提醒用户的重要事件。这个级别用于记录可能影响系统功能但尚未导致错误的问题,如根目录inode耗尽等。
NOTICE(5):注意,不会影响正常功能,但是需要注意的事件。这个级别用于记录一些需要注意但不会影响系统正常运行的事件。
INFO(6):信息,正常的系统运行产生的信息。这个级别用于记录系统正常运行时的信息,如用户登录、服务启动等。
DEBUG(7):调试,程序或者系统调试信息。这个级别用于记录程序或系统调试时的信息,通常用于开发或测试阶段。
此外,还有一个特殊的级别“none”,表示不记录任何消息。

在实际应用中,系统管理员可以根据日志的优先级别来过滤和查看日志信息,以便更快地定位和处理问题。同时,合理的日志级别设置也有助于减少日志文件的冗余和占用空间。

应用将日志发到rsyslog的流程
启用网络日志服务:
在rsyslog服务器上,需要启用网络日志服务,以便接收来自其他主机的日志。这通常通过修改rsyslog配置文件(如/etc/rsyslog.conf)来实现,添加或修改如下配置以启用UDP日志接收:

#在服务器端,修改sshd服务配置
vim /etc/rsyslog.conf

module(load="imudp")
input(type="imudp" port="514")

同样,如果需要启用TCP日志接收,可以添加或修改如下配置:

#在服务器端,修改sshd服务配置
vim /etc/rsyslog.conf

module(load="imtcp")
input(type="imtcp" port="514")

配置应用发送日志:
在应用服务器上,需要配置应用将日志发送到rsyslog服务器。这通常通过修改应用的配置文件来实现。
例如,对于sshd服务,可以修改/etc/ssh/sshd_config文件,设置SyslogFacility为指定的分类(如local6),然后重启sshd服务。

#在客户端,修改sshd服务配置
vim /etc/ssh/sshd_config

SyslogFacility LOCAL6

#在客户端,修改sshd配置
vim /etc/rsyslog.d/50-default.conf

local6.*                       @10.0.0.10:154

#在客户端,重启sshd和rsyslog服务
systemctl restart sshd rsyslog.service

配置rsyslog写入目标:
在rsyslog服务器上,还需要配置rsyslog将接收到的日志写入到指定的文件中。这同样通过修改rsyslog配置文件(如/etc/rsyslog.conf或/etc/rsyslog.d/目录下的配置文件)来实现。
例如,可以添加如下配置来将local6分类的所有日志写入到/var/log/ssh.log文件中:

#在服务器端,修改rsyslog服务配置
vim /etc/rsyslog.d/50-default.conf

local6.*     /var/log/all-ssh.log

测试日志发送与接收:
最后,可以在应用服务器上使用logger命令或触发应用生成日志来测试日志的发送与接收。例如,可以使用如下命令发送一条info级别的日志到rsyslog服务器:

#在客户端,发送消息
logger -p local6.info "This is a test log message"

然后,在rsyslog服务器上使用tail -f /var/log/all-ssh.log命令查看是否接收到了该日志消息

#在服务器端,查看消息
tail -f /var/log/all-ssh.log

6.完成功能,sshd应用将日志写到rsyslog的local6分类,过滤所有级别,写入到/var/log/ssh.log。

#x修改sshd服务配置
vim /etc/ssh/sshd_config

SyslogFacility LOCAL6

#修改sshd配置
vim /etc/rsyslog.d/50-default.conf

local6.*                       /var/log/ssh.log

#重启sshd和rsyslog服务
systemctl restart sshd rsyslog.service

#测试结果
tail -f  /var/log/ssh.log

7. 完成功能,将3个主机(要求主机名为ip)的ssh日志,通过rsyslog服务将ssh日志写入到集中的主机上的rsyslog服务,写入到/var/log/all-ssh.log文件

#在2台客户端和服务器修改sshd服务配置
vim /etc/ssh/sshd_config

SyslogFacility LOCAL6

#服务器修改rsyslog配置
vim /etc/rsyslog.d/50-default.conf

local6.*                       /var/log/all-ssh.log

#2台客户端修改rsyslog配置
vim /etc/rsyslog.d/50-default.conf

local6.*                      @10.0.0.10:154

#重启2台客户端和服务器sshd和rsyslog服务
systemctl restart sshd rsyslog.service

#2台客户端和服务器修改命令提示符
echo "PS1='\[\e[1;35m\][\u@\H \W]\\$\[\e[0m\]'" >> .bashrc
#2台客户端和服务器分别修改主机名
hostnamectl set-hostname 10.0.0.100
hostnamectl set-hostname 10.0.0.101
hostnamectl set-hostname 10.0.0.10

#2台客户端和服务器分别发送消息
logger -p local6.info "This is a test log message for 10.0.0.100"
logger -p local6.info "This is a test log message for 10.0.0.101"
logger -p local6.info "This is a test log message for 10.0.0.10"

#测试结果
tail -f  /var/log/all-ssh.log

8. 总结/var/log/目录下常用日志文件作用。

/var/log/ 目录下存放的是Linux系统日志文件,这些文件记录了系统运行过程中的各种事件和错误信息,对于系统管理员进行系统维护和故障排查至关重要。以下是一些常用日志文件及其作用的总结:

/var/log/messages
记录整体系统信息,包括系统启动期间的日志,以及其他重要的系统事件。它是系统最重要的日志文件之一,通常用于诊断系统问题和安全事件。
/var/log/syslog
记录系统运行过程中产生的各种信息,包括系统服务、应用程序日志等。它是系统管理员进行故障排查的重要依据。
/var/log/auth.log(或/var/log/secure,取决于系统配置)
记录系统的认证和授权相关信息,包括用户登录、sudo命令使用等。它对于安全审计和入侵检测非常重要。
/var/log/kern.log
记录内核产生的日志信息,包括硬件设备驱动、内核模块加载等。它对于诊断硬件问题和内核故障非常有用。
/var/log/dmesg
包含内核缓冲信息(kernel ring buffer),记录系统启动时内核检测到的硬件设备信息。该文件的内容可以通过dmesg命令查看。
/var/log/boot.log
记录系统启动过程中的详细信息,包括启动的服务、启动顺序等。它对于诊断系统启动问题非常有用。
/var/log/maillog(或/var/log/mail.log)
记录邮件服务器的日志信息,包括邮件的存取和往来。例如,sendmail日志信息会记录在这个文件中。
/var/log/daemon.log
记录各种系统后台守护进程的日志信息。
/var/log/cron
记录cron进程启动工作的相关信息。每当cron进程开始一个工作时,就会将相关信息记录在这个文件中。
/var/log/lastlog
记录每个用户最后的登录信息。这不是一个ASCII文件,因此需要用lastlog命令查看内容。
/var/log/btmp
记录所有失败的登录尝试。使用lastb命令可以查看这个文件的内容。
/var/log/wtmp 或 /var/log/utmp
记录当前登录的用户以及登录会话信息。使用w、who、last等命令可以查看这些信息。
/var/log/faillog
记录用户登录失败的信息,包括错误登录命令等。
特定服务的日志文件
例如,Apache HTTP服务器的日志文件通常位于/var/log/httpd/或/var/log/apache2/目录下,包括访问日志(access.log)和错误日志(error.log)。
MySQL数据库服务器的日志文件通常位于/var/log/mysql/目录下,包括错误日志(error.log)、查询日志(query.log)等。
其他日志文件
/var/log/dpkg.log:记录使用dpkg命令安装或清除软件包的日志。
/var/log/alternatives.log:记录更新替代信息。
/var/log/cups:记录打印信息的日志。
/var/log/anaconda.log:在安装Linux时,记录所有安装信息。
/var/log/yum.log:记录使用yum安装的软件包信息。

9. 总结journalctl命令的选项及示例. 完成将多个主机(要求主机名为ip)的nginx日志集中写入到mysql表中

journalctl 是用于查询和查看系统日志的实用工具,以下是一些常见的选项及示例:
常用选项
-n 或 --lines
作用:限制显示日志的行数,方便快速查看最近的若干条日志记录。
示例:

 journalctl -n 10 #查看最近 10 条系统日志

-f 或 --follow
作用:实时跟踪日志输出,类似于 tail -f 对普通文本日志的跟踪效果,日志有新内容产生时会实时显示在终端。
示例:

 journalctl -f #实时跟踪系统日志的更新情况

-u 或 --unit
作用:按指定的系统服务单元(systemd unit)来查看相关日志,有助于排查特定服务的问题。
示例:

journalctl -u httpd #查看 httpd 服务(假设使用 systemd 管理)的日志

--since 和 --until
作用:指定日志的时间范围来查看,--since 用于设定起始时间,--until 用于设定截止时间。时间格式可以有多种,比如 “YYYY-MM-DD HH:MM:SS” 等。
示例:

journalctl --since "2024-11-01 00:00:00" --until "2024-11-10 23:59:59" #查看从 2024-11-01 00:00:00 到 2024-11-10 23:59:59 的系统日志

-p 或 --priority
作用:按日志优先级(严重程度级别,比如 emerg、alert、crit 等)来筛选显示日志,有助于聚焦重要的错误或警告信息。
示例:

 journalctl -p err #查看优先级为 error 及以上的日志,(err 代表 error 级别,也可以用对应的数字代码表示优先级)。

-o 或 --output
作用:指定日志的输出格式,常见格式有 “short”(默认格式)、“verbose”(更详细格式)、“json”(以 JSON 格式输出,便于后续程序处理等)等。
示例:

journalctl -o json  #以 JSON 格式输出日志

--disk-usage
作用:查看日志文件占用磁盘空间的情况。
示例:

 journalctl --disk-usage #当前系统日志占用了多少磁盘空间。

--vacuum-size 和 --vacuum-time
作用:用于清理日志,通过限制日志占用的磁盘空间大小(--vacuum-size)或者保留特定时长内的日志(--vacuum-time)来实现日志文件大小控制。
示例:

 journalctl --vacuum-size=1G #将日志文件磁盘占用大小控制在 1GB 以内
 journalctl --vacuum-time=7d #保留最近 7 天的日志

组合使用示例
例如,要查看 nginx 服务在 2024-11-20 08:00:00 到 2024-11-20 18:00:00 之间出现的 error 及以上优先级的日志,并且以详细格式输出,可以使用如下组合命令:

journalctl -u nginx --since "2024-11-20 08:00:00" --until "2024-11-20 18:00:00" -p err -o verbose

总之,通过灵活运用 journalctl 的这些选项,可以高效地查询、分析和管理系统日志,帮助排查系统及服务相关的各类问题。

10. 完成将多个主机(要求主机名为ip)的nginx日志集中写入到mysql表中

#1、在ubuntu0(website0:10.0.0.100),ubuntu1(website1:10.0.0.101),修改rsyslog设置

vim /etc/rsyslog.d/50-default.conf  #修改rsyslog设置
*.info                          @10.0.0.10:514

systemctl restart sshd rsyslog.service #重新启动rsyslog


#2、在ubuntu(proxy:10.0.0.10)收集ubuntu0和ubuntu1日志,连接mysql

apt -y install mysql-server rsyslog-mysql#安装软件

vim /etc/rsyslog.conf #编辑rsyslog配置文件,开启udp端口

module(load="imudp")
input(type="imudp" port="514")


vim  /etc/rsyslog.d/mysql.conf #编辑mysql连接设置

module (load="ommysql")
*.info  action(type="ommysql" server="10.0.0.8" db="Syslog" uid="rsyslog" pwd="123456")

systemctl restart sshd rsyslog.service #重新启动rsyslog

#3、在rocky(10.0.0.8),安装和配置数据库
 
yum -y install mysql-server # 使用yum包管理器安装mysql-server

mysql;# 登录到MySQL数据库服务器
create database Syslog;# 创建一个名为Syslog的数据库
create user 'rsyslog'@'10.0.0.%' identified by '123456';# 创建一个名为'rsyslog'的用户,该用户可以从10.0.0.x网段的任意IP地址连接到MySQL服务器,并设置密码为'123456'
grant all on Syslog.* to 'rsyslog'@'10.0.0.%';# 授予'rsyslog'用户对Syslog数据库的所有权限
mysql -ursyslog -p123456 -h10.0.0.8 Syslog < /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql # 使用'rsyslog'用户连接到位于10.0.0.8的MySQL服务器,并使用密码'123456'登录,然后导入Syslog数据库的初始化数据



#4、测试结果
#ubuntu0、ubuntu1、ubuntu发送测试信息
ubuntu0(website0:10.0.0.100):
  systmctl stop nignx #关闭nignx
  systmctl start nignx #开启nignx
ubuntu1(website1:10.0.0.101):
  systmctl stop nignx #关闭nignx
  systmctl start nignx #开启nignx
ubuntu(proxy:10.0.0.10):
  systmctl stop nignx #关闭nignx
  systmctl start nignx #开启nignx
rocky(10.0.0.8):
   mysql#进入mysql  
   use Syslog; #使用Syslog数据库
   select FromHost,Message from SystemEvents order by id desc limit 10;#查看日志

测试结果:

11. 尝试使用logrotate服务切割nginx日志,每天切割一次,要求大于不超过3M, 保存90天的日志, 旧日志以时间为后缀,要求压缩。

#编辑日志分割配置文件
# 使用vim编辑器打开nginx的logrotate配置文件
vim /etc/logrotate.d/nginx
 
# 指定要轮转的日志文件路径
/var/log/nginx/*.log {
        # 每日轮转日志文件
        daily
        
        # 如果日志文件不存在,则忽略错误
        missingok
        
        # 保留90个轮转后的日志文件
        rotate 90
        
        # 当日志文件大小达到3MB时触发轮转,但注意与daily等选项的交互
        size 3M
        
        # 轮转后压缩旧的日志文件
        compress
        
        # 使用日期作为扩展名来命名轮转后的日志文件
        dateext
        
        # 延迟压缩直到下一次轮转周期,以避免在轮转期间同时访问和压缩文件
        delaycompress
        
        # 如果日志文件为空,则不轮转
        notifempty
        
        # 轮转后创建新的日志文件,并设置权限为0640,所有者为www-data,组为adm
        create 0640 www-data adm
        
        # 对于所有指定的日志文件,只运行一次脚本(如果有的话)
        sharedscripts
        
        # 在轮转前执行的脚本
        prerotate
                # 如果/etc/logrotate.d/httpd-prerotate目录存在,则运行其中的脚本
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                        run-parts /etc/logrotate.d/httpd-prerotate; \
                fi \
        endscript
        
        # 在轮转后执行的脚本
        postrotate
                # 重新加载nginx配置以应用日志文件的更改
                invoke-rc.d nginx rotate >/dev/null 2>&1
        endscript
}

#使用dd命令创建两个测试日志文件,access.log和error.log,每个文件大小为3MB
dd if=/dev/zero of=/var/log/nginx/access.log  bs=1M count=3
dd if=/dev/zero of=/var/log/nginx/error.log  bs=1M count=3

#执行logrotate /etc/logrotate.d/nginx来手动触发日志文件的轮转
logrotate  /etc/logrotate.d/nginx


12. apache不出题,各位按照课程练习下即可

pache HTTP Server(简称Apache)是Apache软件基金会的一个开放源代码的网页服务器,可以在大多数计算机操作系统中运行,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。以下是关于在Linux系统中安装并配置Apache2的详细步骤:

一、安装Apache2
登录Linux系统:
以root用户或具有sudo权限的用户身份登录到Linux系统,确保拥有必要的权限来安装和配置软件。
更新软件包信息:
在安装新的软件之前,建议更新系统的包管理器以获取最新的软件包信息。使用命令sudo apt update(适用于Debian/Ubuntu系统)。
安装Apache2:
使用命令sudo apt install apache2来安装Apache2软件包。
验证安装:
安装完成后,可以通过命令sudo systemctl status apache2来检查Apache的状态,确保其正在运行。
Apache服务在安装后通常会自动启动并设置为开机自启。若未自动启动,可手动启动并设置自动启动。使用命令sudo systemctl start apache2手动启动Apache服务,使用命令sudo systemctl enable apache2设置Apache服务为开机自启。
二、配置Apache2
Apache配置文件结构:
Apache的主要配置文件位于/etc/apache2目录下,包含多个子目录和文件,用于管理不同的配置项。
主配置文件:/etc/apache2/apache2.conf
端口配置:/etc/apache2/ports.conf
站点配置:/etc/apache2/sites-available/
模块配置:/etc/apache2/mods-available/和/etc/apache2/mods-enabled/
修改主配置文件:
使用文本编辑器(如nano)打开主配置文件:sudo nano /etc/apache2/apache2.conf。
在该文件中,可以根据需求修改或添加配置项,如服务器管理员的电子邮件地址(ServerAdmin)、网站的根目录(DocumentRoot)以及目录设置(Directory Settings)等。
配置虚拟主机:
虚拟主机允许在同一台服务器上托管多个网站。默认情况下,Apache2在/etc/apache2/sites-available目录下提供了一个名为000-default.conf的默认虚拟主机配置文件。
可以复制此文件并进行相应的更改以创建新的虚拟主机。例如,创建一个名为example.com的虚拟主机,可以按照以下步骤操作:
在/etc/apache2/sites-available目录下创建一个新的配置文件:sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf。
使用文本编辑器打开新创建的文件:sudo nano /etc/apache2/sites-available/example.com.conf。
更改ServerName和ServerAlias为域名,例如:ServerName example.com和ServerAlias www.example.com。
更改DocumentRoot为要托管的网站文件的目录路径,例如:DocumentRoot /var/www/html/example.com。
保存文件并关闭文本编辑器。
禁用默认的虚拟主机配置文件:sudo a2dissite 000-default.conf。
启用新的虚拟主机配置文件:sudo a2ensite example.com.conf。
重新加载Apache2配置:sudo systemctl reload apache2。
其他配置:
默认网站首页存放主目录路径可以在/etc/apache2/sites-available/000-default.conf文件中配置,参数为DocumentRoot [path]。
默认网站首页可以在/etc/apache2/mods-available/dir.conf文件中配置,参数为DirectoryIndex [file1] [file2] …,可以对应多个文件,若前面的文件找不到则往后查找。
端口号可以在/etc/apache2/ports.conf文件中配置,参数为Listen [port]。如果更改了端口或添加了更多端口,还需要更改/etc/apache2/sites-enabled/000-default.conf文件中的VirtualHost语句。
三、防火墙设置
在外部访问Apache服务器时,需要在Linux系统的防火墙中允许Apache的默认端口(通常是80端口)被外部访问。这可以通过关闭防火墙(不推荐,因为这会降低系统安全性)或配置防火墙规则来实现。
四、访问网站
在Linux系统的终端中执行ifconfig命令查看系统的IP地址。
打开浏览器,输入localhost或http://[Linux系统的IP地址]来访问Apache服务器。
通过以上步骤,可以在Linux系统中成功安装并配置Apache2。请根据实际需求和系统环境进行相应的调整

安装并配置Apache2作为默认Web服务器

Ubuntu

# 更新软件包索引
sudo apt update
 
# 安装Apache2
sudo apt install apache2 -y
 
# 启动Apache2服务并设置开机自启
sudo systemctl start apache2
sudo systemctl enable apache2
 
# 检查Apache2是否正在运行
sudo systemctl status apache2

CentOS

# 更新软件包索引(对于CentOS 8及以上版本使用dnf)
sudo yum update  # CentOS 7及以下
# sudo dnf update  # CentOS 8及以上
 
# 安装httpd(Apache2在CentOS上的名称)
sudo yum install httpd -y  # CentOS 7及以下
# sudo dnf install httpd -y  # CentOS 8及以上
 
# 启动httpd服务并设置开机自启
sudo systemctl start httpd
sudo systemctl enable httpd
 
# 检查httpd是否正在运行
sudo systemctl status httpd

配置Apache2(Ubuntu和CentOS通用)

Apache2的主配置文件通常位于/etc/apache2/(Ubuntu)或/etc/httpd/conf/(CentOS)目录下。在Ubuntu上,你可能还需要编辑/etc/apache2/apache2.conf或/etc/apache2/ports.conf来更改全局设置。

# Apache2 虚拟主机配置文件示例
# 文件名: mysite.conf
# 位置: /etc/apache2/sites-available/ (Ubuntu) 或 /etc/httpd/conf.d/ (CentOS)
 
# 定义一个基于域名的虚拟主机
<VirtualHost *:80>
    # 服务器管理员的电子邮件地址
    ServerAdmin webmaster@mysite.com
 
    # 文档根目录,即网站文件存放的目录
    DocumentRoot "/var/www/mysite"
 
    # 服务器名称,即你的域名
    ServerName mysite.com
 
    # 服务器别名,可以是你的域名的其他形式,如www子域名
    ServerAlias www.mysite.com
 
    # 错误日志文件的路径
    ErrorLog ${APACHE_LOG_DIR}/mysite-error.log
 
    # 访问日志文件的路径和格式
    CustomLog ${APACHE_LOG_DIR}/mysite-access.log combined
 
    # 启用.htaccess文件中的重写规则(如果需要)
    <Directory "/var/www/mysite">
        AllowOverride All
        Require all granted
    </Directory>
 
    # 将所有HTTP请求重定向到HTTPS(可选)
    # 注意:这需要在服务器上安装并配置有效的SSL/TLS证书
    Redirect 301 / https://mysite.com/
</VirtualHost>
 
# 定义一个基于HTTPS的虚拟主机
<VirtualHost *:443>
    # 服务器管理员的电子邮件地址(与上面相同)
    ServerAdmin webmaster@mysite.com
 
    # 文档根目录(与上面相同)
    DocumentRoot "/var/www/mysite"
 
    # 服务器名称和别名(与上面相同)
    ServerName mysite.com
    ServerAlias www.mysite.com
 
    # SSL/TLS配置开始
    # 你的SSL证书文件的路径(这里是一个示例路径)
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/mysite.crt
    # 你的SSL证书密钥文件的路径(这里是一个示例路径)
    SSLCertificateKeyFile /etc/ssl/private/mysite.key
    # 如果你有一个SSL证书链文件,也需要指定它的路径(可选)
    # SSLCertificateChainFile /etc/ssl/certs/chain.crt
 
    # 错误日志文件和访问日志文件的路径(与上面相同,但可以使用不同的日志文件)
    ErrorLog ${APACHE_LOG_DIR}/mysite-ssl-error.log
    CustomLog ${APACHE_LOG_DIR}/mysite-ssl-access.log combined
 
    # 启用.htaccess文件中的重写规则(如果需要,与上面相同)
    <Directory "/var/www/mysite">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

 注意:
1. 在Ubuntu上,需要使用`a2ensite mysite.conf`来启用这个配置文件。
2. 在CentOS上,只需要确保配置文件放在/etc/httpd/conf.d/目录下,并重新加载httpd服务。
3. 在启用SSL/TLS之前,请确保你已经从可信的证书颁发机构获取了SSL证书,并将其路径正确配置在SSLCertificateFile和SSLCertificateKeyFile指令中。
4. 如果使用了自签名证书进行测试,请确保浏览器信任了这个证书,或者访问网站时接受了安全警告。
5. 如果想要强制所有HTTP请求都重定向到HTTPS,需要确保你的服务器上有有效的SSL证书,并且在上面的<VirtualHost *:80>部分添加了Redirect指令。

日志管理
Apache的日志文件通常位于/var/log/apache2/(Ubuntu)或/var/log/httpd/(CentOS)目录下。

常见日志文件:

access.log:记录所有对Apache服务器的访问请求。
error.log:记录Apache服务器的错误和警告信息。
 

Ubuntu实例:

# 在/etc/apache2/sites-available/mycustomsite.conf中

<VirtualHost *:8080>
    # 服务器管理员的电子邮件地址(可选)
    ServerAdmin webmaster@mycustomsite.com
    
    # 文档根目录
    DocumentRoot /var/www/mycustomsite
    
    # 服务器名称(域名或IP地址)
    ServerName mycustomsite.com
    
    # 错误日志文件的位置
    ErrorLog ${APACHE_LOG_DIR}/mycustomsite-error.log
    
    # 访问日志文件的位置和格式(combined是Apache的一个标准日志格式)
    CustomLog ${APACHE_LOG_DIR}/mycustomsite-access.log combined
    
    # 允许.htaccess文件中的指令覆盖全局设置(如果需要使用.htaccess文件)
    <Directory /var/www/mycustomsite>
        AllowOverride All
        Require all granted
    </Directory>
    
    # 其他可能的配置指令...
    # 例如,启用SSL、设置重写规则等
</VirtualHost>

CentOS实例:

# 在/etc/httpd/conf.d/mycustomsite.conf中

<VirtualHost *:8080>
    # 服务器管理员的电子邮件地址(可选)
    ServerAdmin webmaster@mycustomsite.com
    
    # 文档根目录
    DocumentRoot "/var/www/mycustomsite"
    
    # 服务器名称(域名或IP地址)
    ServerName mycustomsite.com
    
    # 错误日志文件的位置(注意路径可能需要根据实际系统进行调整)
    ErrorLog "logs/mycustomsite-error.log"
    
    # 访问日志文件的位置和格式(combined是Apache的一个标准日志格式)
    CustomLog "logs/mycustomsite-access.log" combined
    
    # 允许.htaccess文件中的指令覆盖全局设置(如果需要使用.htaccess文件)
    <Directory "/var/www/mycustomsite">
        AllowOverride All
        Require all granted
    </Directory>
    
    # 其他可能的配置指令...
    # 例如,启用SSL、设置重写规则等
</VirtualHost>


注意:在Ubuntu上,别忘了使用a2ensite mycustomsite.conf命令启用新的虚拟主机配置,并重新加载Apache服务。在CentOS上,直接重新加载或重启Apache服务即可。

13. 总结http协议相关面试题,建议面试前背一背。参考链接: https://juejin.cn/post/7117533146454687757

叙述对HTTP 0.9、HTTP 1.0、HTTP 2.0、HTTP 3.0 四个版本的联系与区别


联系
基础目标一致:它们的核心目标都是为了实现客户端(如浏览器)与服务器之间的超文本传输,以支持网页等资源在网络上的交互获取,保障互联网应用能够正常展现和运行。
协议演进关系:后续版本都是在前一版本基础上,为了应对不断出现的新需求、解决旧版本存在的问题而逐步发展演变而来的,整体是一脉相承的技术迭代过程。


区别
HTTP 0.9(最早且极为简单的版本)
功能特性:
只支持 GET 请求方法,意味着客户端只能从服务器获取资源,无法进行像提交数据等更复杂操作。
传输的内容只有 HTML 格式的文本内容,功能非常单一。
没有请求头、响应头的概念,通信过程很简洁直接,发送请求获取页面内容后就结束交互。
应用场景及局限:在互联网发展早期,简单的静态网页浏览场景下能基本满足需求,但随着网页内容丰富、交互性增强等发展趋势,其功能匮乏的问题凸显,无法适应后续复杂应用。
HTTP 1.0
功能特性:
新增了多种请求方法,比如 POST、HEAD 等,POST 方法使得客户端可以向服务器提交数据,拓展了交互的维度。
引入了请求头和响应头,能够在其中携带诸如内容类型(如 text/html、image/jpeg 等)、编码格式、缓存控制等丰富的元信息,方便服务器和客户端更好地处理和展示内容、管理缓存等。
支持传输多种类型的文件,不再局限于 HTML 文本,像图片、CSS 样式文件等都能传输,促使网页变得更加美观、功能更丰富。
应用场景及局限:虽然相比 0.9 有了很大进步,但它每次请求都需要建立一个新的 TCP 连接,在加载包含多个资源(如图片众多的网页)时,频繁建立和断开连接会导致性能损耗,加载速度受限,对于复杂、资源繁多的页面响应效率不高。
HTTP 2.0
功能特性:
采用二进制格式进行数据传输,相较于 HTTP 1.0 的文本格式,解析效率更高,更利于计算机进行处理,同时也增强了传输的稳定性和安全性。
引入了多路复用技术,一个 TCP 连接里可以同时并发多个请求和响应,多个资源的请求不用排队等待,极大提高了传输效率,解决了 HTTP 1.0 中连接频繁创建销毁导致的性能瓶颈问题。
具备头部压缩功能,通过特定算法对请求头和响应头中重复出现的信息进行压缩,减少了网络传输的数据量,进一步提升传输效率。
支持服务器推送,服务器可以主动向客户端推送一些它认为客户端可能后续需要的资源,比如在客户端请求 HTML 页面时,服务器主动推送相关的 CSS、JavaScript 文件等,优化页面加载速度。
应用场景及局限:极大地提升了网页等应用的加载性能,尤其适用于如今复杂的、资源众多且交互频繁的网页应用和移动端应用,但在应对一些网络环境多变、丢包严重等复杂情况时,由于底层还是基于 TCP 协议,会面临一些诸如队首阻塞(一个流中的某个数据包丢失会阻塞后续所有流的处理)的问题。


HTTP 3.0
功能特性:
最大的改变是将底层传输协议从 TCP 换成了 QUIC(Quick UDP Internet Connections)协议,基于 UDP 实现,但又融合了 TCP 的可靠传输等特性,解决了 TCP 存在的队首阻塞问题,在丢包等复杂网络环境下也能有较好的传输表现,提升传输的灵活性和效率。
继承了 HTTP 2.0 的诸多优秀特性,如多路复用、头部压缩、服务器推送等,在保障高效利用网络资源、优化交互体验的同时,借助新的底层协议进一步增强了性能。
具备更好的连接迁移能力,比如当用户从一个网络切换到另一个网络(如从 WiFi 切换到移动数据)时,能够更平滑地保持连接,不影响正在进行的传输任务。
应用场景及局限:适用于对网络性能、连接稳定性要求极高的现代互联网应用场景,像高清视频流传输、实时互动的云游戏、大型在线协作办公等场景,但由于其较新,协议推广和在一些老旧网络设施兼容等方面还面临一定挑战,全面普及需要一定时间。
总体而言,HTTP 协议各版本的演进是为了不断适配互联网发展中日益增长的性能、功能需求,逐步走向更高效、更可靠、更智能的超文本传输解决方案。

介绍一下HTTP 协议通信过程和HTTP协议通信过程
 

HTTP(超文本传输协议)通信过程主要包括以下几个阶段:

一、建立连接

域名解析(可选)
当客户端(如浏览器)要访问一个网站时,通常使用域名来标识服务器。例如,访问 “www.example.com”。首先,客户端需要将域名解析为对应的 IP 地址。这一过程是通过 DNS(域名系统)服务器来完成的。客户端会向本地 DNS 服务器发送请求,本地 DNS 服务器如果没有缓存该域名对应的 IP 地址,会向上一级 DNS 服务器查询,直到找到权威 DNS 服务器获取到 IP 地址。
TCP 连接建立
客户端使用获取到的服务器 IP 地址,通过 TCP(传输控制协议)协议与服务器建立连接。这一过程涉及 TCP 的三次握手。
第一次握手:客户端向服务器发送一个带有 SYN(同步序列号)标志的 TCP 数据包,这个数据包中包含一个初始序列号(ISN),用于后续数据传输的排序和确认。例如,客户端发送一个 SYN = 1,ISN = x 的数据包。
第二次握手:服务器收到客户端的 SYN 数据包后,会发送一个 SYN/ACK(同步 / 确认)数据包作为回应。这个数据包中的 SYN 标志用于同步服务器的序列号,ACK 标志用于确认收到客户端的序列号。服务器的 SYN 标志对应的序列号设为 y,ACK 标志对应的确认号设为 x + 1,表示已经收到客户端的序列号并且期待下一个序列号是 x+1。例如,服务器发送 SYN = 1,ISN = y,ACK = x + 1 的数据包。
第三次握手:客户端收到服务器的 SYN/ACK 数据包后,会发送一个 ACK 数据包进行确认。这个数据包中的 ACK 标志对应的确认号设为 y + 1,表示已经收到服务器的序列号并且期待下一个序列号是 y + 1。例如,客户端发送 ACK = y + 1 的数据包。经过这三次握手,TCP 连接成功建立,双方可以开始传输数据。


二、客户端发送请求

构建请求报文
请求行:包含请求方法(如 GET、POST、PUT、DELETE 等)、请求的 URL(统一资源定位符)和 HTTP 协议版本(如 HTTP/1.1 或 HTTP/2.0)。例如,在一个简单的 GET 请求中,请求行可能是 “GET /index.html HTTP/1.1”,其中 “GET” 是请求方法,“/index.html” 是请求的资源路径,“HTTP/1.1” 是协议版本。
请求头:包含各种与请求相关的信息。比如 “Host” 字段,用于指定请求的目标主机域名,这在服务器托管多个域名时很重要;“User - Agent” 字段,用于告知服务器客户端的软件类型和版本,例如浏览器类型和版本号;“Accept” 字段,用于说明客户端能够接受的内容类型,如 “text/html,application/xhtml+xml,application/xml;q = 0.9,image/webp,image/apng,/;q = 0.8” 表示客户端可以接受多种格式的内容,并且对不同格式有不同的接受优先级(通过 q 值表示);“Cookie” 字段,如果客户端之前与服务器建立过会话并且服务器设置了 Cookie,那么这个字段会包含相关的 Cookie 信息,用于服务器识别客户端的身份或状态。
请求体(部分请求方法需要):对于 POST 等请求方法,需要在请求体中放置要发送的数据。例如,在提交一个表单时,请求体中可能包含表单字段的名称和值,如 “username = john&password = 1234”。
发送请求报文
客户端将构建好的请求报文通过已经建立好的 TCP 连接发送给服务器。


三、服务器处理请求

接收请求报文
服务器通过 TCP 连接接收客户端发送的请求报文。
解析请求报文
服务器解析请求行,确定请求方法和要访问的资源路径,同时了解请求的协议版本。
服务器解析请求头,获取各种相关信息,如客户端的身份、接受的内容类型等,这些信息将用于后续生成响应。
如果有请求体,服务器也会解析请求体,提取其中的数据,例如提取表单数据用于数据库插入等操作。
生成响应报文
响应行:包含 HTTP 协议版本、响应状态码和状态描述。例如,“HTTP/1.1 200 OK”,其中 “HTTP/1.1” 是协议版本,“200” 是状态码,表示请求成功,“OK” 是状态描述。常见的状态码还有 404(资源未找到)、500(服务器内部错误)等。
响应头:包含与响应相关的各种信息。例如,“Content - Type” 字段用于告知客户端返回内容的类型,如 “text/html” 表示返回的是 HTML 文档;“Content - Length” 字段用于告知客户端返回内容的长度,以便客户端准确接收;“Set - Cookie” 字段用于设置 Cookie,用于后续会话管理等。
响应体:包含实际要返回给客户端的内容,如请求的 HTML 页面、图片文件的二进制数据、API 返回的 JSON 数据等。
发送响应报文
服务器将生成好的响应报文通过 TCP 连接发送回客户端。


四、客户端接收并处理响应

接收响应报文
客户端通过 TCP 连接接收服务器发送的响应报文。
解析响应报文
客户端解析响应行,了解请求是否成功以及响应的状态码和状态描述。
客户端解析响应头,获取返回内容的类型、长度等信息。
客户端从响应体中提取实际内容,例如,如果是 HTML 文档,就可以进行渲染展示;如果是图片文件,就可以进行显示等。
关闭连接(可选)
在完成请求 - 响应交互后,客户端和服务器可以选择关闭 TCP 连接。不过,在 HTTP/1.1 及以后的版本中,支持持久连接,即可以保持连接用于后续的请求 - 响应,以减少连接建立和关闭的开销。如果选择关闭连接,会通过 TCP 的四次挥手来完成。
第一次挥手:主动关闭方(可以是客户端也可以是服务器)发送一个 FIN(结束)标志的 TCP 数据包,表示自己没有数据要发送了。
第二次挥手:另一方收到 FIN 数据包后,发送一个 ACK 数据包,表示已经收到 FIN 数据包。
第三次挥手:另一方(如果它也没有数据要发送了)发送一个 FIN 数据包,表示自己也没有数据要发送了。
第四次挥手:主动关闭方收到 FIN 数据包后,发送一个 ACK 数据包,表示已经收到 FIN 数据包,此时连接完全关闭。

HTTPS通信过程主要包括以下几个阶段:

建立 TCP 连接
与 HTTP 协议一样,通信的第一步是建立 TCP 连接。客户端(如浏览器)根据服务器的域名,通过 DNS(域名系统)解析获取服务器的 IP 地址。然后,客户端使用该 IP 地址与服务器进行 TCP 的三次握手来建立连接。
第一次握手:客户端向服务器发送一个带有 SYN(同步序列号)标志的 TCP 数据包,这个数据包包含一个初始序列号(ISN),用于后续数据传输的排序和确认。
第二次握手:服务器收到客户端的 SYN 数据包后,发送一个 SYN/ACK(同步 / 确认)数据包作为回应。这个数据包中的 SYN 标志用于同步服务器的序列号,ACK 标志用于确认收到客户端的序列号。
第三次握手:客户端收到服务器的 SYN/ACK 数据包后,发送一个 ACK 数据包进行确认,此时 TCP 连接成功建立。


SSL/TLS 协商阶段
客户端发起 SSL/TLS 握手请求(ClientHello)
客户端向服务器发送一个 “ClientHello” 消息。这个消息包含了很多重要信息,如客户端支持的 SSL/TLS 协议版本(例如 TLS 1.2、TLS 1.3 等),因为不同版本有不同的安全特性和加密算法;加密套件列表,加密套件是一组加密算法和密钥交换算法的组合,例如 RSA - AES - GCM 等,这是为了让服务器选择合适的加密方式;还有一个随机数(Client Random),这个随机数将用于后续生成会话密钥。
服务器响应(ServerHello)
服务器收到 “ClientHello” 消息后,会返回一个 “ServerHello” 消息。这个消息包含服务器选择的 SSL/TLS 协议版本,通常是从客户端支持的版本中选择一个双方都兼容的;加密套件,是从客户端提供的加密套件列表中挑选出来的;另一个随机数(Server Random)。同时,服务器会发送自己的数字证书,这个证书包含了服务器的公钥,用于身份验证。
客户端验证服务器证书
客户端收到服务器证书后,会对证书进行验证。首先检查证书是否是由可信任的证书颁发机构(CA)颁发的,客户端通常会预先安装一些受信任的 CA 根证书,通过这些根证书来验证服务器证书的颁发链是否合法。其次,检查证书是否过期,以及证书的域名与服务器的域名是否匹配。如果证书验证不通过,客户端通常会向用户显示警告信息,提示可能存在安全风险。如果证书验证通过,客户端就可以使用证书中的公钥进行后续操作。
密钥交换和生成会话密钥
根据协商好的加密套件,客户端和服务器会进行密钥交换操作。以 RSA 加密套件为例,客户端会生成一个随机的对称密钥(也称为预主密钥,Pre - Master Secret),这个对称密钥将用于后续数据加密。然后客户端使用服务器证书中的公钥对这个对称密钥进行加密,并发送给服务器。服务器收到后,使用自己的私钥解密得到对称密钥。在使用 Diffie - Hellman(DH)或其变种(如 ECDHE)加密套件时,双方会通过一系列复杂的数学运算来共同生成会话密钥。例如,在 ECDHE 中,客户端和服务器分别生成自己的临时椭圆曲线密钥对,然后交换公钥部分,通过结合自己的私钥和对方的公钥,利用椭圆曲线算法的特性,双方可以计算出相同的会话密钥。
完成 SSL/TLS 握手
客户端发送一个 “ChangeCipherSpec” 消息,表示之后的数据将使用协商好的会话密钥和加密套件进行加密。然后发送一个 “Finished” 消息,这个消息包含经过加密的握手消息的摘要,用于验证握手过程的完整性。服务器收到 “ChangeCipherSpec” 和 “Finished” 消息后,也会发送“ChangeCipherSpec” 和 “Finished” 消息。至此,SSL/TLS 握手完成,双方建立了一个安全的加密通道。


数据传输阶段
客户端发送请求
客户端构建 HTTP 请求报文,包括请求行、请求头和请求体(如果有)。与 HTTP 不同的是,这些请求报文会使用协商好的会话密钥和加密算法进行加密,然后通过加密通道发送给服务器。
服务器处理请求
服务器收到加密的请求报文后,使用会话密钥进行解密,然后按照 HTTP 协议的方式处理请求。即解析请求报文,生成响应报文。
服务器发送响应
服务器将生成的响应报文使用会话密钥进行加密,然后通过加密通道发送回客户端。
客户端接收并处理响应
客户端收到加密的响应报文后,使用会话密钥进行解密,然后按照 HTTP 协议的方式解析响应报文,提取内容并进行相应处理。
关闭连接(可选)
在完成请求 - 响应交互后,客户端和服务器可以选择关闭 TCP 连接和 SSL/TLS 会话。关闭过程和 HTTP 类似,也是通过 TCP 的四次挥手来完成,同时 SSL/TLS 会话相关的资源也会被释放。


​介绍一下请求报文和响应报文的结构,以及响应报文的响应码的含义

请求报文结构
请求行
这是请求报文的起始部分,包含三个关键元素:请求方法、请求 URL 和 HTTP 协议版本。
请求方法:定义了客户端对服务器资源的操作类型。常见的有:
GET:用于从服务器获取资源,例如获取网页、图片、文档等。它是幂等的,多次请求相同的 URL 应该返回相同的结果。
POST:用于向服务器提交数据,比如提交表单数据(用户注册、登录、发表评论等场景)。POST 请求的数据通常包含在请求体中,且它不是幂等的。
PUT:用于更新服务器上指定资源的全部内容,会用请求体中的数据替换服务器上对应的资源。
DELETE:用于请求服务器删除指定的资源。
请求 URL:指明客户端想要访问的服务器资源的位置,例如 “/index.html” 表示服务器根目录下的 index.html 文件。它也可以包含查询参数,如 “/search?q=keyword”,其中 “q=keyword” 就是查询参数,用于向服务器传递搜索关键词等信息。
HTTP 协议版本:如 “HTTP/1.1” 或 “HTTP/2.0”,表明请求所遵循的 HTTP 协议版本。
请求头
由一系列键值对组成,用于向服务器传递额外的请求信息。例如:
Host:指定请求的目标主机域名,在服务器托管多个域名时,用于明确请求的具体目标,如 “Host: www.example.com”。
User - Agent:告知服务器客户端的软件信息,包括软件类型和版本。例如浏览器类型和版本号,像 “User - Agent: Mozilla/5.0 (Windows NT 10.0; Win64;x64) AppleWebKit/7600.14 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36”。
Accept:表示客户端能够接受的内容类型,格式为类型 / 子类型的列表,也可以包含优先级(q 值)。例如 “Accept: text/html,application/xhtml + xml,application/xml;q = 0.9,image/webp,image/apng,/;q = 0.8”,这表明客户端最希望接收 text/html 类型的内容。
Accept - Language:用于指定客户端接受的语言,例如 “Accept - Language: en - US,en;q = 0.9”,表示客户端最希望接收美式英语内容。
Accept - Encoding:表示客户端能够接受的内容编码方式,如 gzip、deflate 等,用于压缩传输内容,例如 “Accept - Encoding: gzip,deflate”。
Cookie:如果客户端之前与服务器有交互并且服务器设置了 Cookie,这个字段会包含相关的 Cookie 信息,用于服务器识别客户端的身份或状态。
请求体(可选)
不是所有请求都有请求体。GET 请求通常没有请求体,因为它主要是获取资源。而 POST、PUT 等请求通常有请求体,用于包含要发送的数据。例如,在 POST 请求提交表单时,请求体可能包含 “username = john&password = 1234” 这样的表单字段值。请求体的内容类型由请求头中的 “Content - Type” 字段指定。


响应报文结构
响应行
位于响应报文的开头,包含三个部分:HTTP 协议版本、响应状态码和状态描述。
HTTP 协议版本:与请求报文中的协议版本相对应,如 “HTTP/1.1” 或 “HTTP/2.0”。
响应状态码:是一个三位数字的代码,用于告知客户端请求的处理结果。
状态描述:是对响应状态码的简单文字解释,如 “OK”(对应状态码 200)、“Not Found”(对应状态码 404),方便用户理解响应状态。
响应头
也是一系列键值对,用于向客户端传递有关响应的信息。例如:
Content - Type:告知客户端返回内容的类型,格式为类型 / 子类型,如 “Content - Type: text/html” 表示返回的是 HTML 文档,“Content - Type: image/jpeg” 表示返回的是 JPEG 格式的图片。
Content - Length:告知客户端返回内容的长度(字节数),例如 “Content - Length: 1234”,方便客户端准确接收内容。
Set - Cookie:用于设置 Cookie,将信息存储在客户端,用于后续会话管理,例如 “Set - Cookie: sessionid = 12345;expires = Fri, 31 - Dec - 2024 23:59:59 GMT;path = /”。
Cache - Control:用于控制客户端的缓存行为,如 “Cache - Control: max - age = 3600” 表示客户端可以缓存内容 3600 秒。
Content - Encoding:如果返回的内容经过编码(如 gzip 压缩),这个字段会告知客户端内容的编码方式,例如 “Content - Encoding: gzip”。
响应体
包含服务器实际要返回给客户端的具体内容,如请求的 HTML 页面、图片文件的二进制数据、API 返回的 JSON 数据等。


响应码的含义
1xx(信息性)
这类状态码主要用于提供信息,在 HTTP/1.1 协议中用于中间状态通信,不太常见。例如:
100(Continue):客户端发送带有请求体的请求(如 POST)时,先发送请求头,服务器返回 100 表示可以继续发送请求体。
2xx(成功)
200(OK):最常见的成功状态码,表示服务器成功处理请求并返回请求的内容。例如,客户端请求一个网页,服务器找到并返回网页的 HTML 内容时返回此码。
201(Created):表示请求成功且在服务器上创建了新的资源。通常在 POST 或 PUT 请求后返回,比如用户成功注册新账号,服务器创建新用户记录后可能返回此码。
204(No Content):服务器成功处理请求,但没有返回内容。比如客户端请求删除资源,服务器成功删除后返回此码,因为不需要返回数据。
3xx(重定向)
301(Moved Permanently):请求的资源已永久移动到新 URL,客户端应使用新 URL 进行后续访问。例如网站域名更换,旧域名资源迁移到新域名,访问旧域名时服务器返回此码并在响应头提供新 URL。
302(Found):请求的资源临时移动到新 URL,客户端应使用新 URL 访问。与 301 不同的是它是临时重定向。
304(Not Modified):用于缓存控制。如果客户端发送缓存相关请求头(如 If - Modified - Since),服务器判断客户端缓存内容有效,就返回此码,告知客户端可以使用缓存内容,无需重新发送实际内容。
4xx(客户端错误)
400(Bad Request):客户端发送的请求有语法错误或请求参数不符合要求,如请求 URL 格式错误或请求头字段值不符合预期。
401(Unauthorized):请求的资源需要授权,但客户端未提供有效授权信息(如用户名和密码)或授权信息无效。
403(Forbidden):客户端有授权信息,但仍被禁止访问请求的资源,可能是权限不够或资源有访问限制。
404(Not Found):非常常见,客户端请求的资源在服务器上不存在,如请求不存在的网页或图片文件时返回此码。
5xx(服务器错误)
500(Internal Server Error):服务器在处理请求时发生内部错误,通常是服务器端代码问题,如程序崩溃、数据库查询出错等。
502(Bad Gateway):一般是代理服务器或网关服务器出现的错误。当代理服务器无法从后端服务器获取有效响应时返回此码,可能是后端服务器故障或网络问题。
503(Service Unavailable):服务器暂时无法处理请求,通常是因为服务器过载、维护或其他临时故障。例如服务器升级维护时收到请求会返回此码。

504(Gateway Time - out)是一种服务器返回的 HTTP 状态码,表示网关或者代理服务器在尝试从上游服务器获取响应时,没有在规定的时间内得到响应,出现了超时情况。

Logo

一站式 AI 云服务平台

更多推荐