在 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_only
”和“anonymous_enable
”这两项的默认值是YES
。其中“anon_world_readable_only
”选项如果为YES
,则允许匿名用户下载服务器上的文件,很明显我不能允许,所以这个选项应设为NO
。“anonymous_enable
”选项控制是否允许匿名用户登录 FTP 服务器,很明显这项也应设置为NO
。所以,我们需要在配置文件中配置下面这两项:
anon_world_readable_only = NO
anonymous_enable = NO
再往下看,我发现可以改变用户根目录的两个选项“chroot_local_user
”和“chroot_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