FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。

互联网上提供文件存储和访问服务的计算机,他们依照的是FTP协议提供服务!支持FTP协议的服务器就是FTP服务器!FTP协议提供存储和传输服务的一套协议!

下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。

FTP 的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。

常见的FTP服务

Windows下:Serv-U FTP Server

Linux下有代表性的FTP服务器软件是Wu-FTP、ProFTP 及vsftpd。Wu-FTP(Washington University FTP)是由美国华盛顿大学开发的、以效率和稳定性为参考量的FTP软件。它的功能强大,配置较复杂,由于开发时间较早,应用十分广泛,也因此成为黑客们主要的攻击目标。Wu-FTP的早期各级版本不断出现安全漏洞,系统管理员不得不因安全因素而经常对其进行升级。ProFTP针对Wu-FTP的弱项而开发,除了在安全性方面进行了改进外,还具备设置简单的特点,并提供了一些Wu-FTP没有的功能,大大简化了架设和管理FTP服务器的工作。vsftpd 则凭借在安全性方面的出色表现,被很多大型网站广为采用。

工作端口和模式

20号端口:数据传输端口 ftp-data

21号端口:指令传输端口

[root@kylinos63 ~]# grep ftp /etc/services

ftp-data        20/tcp

ftp-data        20/udp

# 21 is registered to ftp, but also used by fsp

ftp             21/tcp

ftp             21/udp          fsp fspd  #fsp=file service protocol 文件服务协议

模式:FTP 是基于客户———服务器(C/S)模型而设计的,在客户端与 FTP 服务器之间建立两个连接。

工作原理

开发任何基于 FTP 的客户端软件都必须遵循 FTP 的工作原理,FTP 的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条 TCP 连接,一条是数据连接,用于数据传送;另一条是控制连接,用于传送控制信息(命令put、get和响应),这种将命令和数据分开传送的思想大大提高了 FTP 的效率,而其它客户服务器应用程序一般只有一条 TCP 连接。在整个交互的 FTP 会话中,控制连接始终是处于连接状态的,数据连接则在每一次文件传送时先打开后关闭。

数据传输原理

数据传输原理: FTP的传输有两种方式:ASCII、二进制(默认传输方式)。

ASCII传输方式

假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。

但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝。

二进制传输模式

在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。

如在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果传输二进制文件,所有的位都是重要的。)

支持模式

FTP客户端发起FTP会话,与FTP服务器建立相应的连接。FTP会话期间要建立控制信息进程与数据进程两个连接。控制连接不能完成传输数据的任务,只能用来传送FTP执行的内部命令以及命令的响应等控制信息;数据连接是服务器与客户端之间传输文件的连接,是全双工的,允许同时进行双向数据传输。当数据传输完成后,数据连接会撤消,再回到FTP会话状态,直到控制连接被撤消,并退出会话为止。

工作流程(原理):主动被动模式

FTP会话包含了两个通道,控制通道和数据通道,FTP的工作有两种方式,一种是主动模式,一种是被动模式,以FTPServer为参照物,主动模式,服务器主动连接客户端传输,被动模式,等待客户端的的连接。这里都是相对于服务器而言的。

(无论是主动模式还是被动模式,首先的控制通道都是先建立起来的,只是在数据传输模式上的区别)

主动模式(standard、PORT方式)

服务器是主动的连接客户端的,所以称这种模式为主动模式。

工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:

PORT模式 :当FTP客户以PORT模式连接服务器时,他动态的选择一个端口号(本次试验是6015)连接服务器的21端口,注意这个端口号一定是1024以上的,因为1024以前的端口都已经预先被定义好,被一些典型的服务使用,当然有的还没使用,保留给以后会用到这些端口的资源服务。当经过TCP的三次握手后,连接(控制信道)被建立。现在用户要列出服务器上的目录结构(使用ls或dir命令),那么首先就要建立一个数据通道,因为只有数据通道才能传输目录和文件列表,此时用户会发出PORT指令告诉服务器连接自己的什么端口来建立一条数据通道(这个命令由控制信道发送给服务器),当服务器接到这一指令时,服务器会使用20端口连接用户在PORT指令中指定的端口号,用以发送目录的列表。当完成这一操作时,FTP客户也许要下载一个文件,那么就会发出get指令,请注意,这时客户会再次发送PORT指令,告诉服务器连接他的哪个"新"端口,你可以先用netstat -na这个命令验证,上一次使用的6044已经处于TIME_WAIT状态。当这个新的数据传输通道建立后(在微软的系统中,客户端通常会使用连续的端口,也就是说这一次客户端会用6045这个端口),就开始了文件传输的工作。

被动模式(Passive 、PASV)

服务器是被动的等待客户端来连接的,所以称这种模式为被动模式。

PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:

PASV模式 :然而,当FTP客户以PASV模式连接服务器时,情况就有些不同了。在初始化连接这个过程即连接服务器这个过程和PORT模式是一样的,不同的是,当FTP客户发送ls、dir、get等这些要求数据返回的命令时,他不向服务器发送PORT指令而是发送PASV指令,在这个指令中,用户告诉服务器自己要连接服务器的某一个端口,如果这个服务器上的这个端口是空闲的可用的,那么服务器会返回ACK的确认信息,之后数据传输通道被建立并返回用户所要的信息(根据用户发送的指令,如ls、dir、get等);如果服务器的这个端口被另一个资源所使用,那么服务器返回UNACK的信息,那么这时,FTP客户会再次发送PASV命令,这也就是所谓的连接建立的协商过程。

 在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。

总结:

主动FTP:

命令连接:客户端 >高位端口 ------> 服务器 21端口

数据连接:客户端 >2高位端口 <------ 服务器 20端口

被动FTP:

命令连接:客户端 >高位端口 -------> 服务器 21端口

数据连接:客户端 >2高位端口 -------> 服务器 >Server高位端口

两个模式面临的问题:

主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。

被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。

第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。

随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置。

主动与被动FTP优缺点的简要总结:

主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。

幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。

active和passive模式的配置:

在命令行输入vim /etc/vsftpd/vsftpd.conf:

1> active mode:

pasv_enable=NO     (passive模式关闭)

pasv_min_port=3000

pasv_max_port=4000

port_enable=YES    (active模式开启)

connect_from_port_20=YES  (即默认情况下,FTP PORT主动模式进行数据传输时使用20端口(ftp-data)。YES使用,NO不使用。)

2>passive mode:

pasv_enable=YES

pasv_min_port=3000

pasv_max_port=4000

设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意(1024 – 65535端口)。默认值为0。把端口范围设在比较高的一段范围内,比如3000-4000。

在linux上,如果不配置pasv_enable=NO,默认是passive模式。

用户分类

Real实体帐户

这类用户是指在FTP服务上拥有帐号。当这类用户登录FTP服务器的时候,其默认的主目录就是其帐号命名的目录。但是,其还可以变更到其他目录中去。如系统的主目录等等。

Guest虚拟用户

在FTP服务器中,我们往往会给不同的部门或者某个特定的用户设置一个帐户。但是,这个账户有个特点,就是其只能够访问自己的主目录。服务器通过这种方式来保障FTP服务上其他文件的安全性。这类帐户,在Vsftpd软件中就叫做Guest用户。拥有这类用户的帐户,只能够访问其主目录下的目录,而不得访问主目录以外的文件。增加了系统安全性,客户端使用guest账户登录,需要提交账号密码,管理员可以根据账号进行策略设置,增加了对用户和下载的可管理性。

Anonymous匿名用户

这也是我们通常所说的匿名访问。这类用户是指在FTP服务器中没有指定帐户,但是其仍然可以进行匿名访问某些公开的资源,权限较小。

在组建FTP服务器的时候,我们就需要根据用户的类型,对用户进行归类。默认情况下,Vsftpd服务器会把建立的所有帐户都归属为Real用户。但是,这往往不符合企业安全的需要。因为这类用户不仅可以访问自己的主目录,而且,还可以访问其他用户的目录。这就给其他用户所在的空间带来一定的安全隐患。所以,企业要根据实际情况,修改用户所在的类别。

软件包

vsftpd-2.2.2-11.el6_4.1.x86_64.rpm             //服务端软件包

ftp-0.17-54.el6.x86_64.rpm                         //客户端软件包

lftp-4.0.9-1.el6.x86_64.rpm                         //类似ftp的客户端软件包,具有增强功能

lftp相对于ftp具有支持协议多,如ftp,ftps,http,https,hftp,等,其中ftps和https需要openssl库的支持,还有自动补全,历史记录,书签,排队,镜像,断点续传,多进程下载,多个后台任务执行的功能!

windows下的ftp工具:CuteFTP,FlashFXP,资源管理器

vsftpd的匿名用户:anonymous/ftp

匿名用户密码为空

相关配置文件和目录

/etc/vsftpd/vsftpd.conf               //主配置文件,核心配置文件

/etc/vsftpd/ftpusers                           //黑名单,这个里面的用户不允许访问FTP服务器

/etc/vsftpd/user_list                           //白名单,允许访问FTP服务器的用户列表

[root@kylinos63 ~]# vim /etc/vsftpd/user_list

# vsftpd userlist

# If userlist_deny=NO, only allow users in this file

# If userlist_deny=YES (default), never allow users in this file, and

#如果在vsftpd.conf中设定了userlist_deny=no(默认是yes),是白名单,是yes就是黑名单,无法登陆,甚至连输入密码的机会都没有

# do not even prompt for a password.

# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers

# for users that are denied.

root

……

/etc/vsftpd/vsftpd_conf_migrate.sh                   //VSFPTD操作的一些变量和设置的脚本等

/var/ftp/                                                   //默认匿名用户跟目录

[root@kylinos63 ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak    //备份配置文件

anonymous_enable=YES                    #匿名用户登陆 允许

local_enable=YES                            #全局设置,是否容许写入(无论是匿名本地用户,若要启用上传权限的话,就要开启他)

write_enable=YES                            #支持本地用户的写权限

local_umask=022                         #本地用户上传上来的文件权限

anon_umask=022                          #匿名用户上传上来文件的权限

anon_root=(none)                            #匿名用户主目录

anon_max_rate=(0)                     #匿名用户速度限制

anon_umask=(077)                  #匿名用户上传文件时有掩码(若想让匿名用户上传的文件能直接被匿名下载,就这设置这里为073)

#no_anon_password=YES           #匿名用户login时不询问口令,此项配置文件无

#anon_world_readable_only=YES  #控制匿名用户对文件的下载权限

#anon_upload_enable=YES             #匿名用户上传是否可以,默认拒绝

#anon_mkdir_write_enable=YES        #匿名用户是否可以建立目录的权限,默认拒绝

#anon_other_write_enable= YES   #控制匿名用户对文件和文件夹的删除和重命名,此项配置文件里面无

dirmessage_enable=YES                #显示目录下的.message文件内容,文件是隐藏的

xferlog_enable=YES                          #传输日志记录,默认位置/etc/var/log/xferlog_enable

connect_from_port_20=YES      #是否监控数据传输端口20,使用的20号端口来连接FTP

#chown_uploads=YES                  #所有匿名上传的文件的所属用户将会被更改成chown_username

#hown_username=find                     #匿名上传文件所属用户名

#xferlog_file=/var/log/xferlog      #配合xferlog_enable=YES使用,指定日志路径

xferlog_std_format=YES                  #使用标准的日志格式

#idle_session_timeout=600               #空闲超时时间,单位是秒

#data_connection_timeout=120        #数据传输超市时间,单位是秒

#nopriv_user=ftpsecure      #当服务器运行于底层的使用用户名,使用什么身份的用户运行

#async_abor_enable=YES       #允许使用\"async ABOR\"命令,一般不用,容易出问题 ,可以直接忽略此项,不记

#ascii_upload_enable=YES                #是否可用ASCII 模式上传。默认值为NO

#ascii_download_enable=YES          #是否可用ASCII 模式下载。默认值为NO

#ftpd_banner=Welcome FTP Sev    #用户登陆显示的欢迎信息,如果设置了banner_file则此设置无效

#deny_email_enable=YES              #如果匿名用户需要密码,那么使用, 此参数默认值为NO。当值为YES时,拒绝使用banned_email_file参数指定文件中所列出的e-mail地址进行登录的匿名用户。即,当匿名用户使用banned_email_file文件中所列出的e-mail进行登录时,被拒绝。显然,这对于阻击某些Dos攻击有效。当此参数生效时,需追加banned_email_file参数,banned_email_file里面的电子邮件地址的用户不能登录

#banned_email_file=/etc/vsftpd/banned_emails        #配合deny_email_enable,禁止使用匿名用户登陆时作为密码的电子邮件地址

#chroot_local_user=YES                  #囚牢在自己的家目录

#chroot_list_enable=YES                 #是否启动限制用户的名单 YES为启用  NO禁用(包括注释掉也为禁用)

#chroot_list_file=/etc/vsftpd/chroot_list       #是否限制在主目录下的用户名单,至于是限制名单还是排除名单,这取决于chroot_local_user的值,我们可以这样记忆: chroot_local_user总是一个全局性的设定,其为YES时,全部用户被锁定于主目录,其为NO时,全部用户不被锁定于主目录。那么我们势必需要在全局设定下能做出一些“微调”,即,我们总是需要一种“例外机制",所以当chroot_list_enable=YES时,表示我们“需要例外”。而”例外“的含义总是有一个上下文的,即,当”全部用户被锁定于主目录“时(即chroot_local_user=YES),"例外"就是:不被锁定的用户是哪些;当"全部用户不被锁定于主目录"时(即chroot_local_user=NO),"例外"“就是:要被锁定的用户是哪些。这样解释和记忆两者之间的关系就很清晰了!

#ls_recurse_enable=YES             #是否能使用ls -R命令以防止浪费大量的服务器资源

listen=YES                                          #独立模式监听服务

#listen_ipv6=YES                                #监听IPV6

pam_service_name=vsftpd             # pam认证服务配置文件位置及其名称

userlist_enable=YES                         #是否支持userlist白名单

userlist_deny=YES                           #白名单转化为黑名单

tcp_wrappers=YES                            #开启tcp_wrappers支持

#listen_port=21                             #使用21号端口

max_clients=100                             #最大同时连接客户端数,0不限制

max_per_ip=5                                 #同一个IP最大连接客户端数,0不限制

local_max_rate=500000                   #本地用户最大传输速率

anon_max­_rate=200000                    #匿名用户最大传输速率

local_root=/local                               #更改本地用的根目录

listen_address=192.168.1.63         #监听的IP地址

download_enable=yes                 #是否允许下载

ftp_username=ftp  #匿名用户所使用的系统用户名。默认下,此参数在配置文件中不出现,值为ftp。

no_anon_password=YES   #控制匿名用户登入时是否需要密码,YES不需要,NO需要。默认值为NO。

anon_root=/home/ftp   #设定匿名用户的根目录,即匿名用户登入后,被定位到此目录下。主配置文件中默认无此项,默认值为/var/ftp/。

anon_world_readable_only=YES|NO #控制是否只允许匿名用户下载可阅读文档。YES,只允许匿名用户下载可阅读的文件。NO,允许匿名用户浏览整个服务器的文件系统。默认值为YES。

#pasv_enable=YES                            #允许使用pasv模式

#port_enable=YES                            #允许使用port模式

以上配置参数的说明,在redhat中可以使用man 5 vsftpd.conf

对于chroot_local_user与chroot_list_enable的组合效果,可以参考下表:

chroot_local_user=YES

chroot_local_user=NO

chroot_list_enable=YES

1.所有用户都被限制在其主目录下

2.使用chroot_list_file指定的用户列表,这些用户作为“例外”,不受限制

1.所有用户都不被限制其主目录下

2.使用chroot_list_file指定的用户列表,这些用户作为“例外”,受到限制

chroot_list_enable=NO

1.所有用户都被限制在其主目录下

2.不使用chroot_list_file指定的用户列表,没有任何“例外”用户

1.所有用户都不被限制其主目录下

2.不使用chroot_list_file指定的用户列表,没有任何“例外”用户

服务启动与关闭

[root@kylinos63 ~]# systemctl enable vsftpd

[root@kylinos63 ~]# systemctl start vsftpd

[root@kylinos63 ~]# netstat -antup | grep ftp

tcp        0      0 0.0.0.0:21         0.0.0.0:*            LISTEN      49769/vsftpd

#FTP的工作端口有20.21号端口,这里么有20号端口的原因是因为没有数据传输

配置FTP服务器实例

通过修改不同的配置文件选项,达到不同的实验效果

匿名用户共享

允许所有员工上传和下载,并允许用户创建自己的目录并修改目录名

[root@kylinos63 ~]# vim /etc/vsftpd/vsftpd.conf                     //需要检查或修改的项目

anonymous_enable=YES               #允许匿名用户访问

anon_upload_enable=YES                #允许匿名用户上传

anon_mkdir_write_enable=YES                   #允许匿名用户创建目录

[root@kylinos63 ~]# systemctl restart vsftpd

测试:

在资源管理器中输入:

进入pub目录,pub目录才是匿名用户的根目录,然后新建一个目录或者文件

无法创建,我们检查目录权限:

[root@kylinos63 ~]# ll -d /var/ftp/

drwxr-xr-x 3 root root 4096 Oct 13 11:40 /var/ftp/

这里要注意,默认匿名用户的根目录/var/ftp,权限是755,这个权限不能改变,切记(这个目录时用户ftp的家目录,家目录的权限不能随便改为别人可以写,安全问题,vsFTPd出于安全考虑,是不准让ftp用户的家目录的权限是完全没有限制的,官方文档提供信息)

需要编辑配置文件,添加如下内容

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

anon_other_write_enable=YES

[root@kylinos63 ~]# chmod 755 -R /var/ftp/pub

[root@kylinos63 ~]# chown ftp:ftp -R /var/ftp/pub

[root@kylinos63 ~]# systemctl restart vsftpd     //重启之后,测试客户端可以读写,重命名了。

日常工作中,我们只是让匿名用户读取,其他权限一般不给

系统用户共享

公司现有一台FTP和一台Web服务器,FTP功能主要维护公司网站内容更新,包括上传,删除,新建等,公司现在有两个部门负责维护任务,分别为team1,和team2账号进行管理,但是不能直接登录本地服务器,账号目录只能在/var/www/html下面工作,不能进入其他任何目录!

此要求将我们的FTP根目录和网站的根目录全部固定在了/var/www/html下面,禁止匿名,还要使用chroot禁锢根目录!

建立用户

[root@kylinos63 ~]# useradd team1

[root@kylinos63 ~]# useradd team2

[root@kylinos63 ~]# echo team1:123456 | chpasswd

[root@kylinos63 ~]# echo team2:123456 | chpasswd

注意:

创建用户的时候不建议使用/sbin/nologin,在测试的时候,一直提示530 Login incorrect。如果需要用户的shell环境为/sbin/nologin时,需要修改pam的参数:

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

auth required pam_shell.so #注释此行

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

#此参数只有在不使用pam时才生效,默认为YES

check_shell=NO

修改配置文件

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

anonymous_enable=NO                 #此行修改,禁止匿名

#anon_upload_enable=YES             #下面这三行,找到,注释掉

#anon_mkdir_write_enable=YES

#anon_other_write_enable=YES

local_enable=YES                            #本地用户,启用,默认正常

local_root=/var/www/html                #紧接着制定普通用户的ftp根目录

#先不改chroot内容,去看实验效果

[root@kylinos63 ~]# systemctl restart vsftpd

修改目录权限

[root@kylinos63 ~]# ll -d /var/www/html/

drwxr-xr-x. 2 root root 4096 Aug  2  2013 /var/www/html/

[root@kylinos63 ~]# chmod o+w -R /var/www/html/               //方便实验,这里可以直接加上W权限

[root@kylinos63 ~]# cp /etc/passwd /var/www/html/index.html             //测试页面一个

未禁锢根目录测试

资源管理器输入:ftp://192.168.1.63

可以看到内容了

创建文件,重命名等操作测试,没问题

未禁锢根Linux客户端测试

[root@kylinos64 ~]# yum install -y lftp                            //使用lftp测试

[root@kylinos64 ~]# lftp -u team1,123456 192.168.1.63                          //lftp使用方法

lftp team1@192.168.1.63:~> ls                       #查看当前目录

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

lftp team1@192.168.1.63:~> cd ..                    #可以向上切换目录

cd ok, cwd=/var/www

lftp team1@192.168.1.63:/var/www> ls        #切换成功,没有禁锢,安全不足

drwxr-xr-x    2 0        0            4096 Aug 02  2013 cgi-bin

drwxr-xr-x    3 0        0            4096 Aug 04 08:51 error

drwxr-xrwx    2 0        0            4096 Oct 13 06:29 html

drwxr-xr-x    3 0        0            4096 Aug 04 08:51 icons

配置禁锢根目录

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

chroot_list_enable=YES                               #此行启用

chroot_list_file=/etc/vsftpd/chroot_list                    #此行启用

allow_writeable_chroot=YES

#如果不加allow_writeable_chroot参数会提示:500 OOPS: vsftpd: refusing to run with writable root inside chroot()

[root@kylinos63 ~]# vim /etc/vsftpd/chroot_list

team1           #把要禁锢的用户加进来即可,一行一个

team2

[root@kylinos63 ~]# systemctl restart vsftpd

Linux测试禁锢目录

[root@kylinos64 ~]# lftp -u team1,123456 192.168.1.63                   //team1用户测试

lftp team1@192.168.1.63:~> ls

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

lftp team1@192.168.1.63:/> cd ..

lftp team1@192.168.1.63:/> ls #切换失败,还是当前路径下的index.html以及my.cnf两个文件

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

[root@kylinos64 ~]# lftp -u team2,123456 192.168.1.63                   //team2测试

lftp team2@192.168.1.63:~> ls

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

lftp team2@192.168.1.63:/> cd ..

lftp team2@192.168.1.63:/> ls               #team2也被禁锢

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

测试文件上传

lftp team2@192.168.1.63:/> !ls                  #反查系统内容

anaconda-ks.cfg  Documents  install.log     Music     Public     Videos

Desktop      Downloads  install.log.syslog  Pictures  Templates

lftp team2@192.168.1.63:/> put install.log  #上传文件

60606 bytes transferred

lftp team2@192.168.1.63:/> ls                       #查看上传是否成功

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

-rw-r--r--    1 500      500           60606 Oct 13 06:29 install.log

黑白名单控制

黑白名单有很多种,这里两种介绍

文件,黑白名单,

用户,黑白名单

目录切换黑白名单

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

chroot_local_user=YES  #禁锢在自己的家目录,此行启用    禁锢=- yes   不=NO +

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

#chroot_local_user=YES的时候,那么下面的chroot_list直面的用户,只有这里面的用户可以切换到其他目录,为NO的时候,只有这个里面的用户不可以切换到其他目录

[root@kylinos63 ~]# vim /etc/vsftpd/chroot_list        //只留下team1

team1

[root@kylinos63 ~]# systemctl restart vsftpd

Linux客户端测试

[root@kylinos64 ~]# lftp -u team1,123456 192.168.1.63     //team1可以切换目录的验证

lftp team1@192.168.1.63:~> ls

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 501      501         60606 Oct 13 06:40 install.log

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

lftp team1@192.168.1.63:~> cd ..

cd ok, cwd=/var/www

lftp team1@192.168.1.63:/var/www> ls

drwxr-xr-x    2 0        0            4096 Aug 02  2013 cgi-bin

drwxr-xr-x    3 0        0            4096 Aug 04 08:51 error

drwxr-xrwx    2 0        0            4096 Oct 13 06:40 html

drwxr-xr-x    3 0        0            4096 Aug 04 08:51 icons

[root@kylinos64 ~]# lftp -u team2,123456 192.168.1.63     //team2不可以切换目录的验证

lftp team2@192.168.1.63:~> ls

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 501      501         60606 Oct 13 06:40 install.log

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

lftp team2@192.168.1.63:/> cd ..

lftp team2@192.168.1.63:/> ls

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 501      501         60606 Oct 13 06:40 install.log

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

修改配置文件,让结果反转

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

chroot_local_user=NO

[root@kylinos63 ~]# systemctl restart vsftpd

那么现在是team1不能切换,team2可以切换

[root@kylinos64 ~]# lftp -u team2,123456 192.168.1.63                   //team2可以切换

lftp team2@192.168.1.63:~> ls

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 501      501         60606 Oct 13 06:40 install.log

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

lftp team2@192.168.1.63:~> cd ..

cd ok, cwd=/var/www

lftp team2@192.168.1.63:/var/www> ls

drwxr-xr-x    2 0        0            4096 Aug 02  2013 cgi-bin

drwxr-xr-x    3 0        0            4096 Aug 04 08:51 error

drwxr-xrwx    2 0        0            4096 Oct 13 06:40 html

drwxr-xr-x    3 0        0            4096 Aug 04 08:51 icons

[root@kylinos64 ~]# lftp -u team1,123456 192.168.1.63                   //team1不可以切换

lftp team1@192.168.1.63:~> ls

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 501      501         60606 Oct 13 06:40 install.log

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

lftp team1@192.168.1.63:/> cd ..

lftp team1@192.168.1.63:/> ls

-rw-r--r--    1 0        0            1664 Oct 13 06:25 index.html

-rw-r--r--    1 501      501         60606 Oct 13 06:40 install.log

-rw-r--r--    1 500      500           203 Oct 13 06:29 my.cnf

ftpusers登陆黑白名单

[root@kylinos63 ~]# vim /etc/vsftpd/ftpusers                  //标准黑名单,末尾加上team1

team1

不用重启服务,测试

[root@kylinos64 ~]# lftp -u team1,123456 192.168.1.63            //没有说什么错误

lftp team1@192.168.1.63:~> ls                   #执行命令的时候,可以看出登陆失败

ls: Login failed: 530 Login incorrect.

[root@kylinos64 ~]# rpm -ivh /media/Packages/ftp-0.17-54.el6.x86_64.rpm   //用ftp工具更明显

[root@kylinos64 ~]# ftp 192.168.1.63

Connected to 192.168.1.63 (192.168.1.63).

220 (vsFTPd 2.2.2)

Name (192.168.1.63:root): team1

331 Please specify the password.

Password:       #123456

530 Login incorrect.

Login failed.

[root@kylinos63 ~]# vim /etc/vsftpd/ftpusers                  //删除team1,测试正常登陆

[root@kylinos64 ~]# ftp 192.168.1.63

Connected to 192.168.1.63 (192.168.1.63).

220 (vsFTPd 2.2.2)

Name (192.168.1.63:root): team1

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>

拓展:为甚ftpuser为黑名单

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

session    optional     pam_keyinit.so    force revoke

auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

#定义user(item)收到信息之后,看到sense(感觉)是什么操作,这里是deny,就是直接拒绝

userlist登陆黑白名单

[root@kylinos63 ~]# vim /etc/vsftpd/user_list                         //末尾添加此行

team2

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

userlist_enable=YES         #激活userlist,默认是激活的

userlist_deny=NO            #为NO则是白名单,里面用户可以登陆,此行添加

[root@kylinos63 ~]# systemctl restart vsftpd

测试

[root@kylinos64 ~]# ftp 192.168.1.63

Connected to 192.168.1.63 (192.168.1.63).

220 (vsFTPd 2.2.2)

Name (192.168.1.63:root): team2

331 Please specify the password.

Password:       #123456

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

#此时,team2在白名单,可以登陆

[root@kylinos64 ~]# ftp 192.168.1.63

Connected to 192.168.1.63 (192.168.1.63).

220 (vsFTPd 2.2.2)

Name (192.168.1.63:root): team1

530 Permission denied.          #team1没在白名单,拒绝登陆

Login failed.

ftp>

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

userlist_deny=YES           #白名单反转黑名单

[root@kylinos63 ~]# systemctl restart vsftpd

测试

[root@kylinos64 ~]# ftp 192.168.1.63

Connected to 192.168.1.63 (192.168.1.63).

220 (vsFTPd 2.2.2)

Name (192.168.1.63:root): team2     #此时在黑名单,连输入密码机会都没有

530 Permission denied.

Login failed.

[root@kylinos64 ~]# ftp 192.168.1.63                //team1就没有问题

Connected to 192.168.1.63 (192.168.1.63).

220 (vsFTPd 2.2.2)

Name (192.168.1.63:root): team1

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

虚拟用户

虚拟用户的主要目的是为了解决安全性,因为我们拿出去的账户系统并不存在,除开我们能否登陆系统使用nologin的shell外,连用户他都查不到,因为用户是虚拟的

可以对虚拟账号实行验证机制,并对不同的虚拟账号设置不同的权限,根据用户的等级,限制客户端的上传下载速度,对普通用户能做的权限,虚拟账号可以可以做到!

[root@kylinos63 ~]# vim /etc/vsftpd/virtual

aoa

123

bob

345

vip

789

#文件格式为,奇数行为用户,偶数行为密码,直接认为一行用户一行密码

生成用户数据库

[root@kylinos63 ~]# db_load -T -t hash -f /etc/vsftpd/virtual /etc/vsftpd/vsftpd_virtual.db

拓展:

[root@kylinos63 ~]# which db_load

/usr/bin/db_load

[root@kylinos63 ~]# rpm -qf /usr/bin/db_load

db4-utils-4.7.25-18.el6_4.x86_64

db_load可以将我们的文件按照指定的方式加密生成指定的数据库文件

-T,txt文档

-t,type 加密类型

-f,file,文件,指定文件

[root@kylinos63 ~]# rm -rf /etc/vsftpd/virtual           //明文存在,用完删除,保证安全

修改数据文件访问权限

[root@kylinos63 ~]# ll /etc/vsftpd/vsftpd_virtual.db

-rw-r--r-- 1 root root 12288 Oct 13 15:34 /etc/vsftpd/vsftpd_virtual.db

一般来书,对于类似于密码等证书类型的文件,权限都是设置600较为科学

[root@kylinos63 ~]# chmod 600 /etc/vsftpd/vsftpd_virtual.db

配置PAM文件

目的是服务器能够从我们生成的数据库力读取响应的信息,对客户端按进行身份认证,这里需要使用PAM模块

PAM=Plugable Authentication Module,为可插拔认证模块,不必重新安装系统应用,通过修改指定文件,调整对改程序的认证方式。PAM模块配置文件路径为/etc/pam.d/目录,此目录下保存着大量的与认证有关的配置文件,并且都是以服务命名

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

#%PAM-1.0

#session    optional     pam_keyinit.so    force revoke

#auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

#auth       required    pam_shells.so

#auth       include     password-auth

#account    include     password-auth

#session    required     pam_loginuid.so

#session    include     password-auth

#上面的全部注销,下面添加两行,pam_userdb.so可以写成/lib64/security/pam_userdb.so的绝对路径

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

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

建立虚拟用户映射的本地用户

[root@kylinos63 ~]# mkdir /ftproot                                //存放虚拟用户的家目录

[root@kylinos63 ~]# useradd general -d /ftproot/general

[root@kylinos63 ~]# useradd veryip -s /sbin/nologin  -d /ftproot/veryip

[root@kylinos63 ~]# chmod -R 500 /ftproot/general/       //普通用户只能下载

[root@kylinos63 ~]# chmod -R 700 /ftproot/veryip/         //veryip可以上传下载等操作

修改核心配置文件

[root@kylinos63 ~]# cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/vsftpd.conf    //恢复配置文件

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

anonymous_enable=NO              #禁用匿名

write_enable=YES                  #可写

chroot_local_user=YES   #启用囚牢

user_config_dir=/etc/vsftpd/virtualconfig           #虚拟账号配置文件存放路径

pam_service_name=vsftpd         #pam.d下面的文件

max_clients=300             #最多300用户连接

max_per_ip=10               #同一个IP最多10用户连接

建立虚拟账号自己的配置文件

[root@kylinos63 ~]# mkdir /etc/vsftpd/virtualconfig

[root@kylinos63 ~]# vim /etc/vsftpd/virtualconfig/aoa                   //创建aoa的配置文件

guest_enable=yes                        #声明虚拟用户

guest_username=general                             #映射本地用户

anon_world_readable_only=no                   #拒绝浏览这个服务器文件系统

anon_max_rate=50000                        #限速50kb

[root@kylinos63 ~]# cp /etc/vsftpd/virtualconfig/aoa /etc/vsftpd/virtualconfig/bob      //aoa,bob相同

[root@kylinos63 ~]# vim /etc/vsftpd/virtualconfig/vip

guest_enable=yes                        #声明虚拟用户

guest_username=veryip              #映射本地用户

anon_world_readable_only=no      #拒绝浏览这个服务器文件系统,启用后,匿名用户只允许下载全部可读的文件。这是承认ftp用户可能拥有文件,特别是在上传的情况下。

write_enable=yes                            #可写

anon_mkdir_write_enable=YES #这里可以理解为 虚拟用户=guest=访客=anon

anon_other_write_enable=YES

anon_upload_enable=YES

anon_max_rate=100000

[root@kylinos63 ~]# systemctl restart vsftpd

建立测试文件

[root@kylinos63 ~]# dd if=/dev/zero of=/ftproot/general/50Mfile bs=1M count=50

[root@kylinos63 ~]# cp -r /boot/ /ftproot/general/

[root@kylinos63 ~]# dd if=/dev/zero of=/ftproot/veryip/100Mfile bs=1M count=100

[root@kylinos63 ~]# cp -r /etc/yum/ /ftproot/veryip/

客户端测试

[root@kylinos64 ~]# lftp -u aoa,123 192.168.1.63              //aoa和bob的配置文件相同,测试一个即可

lftp aoa@192.168.1.63:~> ls

-rw-r--r--    1 0        0        52428800 Oct 13 08:27 50Mfile

dr-xr-xr-x    5 0        0            4096 Oct 13 08:27 boot

lftp aoa@192.168.1.63:/> cd /           #目录禁锢

lftp aoa@192.168.1.63:/> pwd

ftp://aoa:123@192.168.1.63/

lftp aoa@192.168.1.63:/> ls

-rw-r--r--    1 0        0        52428800 Oct 13 08:27 50Mfile

dr-xr-xr-x    5 0        0            4096 Oct 13 08:27 boot

lftp aoa@192.168.1.63:/> put install.log

put: Access failed: 550 Permission denied. (install.log)        #上传无权限

lftp aoa@192.168.1.63:/> get 50Mfile        #下载测试

`50Mfile' at 196608 (0%) 73.3K/s eta:12m [Receiving data]

#对于文件传输速度并不是一个锁定,而是一个在80%到120%之间的变化,比如100kb,那么在80-120kb间变化

VIP用户测试

[root@kylinos64 ~]# lftp -u vip,789 192.168.1.63

lftp vip@192.168.1.63:~> ls

-rw-r--r--    1 0        0        104857600 Oct 13 08:29 100Mfile

drwxr-xr-x    5 0        0            4096 Oct 13 08:29 yum

lftp vip@192.168.1.63:/> cd /       #目录禁锢

lftp vip@192.168.1.63:/> ls

-rw-r--r--    1 0        0        104857600 Oct 13 08:29 100Mfile

drwxr-xr-x    5 0        0            4096 Oct 13 08:29 yum

lftp vip@192.168.1.63:/> put install.log        #上传

60606 bytes transferred

lftp vip@192.168.1.63:/> get 100Mfile       #下载测试

`100Mfile' at 2095328 (1%) 97.9K/s eta:17m [Receiving data]

排错代码

110 重新启动标记应答。                                           120 服务在多久时间内ready。

125 数据链路埠开启,准备传送。                        150 文件状态正常,开启数据连接端口。

200 命令执行成功。                                          202 命令执行失败。

211 系统状态或是系统求助响应。                        212 目录的状态。

213 文件的状态。                                             214 求助的讯息。

215 名称系统类型。                                          220 新的联机服务ready。

221 服务的控制连接埠关闭,可以注销。        225 数据连结开启,但无传输动作。

226 关闭数据连接端口,请求的文件操作成功。      227 进入passive mode。

230 使用者登入。                                             250 请求的文件操作完成。

257 显示目前的路径名称。                                 331 用户名称正确,需要密码。

332 登入时需要账号信息。                                 350 请求的操作需要进一部的命令。

421 无法提供服务,关闭控制连结。              425 无法开启数据链路。

426 关闭联机,终止传输。                                 450 请求的操作未执行。

451 命令终止:有本地的错误。                           452 未执行命令:磁盘空间不足。

500 格式错误,无法识别命令。                           501 参数语法错误。

502 命令执行失败。                                          503 命令顺序错误。

504 命令所接的参数不正确。                              530 未登入。

532 储存文件需要账户登入。                              550 未执行请求的操作。

551 请求的命令终止,类型未知。                        552 请求的文件终止,储存位溢出。

553 未执行请求的的命令,名称不正确。

利用上面登陆错误代码,可以快速定位到错误原因,方便排错!

其他配置选项

#################用户登陆控制##############

anonymous_enable=YES                        #接受匿名用户

no_anon_password=YES                        #匿名用户login时不询问口令  

anon_root=(none)                             #匿名用户主目录  

local_enable=YES                             #接受本地用户

local_root=(none)                             #本地用户主目录

deny_email_enable=YES   #如果匿名用户需要密码,那么使用banned_email_file里面的电子邮件地址的用户不能登录

check_shell=YES                          #仅在没有pam验证版本时有用,是否检查用户有一个有效的shell来登录

userlist_enable=YES                      #若启用此选项,userlist_deny选项才被启动

userlist_deny=NO    #若为YES,则userlist_file中的用户将不能登录,为NO则只有userlist_file的用户可以登录

#如果和chroot_local_user一起开启,那么用户锁定的目录来自/etc/passwd每个用户指定的目录

passwd_chroot_enable=NO                 #切换目录密码支持

ftp_username=FTP                          #定义匿名登入的使用者名称。默认值为ftp。

#################用户权限控制###############

write_enable=YES                            #可以上传(全局控制).

local_umask=022                         #本地用户上传文件的umask

file_open_mode=0666                     #上传文件的权限配合umask使用

anon_upload_enable=NO                   #匿名用户可以上传

anon_mkdir_write_enable=NO              #匿名用户可以建目录

anon_other_write_enable=NO              #匿名用户修改删除

anon_world_readable_only=YES            #如果设为YES,匿名登入者会被允许下载可阅读的档案。默认值为YES。

#guest_enable=NO                #如果开启,那么所有非匿名登陆的用户名都会被切换成guest_username指定的用户名

chown_uploads=YES                           #所有匿名上传的文件的所属用户将会被更改成chown_username

chown_username=lightwiter               #匿名上传文件所属用户名

chroot_list_enable=YES          #如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录

async_abor_enable=YES                   #允许使用"async ABOR"命令,一般不用

ascii_upload_enable=YES                 #使用ASSCII上传

ascii_download_enable=YES               #用ASCII 模式下载

secure_chroot_dir=/usr/share/empty      #这个选项必须指定一个空的数据夹且任何登入者都不能有写入的权限,当

vsftpd 不需要file system 的权限时,就会将使用者限制在此数据夹中

默认值为/usr/share/empty

###################超时设置##################

idle_session_timeout=600                    #空闲连接超时

data_connection_timeout=120             #数据传输超时

ACCEPT_TIMEOUT=60                           #PAVS请求超时

connect_timeout=60                      #PROT模式连接超时

################服务器功能选项###############

xferlog_enable=YES                      #开启日记功能

xferlog_std_format=YES                  #使用标准格式

#log_ftp_protocol=NO       #当xferlog_std_format关闭且本选项开启时,记录所有ftp请求和回复,当调试比较有用.

pasv_enable=YES                         #允许使用pasv模式

#pasv_promiscuous=NO                        #关闭安全检查,Pasv向

#port_enable=YES                            #允许使用port模式

#prot_promiscuous                           #关闭安全检查,Port向

tcp_wrappers=YES                            #开启tcp_wrappers支持

pam_service_name=vsftpd                 #定义PAM 所使用的名称,预设为vsftpd

nopriv_user=nobody                      #当服务器运行于最底层时使用的用户名

pasv_address=(none)                 #使vsftpd在pasv命令回复时跳转到指定的IP地址.(服务器联接跳转?)

#################服务器性能选项##############

#ls_recurse_enable=YES               #是否能使用ls -R命令以防止浪费大量的服务器资源

#one_process_model                    #是否使用单进程模式

listen=YES      #绑定到listen_port指定的端口,既然都绑定了也就是每时都开着的,就是那个什么standalone模式

text_userdb_names=NO                      #当使用者登入后使用ls -al 之类的指令查询该档案的管理权时,预设会出

现拥有者的UID,而不是该档案拥有者的名称。若是希望出现拥有者的名

称,则将此功能开启。

use_localtime=NO                    #显示目录清单时是用本地时间还是GMT时间,可以通过mdtm命令来达到一样的效果

#use_sendfile=YES                           #测试平台优化

################信息类设置################

ftpd_banner=Welcome FTP Server.         #login时显示欢迎信息.如果设置了banner_file则此设置无效

dirmessage_enable=YES               #允许为目录配置显示信息,显示每个目录下面的message_file文件的内容 #setproctitle_enable=YES                    #显示会话状态信息,关!

############## 文件定义 ##################

chroot_list_file=/etc/vsftpd/vsftpd.chroot_list #定义不能更改用户主目录的文件

userlist_file=/etc/vsftpd/vsftpd.user_list      #定义限制/允许用户登录的文件

banner_file=/etc/vsftpd/banner                      #定义登录信息文件的位置

banned_email_file=/etc/vsftpd.banned_emails     #禁止使用的匿名用户登陆时作为密码的电子邮件地址

xferlog_file=/var/log/vsftpd.log                    #日志文件位置

message_file=.message                               #目录信息文件

############## 目录定义 #################

user_config_dir=/etc/vsftpd/userconf                #定义用户配置文件的目录

                                                        #定义本地用户登陆的根目录,注意定义根目录可以是相对路径

也可以是绝对路径.相对路径是针对用户家目录来说的.

local_root=webdisk                           #此项设置每个用户登陆后其根目录为/home/username/webdisk

anon_root=/var/ftp                                   #匿名用户登陆后的根目录

#############用户连接选项#################

max_clients=100                                       #可接受的最大client数目

max_per_ip=5                                              #每个ip的最大client数目

connect_from_port_20=YES                                  #使用标准的20端口来连接ftp

listen_address=192.168.0.2                            #绑定到某个IP,其它IP不能访问

#listen_port=2121                                         #绑定到某个端口

#ftp_data_port=2020                                   #数据传输端口

pasv_max_port=0                         #pasv连接模式时可以使用port 范围的上界,0 表示任意。默认值为0。

pasv_min_port=0                         #pasv连接模式时可以使用port 范围的下界,0 表示任意。默认值为0。

##############数据传输选项#################

anon_max_rate=51200                     #匿名用户的传输比率(b/s)

local_max_rate=5120000                  #本地用户的传输比率(b/s)

选择策略

在数据通道建立的过程中,客户端会在另一个端口上监听等待连接,并利用命令连接通道告诉服务器其监听的端口号。然后企业的边界路由器会将FTP的IP地址转换为合法的公网IP地址(假设企业由于公网IP地址有限,在边界路由器上通过NAT服务向外部用户提供FTP连接)。

采用的是主动操作模式的话,则在连接这个数据通道的过程中FTP服务器会主动跟边界路由器的端口进行通信(因为FTP服务器认为这台边界路由器,其实就是NAT服务器,就是FTP客户端)。

但是实际上不是,而且也有可能没有启用这个端口。为此客户端 与FTP服务器之间的连接最终没有建立起来。

所以说,如果采用主动操作模式的话,当FTP服务器部署在NAT等服务器后面的时候,则FTP服务器与客户端 之间只能够建立命令连接通道,而无法建立起数据传输通道。

如果FTP服务器与客户端之间还有防火墙的话,在连接的过程中也会出现以上类似的情况。

被动操作模式的话,是客户端主动跟服务端的20号端口进行连接的。为此在数据传输通道建立的过程中,即使中间有NAT服务器或者防火墙,也 会准确无误的连接到FTP服务器的数据传输接口。

所以说,如果在客户端与FTP服务器之间存在防火墙或者NAT服务器等类似设备的话,那么在FTP服务器 部署的时候,最好采用被动操作模式。否则的话,很可能只能够建立命令连接通道,而无法进行数据传输。

如果一些出差在外的员工或者员工在家庭办公时也需要访问企业内部的FTP服务器,而此时出于安全的考虑或者公网IP 地址数量的限制,企业往往会把FTP服务器部署在防火墙或者NAT服务器的后面,此时这个主动操作模式就不行了。

如果企业中通过互联网来访问企业内部FTP服务器的员工比较多的时候,那么最好能够一劳永逸的解决这个问题,即在FTP服务器上进行设置,强制客户端在连接的时候采用被动操作模式。

用户比较少的话,而且用户又具有一定的计算机知识,那么可以不在服务器上进行设置。而是在连接的过程中,通过FTP客户端来设置。如在某些FTP客户端 上,会有一个Passive Transfers等类似的选项。选中这个选项就表示以被动操作方式进行传输。而没有选中这个选项的客户端则仍然采用主动操作模式来进行连接。

如果把FTP服务器部署在防火墙或者NAT服务器的背后,则采用主动操作模式的客户端只能够建立命令连接而无法进行文件传输。如果部署完FTP服务器后,系统管理员发现用户可以连接上FTP服务器,可以查看 目录下的文件,但是却无法下载或者上传文件,如果排除权限方面的限制外,那么很有可能就是这个操作模式选择错误。

常见客户端设置被动模式

FTP服务器部署的时候,其默认采用的是主动操作模式。如果企业FTP服务器的用户都是在内部网络中的,即不用像外部网络的用户提供FTP连接的需求,那 么采用这个默认操作方式就可以了。

大部分FTP客户端默认使用PASV方式。IE默认使用PORT方式。在大部分FTP客户端的设置里,常见到的字眼都是“PASV”或“被动模式”,极少见到“PORT”或“主动模式”等字眼。因为FTP的登录方式只有两种:PORT和PASV,取消PASV方式,就意味着使用PORT方式。

(1)IE:工具 -> Internet选项 -> 高级 -> “使用被动FTP”(需要IE6.0以上才支持)。

(2)CuteFTP:Edit -> Setting -> Connection -> Firewall -> “PASV Mode” 或File -> Site Manager,在左边选中站点 -> Edit -> “Use PASV mode” 。

(3)FlashGet:工具 -> 选项 -> 代理服务器 -> 直接连接 -> 编辑 -> “PASV模式”。

(4)FlashFXP:选项 -> 参数选择 -> 代理/防火墙/标识 -> “使用被动模式” 或站点管理 -> 对应站点 -> 选项 -> “使用被动模式”或快速连接 -> 切换 -> “使用被动模式”。

ftp、sftp、vsftp、vsftpd的区别

ftp 是File Transfer Protocol的缩写,文件传输协议,用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。

sftp 是SSH File Transfer Protocol的缩写,安全文件传输协议;

vsftp 是一个基于GPL发布的类Unix系统上使用的ftp服务器软件,它的全称是Very Secure FTP从此名称可以看出来,编制者的初衷是代码的安全;

vsftpd 是very secure FTP daemon的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件;

Linux lftp命令和ftp命令用法解析与示例

lftp命令

lftp是一个文件客户端程序,它支持ftp、SETP、HTTP和FTPs等多种文件传输协议。lftp支持tab自动补全,记不得命令双击tab键,就可以看到可能的选项了。

1. 语法和常用参数

lftp(选项)(参数)
#参数为要访问的站点的ip地址或者域名。
 
-f:指定lftp指令要执行的脚本文件;
-c:执行指定的命令后退出;
--help:显示帮助信息;
--version:显示命令的版本号。

2. 用法示例

示例1lftp登录

lftp 用户名:密码@ftp地址:传送端口(默认21)
#在服务端未进行一些限制设置的时候可以直接通过ip进行登录访问
用法
(1)lftp username:password@127.0.0.1:21 回车
(2)lftp username@127.0.0.1 回车     ##默认21端口 回车后输入密码
(3)lftp 127.0.0.1 回车   ##回车后 login 登录
(4)lftp 回车 --> open 127.0.0.1 --> login 登录
 

示例2 :查看或者改变目录

cd
ls 
#这两个命令和Linux里的用法一致

示例3 :文件的下载

lcd /home/123/web       ##设置本地存放目录 默认为 /home/usr
get 123.txt            ##下载123.txt文件到 /home/123/web 中
get -c 123.txt        ##断点续传下载
mget *.txt             ##批量下载所有txt文件
mget -c ./123/aaa/*.txt      ##断点续传、批量下载ftp端aaa目录下的所有txt文件
mget -c *.pdf  #把所有的pdf文件以允许断点续传的方式下载。
mirror aaa/    #将aaa目录整个的下载下来,子目录也会自动复制,本地自动建立目录。
pget -c -n 10 file.dat #以最多10个线程以允许断点续传的方式下载file.dat,可以通过设置pget:default-n的值而使用默认值

示例4 :文件上传

put 123.txt           ##上传123.txt文件到ftp site
mput *.txt           ##匹狼上传所有的txt文件
mirror -R 本地目录名   #将本地目录以迭代(包括子目录)的方式反向上传到ftp site。

示例5lftp中文乱码问题

若登录后看到的都是中文乱码(因为一般本地都是utf-8的编码),怎么半呢,用 set 命令来解决
set ftp:charset gbk(或者 gb2312 或 utf-8)   ##设置ftp端的编码格式
set file:charset utf-8 (...同上)        ##设置本地编码格式
附:set命令的技巧 (1)输入set 查看已经设置好的命令 (2)set -a 查看所有可以设置的命令
示例6:查找ftp端文件
ls *.txt           ##查找当前目录下的所有txt文件
ls ./123/          ##列出123目录下所有文件
find . -name "*.txt"       ##递归查找站点上所有的txt文件
find ./xx -name "*.txt"    ##查找xx目录下所有的txt文件
附1: ls第二次读取的是本地缓存,可以用 rels 代替 ls 或者catch off / catch on 来开关catch,catch flush清空本地catch
附2: 浏览本地目录的命令可用!ls, 如 !ls /usr/local/bin/

示例6、设置被动/非被动模式

set ftp:passive-mode 1    ## 1 被动 0非主动

示例7、多任务处理

ctrl+z        ##将当前进行的任务移交后台处理
wait          ##将后台处理任务调至前台查看
jobs          ##查看后台进行的任务列表
kill all 或者 job_no  ##删除所有任务 或 指定的任务
##将任务加入任务列表
queue get 123.txt
queue put 234.txt
queue mirror aaa/ 
queue      ##查看任务列表
jobs        ##查看后台任务列表
queue start    ##开始任务列表
queue stop    ##停止任务列表

示例8、其他命令 

alias []   #定义别名
alias less more
alias reconnect "close; cd ."
直接输入 alias 即可看到目前定义了那些别名。如果只输入 alias name 的话, 则是取消 name 这个别名。
bookmark SUBCMD
设定书签, 可将目前站台及所在目录设成书签, 下次可直接进来, 不用再 cd 来 cd 去的
bookmark add name   #用来新增名称为 name 的书签
bookmark del name   #删除名称为 name 的书签
bookmark list      #显示目前有设定那些书签(另外直接打 bookmark 和 bookmark list 的结果一样)
bookmark edit      #呼叫编辑器修改书签 (~/.lftp/bookmarks)
 
cache SUBCMD   #管理 lftp 的 cache
 
rels []        #从 cache 中显示远端档案列表
rels 则不会从 cache 中读取
recls opts [path/]pattern 从 cache 中显示远端的档案列表, 应该算是 ls 的加强版, 有很多参数可用,应该是可用来产生各种不同>的档案列表以供其他程式使用。
recls 则不会从 cache 中读取
 
du options    #计算远端整个目录占用容量
 
get OPTS -o    #抓取远端档案  
get rfile -o lfile  #抓 rfile 到本地改名为 lfile
-c 为续传
-E 抓档完成后, 将远端的档案砍了
-a 为 ascii mode, 预设为 binary mode
-O 设定 base directory 为本地端放档案的目录
 
mget OPTS  #下载远端档案(可用 wildcard expansion 也就是 *)
pget OPTS -o #使用多个连结来下载档案, 预设为五个。
-n 3 为叁个连结
 
jobs -v #显示目前有那些程序在背景执行
-v 显示详细的资讯(-v 可多加几个来显示更详细的资讯)
lcd #切换本地端的目录
mirror OPTS remote [local] #下载整个目录(楼上的 get 只能用来抓档案)
-c 续传
-e 这个要小心一些, 比较远端和本地端的档案, 假如远端没有的, 就将本地端的档案删除, 也就是将本地端和远端资料同步。
-R 上传整个目录
-n 只下载较新的档案
-r 不用递回到目录中
--parallel=n 同时下载 n 个档案(预设一次只下载一个) 
module name args    #载入模组
put OPTS -o              #上传档案
mput OPTS               #上传档案(可用 wildcard expansion 也就是 *)
mv                              #将远端的 file1 改名为 file2
mrm                            #用 wildcard expansion 方式来删除远端档案
open OPTS              #开启某个站台
open -u , -p site
queue OPTS []         #将 cmd 放到伫列中等待执行
-d index                    将编号为 index 的 job 删除
-m index new_index 将编号为 index 的 job 移至编号 new_index, 插队专用。
-n index 在编号 index 之前新增一个 job
wait []                      将背景执行中的程序移至前景(也可用 fg)
kill all|                    删除全部的 jobs 或 job_no
repeat delay command             #每隔 delay 秒, 重覆执行 command, 预设是每隔一秒
rm -r -f                       #移除远端档案
mkdir -p                     #建立远端目录
rmdir -f                        #移除远端目录
set OPT []                   #设定变数,直接键入 set 可看目前定义了那些变数
source                      #读取 file, 并执行 file 中的命令(应该是和 bash 中的 source 命令是一样的吧)
debug [|off] -o            #设定 debug level 为 level
-o 将输出导向至 file
exit [|bg]                   #结束 lftp,此时若还有 jobs, 则会将 lftp 放至背景执行, 继续未完成的工作
history -w file-r file-c|-l cnt              #和 bash 中的 history 功能一样
renlist []  #只显示远端的档名
pwd -p  #显示目前远端所在目录
-p 连登入密码也显示
scache []  #只打 scache 显示目前所有的 session, 加上 session_no 可切换至其他的 session,对于同时开启多个站台或同个站台不同目录间切换。
 

3. 配置文件

vim /etc/lftp.conf 
一般,添加以下几行:
 set ftp:charset gbk
 set file:charset utf8
 set pget:default-n 5 
这样,就不用每次进入都要打命令了。其他的set可以自己tab然后help来看。

ftp命令

ftp命令用来设置文件系统相关功能。ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件。

语法和选项

ftp(选项)(参数) 选项 
#参数为指定要连接的FTP服务器的主机名或ip地址。
 
-d:详细显示指令执行过程,便于排错或分析程序执行的情况
-i:关闭互动模式,不询问任何问题;
-g:关闭本地主机文件名称支持特殊字符的扩充特性;
-n:不使用自动登录;
-v:显示指令执行过程。

用法示例

连接ftp: 
ftp ip
#然后根据提示输入用户名称和密码
或者用下面的格式  
ftp -i  -n  IP_ADDRESS
user USERNAME PASSWORD
ftp -i -n 172.25.254.36
user  root    123456
FTP> ascii :设定以ASCII方式传递文件(缺省值)
FTP> bell :没完成一次文件传送,报警提示
FTP> binary :设定以二进制方式传递文件
FTP> bye :终止主机FTP进程,并退出FTP管理方式
FTP> case :当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母
FTP> cd :同UNIX的CD命令
FTP> cdup:返回上一级目录
FTP> close:终止远端的FTP进程,返回到FTP命令状态,所有的宏定义都被删除
FTP> delete:删除远端主机中的文件
FTP> dir [remote-directory] [local-file]:列出当前远端主机目录中的文件,如果有本地文件,就将结果写至本地文件
FTP> get [remote-file] [local-file]:从远端主机中传递至本地主机中
FTP> help [command]:输出命令的解释
FTP> lcd:改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录
FTP> ls [remove-directory] [local-file]:同DIR
FTP> macdef:定义宏命令
FTP> mdelete [remote-files]:删除一批文件
FTP> mget [remote-files]:从远端主机接收一批文件至本地主机
FTP> mkdir directory-name:在远端主机中建立目录

FTP> mput local-files:将本地主机中一批文件传送至远端主机

FTP> open host [port]:重新建立一个新的连接

FTP> prompt:交互提示模式

FTP> put local-file [remote-file]:将本地一个文件传送至远端主机中

FTP> pwd:列出当前远端主机目录

FTP> quit:同BYE

FTP> recv remote-file [local-file]:同GET

FTP> rename [from] [to]:改变远端主机中的文件名

FTP> rmdir directory-name:删除远端主机中目录

FTP> send local-file [remote-file]:同PUT

FTP> status:显示当前FTP的状态

FTP> system:显示远端主机系统类型

FTP> user user-name [password] [account]:重新以别的的用户名登录远端主机

FTP> ? [command]:同HELP,[command]指定需要帮助的命令名称,如果没有指定command,ftp将显示全部命令的列表

FTP> ! :从ftp子系统退出到外壳

linux服务篇-FTP服务相关推荐

  1. 【Linux】循序渐进学运维-服务篇-FTP服务配置文件详解

    大家好,我是互联网老辛,本文是Linux运维-循序渐进学运维-服务篇的第14篇文章 文章目录 前言 ftp配置文件详解 1. 常见默认配置参数 2. 常见参数的含义 配置文件使用举例 1. 创建本地用 ...

  2. 【Linux】循序渐进学运维-服务篇-FTP的原理及使用

    大家好,我是高胜寒,本文是Linux运维-循序渐进学运维-服务篇的第13篇文章 文章目录 一. FTP服务的概述 1. ftp的相关概念 2. 常见的FTP服务器 3. VSFTP基本信息 二. FT ...

  3. Linux服务篇--openssh服务

    Linux高级篇–SSH服务 一. SSH ssh: secure shell, protocol, 22/tcp, 安全的远程登录 具体的软件实现:   OpenSSH: ssh协议的开源实现,Ce ...

  4. Linux下检测FTP服务并开启FTP服务

    Linux下检测FTP服务并开启FTP服务 1. 检测FTP服务是否开启 通过查询提供FTP服务的进程是否存在 Shell代码   ps -ef | grep ftp   并未找到任何包含ftp关键字 ...

  5. Samba服务和FTP服务

    Samba服务和FTP服务 1.samba服务 1.1 安装samba 1.2 编辑配置文件 smb.conf 1.3 添加访问用户 1.4 关闭防火墙 1.5 启动samba 服务 1.6 wind ...

  6. ftp主要完成与远程计算机的连接,2015计算机三级《网络技术》复习重点:远程登录服务和FTP服务...

    2015计算机三级<网络技术>复习重点:远程登录服务和FTP服务 一.远程登录服务(TCP连接)(TCP的23端口服务) 1.远程登录协议 用户使用Telnet命令,使自己的计算机成为远程 ...

  7. linux怎么配置ftp服务,Ubuntu下安装、配置FTP服务

    续根据前两篇 http://www.linuxidc.com/Linux/2011-09/42775.htm 与 http://www.linuxidc.com/Linux/2011-09/42777 ...

  8. 局域网内Linux下开启ftp服务的“曲折路”和命令复习

    今天主要学习了Linux下网络配置以及vsftp(FTP)和samba的服务配置,学习起来,难度也就一般,并没有特别难,可是在可以做实验的时候,却并没有自己想像的那么顺利,可见,很多事情看起来不难,做 ...

  9. 【Linux】循序渐进学运维-服务篇-ssh服务入门

    大家好,我是高胜寒,本文是Linux运维-循序渐进学运维-服务篇的第3篇文章 文章目录 前言 1. 什么是SSH? 2. ssh的连接原理 3. ssh服务的安装 1) OpenSSH的构成 2) 安 ...

最新文章

  1. 《Kinect应用开发实战:用最自然的方式与机器对话》一3.4 深度图像成像原理...
  2. 仅展示近三天的动态设置_微信朋友圈设置三天可见了吗?
  3. Redis6.0新版本开始引入多线程,到底改善了什么
  4. objc swift 混编
  5. hdu 1881(简单01背包)
  6. Maven依赖中的scope详解
  7. 621. Task Scheduler 任务调度器
  8. springmvc常用注解之@Controller和@RequestMapping
  9. Chrome 浏览器将登陆 Fuchsia OS
  10. Spring加载Properties配置文件,java通过注解读取数据
  11. Windows Server上用命令来起停IIS站点
  12. ARM PWN基础教程
  13. TCP的短链接和长连接
  14. 在线自定义编辑网络拓扑图
  15. vue+element 压缩上传图片
  16. 用sync toy做增量备份
  17. 你能编写CMS79F623的EEPROM写入数据20到地址1,并且给出具体代码
  18. 语音数字信号处理系统设计(含matlab程序)
  19. python 字典计数_python怎么用字典计数
  20. OpenHarmony分布式软总线与设备认证模块总结

热门文章

  1. 百度AnyQ之一——基于docker进行安装
  2. centos7.x openvpn+freeradius认证daloradius管理
  3. 保险业资产负债表接口文档
  4. Alink 是阿里巴巴基于实时计算引擎 Flink 研发的新
  5. 发改委新政配套三期风电项目招标
  6. 理解功率MOSFET的RDS(ON)温度系数特性
  7. 【Unity日系二次元风着色器,场景模型资源,卡通天空球】【内附网盘资源链接】
  8. RabbitMQ脑裂问题
  9. 【深度学习】DenseNet
  10. 黄伟:一场恶意做空事件,却成为万国数据的成长礼