This commit is contained in:
AaronXu
2025-11-13 14:27:03 +08:00
commit 3c39ce6d18
435 changed files with 30973 additions and 0 deletions

View File

@@ -0,0 +1,194 @@
# 1. SSH协议/OpenSSH服务
SSHSecure Shell协议是一种网络协议用于加密方式远程登录到服务器。它提供了一种安全的方法来传输数据防止数据在传输过程中被窃听或篡改。SSH 协议不仅用于远程登录还可用于远程执行命令、文件传输SFTP、端口转发等。
OpenSSH 是 SSH 协议的一个开源实现工具,由 OpenBSD 项目开发和维护。它是大多数 Unix和类 Unix 操作系统中默认的 SSH 实现,包括 Linux、macOS 和 FreeBSD 等等
OpenSSH 提供了服务端程序(openssh-server)和客户端工具(openssh-client)
* Mac 和 Linux 中默认已安装 ssh 客户端,可直接在终端中使用 ssh 命令
* Windows 需手动安装 ssh 客户端,较常用的 Windows SSH 客户端有 XShell和 MobaXterm
**SSH 能够提供两种安全验证的方法:**
* 基于**口令**的验证—用账户和密码来验证登录
* 基于**密钥**的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全
# 2. SSH 客户端使用
OpenSSH 服务提供我们 SSH 工具,该工具采用 SSH 协议来连接到远程主机上
## 2.1 SSH 常用操作
通过 SSH 协议登录远程主机
```shell
# 以 root 用户登录远程主机192.168.88.20
[root@localhost ~]# ssh root@192.168.88.20
root@192.168.88.20's password:
Last login: Tue Dec 24 15:42:36 2024 from 192.168.88.1
```
指定连接远程主机的端口号
```shell
# -P 参数指定远程主机的端口号
[root@localhost ~]# ssh root@192.168.88.20 -P22
#
root@192.168.88.20's password:
Last login: Tue Dec 24 15:43:18 2024 from 192.168.88.10
```
不登陆到远程主机中,仅仅执行某个命令并返回结果
```shell
[root@localhost ~]# ssh root@192.168.88.20 cat /etc/hosts
root@192.168.88.20's password:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
```
## 2.2 SCP 远程文件传输
除了连接到远程主机之外,我们也可以用附带的小工具 SCP 来进行远程文件下载和本地文件上传至远程主机
```shell
# 将本地文件上传至远程主机
本地 % scp root@172.16.175.129:/etc/passwd ./
root@172.16.175.129's password:
passwd 100% 945 1.2MB/s 00:00
# 将远程主机上的文件下载至本地
本地 % scp cmatrix-1.2a.tar.gz root@172.16.175.129:/tmp/
root@172.16.175.129's password:
cmatrix-1.2a.tar.gz 100% 73KB 20.2MB/s 00:00
```
# 3. 服务端配置文件
sshd 服务的配置信息保存在 `/etc/ssh/sshd_config` 文件中。运维人员一般会把保存着最主要配置信息的文件称为主配置文件,而配置文件中有许多以井号开头的注释行,要想让这些配置参数生效,需要在修改参数后再去掉前面的 `#`
**常见配置项**
| 配置项 | 说明 |
| :-------------------------------- | :---------------------------------- |
| Port 22 | 默认的sshd服务端口 |
| ListenAddress 0.0.0.0 | 设定sshd服务器监听的IP地址 |
| Protocol 2 | SSH协议的版本号 |
| HostKey /etc/ssh/ssh_host_key | SSH协议版本为1时DES私钥存放的位置 |
| HostKey /etc/ssh/ssh_host_rsa_key | SSH协议版本为2时RSA私钥存放的位置 |
| HostKey /etc/ssh/ssh_host_dsa_key | SSH协议版本为2时DSA私钥存放的位置 |
| PermitRootLogin yes | 设定是否允许root管理员直接登录 |
| StrictModes yes | 当远程用户的私钥改变时直接拒绝连接 |
| MaxAuthTries 6 | 最大密码尝试次数 |
| MaxSessions 10 | 最大终端数 |
| PasswordAuthentication yes | 是否允许密码验证 |
| PubkeyAuthentication yes | 是否允许使用公钥进行身份验证 |
# 4. 安全密钥验证
上面讲到ssh 远程连接,除了使用密码的方式登录,还可以使用密钥对进行登录。相比于密码等于而言,密钥登录会更加的安全
如果使用公钥和私钥进行加解密,那么我们称之为是一种非对称加密的方式进行加密,那同样的还有对称加密,同一个密钥加解密
非对称加密是一种加密方式,它涉及到两个密钥:一个公钥和一个私钥。公钥可以公开给任何人,而私钥则必须保密,只有密钥的拥有者才知道。这种加密方式的特点是使用公钥加密的数据只能通过对应的私钥来解密,反之亦然,使用私钥加密的数据只能通过对应的公钥来解密。
## 4.1 非对称加密
1. **密钥生成**:首先生成一对密钥,一个公钥和一个私钥。这两个密钥是数学上相关的,但即使知道其中一个,也很难计算出另一个。
2. **加密**:发送方使用接收方的公钥来加密信息。这个过程是可逆的,但只有拥有正确私钥的人才能解密。
3. **解密**:接收方使用自己的私钥来解密信息。这个过程确保了只有拥有私钥的接收方才能阅读信息。
我们可以想象一下,你有一个非常特别的邮箱,这个邮箱有一个特点:它有两个锁。一个锁是公开的,任何人都可以往里投信,但只有你知道如何打开它(私钥)。另一个锁是私有的,只有你知道它在哪里,而且只有你拥有打开它的钥匙(公钥)。
- **公钥(锁)**:你把这个特别的锁(公钥)放在一个公共的地方,比如你的家门口。任何人都可以给你写信,他们只需要用这个锁把你的信锁起来,然后投进你的邮箱。因为只有你知道如何打开这个锁,所以你的信件在运输过程中是安全的。
- **私钥(钥匙)**:你把打开这个锁的钥匙(私钥)藏在家里一个安全的地方。当信件到达时,你可以用你的私钥打开锁,取出信件阅读。
- **安全性**:即使有人试图复制这个锁(公钥),他们也无法制造出能打开它的钥匙(私钥),因为这两个是数学上相关的,但计算其中一个从另一个是几乎不可能的。
## 4.2 SSH密钥对口令验证
在客户端主机中生成**密钥对**
```shell
[root@localhost ~]# ssh-keygen
# 为简化操作请一路向北
# 查看/root/.ssh目录中是否存在id_rsa(私钥)和id_rsa.pub(公钥)
[root@localhost ~]# ls -al /root/.ssh/
total 16
drwx------. 2 root root 80 Dec 25 09:24 .
dr-xr-x---. 3 root root 159 Dec 24 15:58 ..
-rw-------. 1 root root 2610 Dec 25 09:24 id_rsa
-rw-r--r--. 1 root root 580 Dec 25 09:24 id_rsa.pub
-rw-------. 1 root root 837 Dec 24 15:43 known_hosts
-rw-r--r--. 1 root root 95 Dec 24 15:43 known_hosts.old
```
把客户端主机中生成的公钥文件传送至远程主机
```shell
# 使用 ssh-copy-id 这个工具,可以将公钥内容发送给目标主机
[root@localhost ~]# ssh-copy-id 192.168.88.20
# 为简化操作请一路向北,输入一次密码即可
# 检查服务端是否成功接收到公钥authorized_keys 文件中是否有相关记录
[root@localhost ~]# cat .ssh/authorized_keys
```
对远程主机进行设置,使其只允许密钥验证,拒绝传统的口令验证方式
```shell
# 编辑 /etc/ssh/sshd_config 文件,更改的配置项如下
PasswordAuthentication no
PubkeyAuthentication yes
# 重启 sshd 服务
[root@localhost ~]# systemctl restart sshd
```
客户端免密登录到远程主机
```shell
[root@localhost ~]# ssh root@192.168.88.20
```
# 5. mobaxterm 生成密钥登录
通过mobaxterm我们也可以生成密钥对从而通过密钥对进行登录
在工具选项中找到ssh密钥生成器
<img src="01.SSH远程管理/SSH密钥生成器01.png" alt="image-SSH密钥生成器01" style="zoom: 67%;" />
选择生成的密钥对类型以及点击Generator生成
<img src="01.SSH远程管理/SSH密钥生成器02.png" alt="image-SSH密钥生成器02" style="zoom:80%;" />
生成密钥对并且保存公钥和私钥
生成的时候,要鼠标不断移动,该工具会根据鼠标移动的坐标,来生成随机的密钥
<img src="01.SSH远程管理/SSH密钥生成器03.png" alt="image-SSH远程管理协议03" style="zoom:80%;" />
服务端 `.ssh` 目录下新建文件`authorized_keys`,将上面生成的密钥粘进去
<img src="01.SSH远程管理/authorized_keys文件.png" alt="image-authorized_keys文件" style="zoom: 50%;" />
如果连接失败,原因是由于我们通过 mobaxterm 生成的密钥文件权限不满足要求,并且在 windows 上修改权限的话非常麻烦。所以我们可以考虑通过在 cmd 命令行中使用 ssh-keygen 工具来生成密钥文件。
<img src="01.SSH远程管理/ssh-keygen命令.png" alt="image-ssh-keygen命令" style="zoom:80%;" />
可以看到生成的公钥和私钥
<img src="01.SSH远程管理/公私钥文件.png" alt="image-公私钥文件" style="zoom:80%;" />
打开公钥文件,复制其中的内容,在 Linux 中的 /root.ssh/authorized_keys 文件中粘贴
然后继续通过 cmd 连接测试:
<img src="01.SSH远程管理/公私钥文件.png" alt="image-公私钥文件" style="zoom:80%;" />
也可以尝试使用 Mobaxterm 工具,选择私钥进行连接。但是 Mobaxterm 连接的时候也可能会遇到报错的问题。这个是受不同工具的影响。如果通过 cmd 能够连接成功的话。就说明我们的密钥和配置是正常的。

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,468 @@
# 1. Samba文件共享
## 1.1 什么是Samba
Samba 是一个开源软件套件,允许 Linux/Unix 系统与 Windows 系统之间实现文件共享和打印服务。Samba 使用 SMBServer Message Block/CIFSCommon Internet File System协议这些协议是 Windows 系统共享资源的基础。
## 1.2 发展历程
**1992 年**Samba 项目由 Andrew Tridgell 发起,最初作为一个简单工具来查看 DOS 文件共享。
**1994 年**Samba 正式命名,支持 SMB 协议。
**1996 年**:开始支持 Windows NT 域。
**2003 年**:引入 LDAP 集成,支持 Active Directory。
**2012 年**Samba 4 发布,完全实现了 Active Directory 的功能。
**现在**Samba 成为企业级跨平台文件共享的核心工具之一。
## 1.3 Samba用途
**文件共享**:允许用户在不同操作系统之间共享文件。
**打印服务**:提供跨平台的打印服务和在线编辑。
**域控制器**Samba 可以用作 Windows 网络的域控制器。
**认证与授权**:支持用户认证、访问控制和权限管理。
**跨平台互操作性**:让 Linux/Unix 系统与 Windows 系统无缝协作。
Windows计算机网络管理模式
* 工作组WORKGROUP计算机对等关系帐号信息各自管理
* 域DOMAINC/S结构帐号信息集中管理DC,AD
## 1.4 Samba相关软件包介绍
在 Rocky Linux 中Samba 的核心组件包含以下软件包:
- **samba**Samba 的主包,包括核心服务和工具。
- **samba-client**:提供客户端工具,用于访问远程的 SMB/CIFS 共享。
- **samba-common**:共享的配置文件和库。
- **samba-libs**Samba 运行所需的库。
- **samba-common-tools**:包含测试和管理工具,例如 `smbstatus`
- **smbclient**:命令行工具,用于访问 SMB/CIFS 共享。
- **cifs-utils**:提供挂载 SMB 文件系统的工具(如 `mount.cifs`)。
## 1.5 相关服务进程
**smbd**提供文件共享和打印服务TCP139、445。
**nmbd**:负责 NetBIOS 名称解析和浏览功能UDP137、138。
**winbindd**:用于与 Windows 域集成,支持用户和组的认证。
**samba-ad-dc**Samba 4 中的域控制器服务。
## 1.6 Samba主配置文件
主配置文件:/etc/samba/smb.conf 帮助参看man smb.conf
语法检查: testparm [-v] [/etc/samba/smb.conf]
```bash
[global]
workgroup = WORKGROUP # 工作组名称
server string = Samba Server # 服务器描述
security = user # 认证模式
log file = /var/log/samba/log.%m # 日志文件路径
max log size = 50 # 最大日志文件大小KB
dns proxy = no # 禁用 DNS 代理
[shared]
path = /srv/samba/shared # 共享路径
browseable = yes # 是否可浏览
writable = yes # 是否可写
valid users = @smbgroup # 允许访问的用户/组
```
### 1.6.1 全局设置([global]
- `workgroup`:指定工作组名称,默认是 `WORKGROUP`
- security
- `user`:用户级认证(常用)。
- `share`:共享级认证(不推荐)。
- `domain`:域级认证。
- `ads`Active Directory 服务。
- `log file`:日志文件路径。
- `max log size`:限制日志文件大小。
### 1.6.2 共享设置([共享名]
- `path`:共享目录的路径。
- `browseable`:决定共享是否可被浏览。
- `writable`:是否允许写入。
- `valid users`:指定允许访问的用户或组。
# 2. 快速开始
## 2.1 安装Samba服务
```bash
[root@localhost ~]# yum -y install samba
[root@localhost ~]# systemctl enable --now smb
[root@localhost ~]# systemctl enable --now nmb
[root@localhost ~]# ss -nlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 50 0.0.0.0:445 0.0.0.0:*
LISTEN 0 50 0.0.0.0:139 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 50 [::]:445 [::]:*
LISTEN 0 50 [::]:139 [::]:*
LISTEN 0 128 [::]:22 [::]:*
```
`ss`命令的输出中,`Recv-Q``Send-Q`是与TCP连接相关的两个队列的大小。
- `Recv-Q`表示接收队列的大小。它指示了尚未被应用程序(进程)接收的来自网络的数据的数量。当接收队列的大小超过一定限制时,可能会发生数据丢失。
- `Send-Q`表示发送队列的大小。它指示了应用程序(进程)等待发送到网络的数据的数量。当发送队列的大小超过一定限制时,可能会导致发送缓冲区已满,从而阻塞应用程序发送更多的数据。
## 2.2 配置Samba用户
*samba-common-tools
* 工具smbpasswd pdbedit
* 用户数据库:/var/lib/samba/private/passdb.tdb
说明samba用户须是Linux用户建议使用/sbin/nologin
一、创建系统用户
```bash
[root@localhost ~]# useradd -s /sbin/nologin smbuser
[root@localhost ~]# echo 123 | passwd --stdin smbuser
Changing password for user smbuser.
passwd: all authentication tokens updated successfully.
```
二、创建Samba用户
```bash
[root@localhost ~]# smbpasswd -a smbuser
New SMB password:
Retype new SMB password:
Added user smbuser.
[root@localhost ~]# smbpasswd -e smbuser # 启用用户
Enabled user smbuser.
```
三、其他操作(视具体情况而使用)
* 如果已经存在,想修改密码
```shell
[root@localhost ~]# smbpasswd smb1
```
* 想要删除用户和密码
```shell
[root@localhost ~]# smbpasswd -x smb1
[root@localhost ~]# pdbedit -x -u smb1
```
* 查看samba用户列表
```shell
[root@localhost ~]# pdbedit -L -v
```
* 查看samba服务器状态
```shell
[root@localhost ~]# yum install -y samba
[root@localhost ~]# smbstatus
```
## 2.3 基于特定用户或组的共享
### 2.3.1 服务端操作
一、创建共享目录
共享目录为:`/data/samba`
```bash
[root@localhost ~]# mkdir -p /data/samba
[root@localhost ~]# chown -R smbuser:smbuser /data/samba
[root@localhost ~]# chmod -R 2770 /data/samba
```
二、添加配置文件
```bash
[root@localhost ~]# vim /etc/samba/smb.conf
......
[shared]
path = /data/samba
browseable = yes
writable = yes
valid users = @smbuser
create mask = 0660
directory mask = 2770
```
三、关闭防火墙与SELinux
```bash
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
```
四、重启smb服务
```bash
[root@localhost ~]# systemctl restart smb
[root@localhost ~]# systemctl restart nmb
```
### 2.3.2 客户端操作
#### 2.3.2.1 Windows连接
一、在运行窗口中输入:`\\192.168.88.10\`进行连接
<img src="02.Samba文件共享/image-20250111104202425.png" alt="image-20250111104202425" style="zoom:80%;" />
二、用户验证smbuser/123
三、文件创建写入测试
<img src="02.Samba文件共享/image-20250111105213658.png" alt="image-20250111105213658" style="zoom:80%;" />
四、Samba服务端中查看
```bash
[root@localhost ~]# cat /data/samba/file.txt
The file is Created by windows...
```
#### 2.3.2.2 Linux连接
一、客户端工具下载
```bash
[root@localhost ~]# yum -y install samba-client
```
二、创建上传测试文件
```bash
[root@localhost ~]# echo "In server2..." > server2.txt
```
三、使用smbclient连接服务器测试
```bash
[root@localhost ~]# smbclient -L 192.168.88.10 -U smbuser
Password for [SAMBA\smbuser]:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
shared Disk
IPC$ IPC IPC Service (Samba 4.20.2)
smbuser Disk Home Directories
SMB1 disabled -- no workgroup available
[root@localhost ~]# smbclient //192.168.88.10/shared -U smbuser
Password for [SAMBA\smbuser]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Sat Jan 11 11:06:08 2025
.. D 0 Sat Jan 11 11:06:08 2025
file.txt A 33 Sat Jan 11 10:51:54 2025
17756160 blocks of size 1024. 16032064 blocks available
smb: \> get file.txt # 下载文件
getting file \file.txt of size 33 as file.txt (16.1 KiloBytes/sec) (average 16.1 KiloBytes/sec)
smb: \> put /server2.txt # 上传文件
putting file /server2.txt as \server2.txt (4.6 kb/s) (average 4.6 kb/s)
```
### 2.3.3 挂载CIFS文件系统
手动挂载:
```bash
[root@localhost ~]# yum install -y cifs-utils
[root@localhost ~]# mkdir /mnt/smb
[root@localhost ~]# mount -t cifs //192.168.88.10/shared /mnt/smb -o username=smbuser,password=123
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 872M 0 872M 0% /dev/shm
tmpfs 349M 5.2M 344M 2% /run
/dev/mapper/rl-root 17G 1.7G 16G 10% /
/dev/nvme0n1p1 960M 261M 700M 28% /boot
tmpfs 175M 0 175M 0% /run/user/0
//192.168.88.10/shared 17G 1.7G 16G 10% /mnt/smb
[root@localhost ~]# cd /mnt/smb/
[root@localhost smb]# ls
file.txt server2.txt
```
开机自动挂载:
```bash
[root@localhost ~]# vim /etc/fstab
//192.168.88.10/shared /mnt/smb cifs defaults,username=smbuser,password=123 0 0
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 872M 0 872M 0% /dev/shm
tmpfs 349M 5.2M 344M 2% /run
/dev/mapper/rl-root 17G 1.7G 16G 10% /
/dev/nvme0n1p1 960M 261M 700M 28% /boot
//192.168.88.10/shared 17G 1.7G 16G 10% /mnt/smb
tmpfs 175M 0 175M 0% /run/user/0
```
# 3. 实战:不同账户访问不同目录
## 3.1 服务端
一、创建并启用用户
创建三个samba用户分别为smb1、smb2、smb3。密码均为123
```bash
[root@localhost ~]# useradd -s /sbin/nologin -r smb1 # -r 不创建家目录
[root@localhost ~]# useradd -s /sbin/nologin -r smb2
[root@localhost ~]# useradd -s /sbin/nologin -r smb3
[root@localhost ~]#
[root@localhost ~]# smbpasswd -a smb1
New SMB password:
Retype new SMB password:
Added user smb1.
[root@localhost ~]# smbpasswd -a smb2
New SMB password:
Retype new SMB password:
Added user smb2.
[root@localhost ~]# smbpasswd -a smb3
New SMB password:
Retype new SMB password:
Added user smb3.
[root@localhost ~]# smbpasswd -e smb1
Enabled user smb1.
[root@localhost ~]# smbpasswd -e smb2
Enabled user smb2.
[root@localhost ~]# smbpasswd -e smb3
Enabled user smb3.
# 查看smb用户
[root@localhost ~]# pdbedit -L
smbuser:1000:
smb2:986:
smb1:987:
smb3:985:
```
二、修改Samba配置文件如下
```bash
[root@localhost ~]# vim /etc/samba/smb.conf
# 在global中添加该字段
[global]
config file = /etc/samba/conf.d/%U # 变量%U表示匹配用户名
# 新建共享配置
[share]
path = /data/samba/share
browseable = yes
writable = yes
Guest ok = yes
create mask = 0660
directory mask = 2770
```
三、配置共享目录和文件
```bash
[root@localhost ~]# mkdir -p /data/samba/share
[root@localhost ~]# mkdir -p /data/samba/smb1
[root@localhost ~]# mkdir -p /data/samba/smb2
[root@localhost ~]# touch /data/samba/share/share.txt # 共享目录及文件
[root@localhost ~]# touch /data/samba/smb1/smb1.txt # smb1目录及文件
[root@localhost ~]# touch /data/samba/smb2/smb2.txt # smb2目录及文件
[root@localhost ~]# tree /data/samba/
/data/samba/
├── file.txt
├── server2.txt
├── share
│   └── share.txt
├── smb1
│   └── smb1.txt
└── smb2
└── smb2.txt
# 将/data/samba目录权限放开
[root@localhost ~]# chmod 777 -R /data/samba
```
四、针对smb1用户和smb2用户单独编辑配置文件
```bash
[root@localhost ~]# vim /etc/samba/conf.d/smb1
[share]
path = /data/samba/smb1
writable = yes
create mask = 0660
browseable = yes
[root@localhost ~]# vim /etc/samba/conf.d/smb2
[share]
path = /data/samba/smb2
writable = yes
create mask = 0660
browseable = yes
```
五、重启相关服务
```bash
[root@localhost ~]# systemctl restart smb
[root@localhost ~]# systemctl restart nmb
```
## 3.2 客户端
客户端访问测试
```bash
[root@localhost ~]# smbclient //192.168.88.10/share -U smb1
Password for [SAMBA\smb1]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Sat Jan 11 15:00:58 2025
.. D 0 Sat Jan 11 15:00:58 2025
smb1.txt N 0 Sat Jan 11 15:00:58 2025
17756160 blocks of size 1024. 16030864 blocks available
smb: \> exit
[root@localhost ~]# smbclient //192.168.88.10/share -U smb2
Password for [SAMBA\smb2]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Sat Jan 11 15:00:03 2025
.. D 0 Sat Jan 11 15:00:03 2025
smb2.txt N 0 Sat Jan 11 15:00:03 2025
17756160 blocks of size 1024. 16030864 blocks available
smb: \> exit
[root@localhost ~]# smbclient //192.168.88.10/share -U smb3
Password for [SAMBA\smb3]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Sat Jan 11 14:59:44 2025
.. D 0 Sat Jan 11 14:59:44 2025
share.txt N 0 Sat Jan 11 14:59:44 2025
17756160 blocks of size 1024. 16030884 blocks available
```
## 3.3 **结论**
由此可以看出,我们通过针对不同用户编写子配置文件的方式来覆盖主配置文件中相同的共享。可以实现对于没有子配置的用户,访问主配置文件中的定义的目录。对于具备子配置的用户,访问子配置所定义的目录。实现控制不用用户登录访问不同目录。

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,180 @@
# 1. HTTP 协议介绍
HTTPHyperText Transfer Protocol超文本传输协议是用于在客户端通常是浏览器和服务器之间传输超文本如HTML的应用层协议。它是无状态的、面向请求-响应的协议基于TCP/IP传输。
HTTP有不同版本号不同版本号区别如下
- HTTP0.9:仅支持 GET 方法,仅能访问 HTML 格式的资源
- HTTP1.0:增加 POST 和 HEAD 方法MIME 支持多种数据格式,开始支持 Cache支持 tcp 短连接
- HTTP1.1:支持持久连接(长连接),一个 TCP 连接允许多个请求,新增 PUT、PATCH、DELETE 等
- HTTP2.0性能大幅提升新的二进制格式多路复用header 压缩,服务端推送
# 2. HTTP 工作原理
HTTP的工作过程可以总结为以下几个步骤
1. **建立连接:** 客户端如浏览器与服务器之间通过TCP三次握手建立连接。
2. **发送请求:** 客户端向服务器(Apache、Nginx、IIS服务器)发送HTTP请求报文请求资源或操作。
3. **服务器处理请求:** HTTP服务器接收到请求后处理请求并生成响应。
4. **返回响应:** 服务器将响应报文返回给客户端。
5. **断开连接:** 通常在响应完成后关闭TCP连接HTTP/1.0默认短连接HTTP/1.1支持长连接)。
# 3. URL 与 URI
## 3.1 URIUniform Resource Identifier
URI 是统一资源标识符用于标识互联网上的资源。URI 分为两种
- **URLUniform Resource Locator** 统一资源定位符,用于描述资源的地址。
- **URNUniform Resource Name** 统一资源名称,用于标识资源的名称,不依赖物理位置
## 3.2 URLUniform Resource Locator
HTTP 使用统一资源标识符Uniform Resource Identifiers, URI来传输数据和建立连接。URL 是一种特殊类型的URI包含了用于查找某个资源的足够的信息
URL 全称是 UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例介绍下普通URL的各部分组成
```shell
http://iproute.cn:80/news/search?keyword=123&enc=utf8#name=321
```
从上面的URL可以看出一个完整的URL包括以下几部分
1. **协议部分:** 该URL的协议部分为 `http`这代表网页使用的是HTTP 协议。在 Internet 中可以使用多种协议,如 HTTPFTP 等等本例中使用的是 HTTP 协议。在 `http:` 后面的 `//` 为分隔符
2. **域名(主机)部分:** 该 URL 的域名部分为 `iproute.cn`。一个URL 中,也可以使用 IP 地址作为域名使用
3. **端口部分:** 跟在域名后面的是端口,域名和端口之间使用 `:` 作为分隔符。端口不是一个 URL 必须的部分,如果省略端口部分,将采用默认端口
4. **虚拟目录部分:** 从域名后的第一个 `/` 开始到最后一个 `/` 为止,是虚拟目录部分。虚拟目录也不是一个 URL 必须的部分。本例中的虚拟目录是 `/news/`
5. **文件名部分:** 从域名后的最后一个 `/` 开始到 `?` 为止,是文件名部分,如果没有 `?` ,则是从域名后的最后一个 `/` 开始到 `#` 为止,是文件部分,如果没有 `?``#`,那么从域名后的最后一个 `/` 开始到结束,都是文件名部分。本例中的文件名是 `search` 。文件名部分也不是一个 URL 必须的部分,如果省略该部分,则使用默认的文件名
6. **参数部分:**`` 开始到 `#` 为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为 `keyword=123&enc=utf8`。参数可以允许有多个参数,参数与参数之间用 `&` 作为分隔符
7. **锚部分:**`#` 开始到最后,都是锚部分。本例中的锚部分是`name`。锚部分也不是一个 URL 必须的部分
# 4. HTTP 注意事项
1. HTTP 是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
2. HTTP 是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过 HTTP 发送。客户端以及服务器指定使用适合的 MIME-type 内容类型。
3. HTTP 是无状态HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息则它必须重传这样可能导致每次连接传送的数据量增大。另一方面在服务器不需要先前信息时它的应答就较快。
# 5. HTTP 消息结构
- HTTP 是基于客户端/服务端C/S的架构模型通过一个可靠的链接来交换信息是一个无状态的请求/响应协议。
- HTTP 客户端是一个应用程序Web 浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个 HTTP 的请求的目的。
- HTTP 服务端是一个应用程序(通常是一个 Web 服务,如 Apache Web服务器或IIS服务器等通过接收客户端的请求并向客户端发送 HTTP 响应数据。
- HTTP 使用统一资源标识符Uniform Resource Identifiers, URI来传输数据和建立连接。
- HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
![img-CS架构](03.HTTP协议/CS架构.png)
## 5.1 HTTP 请求报文
客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:
![img](03.HTTP协议/请求报文格式.png)
![img](03.HTTP协议/请求报文示例.png)
## 5.2 POST 和 GET 请求方法区别
- 提交的过程
- GET 提交请求的数据会附在URL之后就是把数据放置在 HTTP 协议头中),以?分割URL和传输数据多个参数用&连接
- POST 提交把提交的数据放置在是HTTP包的包体中
- 传输数据的大小
- 首先声明HTTP协议没有对传输的数据大小进行限制HTTP 协议规范也没有对URL长度进行限制
- GET 提交特定浏览器和服务器对URL长度有限制
- POST 提交由于不是通过URL传值理论上数据不受限
- 安全性
- POST 的安全性要比 GET 的安全性高
- 登录页面有可能被浏览器缓存,而缓存的是 URL
- 其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码
- 使用 GET 提交数据还可能会造成 Cross-site request forgery 攻击
## 5.3 常见请求报文头部属性
- Accpet
- 告诉服务端,客户端接收什么类型的响应
- Referer
- 表示这是请求是从哪个URL进来的比如想在网上购物,但是不知道选择哪家电商平台你就去问百度说哪家电商的东西便宜啊然后一堆东西弹出在你面前第一给就是某宝当你从这里进入某宝的时候这个请求报文的Referer 就是 `http://www.baidu.com`
- Cache-Control
- 对缓存进行控制,如一个请求希望响应的内容在客户端缓存一年,或不被缓可以通过这个报文头设置
- Accept-Encoding
- 这个属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩格式
- Host
- 指定要请求的资源所在的主机和端口
- User-Agent
- 告诉服务器,客户端使用的操作系统、浏览器版本和名称
## 5.4 HTTP 响应报文
服务的相应信息格式如下:
![img-响应报文格式](03.HTTP协议/响应报文格式.png)
<img src="03.HTTP协议/响应报文示例.png" alt="img-响应报文示例" style="zoom:80%;" />
## 5.5 常见响应报文头部属性
- Cache-Control
- 响应输出到客户端后,服务端通过该属性告诉客户端该怎么控制响应内容的缓存
- ETag
- 表示客户端请求资源的版本,如果该资源发生了变化,那么这个属性也会跟着变
- Location
- 在重定向中或者创建新资源时使用
- Set-Cookie
- 服务端可以设置客户端的 cookie
# 6. HTTP 状态码
- 状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
- 1xx指示信息--表示请求已接收,继续处理
- 2xx成功--表示请求已被成功接收、理解、接受
- 3xx重定向--要完成请求必须进行更进一步的操作
- 4xx客户端错误--请求有语法错误或请求无法实现
- 5xx服务器端错误--服务器未能实现合法的请求
- 常见状态码
```xml
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在eg输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
```
# 7. HTTP 请求方法
根据 HTTP 标准HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了五种请求方法OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- GET请求指定的页面信息并返回实体主体。
- HEAD类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头
- POST向指定资源提交数据进行处理请求例如提交表单或者上传文件。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
- PUT从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE请求服务器删除指定的页面。
- CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS允许客户端查看服务器的性能。
- TRACE回显服务器收到的请求主要用于测试或诊断。
# 8. 长连接与短连接
HTTP1.1 规定了默认保持长连接HTTP persistent connection 也有翻译为持久连接数据传输完成了保持TCP连接不断开不发RST包、不四次握手等待在同域名下继续用这个通道传输数据相反的就是短连接。
在实际使用中HTTP 头部有了 Keep-Alive 这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这个值,也就是不按标准来。毕竟 TCP 是一个双向连接的协议,双方都可以决定是不是主动断开。
客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间。下图中的 Keep-Alive: timeout=20表示这个TCP通道可以保持20秒
![img-Keep-Alive报文](03.HTTP协议/Keep-Alive报文.png)
# 9. 课后作业
- [扩展]了解更多请求/响应报文头属性
- [扩展]了解更多响应状态码

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

1592
02.企业服务/04.Apache.md Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

1690
02.企业服务/05.Nginx.md Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -0,0 +1,242 @@
# 1. Nginx代理服务
- 代理一词往往并不陌生, 该服务我们常常用到如(代理理财、代理租房、代理收货等等)
![image-20210711132943764](06.反向代理/image-20210711132943764.png)
- 在没有代理模式的情况下客户端和Nginx服务端都是客户端直接请求服务端服务端直接响应客户端。
![image-20210711133242593](06.反向代理/image-20210711133242593.png)
- 那么在互联网请求里面,客户端往往无法直接向服务端发起请求,那么就需要用到代理服务,来实现客户端和服务通信
![image-20210711141653692](06.反向代理/image-20210711141653692-1626395774911-1739587022188226.png)
# 2. Nginx代理服务常见模式
- Nginx作为代理服务,按照应用场景模式进行总结,代理分为正向代理、反向代理
![image-20210711142214493](06.反向代理/image-20210711142214493.png)
- 正向代理与反向代理的区别
- 区别在于形式上服务的”对象”不一样
- 正向代理代理的对象是客户端,为客户端服务
- 反向代理代理的对象是服务端,为服务端服务
# 3. Nginx代理服务支持协议
- Nginx作为代理服务可支持的代理协议非常的多
![image-20210711143359615](06.反向代理/image-20210711143359615.png)
- 如果将Nginx作为反向代理服务常常会用到如下几种代理协议
![image-20210711143720275](06.反向代理/image-20210711143720275.png)
# 4. Nginx反向代理配置语法
- 代理配置语法
```bash
Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
http://localhost:8000/uri/
http://192.168.56.11:8000/uri/
http://unix:/tmp/backend.socket:/uri/
```
- url跳转修改返回Location[不常用]
```bash
Syntax: proxy_redirect default;
proxy_redirect off;proxy_redirect redirect replacement;
Default: proxy_redirect default;
Context: http, server, location
```
- 添加发往后端服务器的请求头信息
```bash
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
# 用户请求的时候HOST的值是www.test.com, 那么代理服务会像后端传递请求的还是www.test.com
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
```
- 代理到后端的TCP连接、响应、返回等超时时间
```bash
//nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
//nginx代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
//后端服务器数据回传给nginx代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
```
- proxy_buffer代理缓冲区
```bash
//nignx会把后端返回的内容先放到缓冲区当中然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
//设置nginx代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
//proxy_buffers 缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location
```
- 常用优化配置
- Proxy代理网站常用优化配置如下将配置写入新文件调用时使用include引用即可
```bash
[root@Nginx ~]# vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
```
- 重复使用配置
- 代理配置location时调用方便后续多个Location重复使用
```bash
location / {
proxy_pass http://127.0.0.1:8080;
include proxy_params;
}
```
# 5. Nginx反向代理场景实践
- Nginx反向代理配置实例
![image-20210711151756044](06.反向代理/image-20210711151756044.png)
- web01服务器,配置一个网站监听在8080
```bash
[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# vim web.conf
server {
listen 8080;
server_name localhost;
location / {
root /code/8080;
index index.html;
allow all;
}
}
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# systemctl restart nginx
[root@web01 ~]# mkdir -p /code/8080
[root@web01 ~]# echo "listening 8080 ..." > /code/8080/index.html
```
- proxy代理服务,配置监听80端口使能够通过代理服务器访问到后端的192.168.175.20的8080端口站点内容
```bash
[root@proxy ~]# cd /etc/nginx/conf.d/
[root@proxy conf.d]# vim proxy_web_node1.conf
server {
listen 80;
server_name proxy.test.com;
location / {
proxy_pass http://192.168.175.20:8080;
}
}
[root@proxy conf.d]# nginx -t
[root@proxy conf.d]# systemctl restart nginx
```
- 存在的问题通过抓包可以看到客户端是使用域名对网站进行访问的但是代理却是使用的IP地址加端口号
- 当访问80端口的时候没有域名的情况下默认会去找排在最上面的那个配置文件。
- 所以我们需要解决这个问题,保留住最开始的请求头部信息。
![image-20210711154444696](06.反向代理/image-20210711154444696.png)
![image-20210711154508713](06.反向代理/image-20210711154508713.png)
- 修改配置文件,使用`proxy_set_header`模块
```bash
[root@proxy conf.d]# vim proxy_web_node1.conf
server {
listen 80;
server_name proxy.test.com;
location / {
proxy_pass http://192.168.175.20:8080;
proxy_set_header Host $http_host;
}
}
```
- 使用http1.1协议
```bash
server {
listen 80;
server_name proxy.test.com;
location / {
proxy_pass http://192.168.175.20:8080;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
}
}
```
- 在生产环境中我们必须要记录客户端的来源IP如果所有的访问日志全都来源于代理那么我们根本不知道都有哪些地区的用户访问了我们什么页面。
- 还需要使用`proxy_set_header`
```bash
server {
listen 80;
server_name proxy.test.com;
location / {
proxy_pass http://192.168.175.20:8080;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Some files were not shown because too many files have changed in this diff Show More