vsftp这个ftp服务实在有些年头,刚接触Linux的时候,就知道了这个经典的软件。虽然经典,但设置起来太繁琐,网上各种安装教程,也是各有侧重,很难快速完成安装和配置。本身只是因为需要搭建个ftp服务,但耽误一天就有些浪费时间了。因此写一篇文章,记录一下这次安装的过程,以及对一些配置参数的理解,也方便看到的人能够节省一些时间。

在解决问题的同时,也思考了一下vsftp的设计思路

同时也希望出一个类似lnmp的shell脚本解决方案,快速完成vsftp的安装和配置

安装

yum -y install vsftpd

安装很简单

接下来就该配置,修改配置一定要注意,不要加多余空格,或者一些多余字符,还有配置在文件中的顺序也很重要,不对也会出现错误。这次配置过程中就出现了无法启动vsftp的问题,很难找到原因

Job for vsftpd.service failed because the control process exited with error code

遇到这类问题,直接卸载掉,重新安装一下

yum remove vsftp

配置

关闭匿名用户,使用本地用户

匿名用户关闭,匿名用户存在安全问题一定要关闭

anonymous_enable=no

使用本地用户

local_enable=yes

这里要注意权限问题

When SELinux is enforcing check for SE bool ftp_home_dir

这里的意思是当SELinux设置为enforcing时,会检测ftp_home_dir安全,使用阿里云ECS默认是disable状态,不需要考虑。但文件权限需要考虑,后面会涉及到。

chroot

chroot_local_user
chroot_list_enable
chroot_list_file

关于chroot这一组配置,网上有很多解释和说明,但我这边配置过程中,发现并不起作用,只能是指定目录为根目录,无法更改。这样也好,是安全的,做服务最重要的特性之一就是足够安全。所以不用管它,默认的设置就好,不用纠结这个。后面会说到虚拟用户,这样就可以方便设置更多的目录为根目录进行ftp服务了。

监听端口

listen_port=10021

如果要修改默认监听端口,可以加这个配置,默认是21,注意这个配置要在

listen=NO
listen_ipv6=YES

之后,否则无法启动。

监听模式

关于监听模式,默认是主动模式,不需要增加额外配置,如果需要支持被动模式,需要增加下面的配置。因为客户端默认也是这种模式,这种模式更加网络安全

# 开启被动模式,默认打开
pasv_enable=yes
# 数据连接使用的最大端口
pasv_max_port=10090
# 数据连接使用的最小端口
pasv_min_port=10080

基于阿里云ECS上进行配置的话,需要服务器打开如下端口,包括控制和数据端口,如果仅支持主动模式的话,不需要设置数据端口

阿里云端口设置

接下来说一下主动和被动模式的不同,以及对协议设计我自己的理解

首先看一下下面两张图,说明主动模式和被动模式的连接方式,这里省略掉了TCP的握手细节

FTP PORT(主动)模式
FTP PASV(被动) 模式

主动和被动模式的共同点,将控制命令和数据传输通道进行了拆分,使用了两个TCP的连接。控制端口主要用来进行命令信息的传递,服务端是21端口,客户端是随机生成的10031端口。数据端口的产生和发起连接是主动和被动模式的区分点。

主动模式,客户端会告知服务端客户端开放的数据端口10032(10031+1),服务端收到后,发起数据端口的连接,服务端端口是20,客户端是10032。这里存在一个问题,防火墙,为了网络安全,防火墙默认是不允许外来请求访问的,因此必须要修改防火墙规则,允许服务端访问客户端,这就存在一定的风险和用户操作的成本,同时用户也会对使用软件产生不安全的想法。现在基本已经见不到这样的网络通信设计了。有时为了客户端之间互通,需要做一些特别的处理,称之为防火墙打洞。同时还有一个风险,这个服务端端口固定是20,很容易给黑客进行扫描劫持数据,当然可以修改默认20端口,但与被动模式的随机端口号比安全性还是差一些

# 修改ftp-data端口
ftp_data_port=10020

被动模式,服务端会告知客户端开启了随机端口10080端口,客户端收到后,客户端发起数据端口的连接,客户端端口是10032(10031+1),服务端端口是10080。这样的优点,不在需要服务端发起连接。同时每次传输数据都会使用不同的端口,保证安全性。

这里面的网络设计,有个很重要的点就是多个文件传输和大文件传输问题,因此传送某个大文件的时候,不会影响其他文件的正常处理,也不会影响到控制命令的传递和执行。这样在扩展性方面也有了很大的加强,单机上的性能能达到最大限度资源利用。是否支持多台,理论上应该是可以的,因为服务端返回的是带IP的,不过是内网IP,不知道是否可以设置。这次没有用到,有机会再研究。

服务端告知客户端打开的数据端口

虚拟用户

vsftp设计中,虚拟用户是设计的比较巧妙的。一开始觉得配置特别繁琐,但使用之后发现,确实解决了很多问题。有点类似nginx配置虚拟主机。

首先创建用户文本文件

touch /etc/vsftpd/vsftpd_virtualuser.txt
vim /etc/vsftpd/vsftpd_virtualuser.txt
虚拟帐号 1
密码
虚拟帐号 2
密码

比如:

ftp
123456

接下来生成数据库文件,因为普通的文本文件无法被系统帐号直接调用

db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db

修改数据库文件访问权限

chmod 600 /etc/vsftpd/vsftpd_virtualuser.db

接下来配置 PAM 文件

修改 vsftpd 对应的 PAM 配置文件/etc/pam.d/vsftpd,将默认配置使用“#”全部注释,添加刚才生成好的数据库文件

auth       required     pam_userdb.so   db=/etc/vsftpd/vsftpd_virtualuser
account    required     pam_userdb.so   db=/etc/vsftpd/vsftpd_virtualuser

接下来创建虚拟帐号对应的系统用户

这里如果需要使用现有用户,比如www,直接使用就好,不需要创建,但如果是单独做FTP服务的文件内容,可以创建一个ftpuser的用户

useradd -d /var/ftp/ ftpuser
chmod -R 700 /var/ftp/

这里要注意权限问题,如果是新建的FTP用户和目录,那么是可以的,因为目录和文件的所有者是ftpuser,但如果所有者是其它用户,则设置起来就会导致出现不安全,因为很可能你需要设置为777。所以这里就体现了虚拟用户的一个好处,我可以直接和需要共享的文件所有者进行关联,(具体下面会看到),这样虚拟用户会拥有操作的权限,同时不会暴露给客户端。

接下来配置vsftpd.conf,增加下面几个配置

# 配置 vsftpd 使用的 PAM 模块为 vsftpd
pam_service_name=vsftpd
# 设置虚拟帐号的主目录为/vuserconfig
user_config_dir=/etc/vsftpd/vuserconfig

接下来建立虚拟帐号配置文件

在 user_config_dir 指定路径下,建立与虚拟帐号同名的配置文件并添加相应的配置字段,比如

vim /etc/vsftpd/vuserconfig/ftp
# 开启虚拟帐号登录
guest_enable=yes
# 设置 ftp 对应的系统帐号为ftpuser
guest_username=ftpuser
# 允许在文件系统写入权限
write_enable=yes
# 允许创建文件夹
anon_mkdir_write_enable=yes
# 限定传输速率为 50KB/s
anon_max_rate=50000
# 如果设置了可写权限,要加上配置项
allow_writeable_chroot=yes
# 默认家目录,可以修改
local_root=/var/ftp
# 下载文件和目录权限
anon_world_readable_only=NO
# 创建文件和目录权限
anon_upload_enable=YES
# 上传覆盖文件和目录权限
anon_other_write_enable=YES

接下来重启 vsftpd 使配置生效

systemctl restart vsftpd

虚拟用户在设计上,可以使开放账户更加灵活,对权限和目录也可以有更加精细化的控制。同时通过配置和系统用户进行关联,和系统的权限方便结合。在编写一个基础服务时,账户体系可以有一定的参考。

总结

总体来看,vsftp在账户体系和安全上进行了充分了考虑,同时在扩展性上也有所考虑,值得借鉴和参考。关于SSL部分,没有涉及,不讨论了。对于希望能够一键式使用的用户,我觉得还是有个一键式部署的脚本比较好,网上没有搜到类似的,有时间可以写一个

参考文章

https://www.jianshu.com/p/77f7db660bde
https://baijiahao.baidu.com/s?id=1604307221471041402&wfr=spider&for=pc
https://www.jianshu.com/p/898cbb034bf1
https://www.jb51.net/article/130915.htm
https://blog.csdn.net/yuwenruli/article/details/8767160
http://blog.dothinkings.com/wp/?p=805

发表评论

邮箱地址不会被公开。 必填项已用*标注