一、FTP的基本概念
1. FTP作用
FTP (文件传输协议)是TCP/IP协议栈所提供的一种子协议,该子协议具体可以实现在以下功能:
 从客户向服务器发送一个文件;从服务器向客户发送一个文件;
 从服务器向客户发送文件或目录列表
2. FTP的工作体系
FTP工作在TCP/ip模型的第四层上,服务器与客户机之间利用TCP的21号端口传送信号指令;利用20号端口用于传送数据;具体工作过程如下:
(1) 客户机启动客户端程序,通过TCP的“三次握手”建立服务器的连接
(2) 服务器对客户机进行身份验证
(3) 进行相应目录操作和数据传输
(4) 断开连接
3. FTP的数据传输模式
主动传输模式:
在这种模式下,服务器向客户端发起一个用于数据传输的连接,客户端的连接端口是由服务器和客户端通过协商通过的
被动传输模式:
在这种模式下,客户端向服务器发起一个用于数据传输的连接,客户端的连接端口是发起这个数据连接请求时使用的端口号
4. Linux下常见的FTP软件
(1)wu-ftp
wu-ftp是历史最久的非商业FTP服务器软件之一,主要有以下特点:
 可以限制最高访问人数,以维持系统的最佳运行效率
 可以记录文件上传和下载的全过程
 可以支持匿名FTP服务
 可以支持虚拟FTP主机
 可以控制不同网段及其对FTP服务器的存取权限和访问时段
(2)proftp
proftpd是在意图修改wu-ftp一些不足情况下产生的,具体有如下特点:
 单配置文件,配置简单
 基于单个目录的.ftpaccess设置文件,类似apache的.htaccess文件
 可以设置为从xinetd启动,或者是独立ftp服务器两种运行方式
 强大的log功能
 支持以非root身份运行,从而减少了安全隐患
 支持匿名FTP功能
(3)vsftpd
 是一个安全、高速、稳定的FTP服务器
 可设定多个基于IP的虚拟FTP服务器
 匿名FTP服务器更是十分容易
 不执行任何外部程序,从而减少了安全隐患
 支持虚拟用户,且支持每个虚拟用户具有独立的配置
 可以设置为从xinetd启动,或者是独立FTP服务器两种运行方式
 支持PAM或xinetd/tcp_wrappers的认证方式
 支持带宽限制

二.vsftp安装与配置

1.软件包:vsftpd-x.x.x-x.i386.rpm

2./etc/vsftpd/vsftpd.conf     主配置文件
/etc/vsftpd.ftpusers      指定哪些用户不能访问FTP服务器
/etc/vsftpd.user_list     可以根据vsftpd.conf文件中的设置来决定该文件中指定的用户是否可以访问ftp服务器
/etc/rc.d/init.d/vsftpd    vsftpd的启动脚本文件

3.vim /etc/vsftp/vsftpd.conf 中一些基本配置选项

anonymous_enable=YES|NO
控制是否允许匿名用户登录,YES允许,NO不允许,默认值为YES。
ftp_username= username
匿名用户所使用的系统用户名。默认下,此参数在配置文件中不出现,值为ftp
no_anon_password=YES|NO
控制匿名用户登入时是否需要密码,YES不需要,NO需要。默认值为NO。 
anon_root=path
设定匿名用户的根目录,即匿名用户登入后,被定位到此目录下。主配置文件中默认无此项,默认值为/var/ftp/。
anon_world_readable_only=YES|NO
控制是否只允许匿名用户下载可阅读文档。YES,只允许匿名用户下载可阅读的文件。NO,允许匿名用户浏览整个服务器的文件系统。默认值为YES。
anon_upload_enable=YES|NO
控制是否允许匿名用户上传文件,YES允许,NO不允许,默认是不设值,即为NO。除了这个参数外,匿名用户要能上传文件,还需要两个条件:一,write_enable参数为YES;二,在文件系统上,FTP匿名用户对某个目录有写权限。
anon_mkdir_write_enable=YES|NO
控制是否允许匿名用户创建新目录,YES允许,NO不允许,默认是不设值,即为NO。当然在文件系统上,FTP匿名用户必需对新目录的上层目录拥有写权限。
anon_other_write_enable=YES|NO
控制匿名用户是否拥有除了上传和新建目录之外的其他权限,如删除、更名等。YES拥有,NO不拥有,默认值为NO。
chown_uploads=YES|NO
是否修改匿名用户所上传文件的所有权。YES,匿名用户所上传的文件的所有权将改为另外一个不同的用户所有,用户由chown_username参数指定。此选项默认值为NO。
chown_username=whoever
指定拥有匿名用户上传文件所有权的用户

local_enable=YES|NO
控制vsftpd所在的系统的用户是否可以登录vsftpd。默认值为YES。
local_root=
定义所有本地用户的根目录。当本地用户登入时,将被更换到此目录下。默认值为无。
user_config_dir=
定义用户个人配置文件所在的目录。用户的个人配置文件为该目录下的同名文件

chroot_list_enable=YES|NO
锁定某些用户在自家目录中。即当这些用户登录后,不可以转到系统的其他目录,只能在自家目录(及其子目录)下。具体的用户在chroot_list_file参数所指定的文件中列出。默认值为NO。
chroot_list_file=/etc/vsftpd/chroot_list
指出被锁定在自家目录中的用户的列表文件。文件格式为一行一用户。通常该文件是/etc/vsftpd/chroot_list。此选项默认不设置。
chroot_local_users=YES|NO
将本地用户锁定在自家目录中。当此项被激活时,chroot_list_enable和chroot_local_users参数的作用将发生变化,chroot_list_file所指定文件中的用户将不被锁定在自家目录。本参数被激活后,可能带来安全上的冲突,特别是当用户拥有上传、shell访问等权限时。因此,只有在确实了解的情况下,才可以打开此参数。默认值为NO。
passwd_chroot_enable =YES|NO
当此选项激活时,与chroot_local_user选项配合,chroot()容器的位置可以在每个用户的基础上指定。每个用户的容器来源于/etc/passwd中每个用户的自家目录字段。默认值为NO。

listen_address=ip address
定义了在主机的哪个IP地址上监听FTP请求

listen_port=port_value  
指定FTP服务器监听的端口号(控制端口),默认值为21。此选项在standalone模式下生效

port_enable=YES|NO
指定数据连接时模式,默认值为YES(PORT模式,NO为PASV模式)
connect_from_port_20=YES|NO
控制以PORT模式进行数据传输时是否使用20端口(ftp-data)

ftp_data_port=port number
设定ftp数据传输端口(ftp-data)值。默认值为20。此参数用于PORT FTP模式。 

pasv_enable=YES|NO
YES,允许数据传输时使用PASV模式。NO,不允许使用PASV模式。默认值为YES。
pasv_min_port=port number
pasv_max_port=port number
设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表    示任意。默认值为0。把端口范围设在比较高的一段范围内,比如50000-60000,将有助于安全性的提高
pasv_address= ip address
此选项为一个数字IP地址,作为PASV命令的响应。默认值为none,即地址是从呼入的连接套接字(incoming connectd socket)中获取。

ascii_upload_enable=YES|NO
控制是否允许使用ascii模式上传文件,YES允许,NO不允许,默认为NO
ascii_download_enable=YES|NO
控制是否允许使用ascii模式下载文件,YES允许,NO不允许,默认为NO。

idle_session_timeout= numerical value
空闲用户会话的超时时间,若是超出这时间没有数据的传送或是指令的输入,则会强迫断线。单位为秒,默认值为300。
data_connection_timeout= numerical value
空闲的数据连接的超时时间。默认值为300 秒。
accept_timeout=numerical value
接受建立联机的超时设定,单位为秒。默认值为60。
connect_timeout=numerical value
响应PORT方式的数据联机的超时设定,单位为秒。默认值为60

max_clients=numerical value
此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义了FTP服务器最大的并发连接数,当超过此连接数时,服务器拒绝客户端连接。默认值为0,表示不限最大连接数。
max_per_ip=numerical value
此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义每个IP地址最大的并发连接数目。超过这个数目将会拒绝连接。此选项的设置将影响到象网际快车这类的多进程下载软件。默认值为0,表示不限制。
anon_max_rate=value
设定匿名用户的最大数据传输速度value,以Bytes/s为单位。默认无。
local_max_rate=value
设定用户的最大数据传输速度value,以Bytes/s为单位。默认无。

三.功能实现,以案例为主

案例一:利用vsftpd配置一台支持匿名用户和本地用户登录,具体要求如下:
 允许匿名用户登录和本地用户登录
 禁止匿名用户上传
 允许本地用户上传和下载,且锁定本地用户主目录,允许用户删除用户主目录的文件
 建立用户组ftpusers,同时建立用户ftp1,ftp2属于ftpusers组,并设置用户的主目录为/soft
 设置/soft目录允许ftpusers组中的用户可以写入,但不能删除目录中的非自己拥有的文件
 本地用户的文件生成掩码为022
 空闲的会话时间为600秒,空闲数据连接时间为60秒,自动中断时间为30秒,自动激活时间为10秒
 本地用户的最大传输速率为50000b/s,匿名用户的最大传输速率为30000b/s
 客户端的连接端口为5000-6000(被动模式中使用)
 使用独占启动方式,侦听192.168.5.1接口的21号端口
 禁止192.168.5.128主机访问FTP服务器
 并发连接的客户数为300,每台客户机的最大连接为5
1. 安装相关软件包
#yum install vsftpd

2.修改/etc/vsftpd/vsftpd.conf
#vim  /etc/vsftpd/vsftpd.conf
修改如下:
anonymous_enable=yes
local_enable=yes
anon_upload_enable=no
write_enable=yes
local_mask=022
idle_session_timeout=600
data_connection_timeout=60
accept_timeout=30
connect_timeout=10
local_max_rate=50000
anon_max_rate=30000
pasv_min_port=5000
pasv_max_port=6000
chroot_local_user=yes
listen=yes
listen_address=192.168.5.1
listen_port=21
max_clients=300
max_per_ip=5
3.创建相关用户组和用户
#mkdir   /soft
#chmod   1777   /soft
#groupadd    ftpusers
#useradd  -d  /soft  -g  ftpusers  ftp1
#passwd  ftp1
#useradd  -d  /soft  -g  ftpusers  ftp2
#passwd  ftp2
4. 设置hosts.allow文件
#vi   /etc/hosts.allow
vsftpd:192.168.5.128:DENY
5. 启动服务
#service  vsftpd  start
6.进行实验效果验证,用新添加的用户进行家目录的访问

案例二:利用VSFTPD配置一台支持虚拟用户登录的FTP服务器,具体要求如下:
 支持本地用户和虚拟用户登录,不允许匿名用户登录
 允许本地用户任意写入
 锁定本地用户的用户主目录
 建立虚拟用户vftp1,vftp2都对应本地用户guest,且虚拟用户在用户主目录中可以写入,但不能删除
 设置客户端连接时的端口为5000-6000
 最大空闲会话时间长度为600秒
 设置空闲数据连接的中断时间为200秒
 设置客户端空闲时的自动中断时间为100秒和激活连接的时间为30秒
 本地用户的最大传输速率为2MB/s
 使用独占启动方式,侦听192.168.5.1接口的21号端口
 设置服务器的并发连接总数为200
 每个客户机的并发连接总量为5
 允许192.168.5.0/24网段内的主机访问
所谓虚拟用户:与系统无关联,不能登入系统,只能访问FTP服务器

配置过程:
1. 安装相关软件
#yum install vsftpd

2. 修改/etc/vsftpd/vsftpd.conf文件
#vi m  /etc/vsftpd/vsftpd.conf
修改内容如下:
anonymous_enable=no
local_enable=yes
guest_enable=yes
guest_username=guest
write_enable=yes
chroot_local_user=yes
pam_service_name=ftp
idle_session_timeout=600
data_connection_timeout=200
accept_timeout=100
connect_timeout=30
local_max_rate=20000
pasv_min_port=5000
pasv_max_port=6000
listen=yes
listen_address=192.168.5.1
listen_port=21
3. 建立相关用户
#useradd  guest
#passwd guest
#chmod  1777    /home/guest
//建立虚拟用户所对应的本地用户
#vi  /etc/vsftpd/vlogin.txt    //建立虚拟用户文件
添加如下内容:
vftp1               (用户名)
123         (密  码)
vftp2
123

4.生成口令库文件,运行db_load之前先安装db4-utils的RPM包

 #yum -y install db4 db4-tcl db4-utils
#db_load  -T  -t  hash  -f  /etc/vsftpd/vlogin.txt  /etc/vsftpd/vlogin.db
#chmod  600   /etc/vsftpd/vlogin.db
5. 设置PAM验证
#cp  /etc/pam.d/vsftpd  /etc/pam.d/ftp
#vim   /etc/pam.d/ftp
添加如下内容:
auth   required  /lib/security/pam_userdb.so  db=/etc/vsftpd/vlogin
account  required  /lib/security/pam_userdb.so  db=/etc/vsftpd/vlogin
6. 设置主机访问控制
#vim   /etc/hosts.allow
添加如下内容:
vsftpd:192.168.5.0/24:ALLOW
7. 启动服务
#service  vsftpd   start

8.实验效果验证:用虚拟用户进行登录