vsftp

FTP服务器默认使用TCP协议的20,21端口与客户端进行通信。21端口用于建立控制连接,并传输FTP控制命令,20端口用于建立数据连接,并传输文件数据。

[root@linux ~]# rpm -ivh /media/RHEL_5.5\ i386\ DVD/Server/vsftpd-2.0.5-16.el5_4.1.i386.rpm
warning: /media/RHEL_5.5 i386 DVD/Server/vsftpd-2.0.5-16.el5_4.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing...                ########################################### [100%]
   1:vsftpd                ########################################### [100%]
[root@linux ~]#

 安装好vsftp软件包后,将自动添加vsftp系统服务,通过“/etc/init.d/vsftp”脚本可以控制vsftp服务的启动和终止,而无须手动执行“/usr/sbin/vsftpd”程序。
vsftp服务的配置文件默认位于/etc/vsftp/文件夹中,主要包括用户控制列表文件(ftpusers, user_list)和主配置文件(vsftpd.conf)。
 ftpusers和user_list文件中包含一份FTP用户的列表,两个文件虽然都用于FTP用户的控制,但是具体作用存在一些差异
 ftpusers文件:该文件包含的用户账户将被禁止登录vsftp服务器,不管该用户是否在user_list文件中出现。通常将root,bin,daemon等特殊用户在该文件中,禁止用于登录FTP服务
 user_list文件:该文件中包含的用户账户可能被禁止登录,也可能被允许登录,具体在主配置文件vsftpd.conf中决定。当存在“userlist_enable=YES”配置项时,user_list文件生效,如果配置“userlist_deny=YES” 则仅禁止列表中的用户账户登录,如果配置“userlist=deny=NO”则仅允许列表中的用户账户登录
 ftpusers文件为vsftpd服务器提供了一份用于禁止登录的FTP用户列表,而user_list文件提供了一份可灵活控制的FTP用户列表。二者相互结合,为FTP用户控制提供了良好的基础。
vsftpd.conf常见配置项及含义说明
作用范围 配置项及示例 含义说明
匿名用户 anonymous_enable=YES 是否允许匿名访问
 anon_umask=022 设置匿名用户所上传文件的默认权限掩码值
 anon_root=/var/ftp 设置匿名用户的FTP根目录(缺省为/var/ftp)
 anon_upload_enable=YES 是否允许匿名用户上传文件
 anon_mkdir_write_enable=YES 是否允许匿名用户有创建目录的写入权限
 anon_other_write_enable=YES 是否允许匿名用户有其他写入权限。如对文件改名,覆盖及删除文件
 anon_max_rate=0 限制匿名用户的最大传输速率(0为无限制)单位为字节
本地用户 local_enable=YES 是否允许本地系统用户访问
 local_umask=022 设置本地用户所上传文件的默认权限掩码值
 local_root=/var/ftp 设置本地用户的FTP根目录(却省为用户的宿主目录)
 chroot_local_user=YES 是否将FTP本地用户禁止在宿主目录中
 local_max_rate=0 限制本地用户的最大传输速率(0为无限制)单位为字节
全局配置 listen=YES 是否以独立运行的方式监听服务
 listen_port=21 设置监听FTP服务的端口号
 write_enable=YES 启用任何形式的写入权限(如上传,删除文件等)都需要开启此项
 download_enable=YES 是否允许下载文件(建立仅限于浏览,上传的FTP服务器是可将其设为NO)
 dirmessage_enable=YES 用户切换进入目录时显示 .message文件(如果存在)的内容
 xferlog_enable=YES 启用xferlog日志,默认记录到“/var/log/xferlog”文件
 xferlog_std_format=YES 启用标准的xferlog日志格式,若禁用次选项,将使用vsftp自己的日志格式
 connect_from_port_20=YES 允许服务器主动模式(从20端口建立数据连接)
 pasv_enable=YES 允许被动模式连接
 pasv_max_port=24600 设置用于被动模式的服务器最大端口号
 pasv_min_port=24500 设置用于被动模式的服务器最小端口号
 pam_service_name=vsftpd 设置用户认证的PAM文件位置(/etc/pam.d/目录中对应的文件名)
 userlist_enable=YES 是否启用user_list用户列表文件
 userlist_deny=YES 是否禁止user_list列表文件中的用户账号
 max_per_ip=0 对来自相同IP地址的客户端,最多允许多个并发连接(0为无限制)
 tcp_wrappers=YES 是否启用TCP_Wrappers主机访问控制(TCP_Wrappers的应用将在后来课程中讲解)
 匿名FTP:访问匿名FTP服务器时不需要密码,只需要用户名“ftp”或“anonymous”即可通过验证。当需要提供公开访问的文件下载资源(如ftp.redhat.com),或者上用户上传一些无需保密的数据资料时,可以选择搭建匿名FTP服务器。
 匿名用户对应的系统账号为ftp,其宿主目录为“/var/ftp”该目录也就是匿名用户访问vsftp服务时所在的根目录(可以通过anon_root配置项更改)。将其中pub子目录的属主修改为ftp,保留其可写权限,可提供给匿名用户上传文件使用。
 调整匿名上传目录权限,并准备下载测试文件。
[root@linux ~]# ls -dl /var/ftp/pub/     //查看vsftp的根目录权限
drwxr-xr-x 2 root root 4096 2009-12-04 /var/ftp/pub/
[root@linux ~]# chown ftp /var/ftp/pub/    //修改根目录的属主
[root@linux ~]# ls -dl /var/ftp/pub/     //修改后的结果
drwxr-xr-x 2 ftp root 4096 2009-12-04 /var/ftp/pub/
[root@linux ~]# tar jcf /var/ftp/pub/ftpconfig.tar.bz2 /etc/vsftpd/  //复制文件供下载测试使用
tar: 从成员名中删除开头的“/”
[root@linux ~]#
[root@linux ~]# vim /etc/vsftpd/vsftpd.conf   //修改主配置文件
anonymous_enable=YES     //允许匿名用户访问
local_enable=NO      //若不需要启用本地用户,可以将此项设置为NO
write_enable=YES      //允许开放写入权限
anon_umask=022      //设置匿名用户上传建立文件时的权限掩码
anon_upload_enable=YES    //允许匿名上传文件
anon_mkdir_write_enable=YES   //允许匿名用户创建目录
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=NO     //未启用本地用户时,可以将用户列表功能禁用
tcp_wrappers=YES
…..上下配置文件中以#开头的注释文全为略过
 如果希望匿名用户在上传目录中能够进行覆盖,删除,重命名文件等写入操作,还可以添加“anon_other_write_enable=YES”的配置项。此项配置可能带来安全性问题,应谨慎使用
[root@linux ~]# service vsftpd start      //启用FTP服务
为 vsftpd 启动 vsftpd:                                    [确定]

 以命令方式访问FTP服务
[root@linux5 ~]# ftp 192.168.1.1    //登录vsftpd服务器
Connected to 192.168.1.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.1.1:root): ftp    //以匿名用户进行认证
331 Please specify the password.
Password:       //密码可以为空或任意字符
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls        //查看FTP根目录下的文件,目录列表
227 Entering Passive Mode (192,168,1,1,150,9)
150 Here comes the directory listing.
drwxr-xr-x    2 14       0            4096 Jan 09 02:27 pub
226 Directory send OK.
ftp> cd pub       //切换目录
250 Directory successfully changed.
ftp> ls        //确定是否切换
227 Entering Passive Mode (192,168,1,1,36,86)
150 Here comes the directory listing.
-rw-r--r--    1 0        0            2655 Jan 09 01:50 ftpconfig.tar.bz2
226 Directory send OK.
ftp> get ftpconfig.tar.bz2     //下载服务器中的ftpconfig.tar.bz2文件到本地
local: ftpconfig.tar.bz2 remote: ftpconfig.tar.bz2
227 Entering Passive Mode (192,168,1,1,59,99)
150 Opening BINARY mode data connection for ftpconfig.tar.bz2 (2655 bytes).
226 File send OK.
2655 bytes received in 0.024 seconds (1.1e+02 Kbytes/s)
ftp> put install.log      //上传本地的install.log文件到服务器
local: install.log remote: install.log
227 Entering Passive Mode (192,168,1,1,186,32)
150 Ok to send data.
226 File receive OK.
30057 bytes sent in 0.048 seconds (6.1e+02 Kbytes/s)
ftp> ls        //查看上传目录中的文件属性
227 Entering Passive Mode (192,168,1,1,72,154)
150 Here comes the directory listing.
-rw-r--r--    1 0        0            2655 Jan 09 01:50 ftpconfig.tar.bz2
-rw-r--r--    1 14       50          30057 Jan 09 02:38 install.log
226 Directory send OK.
ftp> quit        //断开FTP连接并退出
421 Timeout.
[root@linux5 ~]# ls -lh ftpconfig.tar.bz2
-rw-r--r-- 1 root root 2.6K 01-09 10:37 ftpconfig.tar.bz2
 如果只下载文件也可以使用wget工具,指定服务器地址及文件路径即可进行下载
[root@linux5 ~]# wget ftp://192.168.1.1/pub/ftpconfig.tar.bz2  //wget工具下载
--2011-01-09 10:52:24--  ftp://192.168.1.1/pub/ftpconfig.tar.bz2
           => `ftpconfig.tar.bz2'
Connecting to 192.168.1.1:21... 已连接。
正在以 anonymous 登录 ... 登录成功!
==> SYST ... 完成。    ==> PWD ... 完成。
==> TYPE I ... 完成。  ==> CWD /pub ... 完成。
==> SIZE ftpconfig.tar.bz2 ... 2655
==> PASV ... 完成。    ==> RETR ftpconfig.tar.bz2 ... 完成。
长度:2655 (2.6K)

100%[=====================================================================>] 2,655       --.-K/s   in 0s     

2011-01-09 10:52:24 (257 MB/s) - `ftpconfig.tar.bz2' saved [2655]

[root@linux5 ~]#

 本地用户FTP
 vsftpd可以直接使用linux系统的本地用户作为FTP用户,提供基于用户/密码的登录验证。使用本地用户登录FTP服务器后,默认将位于自己的宿主目录中,且在宿主目录中拥有读写权限,并允许切换到其他目录。使用chroot_local_user配置项可以将本地用户禁止锢在宿主目录中(部允许切换袋其他目录)。使用local_root配置项可以将本地用户的FTP根目录设置为同一个文件夹。
 以配置一个基于本地用户并进行宽带,用户数限制的FTP服务器为例
添加FTP用户(即为本地用户)
[root@linux ~]# useradd qiao     //添加用户
[root@linux ~]# passwd qiao     //添加用户密码
Changing password for user qiao.
New UNIX password:       //设置密码
BAD PASSWORD: it is WAY too short
Retype new UNIX password:      //确认密码
passwd: all authentication tokens updated successfully.
[root@linux ~]# ls -lh /etc/*.conf > /home/qiao/etcconf.list  //建立测试文件
[root@linux ~]# vim /etc/vsftpd/vsftpd.conf     //修改配置文件
anonymous_enable=NO    //若不需要启用匿名访问,可将此选项设为NO
local_enable=YES     //允许本地用户访问
write_enable=YES     //允许开发写入权限
local_umask=022     //设置本地用户上传建立文件时的权限掩码
chroot_local_user=YES    //为安全起见,建议将用户禁锢于其宿主目录中
max_clients=20     //限制并发客户连接数位最多20个
max_per_ip=2      //限制来自同一IP的客户连接数最多2个
local_max_rate=102400    //本地用户下载,上传限速为100KB/s
pasv_enable=YES     //允许被动模式并设置端口范围
pasv_min_port=24500
pasv_max_port=24600
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@linux ~]# vim /etc/vsftpd/user_list
qiao          //添加此行,并注释掉其他内容
[root@linux ~]# vim /etc/vsftpd/vsftpd.conf  //修改配置文件
userlist_enable=YES      //添加此行时user_list列表用户禁止登录
userlist_deny=NO       //添加此行时user_list列表用户允许登录
[root@linux ~]# service vsftpd restart   //重启服务
关闭 vsftpd:                                              [确定]
为 vsftpd 启动 vsftpd:                                    [确定]

建立基于虚拟用户的vsftpd服务
 vsftpd服务同时支持匿名用户,本地用户和虚拟用户三类账号,使用虚拟用户账号可以提供集中管理的FTP根目录,同时将于FTP登录的用户名。密码与系统用户账号区分开,进一步加强了FTP服务器的安全性。
建立虚拟用户的用户名/密码数据库
 vsftpd服务的虚拟用户数据库使用Berkeley DB格式的数据文件。建立该数据库文件需要用到db_load命令工具
[root@linux ~]# rpm -ivh /media/RHEL_5.5\ i386\ DVD/Server/db4-utils-4.3.29-10.el5.i386.rpm
              //安装db_load命令工具
warning: /media/RHEL_5.5 i386 DVD/Server/db4-utils-4.3.29-10.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing...                ########################################### [100%]
   1:db4-utils              ########################################### [100%]
[root@linux ~]# vim /etc/vsftpd/vusers.list  //建立文本格式的用户名/密码文件
usera         //奇数行为用户名
123456         //偶数行为上一行中用户所对应的密码
userb         //第二个用户
123456         //对应的密码
[root@linux ~]# cd /etc/vsftpd/    //切换目录
[root@linux vsftpd]# db_load -T -t hash -f vusers.list vusers.db //将列表文件转化为DB数据库
[root@linux vsftpd]# file vusers.db       //查看文件类型
vusers.db: Berkeley DB (Hash, version 8, native byte-order)
[root@linux vsftpd]# chown 600 /etc/vsftpd/vusers.* //降低文件权限以提供安全性
 在db.load命令中,“-f”选项用于指定用户名/密码列表文件,“-T”选项允许Berkey DB的应用程序使用从文本格式转换的DB数据文件,“-t hash”选项允许指定读取数据文件的基本方法。
[root@linux ~]# useradd -d /var/ftproot -s /sbin/nologin virtual //建立映射账号virtual
[root@linux ~]# chmod 755 /var/ftproot/      //更改FTP根目录权限
[root@linux ~]# ls -lh /boot > /var/ftproot/vutest.file    //建立测试文件
 vsftpd虚拟用户需要有一个对应的系统用户账号(该账号无需设置密码及登录Shell),该用户账号的宿主目录作为所有虚拟用户登录后共同FTP根目录。

 建立PAM认证文件
PAM配置文件主要用于为程序提供用户认证控制,vsftpd服务使用的默认PAM配置文件为“/etc/pam.d/vsftpd”可以参考该文件的格式建立新的PAM配置文件,用于虚拟用户认证控制,配置时注意将db选项指定为先前建立的虚拟用户数据文件vusers(省略.db扩展名)。
[root@linux ~]# vim /etc/pam.d/vsftpd.vu
#%PAM-1.0
auth       required     pam_userdb.so db=/etc/vsftpd/vusers
account    required     pam_userdb.so db=/etc/vaftpd/vusers

修改vsftpd.conf配置文件,添加虚拟用户支持
 在vsftpd.conf配置文件中添加guest_enable,guest_username配置项,将访问FTP服务的所有虚拟用户对应到同一系统用户账号virtual,并修改pam_service_name配置项,指定上一步建立的PAM配置文件“/etc/pam.d/vsftpd.vu”。

anonymous_enable=NO
local_enable=YES     //使用虚拟用户需要启用本地用户
write_enable=YES
anon_umask=022     //设置虚拟用户所上传文件 的默认权限掩码
guest_enable=YES     //启用用户映射功能
guest_username=virtual   //将映射用户指定为virtual
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd.vu    //修改使用的PAM文件位置
userlist_enable=YES
tcp_wrappers=YES
 在vsftpd服务中, 虚拟用户账号默认作为匿名用户处理以降低权限,因此对应的权限设置通常使用anon_开头的配置项。例如,在设置虚拟用户所有上传文件的默认权限掩码时应采用配置项anon_uamsk而不是local_umask。

为不同的虚拟用户建立独立的配置文件
 通过前面的四个步骤,实际上已经可以重新启动vsftpd斌提供服务了,使用虚拟用账号可以登录FTP服务器并下载文件。以下步骤将设置如何为个别虚拟用户设置不同的访问权限。
 修改vsftpd.conf主配置文件,添加用户配置目录支持
[root@linux ~]# vim /etc/vsftpd/vsftpd.conf //修改主配置文件
user_config_dir=/etc/vsftpd/vuser_dir  //添加此行配置项,指定用户配置目录位置
[root@linux ~]# mkdir /etc/vsftpd/vusers_dir //创建用户配置目录
[root@linux ~]# cd /etc/vsftpd/vusers_dir/  //切换目录
[root@linux vusers_dir]# vim usera   //为usera用户建立独立的配置文件
anon_upload_ebanle=YES     //允许用户有上传文件的权限
anon_mkdir_write_enable=YES    //允许用户有创建目录的写入权限
[root@linux vusers_dir]# touch userb  //为userb用户创建空配置文件(无额外权限设置)
[root@linux ~]# service vsftpd restart   //重新启动
关闭 vsftpd:                                              [确定]
为 vsftpd 启动 vsftpd:                                    [确定]
[root@linux ~]# chkconfig --list vsftpd
vsftpd          0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
[root@linux ~]# chkconfig --level 35 vsftpd on
[root@linux ~]# chkconfig --list vsftpd
vsftpd          0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭
如果需要禁用或者仅允许一部分虚拟用户账号,同样可以使用“/etc/vsftpd/user_list”列表文件。需要注意的是,在“/etc/vaftpd/ftpusers”文件中加入虚拟用户名,并不能禁用对应的系统账号。
测试虚拟用户账户将得到以下结果
使用usera用户可以登录vsftpd服务器,且可以浏览,下载文件,也可以上传文件。
使用userb用户可以登录vsftpd服务器,并可以浏览,下载文件,但无法上传文件。
使用匿名用户或其他系统用户时,将不能登录该vsftpd服务器。