vsftp的安装和配置
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的握手细节
主动和被动模式的共同点,将控制命令和数据传输通道进行了拆分,使用了两个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