FTP服务器工作原理及配置详解



FTP工作原理概述                                                                 


FTP:file transfer protocol 

它也是一个C/S架构的服务。server:监听在套接字21/tcp端口。按照套接字监听工作状态可以分为两类:    

    命令连接:发送文件管理类命令,始终处于连接状态,始终监听在21/tcp端口。

    数据连接:主要是实现数据传输,这种连接是按需连接的,而且在传输结束会立刻中断。

对于数据连接还有两种不同的工作模式:

    主动工作的模式:服务器根据监听在21端口接收到的命令,使用自己的20号端口,将数据传输给客户端请求的端口加1那个端口。(例如:client使用6432端口请求,了一个ls命令。这时服务器监听在21端口接收到了这个命令并给予相应的处理之后,通过自己的20端口把数据相应的发给客户端的6433端口)。如图:

wKioL1SZkB6QdgVhAACMk5ttMNw041.jpg但是这样问题就来了:如果客户端在自己的主机上施加了防火墙,那么服务器端的信息就无法送达了,其实我们还有另外一种工作模式。

    被动工作的模式:这种工作模式是由服务器根据每个用户的请求对应开启一个大于1023的随机端口,这个端口与用户请求存在着关联关系(这个关联关系是服务器自身用于判断被客户端连接时是否放行的)。当这个端口开启之后,FTP服务器会通知client到这个开启的随机端口请求数据,为了防止前来请求的用户不是冒名顶替的坏蛋。服务器在此时会根据存在关联关系做出判断是否放行。(这种判断方式就是连接追踪)。由此,既保证了数据的有效传输,又保证了服务器的安全。

注意:服务器发送端口编号给客户端不是直接一个端口编号给客户端的。而是通过数字计算的两个数字比如(234,12)。这两个数字分别是端口号除以256所得的商数和余数。(234,12)实际就是端口59916


wKioL1SZmVnyIN9PAACntt-U9Os259.jpg


服务器常见程序:wu-ftpd | proftpd | vsftpd 等。

客户端常见程序:普通浏览器、filezilla 等

ftp服务单位响应码,和httpd的响应码是一样的三位数字:

     1XX:信息类

     2xx:成功类

     3XX:提示需要,进一步补全需求

     4XX:客户端错误。

     5xx:服务器端错误。

VSFTP的主配置文件及几种登陆方式                                                 


我这里使用vsftp来搭建FTP服务,首先rpm -q vsftpd 查看是否安装了这个用具。另外需要安装的工具有ftp,和lftp.

    #yum install vsftpd -y 
    #yum install ftp -y
    #yum install lftp -y
    #rpm -ql vsftpd          //查看生成了那些配置配置文件

    /var/ftp/pub              //这里是ftp文件的共享存放位置。                         

    /etc/rc.d/init.d/vsftpd   //服务脚本

    /etc/vsftpd/vsftpd.conf   //这是主配置文件

    其中在登陆FTP的用户中可以分三类,在主配置文件中可以做出相应的配置。

#vim /etc/vsftpd/vsftpd.conf   //这个配置文件主要包括下面一些配置。

1.匿名用户配置:                                                                                     


匿名用户:这类用户是以映射为ftp用户的方式登陆的。                                          

    anonymous_enable=YES|NO  --->此项开启匿名用户登陆权限。在这个权限开启之后,对于匿名用户还有三类附加的常用权限,有些权限可能没有定义在文件中需要自己添加。

    anon_upload_enable=NO|YES       //允许匿名用户上传文件
    anon_mkdir_write_enable=NO|YES  //允许匿名用户创建目录
    anon_other_write_enable=NO|YES  //允许用户删除

注意:匿名用户的登陆是通过映射为FTP用户的方式。如果匿名用户想拥有以上某种执行权限,仅仅在配置文件中定义是不够的,还需要FTP在文件系统中有执行权限,及属主属组为ftp。


2.普通用户配置:这是OS系统上的用户,登陆时需要用户名和密码。                                          


本地用户登陆格式:例如:lftp -u USERNAME,PASSWORD 172,16.249.11 

    注意:-u 指定用户逗号,后面紧跟密码,中间不允许空格。 

    local_enable=YES|NO   //此项开启表示允许本地用户登陆使用
    local_umask=022       //本地用户创建文件的权限使用的UMASK
    write_enable=YES|NO   //允许本地上传操作


注意:匿名用户是默认只允许在ftp这个映射用户的家目录中执行操作,但是本地用户只要有权限默认是可以在文件系统中游荡的。那么这样就是很危险的,因此我们要对本地用户的活动范围进行限定。

    禁锢用户于家目录的实现

    chroot_local_user=YES   //启动禁止用户于家目录功能
    chroot_list_enable=YES  //启用一个列表用于存放被禁止的用户
    chroot_list_file=/etc/vsftpd/chroot_list //想要禁止的用户写在这个指向的文件中

3.虚拟用户配置:这类用户不需要把自己额账号和密码放在,放在/etc/passwd 和/etc/shadow                   


    虚拟用户不是文件系统中的用户,而是通过文件,或者关系型数据库存储的与OS无关的用户。这些所有的用户在登陆时是通过映射为我们系统上一个普通用户的方式登陆。尽管这些所有用户都是通过映射为系统上某一个用户的方式登陆系统,我们依然可以实现对不同虚拟用户的访问权限控制。那么究竟是如何玩实现的呢?最后会给出基于关系型数据库存储,及不同虚拟用户权限设置。这里先介绍一下这个主配置文件。

    虚拟用户的配置是在文件中加入以下两行:

     guest_enable=YES             //允许虚拟宾客访问
     guest_username=vuser         //定义虚拟宾客映射的用户名

4.日志:                                                                                             


    xferlog_enable=YES|NO         //是否启用传输日志
    xferlog_std_format=NO         //是否使用标准格式。
    xfer_file=/var/log/xferlog    //定义传输日志的存放位置

5.改变上传后文件的属主和数组:                                                                       


    chown_uploads=YES|NO          //开启修改属主属组的功能
    chown_username=whoever        //whoever要修改为自己指定的人

6.用于pam的认证限制                                                                                  


     pam_service_name=vsftpd //这个文件是定义的认证的文件位置
     userlist_enable=YES|NO  //这个配置参数表示启用用户列表。
     userlist_deny=YES|NO //加上这句表示这是判断白黑名单的列表了,如果是yes这就是黑名单了

    这个用户列表在  /etc/vsftpd/userlist 

    listen=yes表示vsftpd使用套接字监听。

    注意:这个文件原来是有很多用户名的,使用时全部清空就可以了。如果我们使userlist_deny=no 这里表示这个名单是白名单,这样之后匿名用户就不可以登陆。

7.连接限制                                                                                           


    max_clients       //最大并发连接数;
    max_per_ip        //每个IP可同时发起的并发请求数;
    anon_max_rate:    //匿名用户的最大传输速率;
    local_max_rate:   //本地用户的最大传输速率。

基于关系型数据库的虚拟用户访问控制                                             


思路:我们这里实现的是基于关系型数据的存储虚拟用户,并实现对不通的虚拟用户进行不同的权限控制。1.首先我们需要建立一个数据库,并且在数据库中键入我们授权的虚拟用户,为了让ftp可以查看库中的用户和密码。给予访问的用户一个授权。2.要给ftp进程建立一个存储虚拟用户列表查找路径的文件,并且在主配置文件中定义这个文件的位置。3.创建一个虚拟用户的映射用户,并且给予授权家目录。4.对不同的虚拟用户进行权限限制。


配置前准备:因为我们基于关系型数据库存储,需要用到pam的认证,因此需要安装pam_mysql的插件。

安装mysqlpam_mysql 

#yum -y install pam_mysql 

注意:pam_mysqlepel源提供。

1.准备数据库及相关表                                                                      

就是把我们用于ftp登陆的用户放在数据库中存储。

首先请确保mysql服务已经正常启动。而后,按需要建立存储虚拟用户的数据库即可,这里将其创建为vsftpd数据库。

mysql> create
database vsftpd;
mysql> grant select on vsftpd.* to [email protected] identified by 'password';  //为了防止本地主机不能登陆,授权一个远程主机。
mysql> flush
privileges; 
mysql> use
vsftpd;
mysql> id int AUTO_INCREMENT NOT NULL,   
    -> name varchar(20)  NOT NULL,      
    -> password char(48) NOT NULL,   
    -> primary key(id)                                         
    -> );
mysql> insert
into users(name,password) values('ftpuser1',password('password'));
mysql> insert
into users(name,password) values('ftpuser2',password('password'));

2.建立虚拟用户列表查找路径的文件                                                          

#vi /etc/pam.d/vsftpd.mysql

添加如下两行

authrequired /lib64/security/pam_mysql.souser=vsftpd passwd=password host=172.16.249.149 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
accountrequired /lib64/security/pam_mysql.so
user=vsftpd passwd=password host=172.16.249.149 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

注意:由于各主机不同,/lib64/security/pam_mysql.so模块可能存在差异,使用rpm -ql pam_mysql查看具体的模块路径。另外如果如果加密使用了password函数,crypy=2。

修改vsftpd的配置文件,/etc/vsftpd/vsftpd.conf  指向这个文件

pam_service_name=vsftpd.mysql

3.建立虚拟用户映射的系统用户及对应的目录                                                  

# useradd -s sbin/nologin -d /var/ftproot vuser
# chmod go+rx  /var/ftproot
vim /etc/vsftpd/vsftpd.conf
guest_enable=YES               允许虚拟用户访问
guest_username=vuser           定义映射的用户名是vuser

另外确认主配置文件已经启用了下列选项,没有的需要自己添加。

vim etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES

4.配置虚拟用户具有不同的访问权限                                                          

方法:在主配置文件中定义一个存放用户虚拟用户权限的目录,在这个目录中为每个虚拟用户的写一个定义权限的文件,名字为虚拟用户的用户名。

a.配置vsftpd为虚拟用户使用配置文件目录

# vim vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_config  //定义目录位置

b.创建所需要目录,并为虚拟用户提供配置文件 

#mkdir /etc/vsftpd/vusers_config/
#cd /etc/vsftpd/vusers_config/
#touch ftpuer1 ftpuser2

c.配置虚拟用户的访问权限

虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。

 anon_upload_enable= {YES|NO}            允许上传?
 anon_mkdir_write_enable={YES|NO}        允许创建目录?
 anon_other_write_enable={YES|NO}        允许下载和删除?
 # service vsftpd start
 # chkconfig vsftpd on 
 # netstat -tnlp | grep :21


下面可以使用虚拟用户登录,验正配置结果了!

 lftp -u ftpuser1,password 172.16.249.149