一、基本概念介绍 

    FTP(File Transfer Protocol)文件传输协议,用于控制文件的双向传输,同时也是一个应用程序,可以实现在主机间共享文件,它属于ISO网络结构中的应用层。

    当启动FTP从远程计算机复制文件时,事实上启动了两个程序:一个是本地机上的FTP客户程序,它向FTP服务器提出复制文件的请求;另一个是启动在远程计算机上的FTP服务器程序,响应客户机的请求吧指定的文件传送到本地机中。

     FTP是应用层的协议,基于传输层为用户服务,负责进行文件的传输。FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,端口21用于传输控制流,并且是命令通向FTP服务器的进口。

    IP地址只能定位到具体的主机,但主机系统中运行着无数个进程,具体由哪个进程负责接收和处理数据则要涉及到端口(Socket接口技术),不同的服务采用不同的端口,例如Web服务采用80号端口,FTP采用21号端口,邮件服务器采用25号端口等

    按协议类型分类端口:

1、TCP端口,即传输控制协议端口,需要在服务器和客户端之间建立连接,提供可靠的传输。常见的有FTP的21号端口、Telnet服务的23号端口、SMTP服务的25端口和HTTP服务的80端口。

2、UDP端口,即用户数据协议端口,无需再客户端和服务端之间建立连接,安全性不能得到保障。常见的有DNS服务的53端口、SNMP服务的161端口以及QQ使用的8000和4000端口。

 

二、FTP服务器工作原理

实现的目标:实现文件共享,同时向用户屏蔽不同主机中各种文件存储系统的细节,提供可靠和高效的数据传输,因此可用于使用不同操作系统的主机之间传输文件

FTP系统采用“客户端/服务器”(C/S)模型。在客户端与服务器端程序之间通过面向连接的TCP协议进行通信,一个FTP服务器进程可同时为多个客户进程提供服务。FTP服务器的进程由两大部分组成:一个主进程负责接收新的请求;另外有若干个从属进程,负责处理单个请求。

具体工作过程:

     1、FTP客户端发出请求,系统动态为之分配一个端口X

     2、若FTP服务器在端口21侦听到该请求,则在客户端的端口X和服务器的端口21之间建立起一个FTP会话连接

     3、当需要传输数据时,FTP客户端再动态打开一个连接到FTP服务器端口20的第二个端口Y,数据传输完毕后这两个端口自动关闭

     4、当FTP客户端断开与FTP服务器的连接时,客户端动态分配的端口将自动释放

 

FTP的传输方式

1、ASCII传输方式

2、二进制传输方式

 

FTP的工作方式

1、主动工作(PORT方式),要求客户端和服务器端同时打开并且监听一个端口以创建连接

工作步骤:

     ——  客户端打开一个随机的注册端口(端口号大于1024)X,同时客户端的一个FTP进程连接至服务器的21号命令端口

     ——  客户端开始监听端口Y,同时向服务器发送一个端口命令,告诉服务器客户端正在监听的端口号Y,并且准备从Y端口接收数据

     ——  服务器打开20号源端口建立和客户端数据端口的连接,此时源端口为20号端口,远程数据端口为Y

     ——  客户端通过本地数据端口建立一个和服务器20号端口的连接,然后向服务器发送一个应答表示已经建立好连接

2、被动方式(PASV方式),命令连接和数据连接都由客户端发起,以解决从服务器到客户端的数据端口的连接被防火墙过滤掉的问题

    工作步骤:

     ——  客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”

     ——  服务器返回命令"PORT Y,告诉客户端(服务器)用哪个端口侦听数据连接

     ——  客户端初始化一个从自己的数据端口到服务器端指定的数据端口Y的数据连接

     ——   服务器给客户端的数据端口返回一个"ACK"响应

 

匿名FTP服务

    在这种设置下,用户不需要账号就可登录服务器。其本质是在提供服务的FTP服务器上建立一个公开账户(一般为anonymous),并赋予该账户访问公共目录的权限。需要登录FTP服务器时,无需事先申请用户账户,而是使用anonymous作为用户名,用自己的Email地址或用户ID作为口令即可登录

 

FTP主配置文件

#设置服务器是否以独立模式运行,若设置为NO则需受xinetd服务的管理控制
listen=NO
#
# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 "any" address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
listen_ipv6=YES
#
#是否允许匿名用户通过FTP登陆
anonymous_enable=NO
#
# 是否允许本地用户登陆,默认值为YES
local_enable=YES
#
# 是否允许访问的用户有写入的权限.
#write_enable=YES
#
# 设置本地用户上传文件的默认权限掩码值
#local_umask=022
#
# 是否允许匿名用户下载文件
#anon_upload_enable=YES
#
# 是否允许匿名用户有创建目录的权限
#anon_mkdir_write_enable=YES
#
# 是否显示目录说明文件
dirmessage_enable=YES
#
# 是否使用本地时间
use_localtime=YES
#
# 是否启用日志记录FTP
xferlog_enable=YES
#
是否确信端口传输来自20
connect_from_port_20=YES
#
# 允许使用一个不同的用户拥有匿名下载的文件,但不建议该用户为root.
# recommended!
#chown_uploads=YES
#chown_username=whoever
#
# 设置日志文件名及路径
#xferlog_file=/var/log/vsftpd.log
#
# 是否使用标准格式存储日志
#xferlog_std_format=YES
#
# 设置默认的断开不活跃session的时间
#idle_session_timeout=600
#
# 设置数据传输超时时间,现为数据连接空闲2分钟后断开
#data_connection_timeout=120
#
# 是否建议在您的系统上定义一个惟一的用户作为一个完全隔离的非特权用户使用.
#nopriv_user=ftpsecure
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
#async_abor_enable=YES
#
#是否使用ASCII格式上传和下载文档
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
# 设置欢迎话语的字符串
ftpd_banner=Welcome to blah FTP service.
#
# 当使用者登陆时会显示此设定所在文件的内容,通常为欢迎话语
#banned_email_file=/etc/vsftpd.banned_emails
#
# 是否将所有用户锁定在主目录
#chroot_local_user=YES
#
# 是否启用锁定用户的名单
#chroot_local_user=YES
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list
#
#避免远程用户在大型计算机上造成过多的I/O网站
#ls_recurse_enable=YES
#
# Customization
#
# Some of vsftpd's settings don't fit the filesystem layout by
# default.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd/empty
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

#
# Uncomment this to indicate that vsftpd use a utf8 filesystem.
#utf8_filesystem=YES

三、服务器配置实例

设置一个FTP登陆用户uftp用于登陆FTP服务器

1、新建一个用于uftp登陆进入的目录

$  cd /home/uftp
$  vi welcome.txt

2、新建用户uftp,指定其主目录为/home/uftp,为其设置密码

$  useradd -d /home/uftp -s /bin/bash uftp
$  passwd uftp

3、删除掉pam.d中的vsftpd文件,以防影响登陆;设置uftp无法使用bash或其他shell登陆,也就只能通过ftp来登陆啦

$  rm /etc/pam.d/vsftpd
$  usermod -s /sbin/nologin uftp

4、设置FTP主配置文件

$  vi /etc/vsftpd.conf

这里给出我的部分基本配置

listen=NO

listen_ipv6=YES

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

use_localtime=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

ftpd_banner=Welcome to blah FTP service.

#将本地用户限制在其home目录下
chroot_local_user=YES
allow_writeable_chroot=YES

#允许读取被限制用户列表,且被限制用户在vsftpd.chroot_list文件中列出
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

utf8_filesystem=YES

#允许读取被允许登陆用户列表,且被允许用户在vsftpd.user_list文件中列出
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.user_list

5、新建限制用户列表文件和允许用户列表文件并编辑。因为我没有要限制的用户故vsftpd.chroot_list文件内容为空,而vsftpd.user_list文件中则加入uftp和本地用户

$  vi /etc/vsftpd.chroot_list
$  vi /etc/vsftpd.user_list

6、重启FTP服务

$  /etc/init.d/vsftpd restart

7、查看本机IP地址

$  ifconfig

8、在浏览器中输入ftp://IP地址访问,输入uftp用户名和密码即可访问

9、本机访问输入以下命令,并输入本机用户名和密码

$  ftp localhost

如果新建一个用户并将其加入vsftpd.chroot_list中,可以测试发现用该账号和密码登陆FTP时会提示被限制登陆