vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。vsftpd 的名字代表"very secure FTP daemon", 安全是它的开发者 Chris Evans 考虑的首要问题之一。在这个 FTP 服务器设计开发的最开始的时候,高安全性就是一个目标。
    在搭建vsftpd服务器之前,首先了解一下FTP的工作原理。
    FTP的传输使用的可靠的TCP协议,使用了两个连接,分别是命令通道和数据流通道。一般来说,FTP服务占用两个端口:20和21端口。其中21端口用来建立命令通道,20端口用来建立数据通道。FTP分为两种模式建立连接,分别为主动模式和被动模式。
    主动模式是通过客户端使用一个大于1024的随机端口向服务器的21端口发起请求,通过三次握手建立命令通道。如果此时有进行文件的上传或下载,服务器会使用20端口向客户端的另一个大于1024的端口发起请求,经过三次握手后建立数据通道。
主动模式图示:
clip_p_w_picpath001

    被动模式下,建立命令通道的方式和主动模式一样,都是在21端口上建立。当有数据传输的指令时,客户端会在命令通道内向服务器发起请求;此时服务器会启用一个端口来监听,但不是20端口,而是一个大于1024的随机端口。这样一来服务器和客户端两端的数据通道会建立在大于1024的端口之间。
被动模式图示:

clip_p_w_picpath002

    现在可以聊一聊vsftpd了,vsftpd全名是“very secure FTP Daemon”,意味非常安全的FTP服务器。有关它的功能和安全性,让我们在后面的实验中慢慢体会。

vsftpd服务器基本功能测试
RHEL5默认情况下已经安装了vsftpd服务器,而且在没有做任何配置的情况下即可开启vsftpd服务。
clip_p_w_picpath002
这时来到windows客户端,用命令行登陆ftp服务器,使用匿名账号anonymous或ftp登陆,密码空。即可成功登陆!默认的匿名FTP根目录为/var/ftp
clip_p_w_picpath004
这时候可以用一些简单的命令查看用户目录的信息,例如dir是查看服务器根目录下的文件夹,可以发现有一个名为pub的文件夹。!dir则是查看自己计算机用户根目录下的文件夹,如下图所示。 clip_p_w_picpath005
和linux中一样,pwd可以用来查看服务器当前目录的路径。在这里我们发现通过匿名用户登陆的ftp目录的路径是相对路径,即只能在/var/ftp这个目录里面访问,没有访问服务器其他路径的权限。lcd则可以用来查看本地计算机的当前路径。
clip_p_w_picpath007
默认情况下匿名用户只有下载的权限,而没有上传的权限。如图所示,上传IPMSG.rar文件时被服务器拒绝,但是可以成功下载install.log文件。另外使用bye命令可以退出ftp服务器。
clip_p_w_picpath008 
vsftpd相关配置文件介绍:
/etc/vsFTPd/vsFTPd.conf  vsftpd的主配置文件
/etc/pam.d/vsFTPd  这是使用PAM相关模块时用到的文件,用作身份验证之用。
/etc/vsFTPd.ftpusers  这个文件相当于一个黑名单,包含了无法登陆FTP的用户。
/etc/vsFTPd.ftpuser_list  这个文件既可以作黑名单也可作为白名单,主要看如何设置策略。
/etc/vsFTPd.Chroot_list  这个文件默认不存在,需要手动建立,用途是将一些用户的根目录锁定在默认目录下,无法进入服务器其他目录。
/etc/sbin/vsFTPd  vsftpd的启动文件。
/var/FTP  vsftpd的默认匿名用户登陆的根目录。

有关vsFTPd.conf文件设置值的说明
anonymous_enable=YES 允许匿名用户登陆
local_enable=YES 允许本地用户登陆
write_enable=YES 允许用户上传
local_umask=022 默认情况下上传的文件夹权限为777,文件的权限为666,022这个值的意思就是在默认权限的基础上减去022,即把文件可写的权限给去除掉,这样别人就只能读取文件,而不能修改文件
anno_upload_enable=YES 允许匿名用户上传,默认被注释掉
anno_mkdir_write_enable=YES 允许匿名用户创建文件夹,默认被注释掉
dirmessage_enable=YES 当用户进入某个目录时,会显示该目录需要注意的内容,默认文件为.message
xferlog_enable=YES 开启客户端上传和下载的日志记录
connect_from_port_20=YES FTP数据通道端口号
xferlog_std_enable=YES 日志采用标准格式
pam_service_name=vsftpd  用户的认证文件为vsftpd
userlist_enable=YES  可以用于检测userlist_file文件中的用户是否可以访问服务器
listen=YES  工作在独立模式下
tcp_wrappers=YES  linux自带的安全保护程序

vsftpd的登陆方式(三种方法)
1、 匿名登陆
使用用户名anonymous或ftp,如之前所示,登陆后的根目录为/var/ftp。
2、 本地用户登陆
使用系统账号和口令登陆ftp服务器,登陆后的根目录为用户的宿主目录,并且可以转换到其他系统目录。
现在测试一下用本地用户登陆,首先创建一个名为userftp的系统账号。
useradd userftp
passwd userftp
在windows下测试,用userftp登陆服务器
clip_p_w_picpath002[8]
我们可以发现登陆后的根目录就是userftp的宿主目录,而且可以改变路径前往其他目录。如图userftp前往到了/home/userftp目录以外的/etc/vsftpd目录下。而且在它自己的根目录下,拥有可读可写可执行的权限,也就是说在/home/userftp目录下可以自由上传和下载。
我们顺便测试一下.message文件的作用,.message的作用就是在ftp用户访问FTP目录时显示欢迎信息。我们在用户根目录下用vi来创建一个.message文件
vi .message
clip_p_w_picpath004[6]
保存退出,用windows客户端登录ftp
clip_p_w_picpath006
可以发现多了一行hello world!其实不仅仅是在根目录,在其他目录中也可以使用。
如果要把系统账号锁定在它自己的根目录下,不让它到处乱跑,该怎么办呢?我们可以在vsftpd.conf中添加一条语句chroot_loacl_user=YES,这样就可以限制系统账号了。
clip_p_w_picpath008
重启vsftpd
service vsftpd restart
clip_p_w_picpath002[10]
可以发现userftp账号无法改变到其他目录下了。
3、 虚拟用户登录
由于本地用户存在一定的方式安全隐患,所以又有了另外一种登录方式,即虚拟用户代替本地用户登录。虚拟用户账户和本地账户没有任何关联,而是保存在一个加密的文件中。下面来看一下虚拟用户的创建和登录过程。
(1) 建立虚拟用户口令库文件
在任意目录下创建一个文本文件vu_list.txt
vi vu_list.txt
clip_p_w_picpath004[8]
其中奇数行代表用户名,偶数行代表密码,注意不要有多余的回车。
(2) 生成vsftpd的认证文件到/etc/vsftpd目录下
#db_load–T –t hash –f vu_list.txt /etc/vsftpd/vu_list.db
注意,如果系统不能识别db_load命令,请把下图的软件包装全
clip_p_w_picpath006[6]
设置认证文件只对用户可读可写
chmod 600 /etc/vsftpd/vu_list.db
(3) 建立虚拟用户所需的PAM配置文件
在/etc/pam.d/目录下,有一个名为vsFTPd的文件,这是使用PAM相关模块时用到的文件,主要用作本地用户身份验证之用。现在我们用的是虚拟用户,自然不能用这个文件了,我们可以在这个目录下新创建一个文件vsftpd.vu,输入以下内容
vi /etc/pam.d/vsftpd.vu
clip_p_w_picpath008[6]
此时建一个本地用户,但不要创建密码,我们创建的虚拟用户根目录都可以映射到这个本地用户的根目录下。
现在需要修改vsftpd.conf文件,增加两行命令
允许虚拟用户访问
guest_enable=YES
虚拟用户所映射的本地用户名
guest_username=virtualuser
将原有的vsftpd认证文件改为新创建的vsftpd.vu
pam_service_name=vsftpd.vu
clip_p_w_picpath010
重启vsftpd服务
service vsftpd restart
这时就可以用之前创建的usertest1和usertest2登陆了,但是不能再用本地用户登陆。
然后这时候的虚拟用户权限很低,只有最基本的访问权限。所以我们需要在主配置文件里修改不同虚拟用户的权限。在没有指定虚拟账号根目录的情况下,usertest1和usertest2的根目录都在/home/virtualuser目录下
创建一个用于包含虚拟用户权限的目录
mkdir /etc/vsftpd_vu
进入vsftpd.conf,增加一行,指向刚才创建的目录
user_config_dir=/etc/vsftpd_vu
clip_p_w_picpath012
对于虚拟用户来说,有下面4个权限可以设置。如果包含了后三个权限的话,就代表这个虚拟用户拥有了所有的权限。
anon_world_readable_only=NO 用户的只读权限
anon_upload_enable=YES 允许上传
anon_mkdir_write_enable=YES 允许创建和删除目录的权限
anon_other_write_enable=YES 允许其他可写权限(如改名和删除)
进入/etc/vsftpd_vu目录,创建两个文件usertest1和usertest2
cd /etc/vsftpd_vu
vi usertest1
clip_p_w_picpath013
vi usertest2
clip_p_w_picpath015
两个文件权限相反,usertest1拥有所有权限,而usertest2只有可读权限。
重启vsftpd服务
service vsftpd restart
这时对于usertest1来说,可以进行上传、下载、创建、删除等各种操作。
clip_p_w_picpath017
而对于usertest2来说,几乎没有任何权限,什么都做不了。
clip_p_w_picpath018

基于IP的虚拟ftp服务器
虚拟ftp服务器就相当于在一台主机上架设多个服务器,通过在一张网卡上捆绑多个IP实现(相当于子接口)。下面来看一下它的实现过程。
1、 绑定其他IP
进入/etc/sysconfig/network-scripts/目录下,拷贝eth0的配置文件 ,用于创建一个eth0:0的虚拟网卡
cp ifcfg-eth0 ifcfg-eth0:0
vi ifcfg-eth0:0
clip_p_w_picpath020
配置eth0:0的IP地址为192.168.10.3,然后保存重启服务
service network restart
查看网卡信息,可以发现eth0:0已经开启了。
ifconfig
clip_p_w_picpath022
2、 创建一个虚拟服务器所映射的本地用户和目录
useradd–d /var/ftp1 ftp1
3、 修改配置文件
vi /etc/vsftpd/vsftpd.conf
加上一行listen_address=192.168.10.1,即这个配置文件只在192.168.10.1上开启监听。
clip_p_w_picpath024
4、 复制生成虚拟服务器的主配置文件
cp/etc/vsftpd/vsftpd.conf/etc/vsftpd/vsftpd1.conf
修改这个文件
vi vsftpd1.conf
clip_p_w_picpath026
5、重新启动vsftpd服务
clip_p_w_picpath028
这时候会多一个vsftpd1服务启动,就是我们刚才创建的vsftpd1.conf文件,另外192.168.10.3上的FTP端口也开始监听了。
根据前面的配置,我们设定了虚拟ftp只能用本地账号登陆(即pam指向了vsftpd文件,而不是vsftpd.vu)。用windows客户端测试192.168.10.3,使用本地账号userftp登陆:
clip_p_w_picpath030
登陆成功!虚拟ftp服务器架设完成!