vsftpd-实战安装
VSFTP简介
FTP是仅基于TCP的服务,不支持UDP。与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21(命令端口)和20(数据端口)。但FTP工作方式的不同,数据端口并不总是20。这就是主动与被动FTP的最大不同之处。
vsftpd提供了3种ftp登录形式:
anonymous(匿名帐号)
使用anonymous是应用广泛的一种FTP服务器.如果用户在FTP服务器上没有帐号,那么用户可以以anonymous为用户名,以自己的电子邮件地址为密码进行登录.当匿名用户登录FTP服务器后,其登录目录为匿名FTP服务器的根目录/var/ftp.为了减轻FTP服务器的负载,一般情况下,应关闭匿名帐号的上传功能.
real(真实帐号)
real也称为本地帐号,就是以真实的用户名和密码进行登录,但前提条件是用户在FTP服务器上拥有自己的帐号.用真实帐号登录后,其登录的目录为用户自己的目录,该目录在系统建立帐号时系统就自动创建.
guest(虚拟帐号)
如果用户在FTP服务器上拥有帐号,但此帐号只能用于文件传输服务,那么该帐号就是guest,guest是真实帐号的一种形式,它们的不同之处在于,geust登录FTP服务器后,不能访问除宿主目录以外的内容.
安装vsftpd
1 | yum install vsftpd |
查看服务器端口是否存在
1 | ss -lntup |grep 22 |
配置文件解释
生产配置文件
1 | egrep -v "#|^$" /etc/vsftpd/vsftpd.conf |
默认配置
1 | 使用户不能离开主目录 |
配置日志和上传下载
1 | 设定支持ASCII模式的上传和下载功能 |
如果启用vsftpd日志需手动建立日志文件
1 | touch /var/log/xfer.log |
配置到这里,一个普通的ftp就可以交付使用。
使用系统账号可以登录自己的ftp。
配置匿名用户
1 | 设定允许匿名访问 |
默认情况下匿名用户没有创建目录的权限,增加匿名用户的权限
1 | chown -R ftp.ftp pub/ |
配置虚拟用户登录
所谓虚拟用户就是没有使用真实的帐户,只是通过映射到真实帐户和设置权限的目的。虚拟用户不能登录CentOS系统。
创建虚拟用户6步走:
在vsftpd.cong文件中添加支持配置
建立虚拟FTP用户的账号数据库文件
创建FTP根目录及虚拟用户映射的系统用户
建立支持虚拟用户的PAM认证文件
在个别虚拟用户建立独立的配置文件以实现权限访问
重启vsftpd服务
1 | vi /etc/vsftpd/vsftpd.conf |
进行认证
1 | 安装Berkeley DB工具 |
虚拟用户根目录必须具有FTP账号的权限。
为了使服务器能够使用上述生成的数据库文件,对客户端进行身份验证,需要调用系统的PAM模块。
PAM(Plugable Authentication Module)为可插拔认证模块,不必重新安装应用系统,通过修改指定的配置文件,调整对该程序的认证方式。
PAM模块配置文件路径为/etc/pam.d/目录,此目录下保存着大量与认证有关的配置文件,并以服务名称命名。
配置PASV(被动模式)
vsftpd
默认没有开启PASV模式,FTP只能通过PORT模式连接。
1 | 开启PASV模式 |
设置FTP根目录权限
1 | 最新的vsftpd要求对主目录不能有写的权限所以ftp为755,主目录下面的子目录再设置777权限 |
vsftpd的高级玩法
配置SSL连接
我们登录ftp时的密码都是明文登录的,这样极不安全,所以我们可以使用基于ssl的ftp登录传输方式。
首先我们要为ftp签署证书;再在配置文件中添加下列内容
1 | ssl_enable=YES 启用ssl |
注意事项
常见问题
默认情况下,ftp的根目录为/var/ftp,为了安全,这个目录默认不允许设置为777权限,否则ftp将无法访问。但是我们要匿名上传文件,需要“other”用户的写权限,正确的做法:
在/var/ftp中建立一个pub(名子自己起吧)文件夹,将个文件夹权限设置为777(视具体需要自己设),在upload这个文件夹中,匿名用户可以上传文件、创建文件夹、删除文件等。一般至此,便实现vsftpd匿名用户的上传下载了。如果还不行可能selinux的问题,关闭即可。
知识补充
主动连接和被动连接的区别
PORT(主动模式)
PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据。
PASV(被动模式)
PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输。
两种模式的对比
- 主动模式,服务器端使用20端口连接客户端的随机端口发送数据。
- 被动模式:服务器端开发随机端口供客户端连接。
- 主动模式:需要客户端必须开放端口给服务器,很多客户端都是在防火墙内,开放端口给FTP服务器访问比较困难。
- 被动模式:只需要服务器端开放端口给客户端连接就行了。
我在实际项目中碰到的问题是,FTP的客户端和服务器分别在不同网络,两个网络之间有至少4层的防火墙,服务器端只开放了21端口, 客户端机器没开放任何端口。FTP客户端连接采用的被动模式,结果客户端能登录成功,但是无法LIST列表和读取数据。很明显,是因为服务器端没开放被动模式下的随机端口导致。
遇到的问题
由于被动模式下,服务器端开放的端口随机,但是防火墙要不能全部开放,解决的方案是,在ftp服务器配置被动模式下开放随机端口在 50000-60000之间(范围在ftp服务器软件设置,可以设置任意1024上的端口段),然后在防火墙设置规则,开放服务器端50000-60000之间的端口端。
主动模式下,客户端的FTP软件设置主动模式开放的端口段,在客户端的防火墙开放对应的端口段。
帮助文档
常见错误
报错一:
点击详细错误的时候是下面的提示
vsftpd: refusing to run with writable root inside chroot() 错误的解决办法
一下是解决办法:
为了避免一个安全漏洞,从 vsftpd 2.3.5 开始,chroot 目录必须不可写。使用命令:
1 | chmod a-w /home/user |
报错二:
500 OOPS: bad bool value in config file for: tcp_wrappers
tcp_wrappers 多了一个空格,删除空格问题解决。