系统运维Day03_FTP与磁盘挂载
1. FTP相关内容
1.1 文件传输协议FTP
FTP(File Transfer Protocol) 是一种用于在网络上进行文件传输的协议,允许用户通过客户端和服务器之间上传、下载文件。
1.2 FTP的两钟工作方式
1. 主动模式(Active Mode)
在主动模式下,客户端 发起控制连接到服务器,而服务器用来传输数据的端口是由 服务器 发起的连接到客户端。
工作流程:
1- 客户端与服务器之间建立 控制连接,通常是通过端口 21(即 FTP 的默认控制端口)
2- 当客户端准备接收数据时,它会通过 随机端口(通常是 20 以外的端口)向服务器请求建立数据连接
3- 服务器通过控制连接得知客户端的端口号后,从端口 20(服务器的 FTP 数据端口) 发起一个连接到客户端指定的端口,用于数据传输
优势:
服务器主动向客户端发起数据连接,通常对大多数服务器来说,这种方式较容易实现。
弊端:
因为客户端通常位于防火墙或 NAT 后面,防火墙可能阻止来自服务器的外部连接,所以这种模式可能会受到网络环境的限制,尤其在客户端位于 NAT 后时,可能无法建立连接。
2. 被动模式(Passive Mode)
在被动模式下,客户端 仍然发起控制连接,但在传输数据时,客户端 会请求服务器开放一个随机的端口来进行数据传输,服务器只负责监听数据连接,客户端主动发起连接。
工作流程:
客户端与服务器之间建立 控制连接(通常是端口 21)。
客户端请求服务器在某个端口(一个随机端口)上等待数据连接。
服务器响应并告知客户端该数据端口号。
客户端随后向该端口发起连接进行数据传输。
优点:
被动模式能更好地穿越防火墙和 NAT,因为所有连接都是由客户端发起的,服务器只是监听连接,不会主动连接客户端。
需要服务器配置和开放更多的端口(通常是端口范围),可能会导致一些安全隐患。
区别说明:
特性
主动模式(Active Mode)
被动模式(Passive Mode)
控制连接
客户端连接服务器的端口 21
客户端连接服务器的端口 21
数据连接
服务器从端口 20 发起连接到客户端的随机端口
客户端连接服务器提供的随机端口
适用网络环境
客户端需要有公网 IP 或不在防火墙后
客户端位于 NAT 或防火墙后时较为适用
防火墙问题
可能无法穿越客户端防火墙或 NAT
由于客户端发起数据连接,较易穿越防火墙
总结:
- 主动模式:服务器发起数据连接,适合客户端有公网 IP 的情况,但可能受到客户端防火墙或 NAT 的限制。
- 被动模式:客户端发起数据连接,适用于客户端位于防火墙或 NAT 后时,能够绕过这些网络限制,安全性和兼容性更高。
1.3 FTP服务器搭建
准备二台服务器,一台用于客户端(node1),另一台用于服务端(master)
1.3.1 服务器配置
- 1- 第一步:在master上安装vsftpd服务(FTP服务器)
apt install vsftpd
- 2- 第二步:启动并配置 vsftpd 服务
systemctl start vsftpd systemctl enable vsftpd # 校验 systemctl status vsftpd![]()
- 3- 第三步: 配置防火墙
firewall-cmd --permanent --add-service=ftp firewall-cmd --reload# 校验 firewall-cmd --list-all
注意: 如果直接将防火墙彻底关闭,此部分可以跳过
systemctl disable firewalld -- now
![]()
- 4- 第四步: 基本访问配置
前置:创建一个用于共享的目录,已经在目录下创建几个文件
mkdir -p /anon echo 'hello' >> /anon/a.txt echo 'hi' >> /anon/b.txt修改配置:
vim /etc/vsftpd.conf添加或修改以下内容: anonymous_enable=YES # 允许匿名用户登录 anon_root=/anon # 匿名用户登录后的根目录 anon_upload_enable=YES # 允许匿名用户上传文件 anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_other_write_enable=YES # 允许匿名用户删除、重命名文件 write_enable=YES # 必须启用写入,否则以上设置无效# 注意:修改配置文件, 记得重启下FTP服务 systemctl restart vsftpd# 校验: systemctl status vsftpd
1.3.2 客户端配置
- 1- 第一步: 在node1上安装FTP服务器
apt install -y lftp说明:
安装 lftp(命令行 FTP 客户端)或 FileZilla(图形化客户端)
我们是无界面化的,故安装lftp即可
- 2- 第二步:连接FTP服务器
lftp ftp://192.168.132.100![]()
1.3.3 windows浏览器访问
- 1- 打开windows文件资源管理器(window + e)
- 2- 地址栏中输入:
ftp://192.168.132.100
上传文件:
在master上创建一个目录,并设置权限为777,允许所有人有对文件夹的全部权限
mkdir -p /anon/test01 chmod 777 -R /anon/test01/![]()
1.4 禁止匿名用户访问
- 第一步:在 master修改FTP的相关配置
vim /etc/vsftpd.conf
修改以下配置:
anonymous_enable=NO # 禁用匿名用户访问
local_enable=YES # 允许本地用户登录
write_enable=YES # 允许写入操作(上传文件)
保存文件并退出,重启服务
systemctl restart vsftpd
- 第二步: 创建一个普通用户用于后续访问FTP 【可选】
- 由于开启了允许本地用户访问, 但是系统中仅有一个root超级用户, 故需要创建普通用户,便于客户端连接(注意:由于root用户权限过高,FTP无法直接使用root来让客户端访问)
useradd smartgouser
mkdir /home/smartgouser
sudo chown root:root /home/smartgouser
sudo chmod 755 /home/smartgouser
sudo passwd smartgouser然后按提示输入两次密码,例如:
New password: 123
Retype new password: 123
passwd: password updated successfully
- node1 客户端访问查看
格式:
lftp ftp://用户名[:密码]@ftp服务器主机地址
示例:
lftp ftp://smartgouser:123@192.168.132.100![]()
一旦登录成功后, 即可使用该账号来操作文件系统了, 此时可以理解为该用户直接访问了对应服务器系统, 只要这个用户对相关的文件或目录有权限, 即可进行直接操作(依赖与该用户在服务器的权限)
1.5 禁锢在指定的数据目录中
- 1- 创建一个本地用户的数据目录 【master】
mkdir -p /data/kefu
说明: 该目录将会作为共享上下传目录
- 2- 修改配置文件
vim /etc/vsftpd.conf
# 添加以下内容
local_root=/data/kefu # 设置默认访问的路径地址 ,如果不指定, 默认访问的是该用户的家目录
# 修改以下内容: 前面的#去除即可
chroot_local_user=YES # 限制所有本地用户(即服务器上的普通用户)只能访问他们的 home 目录
保持退出后,重启vsftpd服务
systemctl restart vsftpd
- 3- 创建用户, 指定用户的家目录为禁锢的数据目录下
useradd -m ftpuser
passwd ftpuser
- 4- 客户端测试访问
lftp ftp://ftpuser:123@192.168.132.100
![]()
通过上述的配置,可以将所有的用户禁锢在指定的目录下, 但是某些特殊的用户需要具备访问其他目录的权限, 如何办呢?(选做)
步骤一: 修改配置文件
vim /etc/vsftpd.conf
步骤二: 修改以下配置 (打开对应行注释即可)chroot_local_user=YES # 启用用户目录锁定
chroot_list_enable=YES # 允许部分用户例外(可访问其他目录)
chroot_list_file=/etc/vsftpd.chroot_list # 指定例外用户列表文件路径
allow_writeable_chroot=YES # 允许锁定目录可写(Ubuntu 必加)
步骤三: 编辑 /etc/vsftpd.chroot_list文件sudo vim /etc/vsftpd.chroot_list
添加允许访问其他目录的用户名,例如:
smartgouser
itheima添加后, :x 保存退出即可
步骤四: 重启vsftpd. 重启后测试使用sudo systemctl restart vsftpd
1.6 用户名单列表使用
把上一实验中禁锢用户数据目录功能关闭后再做下面的实验
操作方式,将 禁锢操作中相关配置前面全部添加 # (表示注释)
- 观察现象: 当采用root直接访问ftp服务
![]()
会被拒绝访问, 权限不够,原因: FTP默认不允许root访问
在master中的/etc/vsftpd目录下,有二个文件:ftpusers和user_list,主要是用来控制哪些用户可以或不能访问 FTP 服务,管理用户访问权限,防止某些用户登录FTP服务器
- ftpusers 文件:ftpusers 文件用于列出不允许访问 FTP 服务的用户。任何列在这个文件中的用户都将被拒绝登录到 FTP 服务器,即使这些用户的用户名和密码是正确的
![]()
- /etc/vsftpd.user_list文件:user_list 文件的作用和 ftpusers 文件相似,但有一些区别。user_list 文件控制哪些用户可以访问 FTP 服务,具体取决于配置文件中 userlist_enable 和 userlist_deny 的设置
- userlist_enable=YES 启用或禁用 vsftpd 服务的系统用户列表功能。
- userlist_deny=YES 默认情况下,列在 user_list 文件中的用户会被拒绝访问。
- userlist_deny=NO 列在 user_list 文件中的用户将被允许访问,除非在 ftpusers 中显式禁止。
# 如果没有/etc/vsftpd.user_list文件,请运行下面命令 sudo cat > /etc/vsftpd.user_list << "EOF" # vsftpd userlist # If userlist_deny=YES, only allow users NOT on this list # If userlist_deny=NO, only allow users on this list root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody EOFsudo chmod 644 /etc/vsftpd.user_list sudo chown root:root /etc/vsftpd.user_list应用场景: 通过这两个文件,可以为FTP服务器设置黑名单和白名单用户
需求: 将root从黑名单释放出来,允许root用户正常访问
- 1- 开启白名单功能
vim /etc/vsftpd.conf
# 修改以下内容:
userlist_enable=YES # 开启user_list权限设置功能
# 添加一下内容:
userlist_deny=NO # 开启白名单,运行文件中的用户
保存后,重启一下FTP服务
systemctl restart vsftpd![]()
- 2- 在ftpusers 文件(黑名单)中去除root用户
![]()
- 3- 访问FTP服务器
lftp ftp://root:123@192.168.132.100
![]()
1.7 常见错误
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
说明: 此错误表示的当前FTP文件系统的根目录的权限过大,存在写权限, 一般就会爆出如上错误, 因为FTP默认情况下,不允许文件系统根目录存在写权限, 以保证根目录的文件安全(根目录下可能会放置一些系统文件信息, 担心出现破坏)
550 Delete operation failed
当在ftp中看到550错误的时候, 一般就是当前这个用户没有权限操作这个文件或目录,如果想要操作, 请赋予相应权限
1.8 如何删除FTP服务
node1:
apt -y remove lftp apt clean allmaster:
apt -y remove vsftpd apt clean allfirewall-cmd --permanent --remove-service ftp firewall-cmd --reload firewall-cmd --list-allrm -rf /anon rm -rf /etc/vsftp*
1.9 综合案例
操作案例之前,请先将node1和master关于ftp的相关内容全部删除
1- 请将node1作为ftp的服务器, master为ftp的客户端,并完成服务端ftp和客户端ftp的安装操作
在node1执行:apt -y install vsftpd # 启动服务 systemctl start vsftpd systemctl status vsftpd在master执行:
apt -y install lftp
2- FTP服务器node1要求如下:
2.1 不允许匿名用户访问
2.2 将用户禁锢在 /export/public 目录下
2.3 在FTP服务器端的/export/public目录下, 创建logs、src目录,并将目录的权限所有用户设置写入权限
2.4 在客户端的家目录下, 创建 a.log hello.java文件, 并将这两个文件通过ftp客户端上传到服务器刚刚创建的logs和src目录, a.log放置到logs目录, hello.java放置到src目录
2.5 设置黑白名单:
1. 在服务器端 创建 zhangsan lisi wangwu 三个用户, 并设置密码均为123456
2. 将zhangsan放置到黑名单,lisi和wangwu用户放置到白名单, 验证zhangsan无法访问,lisi和wangwu可以正常访问
服务器端node1的操作:
node1执行:# 创建禁锢的目录 mkdir -p /export/public# 完成需求2.3 cd /export/public mkdir -p logs src chmod a+w logs chmod a+w src# 完成需求2.5 服务器添加用户 useradd zhangsan useradd lisi useradd wangwu mkdir /home/lisi passwd zhangsan passwd lisi passwd wangwu/etc/vsftpd.conf中:
# 需求2.1 : 禁用匿名登录 anonymous_enable=NO local_enable=YES write_enable=YES# 需求 2.2 禁锢操作 local_root=/export/public chroot_local_user=YES# 需求2.3 黑马名单设置 # 修改配置, 开启白名单 userlist_enable=YES userlist_deny=NO黑白名单文件设置:
# 注意: 一定要使用 >> 追加的方式 echo 'wangwu' >> /etc/ftpusers echo 'lisi' >> /etc/vsftpd.user_list echo 'lisi' >> /etc/vsftpd.user_list# 完成后: 记得重启vsftpd服务器 systemctl restart vsftpd systemctl status vsftpd# 最后,防火墙放行 ftp服务 firewall-cmd --add-service ftp --permanent firewall-cmd --reload firewall-cmd --list-all
客户端操作:
master执行:cd ~ touch a.log hello.java# 通过ftp客户端上传文件到ftp服务器 lftp ftp://lisi:123@192.168.132.101 # 执行上传 put ~/a.log -o /logs/ put ~/hello.java -o /src/
注意:
由于我们已经在服务端设置禁锢操作,将用户已经锁定到/export/public目录下, 所以当客户端登录成功后, 其实就已经进入/export/public中, 客户端会直接将此目录当做为根目录操作, 在客户端中 我们的 / 其实表示的就是/export/public
提示上传命令为:
put 本地路径 -o 远端的路径
注意:路径不需要带地址, 直接写对应的路径即可
例如:node1是服务器端 master是客户端 将master的家目录下的hello.java 上传到 logs目录
# 因为 /export/public 本身就是根目录
put ~/hello.java -o logs/








