第一部分:FTP的基础认知:


FTP: 文件传输协议(File TransferProtocol)使得主机间可以共享文件;它是一种应用层协议;它还可以跨越不同操作系统进行实现共享。是基于C/S进行工作的。

FTP有两类链接方式:

1、命令连接,工作在tcp的21号端口上,但是命令连接仅仅是由客户端在连接到服务器端以后向服务器端发起命令的。

[root@station144 ~]# lftp 172.16.0.1
lftp 172.16.0.1:~> cd pub/
lftp 172.16.0.1:/pub> ls

  2、数据连接:

        主动模式:

221544128.png

   解析:服务器端监听在tcp的20号端口下而且是固定的端口通信,而客户端监听的端口不是固定的是随机生成的大于1023的端口而且通信端口是监听端口+1。劣势:由于客户端监听的端口大于1023,当服务器端请求连接客户端是由于防火墙的存在会导致连接失败。

  被动模式:

221712544.png

   解析:服务器端依然监听在20端口下,但是服务器端是通过随机生成的大于1023的端口进行通信的;这里就是使用6666进行通信。但是不会主动去连接客户端而是等待客户端的请求然后予以响应发送数据。如果还有其他用户再来请求数据,服务器端还会重新再打开一个随机端口予以响应来发送数据。而这些随机端口是通过21号端口告诉客户端的。劣势:这样的服务器端的防火墙就比较麻烦了。


   总结:命令连接和数据连接是关联的,可以没有数据连接但是绝对不能没有命令连接。数据连接的两种模式是根据客户端的请求方式来决定的。


  数据的传送模式:二进制和文本


第二部分:FTP的简单实现和配置解析


服务器端软件类型:

   Unix :wuftpd(现已不常见到)

   Linux:proftpd,pureftp,vsftpd(红帽系统自带,安全性特别高),filezilla(既有linux版也有windows版)

   Windows:Serv-U,IIS


客户端软件类型:

   Linux:浏览器自带访问,ftp,lftp(功能很强大,只工作在linux上),gftp(只工作在linux上),filezilla(客户端的)。

   Windows:浏览器自带访问,ftp,flashxp,cuteftp,leapftp 等等。


安装配置FTP

    系统版本:CentOS 6.4 x86_64

    服务器端安装:yum install vsftpd –y

    启动服务:service vsftpd start

    客户端安装:yum install ftp

客户端安装:yum install lftp


测试连接:

  连接测试:ftp 172.16.18.1

[root@station144 ~]# ftp 172.16.18.1              #连接测试
Connected to 172.16.18.1 (172.16.18.1).
220 (vsFTPd 2.2.2)                   #220是协议解析码
Name (172.16.18.1:root): ftp                #需要使用用户登录,默认使用root,显然这是不行的,可以使用匿名登录输入ftp表示匿名访问
331 Please specify the password.     #331是协议解析码
Password:                  #输入用户密码由于我们是匿名所以为空
230 Login successful.                #230是协议解析码
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

解析:协议响应码:(220 (vsFTPd 2.2.2)331 Please specify the password等都是响应码)

1xx: 服务器信息,主要表示服务器的属性信息等等

2xx: 正确响应信息

3xx: 正常响应,某操作过程尚未完成,需进一步补充完成;

4xx: 客户端错误;

5xx: 服务器端错误;

注:若请求服务器端信息,服务器端不存在则会出现客户端错误信息,原因是由于客户端做的错误请求导致的。由于服务器自身问题导致请求无法完成的会显示服务器端错误。若用户不存在会显示为服务器端错误哦!

用户不存在的情况
[root@station144 ~]# ftp 172.16.18.1
Connected to 172.16.18.1 (172.16.18.1).
220 (vsFTPd 2.2.2)
Name (172.16.18.1:root): an              #/etc/passwd中无此用户
331 Please specify the password.
Password:
530 Login incorrect.                     #服务器端错误
Login failed.
ftp>

特别标明:ftp服务器端文件路径是用户家目录;查看用户家目录可使用finger 用户名。

[root@localhost ~]# finger ftp
Login: ftp                      Name: FTP User
Directory: /var/ftp                     Shell: /sbin/nologin
Never logged in.
No mail.
No Plan.
#其中Directory: /var/ftp表示为用户家目录路径信息


红帽系统最好用FTP服务——vsftpd的用法:

1、vsftpd用户类型:

   匿名用户: 事实上是服务器端自动映射的一个系统用户;

   本地用户:/etc/passwd中的用户,默认rootid号小于500的用户都禁止访问ftp;谨记这一类用户非常的不安全,如果不限定他可以随意切换到家目录或其他目录中并且还可以使用ssh登录。

   虚拟用户:事实上是服务器端自动映射的一个系统用户;多个虚拟用户同时被映射为同一个系统用户,但不同的虚拟用户可以具有不同的访问权限;


2vsftpd常用文件认识:

[root@localhost ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd              #控制vsftpd的日志文件实现滚动
/etc/pam.d/vsftpd                    #定义vsftpd如何认证用户的,若要使用虚拟用户需改动
/etc/rc.d/init.d/vsftpd              #服务脚本
/etc/vsftpd                          #配置文件
/etc/vsftpd/ftpusers                 #配置文件
/etc/vsftpd/user_list                #配置文件
/etc/vsftpd/vsftpd.conf              #主配置文件
/etc/vsftpd/vsftpd_conf_migrate.sh   #配置文件
/usr/sbin/vsftpd                     #服务器端可执行程序

3vsftpd主配置文件的解析

[root@localhost vsftpd]# vim vsftpd.conf
# Example config file /etc/vsftpd/vsftpd.conf        #其中#号表示注释
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES                 #是否启用匿名用户不启用为NO
#
# Uncomment this to allow local users to log in.
local_enable=YES                     #是否启用本地用户不启用为NO
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES                     #是否允许本地用户有上传文件的权限
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022                      #本地用户上传文件之后的权限
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
#anon_upload_enable=YES               #是否允许匿名用户上传文件
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES       #定义匿名用户是否具有创建目录的权限
anon_other_write_enable=YES        #定义其他权限,可以实现更改文件的属主属组删除文件等,但是这需要手动添加
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES              #表示没切换一个目录都会显示欢迎一段信息的
#
# The target log file can be vsftpd_log_file or xferlog_file.
# This depends on setting xferlog_std_format parameter
xferlog_enable=YES                 #是否开启传输日志,显示上传,下载的所有信息
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES           #是否允许服务器工作在主动模式下
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES                 #是否将上传的文件目录属主改成别人
#chown_username=whoever            #定义新的属主,将whoever更改成即可
#
# The name of log file when xferlog_enable=YES and xferlog_std_format=YES
# WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log
#xferlog_file=/var/log/xferlog     #定义日志文件的,虽然上面日志功能已启用,但是仍然不会记录的
#
# Switches between logging into vsftpd_log_file and xferlog_file files.
# NO writes to vsftpd_log_file, YES to xferlog_file
xferlog_std_format=YES             #定义日志是否使用标准格式
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600          #定义命令连接的超时时间
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120       #数据连接的超时时间
#
# It is recommended that you define on your system a unique user which the
……中间不太重要已省略……
# ASCII mangling is a horrible feature of the protocol.
#ascii_upload_enable=YES                #是否强制使用AscII上传文件的
#ascii_download_enable=YES              #是否强制使用AscII下载文件的,若强制可能导致文件的错误
# You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service.      #显示欢迎信息
#
……中间不太重要已省略……
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().        #chroot:禁锢用户于其家目录中,不允许随意访问其他文件
#chroot_local_user=YES          #启用表示所有用户都被禁锢于其家目录中
#chroot_list_enable=YES         #启动表示禁锢指定用户
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list      #被指定禁锢的用户名单文件(注意:一行一个用户)
#
……中间不太重要已省略……
pam_service_name=vsftpd
userlist_enable=YES                           #用户列表是否启用,所有写在ftpusers的用户都不允许登录ftp(/etc/pam.d/vsftpd中有说明)
userlist_deny=NO (需要手动添加此项)           #定义白名单允许登录(若想允许匿名用户出现在白名单中也需要定义;可定义为ftp也可为anonymous);对应文件是user_list
userlist_deny=YES(不添加默认是这一项)         #定义黑名单禁止登录;对应文件是user_list
tcp_wrappers=YES

注:

   1)由于此配置文件检查要求比较严格,不可随意出现任意空白字符,例如write_enable=YES之前不可出现任何空白字符;等号两侧不可出现任何空白字符。

   2)当更改这个文件中的这些权限时一定要确保SElinux是关闭的,不然会被阻止的。


第三部分:基础知识的进一步升华


实战一:匿名用户如何实现文件上传?

服务器端:

[root@localhost vsftpd]# vim vsftpd.conf
确保主配置文件中的anon_upload_enable=YES已启动
服务器端程序重新载入:service vsftpd reload

 切换至客户端:  

[root@station144 ~]# lftp 172.16.18.1
lftp 172.16.18.1:~> put /etc/fstab                #使用此命令进行上传文件(put 文件名)
put: Access failed: 553 Could not create file. (fstab)      #无法实现上传,原因是虽然有了上传文件的权限但是远程服务器上没有向这个文件中写文件的权限。

解决办法:

服务器端

[root@localhost vsftpd]# cd /var/ftp/                #切换至家目录下
[root@localhost ftp]# ls
pub
[root@localhost ftp]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Jul 29 13:25 pub
[root@localhost ftp]# mkdir upload             #新建一个目录
[root@localhost ftp]# setfacl -m u:ftp:rwx upload/       #让这个目录ftp具有读写执行权限
[root@localhost ftp]#

 切换至客户端:

[root@station144 ~]# lftp 172.16.18.1          #重新连接
lftp 172.16.18.1:~> ls
drwxr-xr-x    2 0        0            4096 Jul 29 05:25 pub
drwxrwxr-x    2 0        0            4096 Jul 29 06:36 upload
lftp 172.16.18.1:/> cd upload/
lftp 172.16.18.1:/upload> put /etc/fstab        #上传
921 bytes transferred                        
lftp 172.16.18.1:/upload> ls
-rw-------    1 14       50            921 Jul 29 06:40 fstab      #成功上传


实战二:如何定义在切换目录时显示一段欢迎信息?

 服务器端:

[root@localhost vsftpd]# vim vsftpd.conf
确保dirmessage_enable=YES已经启动
[root@localhost ftp]# cd upload/
[root@localhost upload]# vim .message      #编辑一个.message结尾的隐藏文件
--welcome to Upload--                    #添加一段欢迎信息

  客户端:

[root@station144 ~]# ftp 172.16.18.1       #这里使用lftp无法显示欢迎信息
Connected to 172.16.18.1 (172.16.18.1).
220 (vsFTPd 2.2.2)
Name (172.16.18.1:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload                      #切换至书写信息的目录中
250---welcome to Upload--            #正常显示编辑的欢迎信息
250-
250 Directory successfully changed.



实战三:如何指定用户白名单使其不禁锢于家目录中?

   思路:将chroot_local_user=YES;chroot_list_enable=YES;chroot_list_file=/etc/vsftpd/chroot_list三条指令同时启动实现白名单定制。


//1、修改配置文件
[root@localhost vsftpd]# vim vsftpd.conf
chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
//2、创建文件指定白名单
[root@localhost vsftpd]# vim chroot_list
zhao
centos
//3、切换到客户端测试
[root@station144 ~]# ftp 172.16.18.1
Connected to 172.16.18.1 (172.16.18.1).
220 (vsFTPd 2.2.2)
Name (172.16.18.1:root): centos     #centos在白名单中
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/centos"
ftp> cd /etc
250 Directory successfully changed.
ftp> ls                                  #可以查看etc下所有文件
227 Entering Passive Mode (172,16,18,1,214,167).
150 Here comes the directory listing.
drwxr-xr-x    5 0        0            4096 Jul 12 10:27 ConsoleKit
-rw-r--r--    1 0        0            4439 Apr 17  2012 DIR_COLORS
-rw-r--r--    1 0        0            5139 Apr 17  2012 DIR_COLORS.256color
-rw-r--r--    1 0        0            4113 Apr 17  2012 DIR_COLORS.lightbgcolor
drwxr-xr-x    5 0        0            4096 Jul 12 10:33 NetworkManager
[root@station144 ~]# ftp 172.16.18.1
Connected to 172.16.18.1 (172.16.18.1).
220 (vsFTPd 2.2.2)
Name (172.16.18.1:root): tom        #tom没有在白名单文件中,故无法实现查看其他文件
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> cd /etc
550 Failed to change directory.


实战四:如何定义传输速率;限定匿名用户下载速度为10K而普通用户不限定?

 匿名用户最大传输速率:anon_max_rate=值;默认单位为字节

 普通用户最大传送速率:local_max_rate=值

 扩展:要分别定义传输速率使用user_config_dir=/etc/vsftpd/userconfs/ 然后在后续目录中分别以用户名创建文件将local_max_rate=值写入其中即可。

[root@localhost vsftpd]# vim vsftpd.conf            #编辑配置文件
anon_max_rate=10240                          #添加此命令
[root@localhost vsftpd]# service vsftpd restart       #重启服务

232821692.png


实战五:如何限定登录ftp的个数?

max_clients=值          #最大连接数
max_per_ip=值          #某IP地址的最大连接数
//由于地址的局限性,这里就不在举例说明了


怎么利用ssl对ftp进行加密认证传输?

  本实例需要用到ssl认证加密功能,由于笔者对于ssl知识认识有限这里就不再班门弄斧了,若想看笔者笑话敬请关注后续博客Ooenssl加密认证。。。会有补充说明哟!!j_0003.gif