Linux 下搭建 FTP 服务器

一、搭建环境

        阿里云 CentOS 7.3 64位

二、FTP协议基础知识

2.1 简介

        FTP 是 File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文件协议”。用于 Internet 上的控制文件的双向传输。

2.2 FTP的运作流程与使用端口

        FTP 的传输使用的是 TCP 传输协议,由于 FTP 服务的特点是数据量大、控制信息相对较少,因此在设计的时分别对控制信息与数据进行处理的方式,这样用于通信的 TCP 连接有两个:控制连接与数据连接。其中,控制连接用于在通信双方之间传输 FTP 命令与响应信息,完成连接建立、身份认证与异常处理等控制操作;数据连接用于在通信双方之间传输文件或目录信息。

        FTP支持两种模式:Standard(PORT方式,主动方式),Passive(PASV,被动方式)。

2.2.1 PORT 方式

        图1 FTP服务器的 PORT 方式示意图

        至于连接的过程是这样的:

(1) 建立命令通道的连接

        如上图所示,用户端会随机取一个大于1024以上的端口(port AA)来与FTP服务器端的port 21进行连接,这个过程当然需要经历TCP的三次握手!完成连接后用户端便可透过这个连接来对TCP服务器下达指令,包括查询文件名、下载、上传等等指令都是利用这个通道来下达的。

(2)通知FTP服务器端使用 active 且告知连接的端口号

        FTP 服务器的 21 端口主要用在命令下达,但是当关系到数据流时,就不是使用这个连接了。用户端在需要数据的情况下,会告知服务器端需要用什么方式来连接,如果是 PORT 模式时,用户端会先随机启用一个端口(图中的port BB),且通过命令通道告知 FTP 服务器这两个信息,并等待 FTP 服务器的连接。

(3)FTP服务器【主动】向用户端连接

        FTP 服务器由命令通道了解用户端的需求后,会主动的由 20 这个端口向用户端的 port BB 连接,这个连接当然也会经历 TCP 的三次握手!此时 FTP 的用户端与服务器端会建立两条连线,分别用在命令的下达与数据的传送。而预设 FTP 服务器端使用的主动连接端口就是port 20。

2.2.2 PASV 方式

        图2 FTP服务器的 PASV 方式示意图

(1)用户与服务器建立命令通道

        同样的需要建立命令通道,通过三次握手就可以建立起这个通道了。

(2)用户端发出PASV的连接请求

        当有使用数据通道的指令时,用户端可通过命令通道发出 PASV 的被动式连接要求(Passive 的缩写),并等待服务器的回应。

(3)FTP服务器启动数据端口,并通知用户端连接

        如果你的 FTP 服务器能够处理被动式连接,此时 FTP 服务器会先启动一个端口在监听。这个端口号码可能是随机的,也可以是某一范围的端口,具体看你的 FTP 服务器软件而定。然后你的 FTP 服务器会通过命令通道告知用户端已经启动的端口(图中的 port PASV),并等待用户端的连接。

(4)用户端随机取用大于1024的端口进行连接

         然后你的用户端会随机取用一个大于 1024 的端口号来对主机的 port PASV 连接。

2.3 用户分类

2.2.1 Real账户

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

2.2.2 Guest用户

        在FTP服务器中,我们往往会给不同的部门或者某个特定的用户设置一个帐户。但是,这个账户有个特点,就是其只能够访问自己的主目录。服务器通过这种方式来保障FTP服务上其他文件的安全性。这类帐户,在Vsftpd软件中就叫做Guest用户。拥有这类用户的帐户,只能够访问其主目录下的目录,而不得访问主目录以外的文件。

2.2.3 Anonymous(匿名)用户

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

三、VSFTP

3.1 简介

        VSFTP 是一个基于 GPL 发布的类 Unix 系统上使用的 FTP 服务器软件,它的全称是 Very Secure FTP。

3.2 安装

        查看是否装有 vsftpd 服务。

rpm -qa | grep vsftpd

        若不存在,则使用 yum 命令直接安装:

yum -y install vsftpd

3.3 配置 vsftpd

        修改配置文件,默认路径为 /etc/vsftpd/vsftpd.conf,命令如下。

vim /etc/ftpd/ftpd.conf

        以下为需要修改或添加的配置项。

  • anonymous_enable=NO #不允许匿名用户登陆
  • chroot_list_enable=YES #chroot_list_file 指定文件中指定的用户禁锢在其主目录中
  • chroot_list_file=/etc/vsftpd/chroot_list

        在 /etc/vsftpd 目录下建立文件 chroot_list,命令如下

cd /etc/vsftpd
touch chroot_list

        在 chroot_list 里添加 FTP 用户的用户名,每个用户一样,这里我添加的用户名为 symind。

3.4 添加 FTP 用户组及用户

        添加一个用户组,这里我命名为 webftp。

groupadd webftp

        在用户组中添加用户,并指定用户的主目录。

useradd -g webftp -M -d /home/www -s /sbin/nologin symind

        设置密码。

passwd symind

        修改目录拥有者。

chown -R symind.webftp /home/www

        修改目录权限,vsftp 默认要求如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了。

chmod u=rx /home/www

        也可以更改 vsftpd 的配置,allow_writeable_chroot=YES。

参考文献

1. 百度百科 - ftp(文件传输协议) https://baike.baidu.com/item/ftp/13839?fr=aladdin

2. 百度百科 - VSFTP https://baike.baidu.com/item/VSFTP/2596628?fr=aladdin

3. 鳥哥的 Linux 私房菜 - 檔案伺服器之三 http://linux.vbird.org/linux_server/0410vsftpd.php

4. vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot()错误的解决方法 http://blog.csdn.net/bluishglc/article/details/42399439

5. CentOS下vsftp设置、匿名用户&本地用户设置、PORT、PASV模式设置 http://desert3.iteye.com/blog/1685734

原文地址:https://www.cnblogs.com/SyMind/p/8243454.html