构建FTP文件传输服务器

一、FTP连接及传输模式:
         FTP服务器默认使用TCP协议的2021端口与client进行通信。21号端口用于建立控制连接,并传输控制命令;20号端口用于建立数据连接,并传输文件。根据服务器在建立数据连接的过程中的主、被动关系,FTP的数据连接可以分为主动模式和被动模式。
 
主动模式:服务器主动发起数据连接。首先由客户端向服务器的21号端口建立FTP控制连接,当需要传输数据的时候,客户端以PORT命令告诉服务器,“我打开了某个端口,你过来连接我”,于是,服务器就从20号端口向客户端的这个端口发送请求并建立数据连接。
 
被动模式:这种模式下服务器被动等待数据连接,如果客户机所在的网络的防火墙禁止主动模式连接,通常会用被动模式。首先由客户端向服务器端的21号端口发送控制连接,当需要传输数据的时候,服务器以PASV命令告诉客户端“我打开了某端口,你过来连接我”,于是客户端向服务器的这个端口(非20号)发送请求并建立数据连接。
 
根据在传输文件的时候是否进行字符的转换,又可以分为文本模式和二进制模式:
文本模式:又称为ASCII模式,这种模式在传输文件时使用ASCII字符序列,一般只用于传输纯文本文件。
 
二进制模式:又称为Binary模式,这种模式不会转换文件中的字符序列,更合适传输程序、图片等文件。
 
二、软件的选取:
Linux系统上比较不错的一个FTP服务器软件就是VSFTPD,在RHEL5的系统光盘中已经有了。
文件说明:vsftpd默认的配置文件在/etc/vsftpd/文件夹中,主要包括用户控制列表文件(ftpusers,user_list)和主配置文件/vsftpd.conf
用户控制列表文件ftpusers user_list:
ftpusers:该文件中的包含的用户是禁止登陆到FTP服务器上的。不管该用户是否在user_list中出现,通常将root ,bin,daemon等特殊用户添加到这个文件中。
 
user_list:该文件中的用户是否能够登陆到服务器上,要看vsftpd.conf中的配置。当存在userlist_enable=yes的配置的时,user_list文件才生效。如果配置userlist_deny=yes,则是禁止文件中的用户登陆到服务器上。如果出现:userlist_deny=no则表示允许user_list文件中的用户登陆到服务器上。
 
三、主配置文件vsftpd.conf中的各项说明:
——————————————全局配置—————————————————————
listen=YES                  //是否以独立的方式监听服务
 
listen address=x.x.x.x               //设置监听的地址
 
write_enable=YES             //启用任何形式的写权限,(如上传、删除文件等都需要开启此项)
 
download_enable=YES            //是否允许下载文件
 
dirmessage_enable=YES          //用户切换进入目录时显示.message文件(如果存在)的内容。
 
xferlog_enable=YES                   //启用xferlog日志,默认记录到/var/log/xferlog文件中。
 
xferlog_std_format=YES          //启用标准的xferlog日志格式,若禁用此项将使用vsftpd自己的格式。
 
connect_from_port_20=YES             //允许服务器的主动模式。
 
pasv_eanble=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_clients=0          //设置允许多少个客户端同时连接到FTP服务器,0表示没有限制,官方说是15000是并发是没有问题的。
 
max_per_ip=0          //设置来自相同IP的客户端,最多允许多少个并发连接。0是没有限制。
 
tcp_wrappers=YES           //是否启用TCP_Wrrapers主机访问控制。
 
 
 
——————————————匿名用户配置———————————————————
anonymous_enable=YES          //是否允许匿名用户访问
 
anon_umask=022             //设置匿名用户上传文件默认的权限。umask是指没有的权限。
 
anon_root=/var/ftp          //设置匿名用户的FTP根目录(缺省是/var/ftp
 
anon_upload_enable=YES                 //是否允许匿名用户上传文件。
anon_mkdir_write_eanble=YES                //是否允许匿名用户有创建目录的写入权限
 
anon_other_write_enable=YES                //是否允许匿名用户有其他的写入权限,如文件改名,覆盖及删除文件的权限。
 
anon_max_rate=0            //限制匿名用户最大的传输速率(0是没有限制),单位是字节B
 
—————————————————本地用户配置————————————————
 
local_enable=YES              //是否允许本地用户访问服务器。
 
local_umask=022              //设置本地用户上传的文件默认权限
 
local_root=/var/ftp           //设置本地用户的FTP根目录
 
chroot_local_user=YES             //是否将FTP本地用户禁锢在宿主目录中
 
local_max_rate=0             //限制本地用户最大传输速率 0是没有限制。
 
 
 
四、配置FTP服务器支持虚拟用户:
1、安装db4-utils
vsftpd服务器的虚拟用户数据库使用的是Berkeley DB格式的数据库,建立该数据库文件需要用到db_load命令工具。从RHEL5光盘中安装db4-utils可以使用该工具。
[[email protected] ~]# rpm -ivh /mnt/Server/db4-utils-4.3.29-10.el5_5.2.i386.rpm
warning: /mnt/Server/db4-utils-4.3.29-10.el5_5.2.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing...                ########################################### [100%]
   1:db4-utils              ########################################### [100%]
 
2、在/etc/vsftpd/目录下建立虚拟用户和用户名和密码文件,奇数为用户名,偶数是密码。
[[email protected] vsftpd]# cat vusers.list
admin
admin
hr
hr
切记上面的用户名和密码的后面不能接空格。
 
3、用db_load工具把vusers.list文件转化成DB数据库文件。
[[email protected] vsftpd]# db_load -T -t hash -f vusers.list vusers.db
[[email protected] vsftpd]# file vusers.db
vusers.db: Berkeley DB (Hash, version 8, native byte-order)
[[email protected] vsftpd]# chmod 600 vusers.db
 
-T:表示允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件,
-f:用于指定用户名和密码文件
-t hash:指定读取数据文件的基本方法。
 
4、创建FTP虚拟帐号对应的系统帐号
[[email protected] ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[[email protected] ~]# chmod 755 /var/ftproot          //更改FTP根目录的权限
指定virtual用户的宿主目录是/var/ftproot,不让其登陆系统。
 
5、建立PAM认证文件:
PAM配置文件主要用于为程序提供用户认证控制,vsftpd默认使用的是/etc/pam.d/vsftpd
[[email protected] ~]# cat /etc/pam.d/vsftpd.vu
auth    required        pam_userdb.so db=/etc/vsftpd/vusers
account required        pam_userdb.so db=/etc/vsftpd/vusers
 
6、修改vsftpd.conf配置文件,添加虚拟用户的支持:
              vsftpd.conf文件中添加guest_enable,guest_username,将访问FTP服务器的所有虚拟用户都映射到virtual这个虚拟用户上面。并修改pam_service_name项,指定刚才建立的PAM配置文件/etc/pam.d/vsftpd.vu
 
vsftpd.conf的配置文件如下:
[[email protected] ~]# cat /etc/vsftpd/vsftpd.conf
#-----------------Global Settings----------------------
listen=YES
listen_port=21
 
write_enable=YES
download_enable=YES
 
xferlog_enable=YES
 
pasv_enable=YES
pasv_max_port=24600
pasv_min_port=24500
 
userlist_enable=NO
 
max_clients=100
max_per_ip=5
 
pam_service_name=vsftpd.vu
 
guest_enable=YES
guest_username=virtual
 
tcp_wrappers=YES
 
#---------------Anonymous Settings-------------------
anonymous_enable=YES
anon_root=/var/ftproot/anonymous
anon_max_rate=102400
 
 
 
#--------------Virtual users Settings----------------------
local_enable=YES
#启用虚拟用户需要启用本地用户登陆
user_config_dir=/etc/vsftpd/vusers_dir
 
anon_umask=022
 
 
7、为admin建立独立的配置目录及配置文件
[[email protected] vusers_dir]# cat admin
anon_upload_enable=YES
local_root=/var/ftproot                 //这里要用local_root,而不是anon_root,若是用的是anon_root,则所有的用户的宿主目录都是一样的。不能达到分开的目的。
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
 
[[email protected] vusers_dir]# cat hr
anon_upload_enable=YES
local_root=/var/ftproot/hr
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[[email protected] vusers_dir]#
这里要做下说明,就是系统在对待虚拟用户的时候是以降级的形式来处理的,也就是配置的时候要用匿名用户的格式来写,除了定义虚拟用户的根目录是用local_root还有就是限制虚拟用户下载是用download_enable其他的都是用以anon_开关的来做权限的设定的。
 
8、若还有新的用户要添加的话,那么直接修改vusers.list文件就行了。比如说我现在要添加一个view用户,密码也是view,要求这个用户只能看,不能上传,也不能下载,更不要说修改里面的文件和给文件改名称了。这一个通常在一些教育机构要用到。比如说给你一个可以看的用户,让机构的教学视频有哪些。然后让你再注册VIP等。。我遇到过。
 
来在vusers.list文件中添加view用户
[[email protected] vsftpd]# cat vusers.list
admin
admin
hr
hr
view
view
 
再把那个生成 vusers.db的那个db_load命令再执行一次。
[[email protected] vsftpd]# db_load -T -t hash -f vusers.list vusers.db
 
最后就给view用户来配置权限文件
[[email protected] vusers_dir]# cat view
anon_upload_enable=NO
download_enable=NO               //这里不能用anon_download_enable=NO,因为没有这个配置项,只能用download_enable,所以大家在测试的时候尽量用ftp的交互式命令来测试,这样在哪里配置错误的时候,它会有报错的。
local_root=/var/ftproot/look
[[email protected] vusers_dir]#
 
五、测试FTP服务器:
         首先用匿名登陆下看看:       

构建FTP文件服务器

 
 
admin登陆:

构建FTP文件服务器

 
        
 
hr登陆:

构建FTP文件服务器

        
 
        
 
再用view用户登陆:同时下载文件发现下载不了。再上传文件也上传不了。删除文件和更名view都做不了。        

构建FTP文件服务器

        

构建FTP文件服务器

 

最后,再给一张用ftp交互式命令测试时候报错的图,对排错很有帮助:构建FTP文件服务器