【Linux】FTP(文件传输协议)

一、FTP简介

FTP(File Transfer Protocol,文件传输协议)是用于在网络上进行文件传输的一套标准协议,它属于网络传输协议的应用层。它最主要的功能是在服务器与客户端之间进行文件的传输。这个协议使用的是明文传输。为了更安全的使用FTP协议,只介绍较为安全但功能较少的vsftpd这个软件。

FTP服务器的功能除了单纯的进行文件的传输与管理外,依据服务器软件的配置架构,它还可以提供以下几个主要功能:

1、不同的用户:

FTP服务器在默认的情况下,依据用户登录的情况而分为三种不同的身份,分别是:实体用户,real user;访客,guest;匿名用户,anonymous。

2、命令记录与日志文件记录

FTP可以利用系统的syslogd来进行数据的记录,而记录的数据包括了用户曾经使用过的命令与用户传输数据(传输时间、文件大小等)的记录,所以你可以在/var/log/里面找到各项日志信息。

3、限制用户活动的目录(change root,简称chroot)

为了避免用户在你的linux系统中随意切换目录,所以将用户的工作范围局限在用户主目录下面。FTP可以限制用户仅能在自己的用户主目录当中活动。当用户登录FTP后,由于用户无法离开自己的用户主目录,显示的根目录就是自己用户主目录的内容。这种环境称为change root,即chroot,即改变根目录的意思。

二、FTP的工作流程

FTP的传输使用的是TCP数据包协议。FTP服务器使用了两个连接,分别是命令通道数据流通道。由于是TCP数据包,这两个连接都需要经过三次握手。

建立命令通道的过程

客户端会随机获取一个大于1024以上的端口来与FTP服务器端的port 21来实现连接,这个过程需要三次握手。实现连接后客户端便可以通过这个连接来对FTP服务器执行命令,查询文件名、下载、上传等命令都是利用这个通道来执行的。

建立数据通道的过程

1)通知FTP服务器端使用主动连接且告知连接的端口号

FTP服务器的端口21号主要用在命令的执行,但是牵涉到数据流时,就不是使用这个连接了。客户端在需要数据的情况下,会告知服务器端要用什么方式来连接,如果是主动连接,客户端会先随机启用一个端口,且通过命令通道告知FTP服务器这两个信息,并等待FTP服务器的连接。

FTP服务器主动向客户端连接(PORT方式)

FTP服务器由命令通道了解客户端的需求后,会主动地由port 20向客户端的数据端口连接,这个连接也会经过三次握手。此时FTP的客户端与服务器端会建立两条连接,分别用在命令的执行与数据的传递。而默认FTP服务器端使用的主动连接端口就是port 20。

数据传输通道是在有数据传输的行为时才会建立的通道,并不是一开始连接到FTP服务器就立刻建立的通道。

 注意:port 21主要接收来自客户端的主动连接,port 20则为FTP服务器主动连接至客户端。

(2)客户端选择被动式连接模式(PASV方式

客户端通过命令通道发出被动式连接要求,并等待服务器的回应。

FTP服务器启动数据端口,并通知客户端连接

如果你所使用的FTP服务器是能够处理被动式连接的,此时FTP服务器会先启动一个监听端口。这个端口号码可以是随机的,也可以自定义某一范围的端口,这要看FTP服务器软件而定。然后FTP服务器会通过命令通道告知客户端这个已经启动的端口port pasv,并等待客户端的连接。

客户端随机取用大于1024的端口进行连接

然后客户端会随机取用一个大于1024的端口号来进行对主机的port pasv连接。如果一切都没有问题的话,那么FTP数据就可以通过客户端的随机端口和服务端的port pasv来传送了。

请注意:选择用PASV方式还是PORT方式登录FTP服务器,选择权在FTP客户端 

三、ftp的使用以及软件的安装

为了更安全的使用FTP协议,只介绍较为安全但功能较少的vsftpd这个软件。vsftpd(very secure FTP daemon)。vsftpd是一个设计的较为安全的FTP服务器软件,它的特点如下:

(1)vsftpd服务的启动者身份为一般用户,所以对linux系统的权限较低,对于linux系统的危害就相对降低了。此外,vsftpd也利用chroot这个函数来进行改换根目录的操作,使得系统工具不会被vsftpd这个服务所利用。

(2)任何需要具有较高执行权限的vsftpd命令均以一个特殊的上层程序所控制,该上层程序享有的较高执行权限功能已经被限制的比较低,并以不影响linux系统本身的系统为准。

(3)绝大部分FTP会使用到的额外命令功能(例如ls,cd等)都已经被整合到vsftpd主程序当中了,因此理论上vsftpd不需要使用到额外的系统提供的命令。

(4)所有来自客户端且想要使用这个上层程序所提供的较高执行权限的vsftpd命令的需求,均被视为不可信任的要求来处理,必须要经过相当程度的身份确认后,才可以利用上层程序的功能。

(5)关于上层程序,会使用chroot的功能来限制用户的执行权限。

[root@localhost ~]# yum install vsftpd -y                   //装包

说明: 

/etc/vsftpd/vsftpd.conf     配置文件,设置参数方式为“参数=设置值”,等号两边不能有空格

/etc/pam.d/vsftpd            这个是vsftpd使用PAM模块时的相关配置文件。主要用来作为身份认证,还有阻挡一些用户身份的功能,(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止访问的用户来自/etc/vsftpd/ftpusers文件中的用户)

/etc/vsftpd/ftpusers         与上面一个文件有关系,也就是PAM模块所指定的那个无法登录的用户配置文件,只要将不想让他登录的FTP账号写入这个文件即可。

/etc/vsftpd/user_list         这个文件能否生效与vsftpd.conf内的两个参数有关,分别是userlist_enable和userlist_deny。

/etc/vsftpd/chroot_list      这个文件默认是不存在的,所以需要手动创建。这个文件的功能是可以将某些账号的用户chroot建立在他们的默认主目录。这个文件是否生效与vsftpd.conf内的chroot_list_enablechroot_list_file两个参数有关。

/var/ftp/                           这是vsftpd默认匿名用户登录的根目录。

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf

12 anonymous_enable=YES                      是否允许匿名用户登录vsftpd主机

16 local_enable=YES                                 是否允许/etc/passwd内的账号登录vsftpd服务器

19 write_enable=YES                                 是否允许用户上传数据

23 local_umask=022                                   默认本地用户上传普通文件权限掩码

29 #anon_upload_enable=YES                  是否允许匿名用户上传文件

 33 #anon_mkdir_write_enable=YES         是否让匿名用户具有建立目录的权限。

37 dirmessage_enable=YES                      当用户进入某个目录时,会显示该目录需要注意的内容

40 xferlog_enable=YES                              设置为YES时,用户上传与下载文件都会被记录下来

43 connect_from_port_20=YES                  主动请求的数据端口

 53 #xferlog_file=/var/log/xferlog                 如果xferlog_enable=YES,这里就可以设置日志文件的文件名

57 xferlog_std_format=YES  

60 #idle_session_timeout=600                    如果用户在600秒内都没有命令操作,强制脱机。

63 #data_connection_timeout=120             如果服务器与客户端的数据连接已经成功建立,但是由于线路问题导致120秒                                                                        内还是无法顺利的完成数据的传送,那客户端的连接就会被强制断开

 67 #nopriv_user=ftpsecure                         设置一个执行vsftpd服务的用户

 82 #ascii_upload_enable=YES                   为YES表示客户端默认使用ascii格式上传文件

83 #ascii_download_enable=YES                如果设置为YES,那么client就默认使用ASCII格式下载文件

 

90 #deny_email_enable=YES                       将某些特殊的email  address阻挡住

92 #banned_email_file=/etc/vsftpd/banned_emails          如果deny_email_enable=YES,可以利用这个设置项目来规定哪                                                                                        个email address不可登录我们的vsftpd。在上面设置的文件内,一                                                                                           行输入一个email address即可

100 #chroot_local_user=YES                        是否将用户限制在自己的主目录之内,如果是YES代表用户会被限制在自己                                                                           的主目录之内

101 #chroot_list_enable=YES                        是否启用chroot写入列表的功能

103 #chroot_list_file=/etc/vsftpd/chroot_list    如果chroot_list_enable=YES就可以设置这个项目,这个项目与                                                                                              chroot_local_user有关

114 listen=NO

123 listen_ipv6=YES

125 pam_service_name=vsftpd                      设置PAM认证模块名称为vsftpd

126 userlist_enable=YES                                是否借助vsftpd的阻挡机制来处理某些不受欢迎的账号

127 tcp_wrappers=YES                                   服务端和客户端访问控制策略

[root@localhost pub]# systemct restart vsftpd                 

在重启vsftpd服务后,就可以使用浏览器访问ftp服务:

还可以在Windows的文件管理器输入:

如果打不开记得关闭防火墙和selinux

 实验一:匿名用户的访问

1、匿名用户可以下载文件

[root@localhost pub]# systemct restart vsftpd

[root@localhost pub]# systemctl stop firewalld

[root@localhost pub]# setenforce 0

2、匿名用户可以上传文件

[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf

anon_upload_enable=YES

anon_mkdir_write_enable=YES

[root@localhost pub]# systemctl restart vsftpd

匿名用户默认访问的服务器的目录是/var/ftp/,如果要实现匿名用户可以上传文件,要进行相关权限设置。例如:

[root@localhost ftp]# chmod o+w /var/ftp/pub/

注意:如果给/var/ftp/目录的其他人给了rwx的权限,那么服务器会强制要求你进行用户认证。

思考:匿名用户上传普通文件和目录文件之后的默认权限是多少?                 644和755

如果想设置匿名用户上传文件的权限,需添加如下设置:

[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf

anon_umask=022                                          添加该内容

注意:以上操作匿名用户可以上传文件,但是无法删除文件

3、匿名用户可以删除文件

[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf

anon_other_write_enable=YES 添加该内容

实验二:本地用户(/etc/passwd)的访问

1、下载文件

[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf

anonymous_enable=NO                              修改为NO,注释无效

默认登录后显示的信息是该用户的家目录的信息,但是该用户可以查看到根目录(需要使用ie浏览器)

2、上传、删除文件

[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf

write_enable=YES                                      默认该选项已开启

>>测试:通过IE浏览器(其他浏览器可能看不到效果)访问ftp://ip,需要通过用户名密码进行登录(root用户无法成功),默认访问的界面是根目录下面的文件,可以通过本地用户上传文件和下载文件也可以删除文件。弊端是:通过本地用户的身份能看到/下的所有东西。   

 3、能否chroot

首先开启chroot选项

[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf

allow_writeable_chroot=YES   (如果该字段未添加,则未写在chroot_list文件的用户无法登录)

chroot的三个重要控制文件

chroot_local_user=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

 

                   chroot_list_enable=YES

        chroot_list_enable=NO

  chroot_local_user=YES

在/etc/vsftpd/chroot_list文件中列出的用户可以切换到其他目录;未列出的用户被限制在自己的主目录内

所有的用户都无法切换到其他目录

  chroot_local_user=NO

在/etc/vsftpd/chroot_list文件中列出的用户被限制在自己的主目录内;未列出的用户可以切换到其他目录。

所有的用户都可以切换到其他目录

 

实验三:虚拟用户的访问

创建一个用户,禁止该用户登录系统

[root@localhost ~]# useradd -s /sbin/nologin vhaha

修改主目录下的权限:

[root@localhost ~]# chmod 705 /home/vhaha/ 

添加以下三个选项

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf

guest_enable=YES

guest_username=vhaha

virtual_use_local_privs=YES          本地虚拟用户特权开启表示和本地用户访问时的权限一样,如果为NO表示虚拟用户和                                                            匿名用户是相同的权限。

创建虚拟用户文件:

[root@localhost ~]# vim /etc/vsftpd/vhaha

xixi  用户名

redhat  密码

haha   用户名

redhat 密码

将虚拟用户文件转换成数据库文件:

[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vhaha /etc/vsftpd/vhaha.db

-T表示允许应用程序能够将文本文件转译载入进数据库

-t hash表示使用hash码加密

-f指定包含用户名和密码文本文件。此文件格式为:奇数行为用户名、偶数行为密码

修改PAM认证方式

编辑认证配置文件

[root@localhost vsftpd]# vim /etc/pam.d/vsftpd

注释所有内容 ,添加以下两行

auth required pam_userdb.so db=/etc/vsftpd/vhaha

account required pam_userdb.so db=/etc/vsftpd/vhaha

注:(.so动态链接数据库)数据库文件名的扩展名“.db”不用写

发布了43 篇原创文章 · 获赞 50 · 访问量 7955

猜你喜欢

转载自blog.csdn.net/weixin_43997530/article/details/103550744
今日推荐