目录
前言:
在数字化洪流奔涌的今天,文件依旧需要在不同的服务器、不同的系统、甚至不同的网络环境之间安全而高效地流转。诞生于上世纪 70 年代的 FTP(File Transfer Protocol),历经半个世纪的风雨,仍以其简洁、稳定、跨平台的特性,成为每一位开发者和系统管理员工具箱中不可或缺的“老兵”。
本篇文章将带你从零开始认识 FTP——不仅解释它“如何传文件”,更拆解“主动模式”与“被动模式”背后的网络哲学;不仅手把手教你 10 分钟搭建一个可用的 vsftpd 服务,更示范如何通过黑白名单、权限掩码、根目录禁锢等技巧,把简单的文件共享升级为可审计、可管控的企业级文件中心。
无论你是第一次触碰 Linux 的新手,还是想重温经典协议的老兵,都希望这篇博客能成为你随查随用的实战手册。接下来,就让我们打开终端,输入那条熟悉的 ftp
命令,一起走进 FTP 的世界。
一、FTP 是什么?
FTP(File Transfer Protocol,文件传输协议)是典型的C/S架构的应用层协议,需要由服务端软件、客户端软件两个部分共同实现文件传输功能。FTP客户端和服务器之间的连接是可靠的,面向连接的,为数据的传输提供了可靠的保证。tcp协议:20,21
21端口: 用于传输指令
20端口:用于传输数据
FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP server。Passive模式FTP的客户端发送 PASV命令到 FTP Server
Standard模式:
FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。
Passive模式:
在建立控制通道的时候和Standard模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。
二、FTP作用与工作原理
#2.1 FTP的作用和模式以及通信方式
作用:Internet 上用来传送文件的协议。
VSFTP全称 (very secure FTP)
VSFTP模式: C/S模式
FTP服务器默认使用TCP协议的20、21端口与客户端进行通信
20端口用于建立数据连接,并传输文件数据
21端口用于建立控制连接,并传输FTP控制命令
##2.2 FTP工作原理与流程
FTP数据连接分为两种模式:
主动模式和被动模式
FTP 会话包含了两个通道,控制通道和数据传输通道,FTP 的工作有两种模式,一种是主动模式,一种是被动模式,以 FTP Server 为参照,主动模式,服务器主动连接客户端传输;被动模式,等待客户的连接。
#2.2.1 主动模式的工作原理:
FTP 客户端连接到 FTP 服务器的 21 号端口,发送用户名和密码,客户端随机开放一个端口(1024 以上),发送PORT 命令到FTP 服务器,告知服务器客户端采用主动模式并开放端口,FTP 服务器收到PORT主动模式命令和端口后,通过服务器的 20 号端口和客户端开放的端口连接,发送数据,原理画图所示,(无论是主动还是被动模式,首先的控制通道都是先建立起来,只是在数据传输模式上的区别)
#2.2.2 被动模式的工作原理:
PASV 是 Passive 的缩写,中文成为被动模式,工作原理:FTP 客户端连接到 FTP 服务器所监听的21 号端口,发送用户名和密码,发送 PASV 命令到 FTP 服务器,服务器在本地随机开放一个端口(1024 以上),然后把开放的端口告知客户端,而后客户端再连接到服务器开放的端口进行数据传输,原理画图所示。
注:以上的说明主动和被动,是相对于的 FTP server 端而判断,如果 server 去连接client开放的端口,说明是主动的,相反,如果 client去连接server开放的端口,则是被动。
三、搭建和配置FTP服务
##3.1 安装前准备工作
#3.1.1 关闭防火墙和增强型安全功能
[root@localhost vsftpd]# systemctl stop firewalld
[root@localhost vsftpd]# systemctl disable firewalld
[root@localhost vsftpd]# setenforce 0
[root@localhost vsftpd]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@localhost vsftpd]#
#使用yum 安装,开启FTP服务,文件备份
[root@localhost vsftpd]# yum install -y vsftpd
[root@localhost vsftpd]# systemctl start vsftpd
[root@localhost vsftpd]# systemctl enable vsftpd
[root@localhost vsftpd]# cd /etc/vsftpd/
[root@localhost vsftpd]# cp vsftpd.conf vsftpd.conf.bak
3.2 匿名用户案例
设置匿名用户访问的FTP服务(最大权限)
修改配置文件,并设置权限
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES #开启匿名用户访问。默认已开启
write_enable=YES #开放服务器的写权限(若要上传,必须开启)。默认已开启
anon_umask=022 #设置匿名用户所上传数据的权限掩码(反掩码)。
anon_upload_enable=YES #允许匿名用户.上传文件。默认已注释,需取消注释
anon_mkdir_write_enable=YES #允许匿名用户创建(上传)目录。默认已注释,需取消注释
anon_other_write_enable=YES #允许删除、重命名、覆盖等操作。需添加
# 设置权限
[root@localhost vsftpd]# chmod 777 /var/ftp/pub/ #为匿名访问ftp的根目录下的pub子目录设置最大权限,以便匿名用户.上传数据
# 重启
[root@localhost vsftpd]# systemctl restart vsftpd
服务器连接
# 服务器
C:\Users\EDY>ftp 192.168.10.103
连接到 192.168.10.103。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.10.103:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp> pwd
257 "/"
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
pub
226 Directory send OK.
ftp: 收到 8 字节,用时 0.00秒 4.00千字节/秒。
ftp> cd pub
250 Directory successfully changed.
ftp> put Traffic.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 43 字节,用时 0.00秒 14.33千字节/秒。
ftp>
# 客户端
[root@localhost vsftpd]# ls -lh /var/ftp/pub/
总用量 4.0K
-rw-r--r--. 1 ftp ftp 43 8月 22 19:50 Traffic.txt
# 服务端
ftp> get car.txt 接受客户端发送的数据
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for car.txt (207 bytes).
226 Transfer complete.
ftp: 收到 207 字节,用时 0.00秒 207.00千字节/秒。
服务端
3.3 设置用户模式登录
设置本地用户验证访问ftp,并禁止切换到ftp以外的目录(默认登录的根目录为本地用户的家目录)
#修改配置文件
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
local_enable=Yes #启用本地用户
anonymous_enable=NO #关闭匿名用户访问
write_enable=YES #开放服务器的写权限(若要上传,必须开启)
local_umask=077 #可设置仅宿主用户拥有被上传的文件的权限(反掩码)
chroot_local_user=YES #将访问禁锢在用户的宿主目录中
allow_writeable_chroot=YES #允许被限制的用户主目录具有写权限
#anon_mkdir_write_enable=YES 注释
#anon_other_write_enable=YES 注释
[root@localhost pub]# systemctl restart vsftpd
创建用户
useradd
passwd
/home/用户名下的文件夹
# 服务器
C:\Users\EDY>ftp 192.168.10.103
连接到 192.168.10.103。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.10.103:(none)): test2
331 Please specify the password.
密码:
230 Login successful.
ftp> put Traffic.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 43 字节,用时 0.00秒 43.00千字节/秒。
ftp> put Traffic.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 43 字节,用时 0.00秒 43.00千字节/秒。
ftp>
# 客户端
[root@localhost pub]# ls /home/test2
Traffic.txt
把文件上传到/opt/CC目录下
C:\Users\EDY>ftp 192.168.10.103
连接到 192.168.10.103。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.10.103:(none)): test2
331 Please specify the password.
密码:
230 Login successful.
ftp> put car.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 144 字节,用时 0.00秒 144.00千字节/秒。
ftp>
# 客户端
[root@localhost pub]# ls /opt/CC
car.txt
添加黑
# 使用user_list用户列表文件
vim /etc/vsftpd/user_list
//末尾添加test2用户
test2
vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES #启用user_list用户列表文件
userlist_deny=NO #设置白名单,仅允许user_list用户列表文件的用户访问。默认为YES,为黑名单,禁用
用户被禁用
C:\Users\EDY>ftp 192.168.10.103
连接到 192.168.10.103。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.10.103:(none)): test2
530 Permission denied.
登录失败。
ftp>
总结:
1.1 TFP模式
主动模式:服务器主动发起数据连接
被动模式:服务器被动等待数据连接
2.1.配置匿名用户
-
开启匿名用户访问,默认已开启
-
开启服务器的写的权限,默认已开启
-
匿名用户的上传数据的权限,取消注释
-
开区允许匿名用户上传目录,取消注释
-
允许删除、重命名、覆盖等操作自己添加
-
最后设置目录权限以便匿名用户上传数据
2.2 用户编辑模式
-
编辑主配置文件
-
启用本地用户
-
关闭·匿名用户
-
开放上传权限
-
用户被上传的文件权限(反掩码)
-
用户家目录禁锢
-
用户家目录具有写的权限(允许被限制的用户)关闭匿名 用户删除·创建·其他用户写的权限