在 CentOS 7.4 系统上搭建一个稳定、安全的 FTP(文件传输协议)服务器是企业或个人进行文件共享、备份和管理的常见需求,本文将详细介绍如何使用业界广泛推荐的 vsftpd(Very Secure FTP Daemon)软件包来构建一个功能完善的 FTP 服务,整个过程涵盖安装、配置、防火墙设置以及用户管理,旨在提供一份清晰、可操作的实践指南。

第一步:安装 vsftpd 服务
在开始之前,请确保您拥有具有 sudo 权限的用户账户或直接使用 root 用户进行操作,CentOS 7.4 的官方软件源中已经包含了 vsftpd,因此安装过程非常简便。
打开终端,执行以下命令来安装 vsftpd:
sudo yum install vsftpd -y
安装完成后,需要启动 vsftpd 服务,并将其设置为开机自启,以确保服务器重启后 FTP 服务能自动运行。
sudo systemctl start vsftpd sudo systemctl enable vsftpd
您可以使用 sudo systemctl status vsftpd 命令来检查服务是否已经成功启动并正在运行。
第二步:配置防火墙
CentOS 7.4 默认使用 firewalld 作为防火墙管理工具,为了允许外部客户端访问 FTP 服务,必须在防火墙中开放相应的端口,FTP 使用两个端口:21(命令端口)和 20(数据端口,用于主动模式),为了更好地兼容各种网络环境(尤其是客户端位于 NAT 之后),我们强烈建议启用并配置被动模式(Passive Mode)。
开放 FTP 服务,firewalld 会自动处理标准端口 21:
sudo firewall-cmd --permanent --add-service=ftp
为了支持被动模式,我们需要开放一个端口范围,这个范围将在稍后的 vsftpd 配置文件中定义,这里我们以 10000-10100 为例:
sudo firewall-cmd --permanent --add-port=10000-10100/tcp
完成规则添加后,重新加载防火墙配置使其生效:
sudo firewall-cmd --reload
第三步:配置 vsftpd 服务
vsftpd 的核心配置文件位于 /etc/vsftpd/vsftpd.conf,在进行任何修改之前,建议先备份原始配置文件:

sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
使用您喜欢的文本编辑器(如 vi 或 nano)打开配置文件:
sudo vi /etc/vsftpd/vsftpd.conf
以下是一些关键配置项的推荐设置和说明,您可以根据需求进行调整。
| 配置项 | 推荐值 | 说明 |
|---|---|---|
anonymous_enable=NO |
NO |
禁止匿名用户登录,这是提升安全性的首要步骤。 |
local_enable=YES |
YES |
允许本地系统用户登录 FTP 服务器。 |
write_enable=YES |
YES |
允许登录用户进行写入操作(上传、删除、创建目录等)。 |
chroot_local_user=YES |
YES |
将所有本地用户限制在其主目录内,防止用户访问系统其他目录。 |
allow_writeable_chroot=YES |
YES |
当启用 chroot 时,如果用户主目录可写,某些版本的 vsftpd 会拒绝登录,此选项允许该行为。 |
pasv_enable=YES |
YES |
启用被动模式。 |
pasv_min_port=10000 |
10000 |
设置被动模式使用的最小端口,需与防火墙开放的端口范围一致。 |
pasv_max_port=10100 |
10100 |
设置被动模式使用的最大端口。 |
userlist_enable=YES |
YES |
启用用户列表控制。 |
userlist_file=/etc/vsftpd/user_list |
/etc/vsftpd/user_list |
指定用户列表文件的路径。 |
userlist_deny=NO |
NO |
设置为 NO 时,user_list 文件仅作为允许登录的用户白名单。 |
关于用户列表的特别说明:
userlist_deny=NO 是一个推荐的安全实践,这意味着只有在 /etc/vsftpd/user_list 文件中明确列出的用户才能登录 FTP,默认情况下,这个文件可能不存在或包含一些系统用户,您可以清空该文件,然后手动添加允许 FTP 访问的用户名,每行一个。
第四步:创建 FTP 专用用户
为了安全起见,不建议直接使用 root 或其他重要系统用户进行 FTP 操作,我们可以创建一个专用的 FTP 用户。
创建一个名为 ftpuser 的用户,并为其指定一个主目录(如 /var/ftp/ftpuser):
sudo mkdir -p /var/ftp/ftpuser sudo useradd -d /var/ftp/ftpuser -s /sbin/nologin ftpuser
-d /var/ftp/ftpuser:指定用户的主目录。-s /sbin/nologin:禁止该用户通过 SSH 登录系统,仅允许其用于 FTP 服务,增强安全性。
为新用户设置密码:
sudo passwd ftpuser
将新创建的用户添加到 user_list 白名单中:
echo "ftpuser" | sudo tee -a /etc/vsftpd/user_list
确保该用户对其主目录拥有适当的权限:
sudo chown -R ftpuser:ftpuser /var/ftp/ftpuser sudo chmod -R 755 /var/ftp/ftpuser
第五步:重启服务并测试
所有配置完成后,重启 vsftpd 服务以应用更改:

sudo systemctl restart vsftpd
您可以使用 FTP 客户端(如 FileZilla、WinSCP 或命令行 ftp 工具)进行连接测试,在客户端中输入服务器的 IP 地址、用户名(ftpuser)和刚刚设置的密码,如果一切顺利,您应该能够成功登录并看到用户主目录下的内容。
相关问答FAQs
连接 FTP 服务器时,提示 “500 OOPS: vsftpd: refusing to run with writable root inside chroot()” 错误,是什么原因?
解答:这是一个非常常见的安全限制,当您在 vsftpd.conf 中设置了 chroot_local_user=YES,将用户限制在其主目录时,vsftpd 默认不允许该主目录具有写入权限,以防用户利用权限提升漏洞,要解决这个问题,有两种方法:
- 推荐方法:在
vsftpd.conf中添加或修改allow_writeable_chroot=YES,然后重启服务,这明确告诉vsftpd允许chroot目录可写。 - 传统方法:保持用户主目录不可写,然后在其内部创建一个可写的子目录用于文件上传。
sudo chmod a-w /var/ftp/ftpuser sudo mkdir /var/ftp/ftpuser/uploads sudo chown ftpuser:ftpuser /var/ftp/ftpuser/uploads
这样用户登录后根目录不可写,但可以在
uploads目录中进行所有写操作。
在 FileZilla 等客户端中,可以成功登录 FTP 服务器,但无法列出目录内容,连接最终超时,这是怎么回事?
解答:这个问题通常与被动模式的配置有关,客户端在登录后,会尝试与服务器建立一个被动模式的数据连接来获取文件列表,如果这个过程失败,就会出现上述症状,请检查以下几点:
- 防火墙配置:确认您已经在
firewalld中开放了pasv_min_port和pasv_max_port指定的整个端口范围(10000-10100),并且已经执行了firewall-cmd --reload。 - vsftpd.conf 配置:确认
pasv_enable=YES已启用,pasv_min_port和pasv_max_port的值与防火墙开放的端口范围完全一致。 - 网络设备:如果您的服务器位于物理防火墙或云服务商的安全组之后,请确保这些外部设备也开放了相应的被动模式端口,这通常是容易被忽略的一环。