在基于 Linux 的服务器运维工作中,搭建一个稳定、安全且高效的文件传输协议(FTP)服务是常见需求之一,在众多的 FTP 服务器软件中,vsftpd(Very Secure FTP Daemon)以其卓越的安全性、高性能和稳定性,成为了 CentOS 系统上的首选方案,本文将详细介绍如何在 CentOS 6.5 系统上从零开始搭建一个功能完善的 vsftpd 服务,涵盖安装、配置、安全加固及故障排查,旨在为系统管理员提供一份清晰、实用的操作指南。

准备工作与环境说明
在开始之前,请确保您拥有以下条件:
- 一台已安装 CentOS 6.5 操作系统的服务器。
 - 拥有 root 权限或可以通过 
sudo提权。 - 服务器已连接到互联网,以便使用 
yum命令下载软件包。 - 基础的 Linux 命令行操作知识。
 
第一步:安装 vsftpd 软件包
CentOS 的 yum 仓库中默认包含了 vsftpd,因此安装过程非常简单,通过以下命令即可一键安装:
yum install vsftpd -y
该命令会自动处理所有依赖关系并完成安装,安装完成后,vsftpd 的主配置文件位于 /etc/vsftpd/vsftpd.conf,这是后续所有配置工作的核心。
第二步:核心配置详解
为了建立一个既符合业务需求又安全可靠的 FTP 服务,我们需要对 vsftpd.conf 文件进行细致的调整,建议在修改前先备份原始配置文件:
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
使用文本编辑器(如 vi 或 nano)打开配置文件,并根据以下说明进行修改,我们将采用常见的“禁止匿名登录,允许本地用户登录并限制其主目录”的安全策略。
禁用匿名用户访问 出于安全考虑,生产环境通常应禁止匿名用户登录。
anonymous_enable=NO
将此行修改为 NO,确保未授权的用户无法访问服务器。
允许本地系统用户登录 开启此项,允许在服务器上创建的系统用户通过 FTP 登录。
local_enable=YES
赋予本地用户写入权限 如果允许用户上传、删除或修改文件,必须开启写入权限。
write_enable=YES
限制用户在家目录(Chroot Jail) 这是至关重要的安全措施,启用后,所有本地用户登录后将被“囚禁”在其主目录内,无法访问系统的其他任何区域,有效防止了用户越权操作。

chroot_local_user=YES
需要注意的是,当此选项为 YES 时,如果用户的主目录具有写权限,某些版本的 vsftpd 可能会拒绝登录,一种解决方案是在主目录下创建一个具有写权限的子目录,让用户在其中操作,并将主目录本身设置为不可写。
chmod a-w /home/ftpuser
配置被动模式(Passive Mode) FTP 服务器位于防火墙或 NAT 网关之后,主动模式可能会遇到连接问题,被动模式是更稳妥的选择,我们需要指定一个端口范围用于被动模式的数据连接。
pasv_enable=YES pasv_min_port=30000 pasv_max_port=31000
这里我们设置了 30000 到 31000 共 1000 个端口,这个范围可以根据实际需求调整,但需要与后续的防火墙规则保持一致。
管理用户列表 通过用户列表可以更精细地控制哪些用户可以或不可以登录。
userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd/user_list
userlist_deny=NO 表示 /etc/vsftpd/user_list 文件中的用户为“允许登录”的白名单,如果设置为 YES,则该文件变为黑名单。
设置欢迎信息 可以为登录用户显示一条欢迎信息。
ftpd_banner=Welcome to My FTP Service.
为了方便查阅,以下表格汇总了核心配置参数:
| 参数 | 建议值 | 说明 | 
|---|---|---|
anonymous_enable | 
NO | 禁止匿名用户登录,增强安全性。 | 
local_enable | 
YES | 允许本地系统用户通过 FTP 登录。 | 
write_enable | 
YES | 允许用户进行上传、修改等写操作。 | 
chroot_local_user | 
YES | 将用户限制在其主目录内,防止浏览系统文件。 | 
pasv_enable | 
YES | 启用被动模式,以适应防火墙环境。 | 
pasv_min_port | 
30000 | 设置被动模式使用的最小端口。 | 
pasv_max_port | 
31000 | 设置被动模式使用的最大端口。 | 
userlist_enable | 
YES | 启用用户列表功能。 | 
userlist_deny | 
NO | 将用户列表设为“允许”的白名单。 | 
第三步:防火墙与 SELinux 设置
配置文件修改完毕后,还需要调整系统层面的安全策略,包括防火墙和 SELinux。
配置 iptables 防火墙
CentOS 6.5 默认使用 iptables 作为防火墙,我们需要开放 FTP 的控制端口(21)和之前配置的被动模式端口范围。
# 开放 FTP 控制端口 iptables -I INPUT -p tcp --dport 21 -j ACCEPT # 开放被动模式端口范围 iptables -I INPUT -p tcp --dport 30000:31000 -j ACCEPT # 保存规则,以防重启后失效 service iptables save
配置 SELinux SELinux(Security-Enhanced Linux)是 CentOS 的核心安全模块,它可能会阻止 FTP 用户的写入操作,即使文件权限已正确设置,我们需要检查并设置相关的 SELinux 布尔值。

检查当前 FTP 相关的 SELinux 状态:
getsebool -a | grep ftp
allow_ftpd_full_access 为 off,则需执行以下命令开启它,允许 FTP 用户完全访问:
setsebool -P allow_ftpd_full_access on
-P 参数表示永久生效,重启后依然保持。
第四步:启动服务并设置开机自启
所有配置完成后,即可启动 vsftpd 服务,并将其设置为开机自动启动。
# 启动 vsftpd 服务 service vsftpd start # 设置为开机自启 chkconfig vsftpd on
可以使用 service vsftpd status 命令来检查服务是否正在运行。
第五步:创建 FTP 专用用户并测试
为了遵循最小权限原则,建议创建专门用于 FTP 访问的用户,而不直接使用 root 或其他系统管理用户。
# 创建一个名为 ftpuser 的用户,并指定其主目录 useradd -d /home/ftpuser -s /sbin/nologin ftpuser # 为该用户设置密码 passwd ftpuser
此处 -s /sbin/nologin 的目的是禁止该用户通过 SSH 登录 Shell,仅允许用于 FTP 服务,进一步提升了安全性。
您可以使用 FTP 客户端(如 FileZilla、WinSCP 或命令行 ftp 工具)进行连接测试,输入服务器的 IP 地址、用户名 ftpuser 及其密码,成功登录后,您应该能看到 /home/ftpuser 目录下的内容,并可以进行文件的上传和下载操作。
相关问答 FAQs
Q1: 我可以成功登录 FTP,但是列表文件时总是超时或连接失败,是什么原因?
A: 这个问题几乎总是由防火墙或网络设备引起的,当您使用被动模式时,FTP 客户端在通过 21 端口建立控制连接后,会向服务器请求一个随机的高位端口来建立数据连接,如果您的防火墙(包括服务器上的 iptables 和云服务商的安全组)没有开放这个端口范围,数据连接就会失败,导致无法列出目录或传输文件。
解决方法:
- 确认您的 
vsftpd.conf文件中pasv_min_port和pasv_max_port已正确配置。 - 在服务器的 
iptables和任何外部防火墙或安全组中,为 TCP 协议添加一条规则,允许从pasv_min_port到pasv_max_port范围内的所有端口入站。 - 重启 
iptables服务和vsftpd服务,然后重新测试。 
Q2: 我已经登录,并且目录权限看起来是正确的,但为什么无法上传文件或创建新文件夹,提示“Permission denied”? A: 这个问题通常有两个最可能的原因:文件系统权限和 SELinux 策略。 解决方法:
- 检查文件系统权限: 使用 
ls -ld /home/ftpuser命令检查主目录的所有者和权限,确保您登录的 FTP 用户(ftpuser)是该目录的所有者,或者所属组有写权限,如果需要,可以使用chown ftpuser:ftpuser /home/ftpuser和chmod 755 /home/ftpuser来修正,如果您启用了chroot_local_user=YES,请确保主目录本身(/home/ftpuser)对于所有者来说是可写的,或者在主目录下创建一个专门的、可写的上传目录。 - 检查 SELinux 策略: 这是 CentOS 系统上最容易被忽略的问题,即使文件权限正确,SELinux 也可能阻止 
vsftpd进程写入文件,请运行getsebool -a | grep ftp命令,查看allow_ftpd_full_access的状态,如果为off,请执行setsebool -P allow_ftpd_full_access on命令来永久允许 FTP 写入访问,这通常能解决大部分“权限被拒”的问题。