本教程将详细讲解在 CentOS 7/8/9 上安装和配置 vsftpd 的完整步骤,包括匿名用户、本地用户和虚拟用户的配置。

第一步:安装 vsftpd
我们需要通过 yum 包管理器来安装 vsftpd。
# 更新软件包缓存 sudo yum update -y # 安装 vsftpd sudo yum install -y vsftpd
安装完成后,启动 vsftpd 服务并设置为开机自启:
# 启动 vsftpd 服务 sudo systemctl start vsftpd # 设置为开机自启 sudo systemctl enable vsftpd
检查一下服务状态,确保它正在运行:
sudo systemctl status vsftpd
如果看到绿色的 active (running) 字样,说明服务已成功启动。

第二步:配置防火墙和 SELinux
为了能让外部客户端访问 FTP 服务器,我们需要在防火墙中开放 FTP 端口(默认为 21),SELinux(默认启用)也需要进行相应配置。
配置防火墙
# 永久开放 FTP 服务 (这会自动开放 21 端口并处理被动模式的端口范围) sudo firewall-cmd --permanent --add-service=ftp # 重新加载防火墙配置使更改生效 sudo firewall-cmd --reload
配置 SELinux
这是最关键也最容易出错的一步。vsftpd 在 SELinux 下有严格的策略,我们需要为它设置正确的布尔值。
# 检查当前的 SELinux 状态 sestatus # 临时允许 FTP 服务器写入和读取家目录(仅本次重启有效) # 为了测试,可以先运行这个 setsebool -P ftpd_full_access on # 如果希望永久生效,请使用 -P 参数 setsebool -P ftpd_full_access on
注意:
setsebool -P会永久修改 SELinux 策略,在生产环境中,如果出于安全考虑不想完全开放,可以更精细地配置,但对于大多数用户来说,ftpd_full_access是最简单有效的解决方案。
第三步:配置 vsftpd
vsftpd 的主配置文件是 /etc/vsftpd/vsftpd.conf,我们建议先备份原始配置文件,然后创建一个新的配置。

# 备份原始配置文件 sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak # 创建一个新的配置文件 sudo vim /etc/vsftpd/vsftpd.conf
粘贴到 vsftpd.conf 文件中,这个配置文件包含了最常用和最安全的设置,禁止匿名用户登录,只允许本地用户访问。
# 禁止匿名用户登录 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许本地用户对 FTP 服务器文件有写权限 write_enable=YES # 设置本地用户上传文件的 umask 值 local_umask=022 # 允许为目录配置显示信息 dirmessage_enable=YES # 启用上传和下载的日志记录 xferlog_enable=YES xferlog_file=/var/log/xferlog xferlog_std_format=YES # 设定用户登录后所在的目录,默认为用户的家目录 chroot_local_user=YES # chroot_local_user=YES,则此项设为 NO,防止用户被锁定在无写权限的目录中 allow_writeable_chroot=YES # 激活目录列表功能 ls_recurse_enable=YES # 监听 IPv4 套接字 listen=YES # (可选)监听 IPv6 套接字,如果系统支持 IPv4,请注释掉下面这行 # listen_ipv6=YES # PASV 模式设置,解决客户端连接被动模式失败的问题 pasv_enable=YES pasv_min_port=10022 pasv_max_port=10042 # 建议在防火墙中也开放这个端口范围 # sudo firewall-cmd --permanent --add-port=10022-10042/tcp # sudo firewall-cmd --reload # 用户黑名单 # 如果要禁止某些用户登录,将他们的用户名添加到 /etc/vsftpd/ftpusers 文件中 # userlist_enable=YES # userlist_file=/etc/vsftpd/user_list # userlist_deny=YES # YES表示禁止 user_list 中的用户,NO表示只允许 user_list 中的用户
保存并退出文件(在 vim 中是 wq)。
配置完成后,重启 vsftpd 服务使新配置生效:
sudo systemctl restart vsftpd
第四步:创建 FTP 用户并设置权限
我们需要创建一个可以登录 FTP 的本地用户,假设我们要创建一个名为 ftpuser 的用户。
-
创建用户并设置密码
sudo useradd -m -s /sbin/nologin ftpuser # -m: 创建用户的同时创建其家目录 # -s /sbin/nologin: 禁止此用户通过 SSH 或控制台登录系统,提高安全性 sudo passwd ftpuser # 为 ftpuser 设置密码
-
设置用户家目录的权限 为了让
ftpuser能够上传文件,其家目录的权限必须正确设置。# 设置 ftpuser 家目录的所有者为 ftpuser sudo chown -R ftpuser:ftpuser /home/ftpuser # 设置家目录的权限为 755 (所有者可读写执行,组和其他用户可读和执行) sudo chmod -R 755 /home/ftpuser
重要提示:
chroot功能要求用户的主目录不能有写权限(所有者),否则vsftpd会出于安全拒绝登录,这就是为什么我们设置allow_writeable_chroot=YES的原因,它允许用户在chroot环境内有写权限。
第五步:测试 FTP 连接
你可以使用 FTP 客户端(如 FileZilla、WinSCP)或命令行来测试连接了。
连接信息:
- 主机/服务器: 你的 CentOS 服务器 IP 地址
- 用户名:
ftpuser - 密码: 你刚才设置的密码
- 端口: 21
使用命令行测试 (在 Linux/macOS 上):
# 格式: ftp <服务器IP> ftp <你的服务器IP> # 然后输入用户名和密码
使用 FileZilla 测试:
- 打开 FileZilla。
- 在主机栏输入你的服务器 IP。
- 在用户名和密码栏输入
ftpuser和密码。 - 端口保持 21。
- 点击“快速连接”。
如果连接成功,你应该能看到 ftpuser 的家目录 /home/ftpuser 下的文件。
高级配置:创建虚拟用户(更安全)
在生产环境中,直接使用系统本地用户登录 FTP 存在安全风险(密码泄露可能导致整个系统被入侵),创建虚拟用户是更安全、更灵活的方案,虚拟用户映射到一个专用的、非系统用户上。
安装依赖
我们需要 db4 工具来创建用户数据库。
sudo yum install -y db4-utils
创建虚拟用户名和密码文件
创建一个名为 login.txt 的文件,奇数行是用户名,偶数行是对应的密码。
sudo vim /etc/vsftpd/login.txt
示例:
virtual_user1
password1
virtual_user2
password2
生成数据库文件
使用 db_load 命令将文本文件转换为 db 数据库文件。
sudo db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/vsftpd_login.db
设置数据库文件的权限:
sudo chmod 600 /etc/vsftpd/vsftpd_login.db
创建 PAM 文件
PAM (Pluggable Authentication Modules) 用于认证,我们需要创建一个 PAM 配置文件来使用我们的虚拟用户数据库。
sudo vim /etc/pam.d/vsftpd.virtual
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
创建映射的系统用户
这个
