一、前言
Vsftp(Very Secure FTP)
是一种在Unix/Linux中非常安全且快速稳定的FTP服务器。
Vsftpd
的实现有三种方式:
1
、匿名用户形式:在默认安装的情况下,系统只提供匿名用户访问
2
、本地用户形式:以/etc/passwd中的用户名为认证方式
3
、虚拟用户形式:支持将用户名和口令保存在数据库文件或数据库服务器中。相对于FTP的本地用户形式来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了对用户和下载的可管理性。对于需要提供下载服务,但又不希望所有人都可以匿名下载;既需要对下载用户进行管理,又考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种极好的解决方案。
二、工作原理
工作原理:ftp协议工作是,需要使用两个网络连接进行通信,一个叫控制连接(21),一个叫数据连接(20)。
控制连接:客户端和服务器端进行口沟通的链接,客户端通过该连接向服务器端发送指令的。服务器默认通过21端口等待客户端的指令请求。
数据连接:进行文件传输或者显示文件列表的链接,通信的端口是由控制连接决定的。
FTP
协议中,控制连接均有客户端发起,而数据连接有两种工作方式:PORT方式和PASV方式
PORT
模式(主动方式)
FTP
客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口(一个大于1024的端口)接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。
PASV
模式(被动方式)
在建立控制通道的时候和PORT模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接传送数据。
如果从C/S模型这个角度来说,PORT对于服务器来说是OUTBOUND,而PASV模式对于服务器是INBOUND,这一点请特别注意,尤其是在使用防火墙的企业里,这一点非常关键,如果设置错了,那么客户将无法连接。
三、常见FTP命令及其功能
FTP
命令 |
功能 |
FTP
命令 |
功能 |
ls
|
显示服务器上的目录 |
ls [remote-dir][local-file] |
显示远程目录remote-dir,并存入本地文件local-file |
get remote-file [local-file]
|
从服务器下载指定文件到客户端 |
mget remote-files |
下载多个远程文件(mget命令允许用通配符下载多个文件) |
put local-file [remote-file]
|
从客户端上传指定文件到服务器 |
mput local-file |
将多个文件上传至远程主机(mput命令允许用通配符上传多个文件) |
open
|
连接FTP服务器 |
mdelete [remote-file] |
删除远程主机文件 |
close
|
中断与远程服务器的ftp会话(与open对应) |
mkdir dir-name |
在远程主机中创建目录 |
open host[port]
|
建立指定的ftp服务器连接,可指定连接端口 |
newer file-name |
如果远程主机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件 |
cd directory
|
改变服务器的工作目录 |
rename [from][to] |
更改远程主机的文件名 |
lcd directory
|
在客户端上(本地)改变工作目录 |
pwd |
显示远程主机的当前工作目录 |
bye
|
退出FTP命令状态 |
quit |
同bye,退出ftp会话 |
ascii
|
设置文件传输方式为ASCII模式 |
reget remote-file [local-file] |
类似于get,但若local-file存在,则从上次传输中断处续传 |
binary
|
设置文件传输方式为二进制模式 |
rhelp [cmd-name] |
请求获得远程主机的帮助 |
![cmd [args]]
|
在本地主机中交互shell后退回到ftp环境,如:!ls *.zip |
rstatus [file-name] |
若未指定文件名,则显示远程主机的状态,否则显示文件状态 |
accout [password]
|
提供登录远程系统成功后访问系统资源所需的密码 |
hash |
每传输1024字节,显示一个hash符号(#) |
append local-file [remote-file]
|
将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名 |
restart marker |
从指定的标志marker处,重新开始get或put,如restart 130 |
bye
|
退出ftp会话过程 |
rmdir dir-name |
删除远程主机目录 |
case
|
在使用mget命令时,将远程主机文件名中的大写转为小写字母 |
size file-name |
显示远程主机文件大小,如: size idle 7200 |
cd remote-dir
|
进入远程主机目录 |
status |
显示当前ftp状态 |
cdup
|
进入远程主机目录的父目录 |
system |
显示远程主机的操作系统 |
delete remote-file
|
删除远程主机文件 |
user user-name [password][account] |
向远程主机表明自己的身份,需要密码时,必须输入密码,如:user anonymous my@email |
dir [remote-dir][local-file]
|
显示远程主机目录,并将结果存入本地文件 |
help [cmd] |
显示ftp内部命令cmd的帮助信息,如help get |
FTP
数字代码的意义
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
未执行请求的的命令,名称不正确。
四、安装和配置vsftp服务器
[root@localhost ~]# mkdir /mnt/cdrom
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom
[root@localhost ~]# cd /mnt/cdrom/Server/
[root@localhost Server]# rpm -ivh vsftpd-2.0.5-16.el5.i386.rpm
[root@localhost Server]# rpm -ql vsftpd |less ##
查看形成的文件
[root@localhost Server]# man 5 vsftpd.conf ##
查看配置文件的参数信息
[root@localhost Server]# vim /etc/vsftpd/vsftpd.conf ##
编辑配置文件
12 anonymous_enable=YES ##
支持匿名帐号
15 local_enable=YES ##
支持本地帐号
18 write_enable=YES ##
允许使用任何可以修改文件系统的FTP的指令
22 local_umask=022 ##
屏蔽权限即本地用户上传的文件权限
27 #anon_upload_enable=YES
允许匿名用户上传文件
31 #anon_mkdir_write_enable=YES
允许匿名用户创建新目录
35 dirmessage_enable=YES ##
允许为目录配置显示信息,显示每个目录下面的message_file文件的内容
39 xferlog_enable=YES ##
开启日记功能
42 connect_from_port_20=YES ##
使用标准的20端口来连接ftp
47 #chown_uploads=YES
所有匿名上传的文件的所属用户将会被更改成chown_username
48 #chown_username=whoever
匿名上传文件所属用户名
52 #xferlog_file=/var/log/xferlog
日志文件位置
56 xferlog_std_format=YES ##
使用标准的日志格式
59 #idle_session_timeout=600
空闲连接超时
62 #data_connection_timeout=120
数据传输超时
66 #nopriv_user=ftpsecure
当服务器运行于最底层时使用的用户名
71 #async_abor_enable=YES
允许使用\"async ABOR\"命令,一般不用,容易出问题
81 #ascii_upload_enable=YES
管控是否可用ASCII 模式上传。默认值为NO
82 #ascii_download_enable=YES
管控是否可用ASCII 模式下载。默认值为NO
85 #ftpd_banner=Welcome to blah FTP service ## login
时显示欢迎信息.如果设置了banner_file则此设置无效
89 #deny_email_enable=YES
如果匿名用户需要密码,那么使用banned_email_file里面的电子邮件地址的用户不能登录
90 # (default follows)
91 #banned_email_file=/etc/vsftpd/banned_emails
禁止使用匿名用户登陆时作为密码的电子邮件地址
96 #chroot_list_enable=YES
如果启动这项功能,则所有列在chroot_list_file中的使用者不能更改根目录
97 # (default follows)
98 #chroot_list_file=/etc/vsftpd/chroot_list
定义不能更改用户主目录的文件
104 #ls_recurse_enable=YES
是否能使用ls -R命令以防止浪费大量的服务器资源
109 listen=YES ##
绑定到listen_port指定的端口,既然都绑定了也就是每时都开着的,就是standalone模式(独立的sftpd服务器)
116 pam_service_name=vsftpd ##
定义PAM 所使用的名称,预设为vsftpd
117 userlist_enable=YES ##
若启用此选项,userlist_deny选项才被启动
118 tcp_wrappers=YES ##
开启tcp_wrappers支持
五、案例-------实现支持SSL加密传输的ftp服务器
1.
在没有实现ssl加密之前,先安装一个抓包软件
[root@localhost ~]# yum install wireshark –y
Running Transaction
Installing : libsmi 1/2
Installing : wireshark 2/2
Installed:
wireshark.i386 0:1.0.8-1.el5_3.1
Dependency Installed:
libsmi.i386 0:0.4.5-2.el5
Complete!
[root@localhost ~]# tshark -ni eth0 -R "tcp.dstport eq 21"
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
##
登录ftp,在21端口上进行抓包
如下图:
2.
配置颁发证书的根机构
[root@mail ~]# cd /etc/pki/
[root@mail pki]# vim tls/openssl.cnf
45 dir
= /etc/pki/CA ##证书路径
88 countryName
= optional
89 stateOrProvinceName
= optional
90 organizationName
= optional ##optional表示这些项可选择
136 countryName_default
= CN ##修改一下证书机构的默认值,可以不修改
141 stateOrProvinceName_default = BeiJing
144 localityName_default
= BeiJing
:88,90 s/match/optional
(vim编辑可以选用命令)
产生证书
[root@mail pki]# cd CA
[root@mail CA]# mkdir crl certs newcerts
[root@mail CA]# touch index.txt serial
##
新建相应的文件和目录
[root@mail CA]# echo "01">serial
##
证书的序列号从1开始
[root@mail CA]# openssl genrsa 1024 >private/cakey.pem
##
产生私钥
Generating RSA private key, 1024 bit long modulus
[root@mail CA]# chmod 600 private/*
##
更改权限
[root@mail CA]# openssl req -new -key private/cakey.pem -x509 -out cacert.pem -days 3650
##
产生证书
3.
为ftp申请证书
[root@localhost ~]# mkdir /etc/vsftpd/certs
##
创建存放私有钥匙,证书等信息的目录
[root@localhost ~]# cd /etc/vsftpd/certs/
产生钥匙
[root@localhost certs]# openssl genrsa 1024 >vsftpd.key
Generating RSA private key, 1024 bit long modulus
.......++++++
..........................++++++
e is 65537 (0x10001)
向根机构请求证书
[root@localhost certs]# openssl req -new -key vsftpd.key -out vsftpd.csr
Country Name (2 letter code) [CN]:
State or Province Name (full name) [BeiJing]:
Locality Name (eg, city) [BeiJing]:
Organization Name (eg, company) [My Company Ltd]:lee
Organizational Unit Name (eg, section) []:tec
Common Name (eg, your name or your server's hostname) []:ftp.abc.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
申请证书
[root@localhost certs]# openssl ca -in vsftpd.csr -out vsftpd.cert
更改存放证书私钥的目录权限
[root@localhost certs]# chmod 600 *
修改配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
在这如果不知道怎么写的话,可以man一下,查看一下帮助
[root@localhost ~]# man 5 vsftpd.conf
添加的内容如下
120 rsa_cert_file=/etc/vsftpd/certs/vsftpd.cert
121 rsa_private_key_file=/etc/vsftpd/certs/vsftpd.key
##
指定证书和钥匙的目录
122 ssl_tlsv1=YES
123 ssl_sslv3=YES
124 ssl_sslv2=YES
125 ssl_enable=YES
##
启动ssl,并支持ssl的版本
126 force_local_logins_ssl=YES
127 force_local_data_ssl=YES
重启服务
[root@localhost ~]# service vsftpd restart
六、测试
在客户机上安装一个ftp客户端FlashFXP
安装之后,新建一个站点,如图:
用之后,连接
接受
现在可以看一下抓包工具所抓取的信息
[root@localhost ~]# tshark -ni eth0 -R "tcp.dstport eq 21"
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
已看不到帐号和密码信息
案例二
实现虚拟帐号的ftp服务器:http://lee0128.blog.51cto.com/5627365/991918,希望大家继续关注...
转载于:https://blog.51cto.com/lee0128/991784