一、安装 vsftpd
在 CentOS 7 系统上,使用 yum 包管理器安装 vsftpd。
yum -y install vsftpd
二、创建 FTP 用户及目录
vsftpd 默认会创建一个名为 ftp 的系统用户。但为了安全和管理方便,建议为每个 FTP 服务创建独立的专用用户。
1. 创建专用用户
以下命令创建一个名为 ftpuser 的用户,其主目录为 /var/ftp/pub,并禁止其登录系统 shell。
adduser -d /var/ftp/pub -g ftp -s /sbin/nologin ftpuser
2. 为用户设置密码
passwd ftpuser
3. 配置用户访问列表
编辑用户列表文件,将新建的用户名加入允许访问的列表(具体行为取决于 vsftpd.conf 中的 userlist_deny 设置)。
vi /etc/vsftpd/user_list
在文件末尾添加用户名 ftpuser。
4. 配置用户根目录锁定(Chroot)
编辑 chroot 列表文件,指定哪些用户将被锁定在其主目录内。
vi /etc/vsftpd/chroot_list
在文件中添加用户名 ftpuser。
三、修改 vsftpd 主配置文件
主配置文件为 /etc/vsftpd/vsftpd.conf。关键配置项说明:
anonymous_enable=NO:禁止匿名登录。local_enable=YES:允许本地用户登录。write_enable=YES:允许写入操作。local_umask=022:设置本地用户创建文件的默认权限掩码。chroot_local_user=YES:将所有本地用户限制在其主目录内。chroot_list_enable=YES:启用 chroot 用户列表。chroot_list_file=/etc/vsftpd/chroot_list:指定 chroot 列表文件路径。userlist_enable=YES:启用用户列表功能。userlist_file=/etc/vsftpd/user_list:指定用户列表文件路径。userlist_deny=NO:仅允许user_list文件中的用户登录(白名单模式)。
修改后保存文件。
四、修正 PAM 认证配置(解决 530 Login incorrect 错误)
编辑 PAM 配置文件 /etc/pam.d/vsftpd,注释掉或修改可能导致认证失败的模块。一个常见的安全配置如下:
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
# 注释掉 pam_shells.so,允许使用 /sbin/nologin 等 shell 的用户登录
#auth required pam_shells.so
auth required pam_nologin.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
关键是将 auth required pam_shells.so 一行注释掉,否则使用 /sbin/nologin shell 的用户将无法通过认证。
五、解决 500 OOPS: vsftpd: refusing to run with writable root inside chroot() 错误
从 vsftpd 2.3.5 开始,出于安全考虑,被 chroot 的用户主目录不能有写权限。有两种解决方法:
方法一:移除用户主目录的写权限(推荐)
为用户创建一个子目录(如 upload)用于上传,并确保主目录本身不可写。
mkdir /var/ftp/pub/upload
chown ftpuser:ftp /var/ftp/pub/upload
chmod a-w /var/ftp/pub
方法二:允许可写的 chroot 目录(降低安全性)
在 /etc/vsftpd/vsftpd.conf 中添加以下配置:
allow_writeable_chroot=YES
注意: 方法二会降低安全性,仅在特定场景下使用。
六、解决 553 Could not create file 错误
此错误通常是由于目标目录的权限问题导致用户无法写入。请确保 FTP 用户对其上传目录拥有写权限。
chown -R ftpuser:ftp /var/ftp/pub/upload
chmod -R 755 /var/ftp/pub/upload
七、CentOS 7 下 vsftpd 服务管理命令
- 启动服务:
systemctl start vsftpd - 停止服务:
systemctl stop vsftpd - 重启服务:
systemctl restart vsftpd - 查看状态:
systemctl status vsftpd - 设置开机自启:
systemctl enable vsftpd
八、防火墙与 SELinux 配置
1. 防火墙
如果系统防火墙(firewalld)开启,需要放行 FTP 服务(端口 21)以及被动模式可能用到的端口范围。
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload
2. SELinux
如果 SELinux 处于 enforcing 模式,需要调整布尔值以允许 FTP 访问用户主目录。
setsebool -P ftp_home_dir on
如果使用非标准目录,可能需要额外设置文件上下文标签。
九、FTP 客户端连接与测试
使用 FTP 客户端(如 FileZilla)或命令行工具 ftp 进行连接测试。确保使用正确的用户名、密码和服务器地址。
提示: 现代网络环境中,建议考虑使用更安全的 SFTP(基于 SSH)或 FTPS(FTP over SSL/TLS)替代传统的明文 FTP 协议。