前言
附件的上传和下载是Web应用所常见的功能,对于中小型项目来说,在文件量不大的情况向下选择直接“上云”,可能会让项目运营的成本增加。同时部分项目系统由于数据的敏感性,数据只能在局域网中进行访问和传输,这种情况下文件“上云”也是不太被考虑的选择。针对上述场景下的文件存储/下载的需求,比较常见的解决方案有
sftp
和ftp
,前者是基于ssh
协议附带的文件传输协议,后者是专门针对文件存储的场景而定义的ftp
协议。后者由于功能更加全面和强大,所以也是很多项目进行文件管理的选择。本篇文章将基于FTP
协议以及vsftpd
工具进行介绍,并使用具体的案例来演示一下如何使用和管理FTP工具,希望对各位读者有所帮助。
一、了解FTP
(一)FTP协议介绍
FTP
是 File Transfer Protocol
(文件传输协议)的英文简称,而中文简称为“文件协议”,当涉及到两个系统间的双向文件传输时,我们一般会选择这个协议来满足我们的文件传输需求。需要注意的是FTP
是传输协议,而并不是具体的某一个应用。在实际的操作中,我们一般是选择某一款支持ftp协议
的应用,来搭建我们的ftp
服务的。
(二)FTP服务的主要功能
- 文件上传下载
FTP核心的功能就是服务器的文件上传和下载功能这里没有太多需要介绍的。 - 用户分配
FTP服务一般将用户划分为三种:真实用户
、访客
、匿名用户
,三种用户对应的权限不同,一般来说真实用户>访客>匿名用户
。 - 命令记录
FTP 可以利用系統的syslogd
命令來進行資料的记录, 而记录的资料包括了使用者曾经执行的命令与使用者传输资料(传输时间、档案大小等等)的记录, 我们可以在/var/log/
裡面找到相关的日志记录
二、ftp协议的两种模式
ftp连接的模式可以分为主动模式和被动模式。但无论是主动模式还是被动模式,进行资料传输时都需要经过两个步骤。步骤一是客户端和服务端之间的TCP连接,保障客户端和服务端之间的通信是正常的,这个端口的通信主要用于命令的交互。步骤二才是资料的传输,服务端会在另外一个新的端口,和客户端进行资料的传输。
(一)PORT模式(主动模式)
![](https://img.haomeiwen.com/i24009055/1d8d90caea3dd25f.png)
主动模式下,服务端的tcp连接端口默认是
21
端口(对客户端的端口没有要求,一般是会选一个大于1024的空闲端口),客户端通过三次握手后和客户端建立起命令通道后就可以向客户端发送命令了。命令可以是查询文件、上传、下载文件等指令。我们可以把这个通道叫做命令通道
当用户发起文件传输的相关指令后,客户端会新开一个连接端口,并通过原先的命令通道告知服务端。接着等待服务端的连接。当服务端收到客户端发送过来的请求后,会主动向客户端发起tcp连接,连接成功建立后就可以在这个连接上进行资料传输了,我们也可以把这里的通道叫做资料传输通道。
需要注意,主动模式下,服务端的端口默认情况下是确定的,即21端口用于进行tcp连接,20端口用于文件传输。而客户端的请求端口则是不固定的。且若指令不涉及资料的传输,则不会默认创建资料传输的连接。
(二)PASV模式(被动模式)
![](https://img.haomeiwen.com/i24009055/c96cfebeeed71203.png)
被动模式下,客户端和服务端同样是要先建立“命令通道”,这里的步骤其实基本和主动模式一样。二者主要的区别在于资料通道的建立。
命令通道建立后,若出现资源传输的指令时,首先客户端会通过命令通道发出 PASV
的被动式连接要求 (Passive 的缩写), 并等待服务端的回应;当服务端收到客户端发来的PASV
指令后,也会通过命令通道告知客户端:在服务端的哪个端口上进行文件传输。这里需要注意,和主动模式不同,被动模式下服务端并不一定是通过20
端口来进行文件传输的
最后客户端收到客户端发送过来的资料通道端口,就会选择一个大于1024的空闲端口和服务端建立资料传输通道了。
两种模式都讲完了,相信读者也已经发现了,主动和被动模式的对象其实以服务端来作为参考的,如果是服务端主动和客户端建立资料传输通道,那就说明是属于主动模式;如果是服务端被动和客户端建立资料传输通道(也就是服务端只告知端口,客户端自行连接),就说明属于被动模式。我们在下文中,也会对如何配置ftp服务的模式进行介绍。
(三)选择哪种模式更加合适?
事实上,网上大部分文章都有提到主动模式下服务端主动连接客户端会存在安全隐患问题,而且在一些内部项目中FTP服务器是运行在局域网内的,无法通过数据传输端口来主动连接外网的用户,出于安全的考量,使用被动模式会更加合适。
当然了,模式的选择并不能一棒子打死,如果不存在用户直接与FTP服务器打交道的场景,而是有着Web应用层来作为隔离,那么FTP服务器就不会暴露在外,同时对内与内网中的Web应用进行数据交互也不存在网络访问不通的操作,那么个人觉得被动模式就是一个可行的选择!
当前针对FTP
协议的服务端产品,Linux系统上使用最广泛的应该就是vsftpd
这款产品了。在下文中我们将针对这款产品的使用来进行说明。
二、搭建FTP服务器
(一)vsftpd软件介绍
vsftpd 的全名是“Very Secure FTP Daemon ”的意思,vsftpd
应用重视安全主要体现在以下几点:
- 尽可能的降低了应用pid的权限,避免过高权限的pid被黑客入侵后利用
-
vsftpd
支持chroot的功能,来修改ftp的根目录,这样也能保障应用被入侵后其他目录不会收影响 -
vsftpd
将例如dir, ls, cd
等额外指令做了集成,避免我们直接使用服务端的系统指令
(二)vsftpd软件的安装
使用yum命令下载vsftpd软件作为我们的ftp服务器
yum -y install vsftpd
安装完成后,可以执行ll /etc/vsftpd/
看一下是否有相关的配置文件生成了
也可以通过vsftpd -v
来查看当前系统中是否安装了vsftpd
应用
![](https://img.haomeiwen.com/i24009055/bbc7eb59d5f9e87e.png)
(三)配置和启动vsftpd服务
上文提到vsftpd
支持三种用户登录,由于匿名用户和虚拟用户在实际应用中使用的不多,所以下面会选择真实用户来作为案例演示。
步骤一:新建用户
真实用户要求访问ftp服务的用户需要是系统中真实存在的用户,所以这里我们需要用root
账户或者其他拥有创建用户的账号,新建一个用户。需要注意的是,这个用户我们只是用来进行FTP文件交互,并不希望它能够通过ssh
登录到我们的服务器上面,所以这里我们使用-s /sbin/nologin
参数来拒绝用户登录我们系统的操作。(如果没有这个需求的话,可以不加这个参数)
useradd -s /sbin/nologin ftpptest
passwd ftpptest
PS:我们知道在linux系统中创建用户后,用户登录后的默认家目录是在/home/用户名
目录下面的,如果我们希望修改后续FTP文件存放的路径的话,这里还可以通过-m
参数来指定家目录,比如useradd -m /var/ftp/file ftpptest
。
步骤二:修改vsftpd的配置文件
vsftpd的核心配置文件为/etc/vsftpd/vsftpd.conf
,也是我们以后会用到最多的配置文件。
(1) 关闭匿名访问
默认情况下,匿名访问是打开的,所以我们需要把anonymous_enable
的值改为NO
-
local_enable
配置用于允许本地用户登录FTP服务,这里我们使用本地用户来进行文件交互,所以要改为YES -
write_enable
配置允许本地用户有修改文件的权限,也要设置为YES(否则上传的文件只能是只读状态) -
local_umask
权限掩码,这里默认022就行 -
anon_upload_enable
和anon_mkdir_write_enable
是用来配置是否允许匿名用户上传文件和创建目录的,默认不开启,这里我们也不要去开启它
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
(2)配置用户的家目录
默认情况下,FTP用户登录FTP应用后,还可以通过切换目录的方式绕过其他校验跳转到其他目录上面,出于安全考量,我们并不希望FTP用户可以访问到除了指定目录外的其他目录,所以这里我们还需要对用户的可访问路径进行限制。
-
chroot_local_user
设置为YES,标识着启用修改用户登录根路径的功能 -
local_root
设置为/home/$USER
,这里用来指定用户登录ftp服务后的根路径,如果不修改默认就是/
-
allow_writeable_chroot
配置是否允许用户对根路径有修改文件的权限,由于上面我们已经修改了用户的根路径,所以这里的权限我们可以放开 -
chroot_list_enable
启用例外用户名单,我们这里不需要使用 -
chroot_list_file
指定例外用户列表文件,列表中用户不被锁定在主目录,我们这里不需要使用。
# 设置所有用户均不能切去其他目录
chroot_local_user=YES
user_sub_token=$USER
local_root=/home/$USER
allow_writeable_chroot=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
(3)关于日志配置
-
xferlog_enable
:配置是否启用日志记录,如果启用的话则会对上传下载的所有操作进行记录。这个建议是开启,可能有些vsftpd版本默认没有开启 -
xferlog_file
:指定日志文件路径,默认文件存放在/var/log/xferlog
。如果想要修改,可以去掉前面的#
后重新进行指定 -
xferlog_std_format
: 配置日志格式是否为标准输出,这里默认YES就行
xferlog_enable=YES
#xferlog_file=/var/log/xferlog
xferlog_std_format=YES
步骤三:启动VSFTP
服务
systemctl start vsftpd
我们可以通过systemctl status vsftpd
来观察当前服务的运行情况
![](https://img.haomeiwen.com/i24009055/a254cea020f603bb.png)
步骤四:尝试登录我们的FTP应用
window系统可以通过ftp://ip
的方式来直接访问FTP服务
![](https://img.haomeiwen.com/i24009055/1c1e0e6fa6ba3921.png)
PS:如果应用启动后用户无法登录,需要检查/etc/pam.d/vsftpd
文件,看是否启用了验证用户shell
是否可用的配置,如果启用了直接注释即可。
![](https://img.haomeiwen.com/i24009055/7bb9d48b28065145.png)
三、ftp服务的管理
服务启动
service vsftpd start
或者
/etc/init.d/vsftpd start
或者
systemctl start vsftpd.service
服务重启
service vsftpd restart
或者
/etc/init.d/vsftpd restart
或者
systemctl restart vsftpd.service
服务关闭
service vsftpd stop
或者
/etc/init.d/vsftpd stop
或者
systemctl stop vsftpd.service
设置开机自启动
systemctl enable vsftpd
参考文章
Linux搭建FTP服务器 https://zhuanlan.zhihu.com/p/624591322
Linux下如何部署FTP服务器 https://mp.weixin.qq.com/s/Abu-yjwd212zIhUopjwxdw
网友评论