在 CentOS 7 上安装 FTP 服务器

在 Linux 系统中通常使用的 FTP 服务器是 vsftpd,所以下面我就记录一下我是如何在一台没有安装 vsftpd 的 Linux 主机上安装 vsftpd。

1、安装 vsftpd 包

sudo yum install vsftpd

2、配置 FTP 账户

在 Linux 系统中 FTP 账户也是一种特殊的系统用户,只不过 FTP 账户的权限需要特殊设定而已。所以,我们先添加一个 FTP 账户:

sudo useradd -d /home/www www

其中,useradd为添加用户的命令,该命令只有超级用户组的用户才可以使用。参数-d表示该参数后面指定的是用户的主目录。最后面一个参数是 FTP 用户名。

然后为www用户设置密码:

sudo passwd www

根据提示输入两次密码。

3、设置www用户的权限:

usermod -s /sbin/nologin www

其中,usermod为修改用户信息的命令,它也是只能由超级用户组的成员才能使用。参数-s表示该参数后面指定的是用户登录所使用的 shell。我们可以查看系统里面有哪些 shell:cat /etc/shells

在我的 CentOS 7 上面显示有如下几个:

/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

我们可以看到上面有两个名为nologin的 shell,其实它们两个是一样的,只不过/sbin目录是/usr/sbin目录的链接目录,也就是我们通常所说的文件夹快捷方式。如果我们为某个用户指定了他登录所使用的 shell 为nologin,那就意味着不允许他使用 ssh 的方式登录系统,但是呢他仍旧可以有其它权限。为了安全性,我们刚创建的 FTP 账户就不能让他有 ssh 方式登录系统的权限,所以需要将他的登录 shell 设为nologin

设置完不能登录还不算完,试想一下,如果 FTP 用户通过 FTP 方式登录系统,那他除了可以看到自己的主目录之外,是不是也可以调转到其它非自己主目录下的目录呢,答案是当然可以,如果不进行限定就是这样。所以,我们还需要限定www用户只能看到自己主目录下的东西。哦,对了,别忘了还有个匿名用户得禁掉。

这些配置我们需要在 vsftpd 的配置文件里面进行配置:

sudo vi /etc/vsftpd/vsftpd.conf

那么,配置文件里面有这么多选项,我们到底该配置哪些呢,不用担心,我们可以去 vsftpd 官网找答案。不过很可惜,我打不开官网,这也没关系,我们可以去 wikipedia.org 上找找看,很快地我就打开了 wikipedia 上的 vsftpd 的词条,我发现里面并没有将如何配置 vsftpd 的,但是我在下方的外部链接External links下面发现了List of Config Directives这项链接,打开一看,我发现这就是我要找的配置说明。

依次从上往下看,我发现了一些关于匿名账户的相关设置,它们多以anon开头,这些选项大多数的默认值都是 NO,我看到anon_world_readable_onlyanonymous_enable这两项的默认值是YES。其中anon_world_readable_only选项如果为YES,则允许匿名用户下载服务器上的文件,很明显我不能允许,所以这个选项应设为NOanonymous_enable选项控制是否允许匿名用户登录 FTP 服务器,很明显这项也应设置为NO。所以,我们需要在配置文件中配置下面这两项:

anon_world_readable_only = NO
anonymous_enable = NO

再往下看,我发现可以改变用户根目录的两个选项chroot_local_userchroot_list_enable,其中chroot其实是一个名为chroot(const char *path)的 C 函数,此函数的作用就是将改变调用进程的根目录为指定的路径。选项chroot_local_user的值如果设为YES,那么本地用户在通过 FTP 方式登录之后,他将会被关进他自己的根目录中,而不允许调转到非自己根目录及其子目录以外的其它目录。而选项chroot_list_enable如果设为YES,那么 vsftpd 将允许我们通过chroot_list_file选项指定一个包含本地用户列表的文件来控制到底哪些用户在登录后会被关进自己的根目录。

我们需要注意的是,chroot_local_user选项和chroot_list_enable选项组合使用时所表示的实际含义是相反的。什么意思呢,下面我用一个表格来说明:

chroot_local_user chroot_list_enable 实际含义
YES YES 只有chroot_list_file里面列出的用户才不会被关进自己的根目录。
YES NO 所有本地用户均会被关进自己的根目录。
NO YES 只有chroot_list_file里面列出的用户才会被关进自己的根目录。
NO NO 所有本地用户均不会被关进自己的根目录。

所以,通常情况下选项chroot_local_user和选项chroot_list_enable不应同时使用,除非有特殊癖好。

我这里只需要设置chroot_local_user选项即可:

chroot_loacl_user = YES

再往下看,我发现了一个名为connect_from_port_20的选项,该选项控制 FTP 传输方式,如果设为YES,则使用Port方式传输数据。关于 FTP 的传输方式,百度文库上有详细说明: http://wenku.baidu.com/view/728dc0104431b90d6c85c79c.html 相对应的还有PASV方式,对于该方式,我们需要将connect_from_port_20选项设为NO或者注释掉。同时还应设置如下选项:

pasv_enable = YES
pasv_max_port = pasv 模式最大端口
pasv_min_port = pasv 模式最小端口

但是,PASV模式通常适用于多客户端,而我就一人使用,所以我就没必要使用这个模式。所以我只需设置connect_from_port_20 = YES就 OK。

4、重启 vsftpd 服务器:

sudo /etc/init.d/vsftpd restart

参考文献
  • http://vsftpd.beasts.org/vsftpd_conf.html
  • http://man7.org/linux/man-pages/man2/chroot.2.html
Tags: vsftpd centos