# SSH 远程连接服务

ssh 是一种用于安全访问远程服务起的协议,它是一种远程管理工具。它可以通过加密的方式来管理连接服务,使登录服务器更加安全!

加密算法

对称加密算法(DES)

① Jack想要给Harry发送信息一个信息A,为了安全起见,Jack使用一种加密算法,比如给信息通过加一个数字B得到一个新的数字C,然后以公开的方式发送给Harry

② Harry接受到数字C后,通过减去一个数字B得到最终的真正的信息A

③ Jack发送给Harry的信息A称为明文;加密后的信息C称为密文;加密用的B称之为密钥

④ 加密算法(方法)可以很复杂,不一定是加和减,也可以是乘和除等等

⑤ 以上过程中,加密和解密的秘钥是同一个密钥B

总结:

  1. 发送方使用密码将明文数据加密成密文,然后发送出去
  2. 接收方收到密文后,使用同一种密钥将密文解密成明文进行读取

非对称加密(RSA)

① 首先Harry生成一对有相互关系的密钥对,比如e(公钥)和f(私钥);其中公钥是可以公开给所有人的,私钥必须Harry本人私自留存,不得泄露。

② 当Jack发送请求时,Harry会把自己的公钥e发送给Jack

③ Jack拿着Harry的公钥e通过一种加密算法将信息A加密成密文C,以公开的方式发送给Harry

④ Harry收到密文C后,通过自己本地留存的私钥f将密文解密成最终的信息A

⑤ 以上过程中,加密使用的是公钥e,解密使用的是私有f;使用不同的秘钥加解密

总结:

  1. 发送方使用接收方发送过来的公钥将明文数据加密成密文,然后发送出去
  2. 接收方收到密文后,使用自己本地留存的私钥将密文解密成明文进行读取

对称加密与非对称加密区别

对称加密:
  1. 使用同一个密钥进行加密解密,密钥容易泄露
  2. 加密速度快,效率高,数据传输速度快,安全性低
非对称加密:
  1. 使用不同的密钥(公钥和私钥)进行加密和解密
  2. 加密速度远远慢于对称加密,数据传输速度慢,安全性较高

SSH 原理

SSH 基于用户名密码认证

步骤:

  1. SSH 客户端向 SSH 服务端发起一个登录请求
  2. SSH 服务端将自己的公钥发送给 SSH 客户端
  3. SSH 客户端使用公钥将自己输入的密码加密发送给服务端
  4. 服务端用私钥解密并进行用户身份验证和 /etc/shadow 文件的用户密码对比认证
  5. 登录结果返回给客户端并发送一个随机会话口令给客户端,用于后面两台主机进行数据传输的一个而临时加密会话口令

注意:如果是第一次访问,则提示以下内容:

说明

当客户端输入yes 确认对方的公钥指纹后,server 端的公钥会被存放到客户机的用户家目录~/.ssh/known_hosts 文件中,下次再访问就直接通过密码登录,不需要再确认公钥。

基于密钥对的认证

步骤:

  1. 客户端 A 生成密钥对,并将公钥发送到客户端 B,客户端记录公钥,并保存到本地的 authorized_keys 文件中
  2. 客户端 A 发送登录请求,服务端 B 比对客户端 A 的公钥与自己的 authorized_keys 文件中的是否一致,如果一致测生成随机字符串,并通过公钥加密成密文
  3. 服务端 B 通过公钥加密的密文生成会话窗口,并发送到客户端 A
  4. 客户端 A 通过通过自己的私钥解密,解密后的字符串发送给服务端
  5. 客户端 B 验证解密后的字符串是否与自己加密的一致
  6. 如果一致返回登陆结果,完成登录

对比总结

ssh 远程登录两种认证方式

基于用户名密码认证

① 用户身份认证(认证用户名和密码)使用非对称加密算法(安全)

② 数据传输使用对称加密算法(快)

③ 要知道访问服务器用户的密码

基于密钥对的认证(免密码)

① 用户身份认证(比对用户公钥)使用非对称加密算法(安全)

② 数据传输使用对称加密算法(快)

③ 事先要将用户的公钥远程拷贝到服务器端

环境准备

准备两台虚拟机,ip 地址设置为静态

主机名IP 地址描述
Server1192.168.19.128client(充当客户端)
Server2192.168.19.129server(充当服务器端)

基础配置

  1. 配置网卡(两台)(系统为 Rocky 9.5)
# 查看网卡
nmcli connection show
# 配置静态网络地址
nmcli connection modify ens160  ipv4.addresses 192.168.19.128/24
# 重启网卡使配置生效
nmcli conn up ens160
  • client
  • server
  1. 修改主机名(两台)
hostnamectl set-hostname client
  • client
  • server
  1. 关闭防火墙(两台)
  1. 关闭 selinux(两台)
vim /etc/selinux/config
SELINUX=disabled

设为宽容模式

setenforce 0
getenforce

显示为 permissive 为宽容模式,我已重启过所以是 Disabled

注意:修改 需要生效,两种方式,一 重启服务器,二设置宽容模式下次重启生效

  1. 配置镜像源

Centos 源

curl -o /etc/yum.repos.d/CentOS-Base.repo \
https://mirrors.aliyun.com/repo/Centos-7.repo

epel****源

curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

我的系统是 Rocky Linux9.5:

sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/Rocky-*.repo

dnf makecache

openssh 软件的安装

SSH 服务底层的软件名称叫做openssh,open 表示开源,ssh 就是ssh 服务。openssh 属于C/S 架构,拥有客户端与服务器端

yum install openssh -y
rpm -qa | grep openssh

启动 sshd 服务

linux中sshd服务默认是启动的!它的服务名为sshd, sshd服务端口为22。

# 查看 sshd 服务启动状态
systemctl status sshd
# 启动 sshd 服务
systemctl start  sshd
# 重启 sshd 服务
systemctl restart sshd
# 自启 sshd 服务
systemctl enable sshd
# 关闭自启 sshd 服务
systemctl disable sshd
ss -tnlp | grep 22

基于用户密码的认证

用法:

ssh [ 选项 ] user@ip

常用选项:

-p 指定端口

案例:

ssh root@192.168.19.129
cat /root/.ssh/known_hosts

**提示:**登录成功后,会在/root/.ssh/目录下生成known_hosts文件,此文件保存了SSH服务器的公钥信息。在下次登录时不再提示 “Are you sure you want to continue connectiong”,直接输入SSH服务器密码即可登录。

SSH 服务端配置文件

SSH 服务端配置文件在/etc/ssh/sshd_config

配置文件主要参数解释

PasswordAuthentication 是否允许密码验证(yes 允许、no 不允许)

Port ssh 连接端口 22(默认)

AuthorzedKeysFile 认证 key 文件,用户家目录下.ssh/authorized_keys

UseDNS 是否开启 SSH 登录的 DNS 解析(默认 yes)

**案例 1:修改 ssh 服务登录端口

vim /etc/ssh/sshd_config

修改后重启生效

能明显看到 22 端口链接拒绝, 222 端口连接成功

案例 2:修改 ssh 服务器 UseDNS

提示:将UseDNS改为no 可以加速ssh的远程连接,因为不用做DNS解析,这样在远程连接时不会有停顿的时间。

UseDNS 为 yes 时,在连接时会等待数秒的时间,因为它要做 DNS 解析,如果 UseDNS 为 no,则可以加速 ssh 链接,不需要等待直接输入密码即可

案例 3:修改 SSH 服务器 PasswordAuthentication

改为 no 则不能使用密码远程登录 ssh 服务器

注意:验证完成后将配置文件还原

SCP 拷贝

通过 SSH 协议可以很方便的将客户端文件拷贝到远程 SSH 服务器端,也可以将 SSH 服务端的文件拷贝到本地

功能:用户 Linux 系统与 Linux 系统之间进行文件传输 (上传、下载)

上传

:::info
scp [ 选项 ] 本地文件路径 远程用户名@远程服务器的IP地址:远程文件存储路径

-r:递归上传,主要针对的是目录

-P:更改了 SSH 服务的默认端口需要使用-P 选项

:::

案例 1:上传文件不改名

案例 2:上传文件并改名

案例 3:上传目录并指定远程端口

下载

:::info
scp [ 选项 ] 远程用户名@远程服务器的IP地址:远程文件存储路径 本地文件路径

-r:递归下载,主要针对的是目录

-P:更改了 SSH 服务的默认端口需要使用-P 选项

:::

案例 1:从 SSH 服务器下载文件

rm -rf /tmp/*
scp root@192.168.19.129:/tmp/pass /tmp/
ll -h /tmp/pass

案例 2:从 SSH 服务器下载目录并指定端口

scp -P 22 -r root@192.168.19.129:/tmp/test /tmp/
ll -h /tmp/test/

SSH 免密登录

为什么要免密登录

SSH 免密登录可以方便地进行远程登录和文件传输,同时也可以提高安全性。

免密登录的实现

  1. 在客户端主机针对某个账号生成公钥和私钥
  2. 使用某些方法把公钥发送到服务端,服务端将该公钥追加到 authorized_keys 文件中
  3. 测试是否实现免密登录

如下:

  1. 生成密钥对
ssh-keygen

  1. 发送公钥到服务端

使用ssh-copy-id把公钥文件中的内容传输到服务器端的 ~/.ssh/authorized_keys文件中

ssh-copy-id root@192.168.19.129

SSH客户端的公钥会被SSH服务端记录在/root/.ssh/authorized_keys文件中

  1. 测试免密登录

SSH 双机互信

ssh 互信是指多个用户之间相互配置免密登录,可以是自己配置免密登录自己,做互信用的公钥可以是多套也可以是一套。

步骤

  1. 两台机器都生成自己的公私钥
  2. 两台机器将自己的公钥传给对方
  3. 测试是否实现免密登录

如下:

  1. 生成密钥对

这里只用在SSH服务端生成密钥对即可,客户端已生完成了免密登录

  1. 发送密钥
  1. 测试

客户端:

ssh root@192.168.19.129

服务器端:

ssh root@192.168.19.128

提示:

做了双击互信后关闭“PasswordAuthentication no”重启服务,此时只有做了双机互信的机器可以免密登录,其他机器不允许连接。

远程链接工具实现免密登录

  1. xshell 生成密钥

  1. xshell 上传公钥到 SSH 服务器
cat key_test.pub >> .ssh/authorized_keys
  1. 测试

Linux 网络服务

VMware 中的三种网络

击虚拟机任务栏中 编辑==>虚拟网络编辑器

vmnet0 桥接模式

此时虚拟机相当于网络上的一台独立计算机,与主机一样,拥有一个独立的 IP地址

  • 与物理真机同网段
  • 可以连接网络

案例:

修改vmware机的vmnet0为桥接模式

** **

打开控制面板==>网络和 Internet==>网络连接

查看当前连接的网络,有的用的是本地连接,说明电脑是接的网线,而此电脑连的是wifi,因此,找到wifi对应的网卡名,就是你桥接的网卡名。

选择wifi图标(WALAN) ===> 右键属性

提示:虚拟机的网卡也要改成桥接模式

选择虚拟机===>右键设置

配置完成后,相当于虚拟机与物理机连接在同一台交换机上,此时就可以配置虚拟机的网卡为dhcp模式,让虚拟机自动从网络中获取ip地址

配置虚拟机网卡测试(仍使用 client 和 server 两台虚拟机)

nmcli conn show
nmcli conn  modify ens160 ipv4.method auto
nmcli conn down ens160 && nmcli conn up ens160 # 重启网卡
ip addr show ens160	# 查看网卡地址

查看物理机的 IP地址

打开 cmd 工具输入 ipconfig

从以上两台虚拟机中看到ip 地址一台是192.168.1.88 一台是 192.168.1.111 而物理机的网卡ip 是192.168.1.77 它们属于同一网段。这样物理机和虚拟机相当于在同一个内网地址内,在内网地址里的其它主机也可以访问虚拟。可以在其它同网段的物理机用ping命令测试是否与你的虚拟机是否可以拼通。

vmnet1 仅主机模式

VMnet1 进主机模式,封闭的网络环境,此时虚拟机只能与虚拟机、主机互连,与网上的其他工作站不能访问

  • 与物理真机不在同一网段,拥有独立的 IP
  • 仅可以进行内部连接
  • 如果拥有一个虚拟的路由器,也能访问外网环境

提示:同样设置完成后虚拟机的网卡也要配置为仅主机模式

配置虚拟网卡为自动获取

nmcli conn  modify ens160 ipv4.method auto
nmcli conn down ens160 && nmcli conn up ens160 # 重启网卡
ip addr show ens160	# 查看网卡地址

client:

server:

可以看到仅主机模式下,虚拟机与虚拟机在同一网段,它们之间是可以相互通信的。

client 的ip 为:192.168.20.128 server 的ip为:192.168.20.129

提示:此时物理机能拼通虚拟机。虚拟机不能拼通物理机

物理机能拼通虚拟机是因为物理机用的是VMnet1这块网卡与虚拟机通信的。它们本来就是同一网段。

vmnet8 NAT 模式

此时虚拟机可以通过主机单项访问网络上的其他工作站,其他工作站不能访问虚拟机。

相当于一个独立的网络环境,与物理真机不处于同一个网段,可通过虚拟路由器连接外网

nmcli connection modify ens160 ipv4.method manual	# 将获取ip设为静态
nmcli connection up ens160	# 重启 ens160 网卡
nmcli connection show ens160 | grep ipv4 # 查看 ens160 网卡 ipv4 配置

此时物理机与虚拟机通信是通过VMnet8通信的,VMnet8自带NAT路由,可以将源地址和目标地址进行转换。

当物理机去ping 虚拟机时目标地址: 192.168.19.128,使用VMnet8 网卡直接与虚拟机的192.168.19.128 通信。

返回时,虚拟机ip目标地址为:192.168.19.128 经过VMnet8将192.168.19.128 的地址进行目标地址转换,转换成192.168.1.0网段再与192.168.1.77 通信。

Linux 网络服务 DHCP 部署

DHCP 工作原理

DHCP 全称是(Dynamic Host Configuration Protocol)动态主机配置协议。

  1. 发现阶段(DHCP Discover):当一个设备(如计算机和手机)首次加入网络时,它会发送一个 DHCP Discover 消息,以寻找可用的 DHCP 服务器。这个消息包含一个空的或临时的 IP地址,以及其他选项,以指示它需要 DHCP 服务。
  2. 提供阶段(DHCP Offer):DHCP 服务器接收到客户端提供的 Discover 消息后,会回应一个 DHCP Offer 消息,其中包含可用的 IP地址、子网掩码、网关、DNS 服务器等网络配置信息。如果有多个 DHCP 服务器可用,客户端接收到多个 Offer,但通常会选择一个。
  3. 请求阶段(DHCP Request):客户端在收到 Offer 后,选择其中一个 DHCP 服务器提供的配置,并向该服务器发送 DHCP Request 消息,以请求分配该配置。
  4. 确认阶段(DHCP Acknowledgment):DHCP 服务器收到客户端的 Request 后,确认分配给客户端的 IP 地址和其他配置信息,并通过 DHCP Acknowledgement 消息通知客户端。同时其他 DHCP 服务器将停止向该用户提供配置。
  5. 配置生效:客户端接收到 DHCP Acknowledgement 后,会配置自己的网络接口,使用分配的 IP地址和其他配置信息,此时,客户端可以正常的网络通信。
  6. 租约和续约:DHCP 分配的 IP 地址通常有一个租约期限,客户端在租约到期前需要续约。在租约到期前,客户端可以选择使用分配的 IP地址,或者请求新的分配。
  7. 释放:当设备不再需要网络配置时,它可以向 DHCP 服务器发送一个 Release 消息,已释放分配的IP地址,使其可供其他设备使用。

安装 DHCP 服务

环境准备

机器IP
DHCP 服务器10.0.0.100

需关闭防火墙、关闭 selinux,配置时间同步、修改主机名,修改虚拟网卡为仅主机模式

systemctl stop firewalld --now
hostnamectl set-hostname dhcp
sed -i '/^SELINUX=/s/enforcing/disabled/g' /etc/selinux/config;setenforce=0
yum -y install chrony
cronta -e
*/1 * * * * ntpdate ntp.aliyun.com

安装: DHCP 服务组件

yum install -y dhcp* dhclient

dhcp* 是涉及:DHCP 服务端的服务组件

dhclient 是用于:DHCP 客户端的工具软件,DHCP 客户端 依赖 dhclient 工具软件来动态获取 TCP/IP 配置

启动 dhcpd 服务进程

systemctl enable dhcpd
systemctl start dhcpd
netstat -tunlp | grep dhcp

工作场景-1:本地作用域

工作需求

公司办公网络环境如下:

① 办公电脑总数为240台。

② 通过交换机予以网络互连,没有划分VLAN,因此整个办公网络就是一个广播域。

③ 公司办公网络的网关出口IP地址是:10.0.0.1/24

④ 公司办公网络的内网DNS服务器IP地址是:10.0.0.1/24

要求

配置DHCP服务器,从而为所有的办公电脑动态分配TCP/IP配置,确保办公电脑可以访问互联网

技术分析

  1. 将 DHCP 服务器连接到交换机,确保与办公电脑处于相同广播域

因为 DHCP 服务的基本工作原理就是:借助 IP 广播来动态分配 TCP/IP 配置

  1. 为 DHCP 服务器手动分配静态 IP

因为 DHCP 服务器的 IP 地址不允许是动态的

nmcli con mod ens160 ipv4.method manual
nmcli con mod ens160 ipv4.address 10.0.0.100/24
nmcli con up ens160
  1. 安装并启动 DHCP 服务
  1. 配置/etc/dhcpd.conf 配置文件,配置思路如下:
    1. 那些配置参数与当前 IP 子网没有关联性,从而可以相对通用与稳定

DNS 服务器 IP 地址:10.0.0.1 和 114.114.114.114

客户端主机名的 DNS 域名后缀:test.com

  • 主要用于 DNS+DHCP 动态更新,如果无此工作需要,则可以省略

地址租约的默认租约时限:43200(12 小时)

  • 地址租约到期之后,原客户端如继续使用则会自动执行续租操作

地址租约的最大时限:86400 秒(24 小时)

  • 如果默认租约时限到期,DHCP 会继续保留租约,以供原客户续租;
  • 如果纸质最大租约时限到期,原客户仍未执行续租操作,DHCP 则会回收并释放租约
  • 注意:最大租约时限不是另计时,而是在默认租约时限的基础上顺延计时。

DHCP 服务的日志设置:默认 local7,从而将日志信息保存到 /etc/log/boot.log 日志文件中去

2. 哪些配置参数与当前 IP 子网息息相关的?

采用 C 类网络,最大可容纳:254 台网络设备

IP 子网的网络号:10.0.0.0/255.255.255.0

网关 IP 地址:10.0.0.1

子网广播地址:10.0.0.255

3. 针对办公电脑,确定一个可分配的 IP 地址范围

可分配 IP地址范围:10.0.0.11 - 10.0.0.250

不可分配的 IP地址范围:10.0.0.1 - 10.0.0.10 和 10.0.0.251 - 10.0.0.254

  1. 创建/etc/dhcp/dhcpd.conf 配置文件
    1. 配置全局性参数
    2. subnet 本地作用域
  2. 重启 dhcp 服务进程生效配置

配置修改

  1. 修改:/etc/dhcp/dhcp.conf 配置文件

本地作用域

它是:一个匹配本机网卡的 IP 子网的动态 IP 地址分配范围。

要求:必须匹配本地网卡的 IP 子网。

功能:针对本机网卡所在的广播域,进行动态 IP 地址分配。

关键字:subnet

cat >> /etc/dhcp/dhcpd.conf <<EOF
# 定义:全局性参数
# 定义:客户端主机名的DNS域名后缀
option domain-name "test.com";
# 定义:DNS服务器IP地址
option domain-name-servers 10.0.0.1, 114.114.114.114;
# 定义:默认租约时限
default-lease-time 43200;
# 定义:最大租约时限
max-lease-time 86400;
# 定义:DHCP服务的日志设施
log-facility local7;
# 定义:subnet 本地作用域(10.0.0.0/24),# 注意:必须匹配本机网卡的IP子网
subnet 10.0.0.0 netmask 255.255.255.0 {
# 定义:可分配的IP地址范围
range dynamic-bootp 10.0.0.11 10.0.0.250;
# 定义:网关IP地址
option routers 10.0.0.1;
# 定义:子网广播地址
option broadcast-address 10.0.0.255;
}
EOF
  1. 重启:DHCP 服务进程,生成我们的配置
systemctl restart dhcpd

另开一台虚拟机,将网卡设置为 dhcp,测试是否通过自建的 DHCP 服务器获取 IP地址

yum -y install dhclient
nmcli con moify ens160 ipv4.method auto
nmcli con up ens160

提示:同时也要记得把该虚拟机网络设为仅主机模式

dhclient -d

通过以上命令可以查看主机向 DHCP 服务器获取 IP 地址的过程

ip addr

工作场景-2:IP 地址保留

公司销售主管在工作中,经常在自己的笔记本上通过共享文件夹的方式,与同事交换数据,由于销售主管经常出差,待其出差回来之后,就会发现自己笔记本的IP地址有时改变,从而给共享访问带来麻烦,虽然他可以手动设置静态IP地址,但是当他回家或别处使用笔记本时,又需要更改笔记本的IP地址,比较麻烦,现在他希望在公司可以动态获得一个固定IP地址。

技术分析

这个要求很简单,只要我们将销售主管的笔记本网卡MAC地址与一个指定的IP地址绑定起来,就可以了。
一定要在可分配动态IP地址范围中,排除保留的IP地址和静态的IP地址,防止动态分配重复的IP地址。

注意:

fixed 保留 IP 地址不计入租约,因而,永久生效

配置修改

查看销售主管的 MAC 地址,假设就为 10.0.0.11 先前这台机器

ssh 10.0.0.11
ip addr
  1. 修改 /etc/dhcp/dhcpd.conf 配置文件
cat > /etc/dhcp/dhcpd.conf <<EOF
# 定义:全局性参数
option domain-name "test.com";
option domain-name-servers 10.0.0.1, 114.114.114.114;
default-lease-time 43200;
max-lease-time 86400;
log-facility local7;
# 定义:shared-network 超级本地作用域
shared-network mynetwork {
# 定义:本地作用域(第1个网段:10.0.0.0/24),# 注意:必须有一个subnet本地作用域匹配本机网卡的IP子网
subnet 10.0.0.0 netmask 255.255.255.0 {
# 排除:保留的IP地址和静态的IP地址,防止动态分配重复的IP地址
range dynamic-bootp 10.0.0.11 10.0.0.100;
range dynamic-bootp 10.0.0.102 10.0.0.250;
option routers 10.0.0.1;
option broadcast-address 10.0.0.255;
} }
# 定义:host 主机声明,并赋予一个fixed 固定IP地址,即可
host u1 {
# 定义:销售经理的笔记本网卡MAC地址,从而确保可以识别出销售经理的笔记本
hardware ethernet 00:50:56:20:7d:4d;
# 定义:fixed 固定IP地址,使之与笔记本网卡MAC地址永久绑定在一起
fixed-address 10.0.0.8; }
EOF
  1. 重启:dhcp 服务
systemctl restart dhcpd
  1. 新开一台机器,将 IP 改为自动获取,测试是否能通过 mac 地址绑定到指定的 IP

Linux Samba 文件共享服务

需关闭防火墙、关闭 seLinux

安装

  1. 关闭防火墙
systemctl stop firewalld
  1. 关闭 selinux
sed -i '/^SELINUX=/s/enforcing/disabled/g' /etc/selinux/config
setenforce 0
  1. 安装
yum -y install samba

安装:Samba 服务端组件(CentOS 7.x 直接使用 Samba 4.x 版本

  1. 启动

smb.service:为客户端提供 SMB/CIFS 文件共享服务

nmb.service:为客户端提供 NetBIOS 名称解析服务

systemctl start nmb smb --now && systemctl status nmb smb
netstat -tunlp | grep -E "(smbd | nmbd)"

  1. 重启
systemctl restart nmb smb

Samba 用户验证

  1. 无验证:匿名用户
    1. 创建:用于匿名共享的目录,并设置本地权限
mkdir -p /public
chmod 750 /public	# 拒绝:other其他人的任何权限
setfacl -m u:nobody:rwx /public	# 仅允许:nobody匿名用户的读、写、执行权限
2. 编辑 smb.conf 配置文件
# vim /etc/samba/smb.conf
# 修改:[global]全局参数
[global]
# 添加:以下选项
# map to guest = Bad User含义如下:
# 如果登录用户名 存在,但是用户密码不正确,则视为:登录失败
# 如果登录用户名不存在,则直接视为:由guest account选项定义的nobody账户
map to guest = Bad User
# (匿名)共享发布:/public目录,共享名为[pub],只读共享权限
[pub]
# 设置:共享名的注释信息
comment = My public Share
# 允许:网络邻居浏览
browseable = Yes
# 设置:只读共享权限
read only = Yes
# 允许:权限继承
inherit acls = Yes
# 设置:共享目录路径
path = /public
# 允许:匿名访问
guest ok = Yes
# 设置:匿名账户为nobody账户
guest account = nobody

3. 重启:Samba 服务
systemctl restart nmb smb
4. Windows 客户端:匿名访问

注意:

需要开启:不安全的来宾登录策略,然后,gpupdate /force 强制更新安全策略

net use * /delete

输入 \ip 即可访问

本地用户

(1) 创建:本地用户账户,并设置Samba访问密码

useradd u1 -s /usr/sbin/nologin # 创建:不可login登录的u1用户
useradd u2 -s /usr/sbin/nologin # 创建:不可login登录的u2用户
smbpasswd -x root; (echo -e '123456\n123456' | smbpasswd -a root)
smbpasswd -x u1; (echo -e '123456\n123456' | smbpasswd -a u1)
smbpasswd -x u2; (echo -e '123456\n123456' | smbpasswd -a u2)
pdbedit -Lw # 查看:Samba用户及密码的存储信息

(2) 创建:用于本地验证的目录,并设置本地权限

mkdir -p /company
chmod 750 /company # 拒绝 :other其他人的任何权限
setfacl -m u:u1:rwx /company # 仅允许:u1用户的读、写、执行权限
setfacl -m u:u2:r-x /company # 仅允许:u2用户的读、执行权限
# vim /etc/samba/smb.conf
# 修改:[global]全局参数
[global]
# 确保以下配置选项值
security = user # 这是Samba最重要的设置之一,设置:设置验证方式,user表示samba用户本地验证
passdb backend = tdbsam # 设置:samba的用户口令验证的后台为tdbsam数据库文件(本地验证)共享发布:/company目
录,共享名为[company],读写共享权限
[company]
comment = My company Share
# 允许:网络邻居浏览
browseable = Yes
# 设置:读写共享权限
read only = No
# 允许:权限继承
inherit acls = Yes
# 设置:共享目录路径
path = /company
# 禁止:匿名访问
guest ok = No
  1. 重启:Samba 服务
systemctl restart nmb smb
  1. Windows 客户端:匿名访问

输入 \ip

切换用户需清理当前用户

net use * /delete

RSYNC 数据同步服务

RSYNC 概述

什么是 rsync

rsync(remote sync)是一个功能强大的文件同步和备份工具,它支持本地和远程文件复制,特别适用于需要增量备份传输大型目录的场景。

数据同步过程

sync 数据同步:强制将修改过的数据块写入磁盘,对实时性要求较高

asyn 数据同步:将数据先放到缓冲区,再周期性的去同步到磁盘,适合大批量数据同步

rsync 特点

  • 增量传输:rsync通过比较源文件和目标文件的差异,之传输有变动的部分,从而节省带宽和时间。
  • 网络支持:rsync可以使用SSH或其他协议安全地在不用的计算机之间复制文件,非常适用于远程备份和服务器之间的文件同步。
  • 广泛的选项:rsync提供了广泛的选项来定制同步过程,包括控制文件权限、所有权时间戳,处理符号链接,排除特定文件或目录等。
  • 安全性:rsync支持使用scp、ssh等方式传输文件,确保数据传输的安全性。
  • 匿名传输:支持匿名传输,方便进行网站镜像等操作。

rsync 与 scp 的区别

  • 两者都可以实现远程同步,但是相比较而言,rsync 的功能更加强大
  • 支持增量备份
  • 数据同步时保持文件的原有属性

RSYNC 的使用

基本语法

:::info
本地文件同步

rsync [OPTION…] SRC… [DEST]

远程文件同步

通过远程 shell 访问

Pull:rsync [ 选项… ] [ 用户名@] IP地址:目录… [DEST]

Push:rsync [OPTION…] SRC… [USER@]HOST:DEST

通过 rsync 后台进程访问

Pull:rsync [OPTION…] [USER@]HOST::SRC… [DEST]

rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST]

Push:rsync [OPTION…] SRC… [USER@]HOST::DEST

rsync [OPTION…] SRC… rsync://[USER@]HOST[:PROT]/DEST

OPTION 选项说明

-v:详细模式输出

-a:归档模式,递归的方式传输文件,并保持文件的属性

-c:打开校验文件,强制对文件传输进行校验。

-r:递归拷贝目录

-l:保留软链接

-p:保留原有权限

-t:保留原有的时间

-g:保留组权限

-o:保留属组权限

-D:表示支持 b,c,s 等类型文件

-R:保留相对路径

-H:保留硬链接

-A:保留 ACL 策略

-e:保留要执行的远程 shell 命令

-E:保留可执行权限

-X:保留扩展属性信息 a 属性

:::

本地文件同步

本地文件同步可以简单理解为就是把文件从一个位置拷贝到另一个位置,类似于 cp 命令

yum -y install rsync

案例 1:

  1. 创建三个目录
mkdir /dir1 /dir2 /dir3
  1. 在/dir1 目录下创建多个文件
touch /dir1/file{1..4}
  1. 远程同步
rsync -av /dir1/ /dir2 # 把/dir1 目录中的所有文件拷贝到/dir2 目录中
rsync -av /dir1 /dir2 # 把/dir1 目录整体的同步到/dir2 目录下
rsync -avR /dir1/ /dir2
  1. 验证同步效果
tree /dir2

tree 可用以下命令安装

yum -y install tree

案例 2:

使用 rsync --delete(删除目标目录中多余的文件)

rm -rf /dir1/file4
rsync -av --delete /dir1 /dir2

验证同步效果(file4 被删除)

远程文件同步

  1. Push:上传文件到远程服务器端

基本语法:

rsync -av 本地文件或目录 远程用户名@远程服务器的IP地址:目录路径

案例

rsync -av rs01.txt root@192.168.19.129:/root
rsync -av linux root@192.168.19.129:/root

创建同步文件

同步

提示:目标主机也许要安装 rsync

  1. Pull:下载文件到本地服务器端

基本语法:

rsync -ac 远程用户名@远程服务器的IP:目录文件货目录 本地存储位置

rsync -av root@192.168.19.129:/root/rsync.txt ./ # 同步文件
rsync -av root@192.168.19.129:/root/shop ./ # 同步目录

在远程服务器创建同步文件

问题 1:rsync 远程同步数据时,默认去需要密码,如果想不输入密码可以怎么做?

因为 rsync 在远程同步时,之所以需要输入密码是因为此服务底层是基于 SSH 服务的,而 SSH 服务有两种认证方式。
如果不设置免密登录默认就是用户名+密码的方式,如果不想要使用用户名+密码,可
以考虑使用 SSH 免密操作

ssh-keygen # 一直回车
ssh-copy-id root@192.168.19.129

问题 2:如果 host2 服务器修改了 SSH 服务的默认端口,那这个数据该如何传递?

rsync -e "ssh -p 55" -av rsync.txt root@192.168.19.129:/root

rsync 作为系统的服务

rsync 作为命令使用是找不到进程的,rsync 作为系统服务,需要以下思路:

对外提供服务-----监听端口----启动服务----启动脚本----配置文件

项目解决方案

项目环境

编号IP 地址主机名称角色
1192.168.19.128code.aliyun代码服务器
2192.168.19.129backup.aliyun备份服务器
  1. 关闭防火墙与 SElinux
systemctl stop firewalld
systemctl disable firewalld
getenforce # 查看
setenforce 0
vim/etc/selinux/config
SELINUX=disable
  1. 更换主机名称
hostnamectl set-hostname code
hostnamectl set-hostname backup
  1. 更换 IP 地址
  • 配置静态 IP 地址
nmcli connection modify ens160 ipv4.addresses 192.168.19.128/24
  • 配置网关
nmcli connection modify ens160 ipv4.gateway 192.168.19.254
  • 配置 DNS
nmcli connection modify ens160 ipv4.dns 114.114.114.114
  • 配置静态获取 IP
nmcli connection modify ens160 ipv4.method manual
  • 重启网络使配置生效
nmcli connection up ens160
  1. 关闭 networkManager
systemctl stop NetworkManager
systemctl disable NetworkManager
  1. 配置 yum 源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 

配置 CentOS 7 yum 源(Rocky Linux 可省略)

curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo 
  1. 时间同步
yum -y install ntpdate
ntpdate cn.ntp.org.cn 

任务解决方案

code:192.168.19.128 代码服务器

安装 rsync

yum -y install rsync 

准备代码文件

mkdir -p /app/java 
mkdir -p /app/java/aa{1..4} 
touch /app/java/file{1..9}.java 

把 rsync 作为系统服务去运行

vim /etc/rsyncd.conf
 [app] 
 path= /app/java 
 log file = /var/log/rsync.log 
rsync --daemon # 启用 daemon 模式
ps -ef | grep rsync 
netstat -tnlp | grep rsync

rsync有两种工作模式:

Daemon 模式(服务端/客户端模式):需要单独启动 rsyncd服务,监听端口(默认 873),通常用于复杂的备份或匿名同步。

SSH 模式(默认模式):不需要启动任何服务,直接利用 SSH 协议传输,这是你上一轮命令正在使用的模式。

Backup:192.168.19.129 备份服务器

安装 rsync

yum -y install rsync
  1. 创建备份目录
mkdir /backup/java_backup -p
  1. 测试rsync是否可以连接到rsync服务
rsync -a root@192.168.19.128::

-a:获取rsync服务对应的同步标签

在备份服务器上执行

下载文件:

rsync -av root@192.168.19.128::app /backup/java_backup
  1. 计划任务的执行
crontab -e
5 2 * * * /root/rsync_java.sh
  1. 编写shell脚本程序的执行
vim rsync_java.sh
#!/bin/bash
rsync -av root@192.168.10.12::app /backup/java_backup &> /dev/null
chmoda +x rsync_java.sh

rsync 扩展

给 rsync 服务添加密码

code 服务器
  1. 修改配置文件
vim /etc/rsyncd.conf
# 配置多个用户用 逗号 隔开
auth users = user1,user2
secrets file = /etc/rsync.secrets
  1. 设置密码
vim /etc/rsync.secrets

格式:

user1:123

user2:123

  1. 更改密码文件权限 600
chmod 600 /etc/rsync.secrets
  1. 重启 rsync 服务
systemctl daemon-reload
备份服务器
cd /tmp 
rsync -av user1@192.168.10.12::app ./

RSYNC 使用 inotify 工具

  1. 下载 inotufy-tools 工具

官网下载:https://sourceforge.net/projects/inotify-tools/

  1. 上传安装包到code 服务器安装inotufy-tools 工具
tar -xvf inotify-tools-3.13.tar.gz -C /usr/local/ 
cd /usr/local/inotify-tools-3.13/

安装依赖包再进行编绎

yum install gcc-c++ make -y 
./configure
make && make install

安装完成后会在/usr/local/bin/目录下生成以下两条命令

ll /usr/local/bin/
  • Inotifywaith 命令用于收集关于被监视的文件属性变更,包括每个 inotify 事件发生多少次
  • inotifywatch 命令– 收集关于被监视的文件系统的统计数据
  1. 编写 inotify.sh
vim inotify.sh
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /app/java |while read events
do
rsync -av --delete /app/java/ root@192.168.19.129:/backup/java_backup
echo "`date +%F\ %T` 出现事件$events" >> /var/log/rsync.log 2>&1
done
2>&1将标准错误输出重定向到标准输出
%T时间,等于%H:%M:%S 如:06:24:40
%F完整日期格式,等价于%Y-%m-%d 如:2024-06-13
-m是要持续监视变化。
-r使用递归形式监视目录。
-q减少冗余信息,只打印出需要的信息。
-e指定要监视的事件列表。

事件描述

access 访问,读取文件

modify 修改,文件内容被修改

attrib 属性,文件元数据被修改

move 移动,对文件进行移动操作

create 创建,生成新文件

open 打开,对文件进行打开操作

close 关闭,对文件进行关闭操作

delete 删除,文件被删除

  1. 添加可执行权限
chmod a+x inotify.sh
  1. 测试

code 服务器开三个终端

第一个终端启动脚本

nohub ./inotify.sh

第二个终端查看日志

tail -0f /var/log/rsync.log

第三个终端执行动作

只 要 对 目 录/app/java执 行 了 动 作 (modify,delete,create,attrib,move)都以触发 inotifywait 命令监控

echo "helloworld" > /app/java/index.html


FTP 文件传输协议

FTP 服务概述

FTP 服务介绍

FTP(File Transfer Protocol)是一种应用广泛并且古老的一个文件传输协议。

文件传输:文件上传或下载

  • 主要用于互联网中文件的双向传输(上传和下载)、文件共享
  • 跨平台 Linux、Windows
  • FTP 是 C/S 架构,拥有一个客户端和服务端使用 TCP 协议作为底层传输协议,提供可靠的数据传输
  • FTP 的默认端口 21 号(命令端口)20 号(数据端口,主动模式下)默认被动模式
  • FTP 程序(软件)vsftpd

FTP 服务的客户端工具

  • Linux:ftp、lftp(客户端的程序)
  • windows:FlashFXP5浏览器
  • ftp:默认是以用户名/密码的方式访问
  • lftp:默认是以匿名用户访问,可以批量下载目录

FTP的两种运行模式

在FTP 服务中,一共有两种模式(主动模式+被动模式)

说明: 如果是FTP 服务器主动连接客户端就是主动模式,如果是客户端主动连接 FTP 服务器就是被动模式

主动模式

cmd: 命令端口(发送FTP 请求)

data: 数据端口(后期用于传输数据)

①客户端打开大于1023 的随机命令端口和大于1023 的随机数据端口向服务的的21 号端 口发起请求

②服务端的 21 号命令端口响应客户端的随机命令端口

③服务端的 20 号端口主动请求连接客户端的随机数据端口

④客户端的随机数据端口进行确认

被动模式

① 客户端打开大于 1023 的随机命令端口和大于 1023 的随机数据端口向服务的的 21 号端 口发起请求

② 服务端的 21 号命令端口响应客户端的随机命令端口

③ 客户端主动连接服务端打开的大于 1023 的随机数据端口

④ 服务端进行确认

提示: FTP 默认使用的就是被动模式

搭建 FTP 服务

环境准备

主机名ip描述
ftp_server192.168.19.128vsftpd 服务器
client192.168.19.129客户端

初始化环境

  1. 修改主机名
hostnamectl set-hostname ftp_server
hostnamectl set-hostname client
  1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  1. 关闭 selinux
# vim /etc/selinux/config 
SELINUX=disabled
setenforce 0
  1. 配置 yum 源(CentOS 7)
curl -o /etc/yum.repos.d/CentOS-Base.repo \ https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache fast

安装 vsftpd 软件

  1. 安装
yum -y install vsftpd
  1. 启动 vsftpd 并设置开机启动
systemctl start vsftpd
systemctl enable vsftpd
  1. 测试 FTP 服务是否安装成功

Ftp 默认的上传下载文件目录在/var/ftp/pub

echo "hello ftp" > /var/ftp/pub/a.txt

windows 访问测试 ftp://192.168.19.128

在 Linux 系统下访问 FTP 服务器

  1. 在 client 端安装 lftp
yum -y install lftp
  1. 登录 ftp 服务器

vsftpd 配置文件

rpm -ql vsftpd

/etc/vsftpd 配置文件的目录

/etc/vsftpd/ftpusers 用户列表文件,黑名单

/etc/vsftpd/user_list 用户列表文件,可黑可白(默认是黑名单)

/etc/vsftpd/vsftpd.conf 配置文件

/usr/lib/systemd/system/vsftpd.service 启动脚本

/usr/sbin/vsftpd 程序文件

/var/ftp 匿名用户的默认数据根目录(根目录权限最大 755)

/var/ftp/pub 匿名用户登录的数据目录

  1. vsftpd
egrep -v "^#|^$" /etc/vsftpd/vsftpd.conf

anonymous_enable=YES 支持匿名用户访问

local_enable=YES 支持非匿名用户,普通账号登录,默认进入用户的家目录

write_enable=YES 写总开关

local_umask=022 反掩码

dirmessage_enable=YES 启动消息功能

xferlog_enable=YES 开启或启用xferlog 日志文件

connect_from_port_20=YES 是否支持主动模式

xferlog_std_format=YES xferlog 日志格式

listen=NO ftp 独立模式下的监听

listen_ipv6=YES pam_service_name=vsftpd 指定认证文件

userlist_enable=YES 启用用户列表

tcp_wrappers=YES 限速操作

  1. vsftpd 配置文件常用参数

可以通过man 5 vsftpd.conf 查看vsftpd.conf 中配置文件其它参数,常用参数如下:

anonymous_enable是否允许匿名用户访问FTP
anonmkdirwrite_enable是否允许匿名用户创建目录
anonotherwrite_enable是否允许匿名用户修改删除文件
anonuploadenable是否允许匿名用户上传文件
anon_root设置匿名用户的根目录
write_enable是否允许写操作
local_root设置本地用户的根目录
chroot_list_file 指定限制用户的文件
chroot_local_user 是否限制用户在根目录下活动

vsftpd 匿名用户的使用

Vsftpd 默认情况下是开启匿名用户访问,并且只允许匿名用户查看根目录下的文件和 下载及切换根目录,不允许其它操作

  1. 开启匿名用户上传文件
vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES
systemctl restart vsftpd

需要修改目录权限

chmod 777 /var/ftp/pub/

再次上传正常

  1. 开启匿名用户创建目录
vim /etc/vsftpd/vsftpd.conf

anon_mkdir_write_enable=YES

systemctl restart vsftpd

只能新建文件夹不能修改名称

  1. 开启匿名用户删除修改文件
vim /etc/vsftpd/vsftpd.conf

anon_other_write_eanble=YES

systemctl restart vsftpd

可以改名,并且删除了 test.txt 文件

  1. 指定匿名用户的根目录
vim /etc/vsftpd/vsftpd.conf

anno_root=路径

例:

anon_root=/data/anon

mkdir -p /data/anon 
mkdir /data/anon/test 
chmod 777 /data/anon/test 

注意:设置了普通用户的根目录后,根目录权限不能超过 755,如果超过,访问时就会提示 输入用户名和密码,无法登录。只能在根目录(/data/anon)下创建一个共享目录并给 777 权限进行文件共享。

systemctl restart vsftpd

可以看到test目录哪就可以在test目录下做增删除改查的操作了。因为匿名用我们在前面
设置了最大权限了!

vsftpd 本地用户使用

  1. 任务场景

场景:使用 FTP 搭建一个客户服务系统,此客户服务系统主要涉及客服资料的上传与下载

需求:

1) 客服人员必须使用用户名密码(kefu/123)的方式登录服务器来下载相应文档

2) 不允许匿名用户访问

3) 客服部门的相关文档保存在指定的目录里/data/kefu , local_root=/data/kefu

4) 客服用户使用用户 kefu/123 登录后就只能在默认的/data/kefu 目录里活动

  1. 创建客服账号

在ftp服务器上创建一个账号

useradd kefu
echo "123" | passwd --stdin kefu
id kefu
  1. 关闭匿名用户访问

anonymous_enable=NO

local_root=/data/kefu

chroot_local_user=YES

systemctl restart vsftpd
  1. 修改本地共享目录权限
mkdir -p /data/kefu
setfacl -R -m u:kefu:rwx /data/kefu
  1. 测试
  1. 500 OOPS 错误

此问题出现在FTP2.3.5 以后的版本

rpm -qi vsftpd # 查看版本信息

解决方案,添加选项

vim /etc/vsftpd/vsftpd.conf

allow_writeable_chroot=YES

登录成功

客户端 LFTP 工具的使用

lftp -u kefu 192.168.19.128
  1. 上传下载文件

客户端

rm -rf /tmp/* 
cp /etc/passwd /tmp/ 
touch /tmp/{a..d}.txt 
mkdir /tmp/file{1..5} 
echo "hello ftp" > /tmp/file1/f1.txt 
echo "this test" > /tmp/file2/f2.txt 
ls /tmp/
lftp -u kefu 192.168.19.128

上传

基本用法

put 本地文件

案例

put /tmp/a.txt /tmp/b.txt

下载

基本用法:

get 远程文件名

案例

默认下载到当前路径下

批量上传

只针对文件 目录不能上传

基本用法:

mput 本地文件

案例

批量下载

只针对文件,目录不可下载

基本用法:

mget 远程文件名

案例:

上传目录

基本用法:

mirror -R 本地目录

案例

mirror -R /tmp/file1

下载目录

基本用法:

mirror 远程目录

案例

mirror  file1

  1. 删除文件

基本用法:

rm [ 选项 ] 远程文件

rm a.txt
rm -f b.txt
rm -rf file1
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐