简介

Vsftp(Very Secure FTP)是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,是一款小巧而又易用FTP服务器程序,Vsftpd 在安全性、高性能及稳定性三个方面有很好的表现。它提供的主要功能包括虚拟IP设置、虚拟用户、Standalone、inetd操作模式、强大的单用户设置能力及带宽限流等。在安全方面,它从原理上修补了大多数Wu-FTP、ProFTP,乃至BSD-FTP的安装缺陷,使用安全编码技术解决了缓冲溢出问题,并能有效避免“globbing”类型的拒绝服务攻击。

Windows下常用Ftp服务器软件: Serv-U、IIS、Filezilla

Linux下Ftp服务器软件:Filezilla、Vsftpd、wuftpd、proftpd 、pureftp

Vsftp的特点:

1、它是一个安全、高速、稳定的FTP服务器
2、它可以做基于多个IP的虚拟FTP主机服务器
3、匿名服务设置十分方便
4、匿名FTP的根目录不需要任何特殊的目录结构,或系统程序或其它的系统文件
5、不执行任何外部程序,从而减少了安全隐患
6、支持虚拟用户,并且每个虚拟用户可以具有独立的属性配置
7、可以设置从inetd中启动,或者独立的FTP服务器两种运行方式
8、支持两种认证方式(PAP或xinetd/ tcp_wrappers)

9、支持带宽限制


目录  

    一.Ftp原理与vsftpd安装

    二.配置文件介绍

    三.配置用户支持上传和下载限制用户连接数及速率   用户类型:

        匿名用户:在默认安装后,系统只提供匿名用户访问(服务器端自动映射的一个系统用户)

        本地用户:以/etc/passwd中的用户名为认证方式(默认root和id号小于500的用户都禁止访问)

        虚拟用户:支持将用户名和口令保存在数据库文件或数据库服务器中。事实上多个虚拟用户同时被映射为同一个系统用户,但不同的虚拟用户可以具有不同的访问权限 

    四.搭建支持SSL加密传输的vsftpd


一、Ftp原理

1、FTP Transfer Protocol 件传输协议的缩写,FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道;如下图:

控制通道:控制通道是和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的, PI称为控制连接

数据通道:数据通道是和FTP服务器进行文件传输或者列表的通道。

FTP协议中,控制连接均有客户端发起,而数据连接有两种工作方式:PORT方式和PASV方式,DTP称为数据连接

PASV模式(被动方式)

在建立控制通道的时候和PORT模式类似,当客户端通过这个通道发送 PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接传送数据。

PORT模式(主动方式)

FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口(一个大于1024的端口)接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

如果从C/S模型这个角度来说,PORT对于服务器来说是OUTBOUND,而PASV模式对于服务器是INBOUND,这一点请特别注意,尤其是在使用防火墙的企业里,这一点非常关键,如果设置错了,那么客户将无法连接。

2、安装Vsftp软件包

这里我们采用rpm安装方式,系统版本:CentOS6.4_x86_64   软件版本vsftpd.x86_64-2.2.2-11.el6_3.1

1
2
3
4
5
[root@localhost ~]# rpm -q vsftpd                  #查询是否安装Vsftp
package vsftpd is not installed                    #提示没有安装
[root@localhost ~]# yum list|grep vsftpd           #使用Yum安装,需要配置好Yum才能使用,当然也可以从光盘映像安装
[root@localhost ~]# rpm -q vsftpd                  #再查看是否安装成功
vsftpd-2.2.2-11.el6_3.1.x86_64                     #已经安装成功

二、配置文件介绍及详解主配置文件

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# rpm -qc vsftpd           #查询vsftpd的配置文件
/etc/logrotate.d/vsftpd                      #日志文件
/etc/pam.d/vsftpd                            #PAM认证文件
/etc/rc.d/init.d/vsftpd                      #服务启动脚本
/etc/vsftpd                                  #Vsftpd配置文件存放路径
/etc/vsftpd/ftpusers                         #禁止使用Vsftpd的用户列表文件
/etc/vsftpd/user_list                        #禁止或允许使用Vsftpd的用户列表文件
/etc/vsftpd/vsftpd.conf                      #主配置文件
/etc/vsftpd/vsftpd_conf_migrate.sh           #vsftpd操作的一些变量和设置
/usr/sbin/vsftpd                             #Vsftpd执行程序
/var/ftp                                     #匿名用户目录
/var/ftp/pub                                 #默认匿名用户存放文件目录

下面主要对主配置文件的一些指令做详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
anonymous_enable=YES                         #是否允许匿名用户访问
local_enable=YES                             #是否允许本地用户访问
write_enable=YES                             #全局配置是否对Ftp服务器有可写权限
local_umask=022                              #用户上传的文件权限
anon_upload_enable=YES                       #是否允许匿名用户上传文件,须开启全局配置可写权限
anon_mkdir_write_enable=YES                  #是否允许匿名用户创建目录
anon_other_write_enable=YES                  #是否允许匿名用户有写入权限
dirmessage_enable=YES                        #当使用者切换目录,会显示该目录下的.message文件中内容
xferlog_enable=YES                           #记录使用者所有上传下载信息
connect_from_port_20=YES                     #确定端口连接是20端口
chown_uploads=YES                            #是否允许改变上传文件的属主,与下面配合使用
chown_username=whoever                       #上传文件的属主,whoever任何人
xferlog_file=/var/log/xferlog                #将上传下载信息记录到日志
xferlog_std_format=YES                       #日志使用标准格式
idle_session_timeout=600                     #数据传输结束后,保持连接的超时时间
data_connection_timeout=120                  #数据连接超时时间
nopriv_user=ftpsecure                        #运行Vsftp需要非特权系统用户
async_abor_enable=YES                        #如果Ftp_client会下达“async abor”这个指令需要开启
ascii_upload_enable=YES                      #是否以ASCII方式传输数据
ascii_download_enable=YES
ftpd_banner=Welcome to blah FTP service.     #Ftp欢迎信息
deny_email_enable=YES                        #黑名单设置
banned_email_file=/etc/vsftpd/banned_emails  #当上面一个选项开启,可以设置哪些邮箱地址不能登录Ftp服务器
chroot_local_user=YES                        #设置是否禁锢用户目录,与下面一项配合使用
chroot_list_enable=YES                       #如果开启三个chroot选项,chroot_list文件相当于白名单
chroot_list_file=/etc/vsftpd/chroot_list     #在些文件中的用户登录后只能在指定的目录中活动
ls_recurse_enable=YES                        #是否允许递归
listen=YES                                   #是否监听
listen_ipv6=YES                              #是否监听Ipv6
pam_service_name=vsftpd                      #设置PAM模块提供的认证服务所使用的配置文件名
userlist_enable=YES                          #是否允许user_list用户文件中的用户登录
tcp_wrappers=YES                             #是否使用些方式作为访问控制方式
anon_max_rate=0                              #匿名用户传输速度限制单位字节,0为不限制
local_max_rate=0                             #本地用户传输速度限制单位字节,0为不限制
max_clients=100                              #同一时间允许客户端最大连接数
max_per_ip=10                                #允许同一IP在同一时间最大连接
connect_timeout=60                           #客户端尝试连接命令通道超过60秒强制断开
pasv_enable=YES                              #是否启动被动式联机
accept_timeout=60                            #当使用被动式进行数据传输时,如果主机启用passive port并等待客户端60秒无响应强制断开
#下面是指定连接Ftp使用ssl加密方式
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key

三、配置用户支持上传、下载功能 

服务器地址: 172.16.14.1   客户端地址: 172.16.14.2

启动Vsftp服务端,启动前请关闭防火墙与SELinux

1
2
3
4
[root@localhost ~]# setenforce 0                        #关闭SELinux
[root@localhost ~]# service iptables stop               #关闭防火墙
[root@localhost ~]# service vsftpd start                #启动成功
为 vsftpd 启动 vsftpd:                                    [确定]

1、配置虚拟用户

所谓的匿名用户实际就是被映射为系统用户ftp,如下图:

我们在这个目录下的pub下新建一个文件(ftp.txt)写入内容来查看一下:

如果想让匿名用户上传文件需要修改主配置文件,如下:

1
2
3
4
5
anonymous_enable=YES                         #开启允许匿名访问(默认开启)
write_enable=YES                             #全局配置写入要开启
anon_upload_enable=YES                       #开启允许匿名用户上传文件,须开启全局配置可写权限
anon_mkdir_write_enable=YES                  #开启允许匿名创建文件夹
anon_other_write_enable=YES                  #如果想要删除文件须开启些项

修改完主配置文件保存退出,要重启vsftp:

1
2
3
[root@localhost ftp]# service vsftpd restart
关闭 vsftpd:                                              [确定]
为 vsftpd 启动 vsftpd:                                    [确定]

在客户端重新登录测试是否有权限上传文件、删除文件,如下图:

Ftp协议码:   大致分类如:

1开头:表示服务器信息    2开头:正确响应的信息    3开头:正常响应,但某一操作尚未完成,需进一步补充完成

4开头:表示客户端错误    5开头:表示服务器端错误

120

服务在nnn分钟内准备好

125

数据连接已打开,准备传送

150

文件状态良好,打开数据连接

200

命令成功

202

命令未实现

211

系统状态或系统帮助响应

212

目录状态

213

文件状态

214

帮助信息,信息仅对人类用户有用

215

名字系统类型

220

对新用户服务准备好

221

服务关闭控制连接,可以退出登录

225

数据连接打开,无传输正在进行

226

关闭数据连接,请求的文件操作成功

227

进入被动模式

230

用户登录

250

请求的文件操作完成

257

创建"PATHNAME"

331

用户名正确,需要口令

332

登录时需要帐户信息

350

请求的文件操作需要进一步命令

421

连接用户过多

425

不能打开数据连接

426

关闭连接,中止传输

450

请求的文件操作未执行

451

中止请求的操作:有本地错误

452

未执行请求的操作:系统存储空间不足

500

格式错误,命令不可识别

501

参数语法错误

502

命令未实现

503

命令顺序错误

504

此参数下的命令功能未实现

530

账号或密码错误

532

存储文件需要帐户信息

550

未执行请求的操作

551

请求操作中止:页类型未知

552

请求的文件操作中止,存储分配溢出

553

未执行请求的操作:文件名不合法

因为我们的服务器端ftp家目录/var/ftp/pub这个目录没有权限,只有文件系统权限与ftp权限的交集才是ftp登录用户的权限

使用客户端登录到服务器再验证,如下图:

2、配置本地用户支持上传下载功能,在服务器上创建一个用户,如下图:

查看centos用户信息,如下图:

编辑服务端主配置文件,允许本地用户访问和写入文件,关闭匿名用户访问:

1
2
3
4
5
6
anon_other_write_enable=NO                 #不允许匿名用户有写入权限
anon_mkdir_write_enable=NO                 #不允许匿名用户创建目录
anon_upload_enable=NO                      #不允许匿名用户上传文件
write_enable=YES                           #开启全局配置有写入权限
local_enable=YES                           #允许本地用户访问,写入权限需开启全局写入权限
[root@localhost ~]# service vsftpd restart #重启Ftp服务器

使用客户端用centos用户登录到Ftp服务验证,如下图:

使用Windows验证,如下图:

使用匿名用户登录Ftp服务器验证,如下图:

这里我们用本地用户登录到Ftp服务器,还遇到一个问题,用户可以在Ftp服务器随意切换目录,这样对服务器很不安全,如下图:

为了安全我们需要把用户禁锢在自己家目录,只允许访问指定的目录,而其他任何目录都不能访问:

1
2
chroot_local_user=YES                      #开启禁锢目录选项
[root@localhost ~]# service vsftpd restart #重启Ftp服务器

使用本地用户登录到Ftp服务器验证,如下图:

也可以禁止一个用户列表 ,如:

1
2
3
4
5
[root@localhost ~]# cat > /etc/vsftpd/chroot_list << EOF
> centos                #把这几个用户添加到指定文件中
> redhat
> suse
> EOF
1
2
3
4
chroot_local_user=NO                       #如果这项启用,下面chroot_list文件中的用户就可以切换目录,相当于白名单
chroot_list_enable=YES                     #开启禁锢列表访问
chroot_list_file=/etc/vsftpd/chroot_list   #开启禁锢列表文件
[root@localhost ~]# service vsftpd restart #重启Ftp服务器

我们用redhat用户验证,如下图:

我们也可以针对某个用户单独设置权限如限制速率:

1
2
3
4
5
6
7
8
修改Ftp服务器主配置文件,加入如下行:
user_config_dir=/etc/vsftpd/debian                #为指定单独设置用户权限的目录
[root@localhost ~]# useradd debian;echo 123456 | passwd --stdin debian
[root@localhost ~]# mkdir /etc/vsftpd/debian      #创建存放限制指定用户权限的目录
[root@localhost ~]# cat > /etc/vsftpd/debian/debian << EOF #在指定的目录创建与限制用户权限同名的文件
> local_max_rate=81920                            #限制debian用户下载速率为80KB/s
> EOF
[root@localhost ~]# service vsftpd restart        #重启Ftp服务器

验证本地用户debian是否能切换目录及下载速率:


四、配置支持SSL加密传输的Ftp服务器

自己需要建立一台CA服务器,我们就与Ftp服务器在同一台服务器上来实现

1、为服务器生成一个私钥文件如下图:

注释:图中"()"代表只在当前子Shell进程中有效

openssl:生成私钥关键字

genrsa:使用rsa加密方式生成私钥

-out:指定输出文件

ftp.key:指定输出生成私钥的文件名称,文件名可以自己定义

2048:表示生成私钥加密的长度(默认为512)

2、从私钥文件中提取公钥制作一个证书签署请求,如下图:

注释: req:证书申请签名管理

-new:制作证书申请

-key:指定私钥文件

3、为CA服务器生成一个私钥文件,如下图:

4、使用刚生成的私钥为自己再生成一个自签证书,如下图:

注释:-x509:表示制作一个自签证书

-days:表示证书申请后可以使用的天数

3、为Ftp服务器签署证书

4、修改Ftp服务器主配置文件加入如下行:

1
2
3
4
5
6
7
8
9
10
ssl_enable=YES                                #是否启用SSL
ssl_tlsv1=YES                                 #是否使用TLS v1
ssl_sslv2=YES                                 #是否使用SSl v2
ssl_sslv3=YES                                 #是否使用SSL v3
allow_anon_ssl=NO                             #是否允许匿名用户使用SSL
force_local_data_ssl=YES                      #百匿名用户传输数据是否加密
force_local_logins_ssl=YES                    #非匿名用户登录时是否加密
rsa_cert_file/etc/pki/CA/caftp.crt            #rsa证书文件位置
rsa_private_key_file=/etc/pki/CA/ftp.key      #ftp私钥文件位置
[root@localhost ~]# service vsftpd restart    #重启Ftp服务器

5、使用FlashFXP客户端验证,如下图:

打开FlashFXP客户端: 站点-->站点管理

成功连接后,会提示保存证书,点接受并保存.如下图:

测试从Ftp服务器下载数据,如下图:

总结:由于Ftp传输方式是明文的,在互联网上不安全.使用明文很容易被窃取数据.本博客刚好是为了解析明文传输而写的,希望能帮助到大家.谢谢...

本博文到此先告一段落,后续会更新Ftp虚拟用户及Mysql做用户验证.敬请期待...

Vsftp精解之安装配置及原理(一)的更多相关文章

  1. 详解CentOS7安装配置vsftp搭建FTP

    安装配置vsftpd做FTP服务,我们的Web应用使用git管理进行迭代,公共文件软件存储使用开源网盘Seafile来管理,基本够用.想不到FTP的使用的场景,感觉它好像老去了,虽然现在基本没有用到这 ...

  2. Linux下Samba详解及安装配置

    1.简介 2.安装配置 3.在windows和linux系统上验证 一.简介 早期网络想要在不同主机之间共享文件大多要用FTP协议来传输,但FTP协议仅能做到传输文件却不能直接修改对方主机的资料数据, ...

  3. Linux系统安装Samba共享服务器详解及安装配置

    一.简介 Samba服务程序是一款基于SMB协议并由服务端和客户端组成的开源文件共享软件,实现了Linux和windows系统间的文件共享.SMB(Server Messages Block,信息服务 ...

  4. visual stdio 2015安装配置及原理

    安装与配置: 1.先配置好IIS,再安装visual stdio,主要原因系统会自注册.net Framework,若顺序不正确,则需手动注册,步骤: a. IIS可承载的Web核心 b. IIS6 ...

  5. Git客户端图文详解如何安装配置GitHub操作流程攻略

    收藏自 http://www.ihref.com/read-16377.html Git介绍 分布式 : Git版本控制系统是一个分布式的系统, 是用来保存工程源代码历史状态的命令行工具; 保存点 : ...

  6. NAS4Free 安装配置 -- 目录

    淘了个DIY的NAS主机,装了3块硬盘,安装配置NAS4Free,用来存储照片.电影等资料,并兼做下载机. 现在把拆箱.安装.配置过程记录下来,供有兴趣的同学参考. NAS4Free 安装配置(一)开 ...

  7. (转)使用LVS实现负载均衡原理及安装配置详解

    使用LVS实现负载均衡原理及安装配置详解 原文:https://www.cnblogs.com/liwei0526vip/p/6370103.html

  8. CentOS 7.0安装配置Vsftp服务器步骤详解

    安装Vsftp讲过最多的就是在centos6.x版本中了,这里小编看到有朋友写了一篇非常不错的CentOS 7.0安装配置Vsftp服务器教程,下面整理分享给各位. 一.配置防火墙,开启FTP服务器需 ...

  9. 《React Native 精解与实战》书籍连载「配置 iOS 与 Android 开发环境」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

随机推荐

  1. iOS 开发之SVN提交问题解决

    1.Commit failed (details follow): '/Users/dev_lzz/Desktop/cjh_ios(16)/cjh/iamgge/iconfont_arrow@3x.p ...

  2. js_多个引号的用法

    str += "<input id='sel_DayB' width='120' onfocus=\"WdatePicker({skin:'whyGreen',dateFmt ...

  3. hive修改 表/分区语句

    参考 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterTable% ...

  4. Libpci库的调用

    这几天发现在Redhat AS6.5 X86_64下用outl(index, 0xcf8)和inl(0xcfc)下读取PCIe配置空间是系统有时性的会hang, 于是去寻找解决方案,首先想到的是用/d ...

  5. flask笔记3-模板

    flask框架使用jinja2模板引擎.简单的说,模板就是一个纯html文件中夹杂着占位符,在渲染模板时用真实变量值替换占位符,就形成了最终的前台页面. 1.模板存放位置: 默认情况下,flask在根 ...

  6. Sql Server 删除所有表(转)

    http://www.cnblogs.com/jys509/p/3589468.html  首先必须要清空所有表的外键 DECLARE c1 cursor for select 'alter tabl ...

  7. 学习iOS

    最近想学习一下iOS开发,不过一点基础都没有,得先从熟悉object-C语法开始,在此把学习中的一些知识点作为记录. mac pro常用操作 学习ios[1]Objective-C 基本语法 学习io ...

  8. MVC5+EF6 入门完整教程八

    本篇是相对独立的一篇,主要讲解不丢失数据进行数据库结构升级. 前面我们讲解EF功能时,已经介绍过一种更新数据库的方式: EF比较model和database,如果两边不一致,程序将会drop and ...

  9. Microsoft.Office.Interop.Excel操作Excel文件时出现的问题及解决方案

    问题描述: Microsoft.Office.Interop.Excel.Worksheet 打不开文件 Microsoft Office Excel 不能访问文件"a.xls". ...

  10. 微信支付之扫码支付开发:我遇到的坑及解决办法(附:Ecshop 微信支付插件)

    前段时间帮一个朋友的基于ecshop开发的商城加入微信扫描支付功能,本以为是很简单的事儿——下载官方sdk或开发帮助文档,按着里面的做就ok了,谁知折腾了两三天的时间才算搞定,中间也带着疑问在网上找了 ...