目录
- 简介: 什么是 vsftpd?
- 第一步:安装 vsftpd
- 第二步:基本配置
- 启动并设置开机自启
- 备份原始配置文件
- 主配置文件
/etc/vsftpd/vsftpd.conf详解
- 第三步:创建 FTP 用户
- 第四步:配置防火墙和 SELinux
- 第五步:测试连接
- 第六步:高级安全配置 (非常重要)
- 限制用户仅能访问其主目录
- 禁止匿名用户访问
- 禁止 root 用户登录
- 启用日志记录
- 常见问题与解决方案
- 530 Login incorrect
- 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
- 553 Could not create file
- 连接被拒绝 (Connection refused)
简介
vsftpd 是 "Very Secure FTP Daemon" 的缩写,它是一个在 Linux 系统上非常流行、稳定且安全的 FTP 服务器软件,它专注于安全性、性能和易用性,是许多系统管理员的首选。

本指南将以 CentOS/RHEL 7/8 和 Ubuntu/Debian 为例进行说明,因为它们的包管理器和防火墙配置略有不同。
第一步:安装 vsftpd
对于 CentOS/RHEL 系统
使用 yum 或 dnf 包管理器进行安装。
# 更新软件包列表 sudo yum update -y # 安装 vsftpd sudo yum install -y vsftpd
对于 Ubuntu/Debian 系统
使用 apt 包管理器进行安装。
# 更新软件包列表 sudo apt update # 安装 vsftpd sudo apt install -y vsftpd
第二步:基本配置
1 启动并设置开机自启
安装完成后,需要启动服务并设置为开机自启。

# 启动 vsftpd 服务 sudo systemctl start vsftpd # 设置开机自启 sudo systemctl enable vsftpd
2 备份原始配置文件
vsftpd 的主配置文件是 /etc/vsftpd/vsftpd.conf,在修改之前,强烈建议先备份原始文件。
# 对于 CentOS/RHEL sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak # 对于 Ubuntu/Debian sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
3 主配置文件 /etc/vsftpd/vsftpd.conf 详解
使用你喜欢的文本编辑器(如 vi, nano)打开配置文件。
sudo vi /etc/vsftpd/vsftpd.conf
下面是几个最核心的配置项及其说明,你可以根据需要取消注释(去掉 )或修改它们。
| 配置项 | 默认值 | 说明 |
|---|---|---|
anonymous_enable=NO |
YES |
是否允许匿名用户登录,为了安全,通常设为 NO。 |
local_enable=YES |
YES |
是否允许本地用户登录,设为 YES 以允许系统用户登录。 |
write_enable=YES |
YES |
是否允许 FTP 命令修改文件,如上传、删除、重命名,设为 YES 以启用写功能。 |
local_umask=022 |
022 |
设置本地用户上传文件后的默认权限掩码。022 意味着上传的文件权限为 755(目录)或 644(文件)。 |
dirmessage_enable=YES |
YES |
如果用户进入一个目录,会显示该目录下 .message 文件的内容。 |
xferlog_enable=YES |
YES |
启用上传/下载日志记录。 |
connect_from_port_20=YES |
YES |
启用 FTP 的数据端口 20,用于主动模式(PORT)。 |
xferlog_std_format=YES |
YES |
使用标准的 FTP 日志格式。 |
listen=YES |
YES |
让 vsftpd 以独立模式监听,而不是由 xinetd 管理。 |
listen_ipv6=NO |
(注释) | 如果你的服务器不使用 IPv6,保持 NO 或注释掉。 |
pam_service_name=vsftpd |
vsftpd |
指定 PAM (Pluggable Authentication Modules) 认证服务的配置文件名。 |
userlist_enable=YES |
YES |
启用用户列表功能。 |
tcp_wrappers=YES |
YES |
使用 TCP Wrappers 进行主机访问控制。 |
一个简单的初始配置示例:

# 禁止匿名用户登录 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许写操作 write_enable=YES # 本地用户上传文件的 umask local_umask=022 # 记录上传下载日志 xferlog_enable=YES connect_from_port_20=YES # 使用标准日志格式 xferlog_std_format=YES # 让 vsftpd 独立运行 listen=YES listen_ipv6=NO # 指定 PAM 认证文件 pam_service_name=vsftpd # 启用用户列表 userlist_enable=YES
修改完成后,保存并退出文件,然后重启 vsftpd 服务使配置生效:
sudo systemctl restart vsftpd
第三步:创建 FTP 用户
为了安全,最好不要使用系统已有的用户(如 root),我们创建一个专门用于 FTP 的用户。
假设我们要创建一个名为 ftpuser 的用户,并将其主目录设置为 /home/ftpuser。
# 创建用户 ftpuser,并设置其主目录 sudo useradd -m -d /home/ftpuser ftpuser # 为该用户设置密码 sudo passwd ftpuser # New password: [输入密码] # Retype new password: [再次输入密码]
ftpuser 就可以通过 FTP 访问其主目录 /home/ftpuser 了。
第四步:配置防火墙和 SELinux
这是最关键的一步,否则即使配置正确,也无法连接。
1 配置防火墙
对于 CentOS/RHEL 7/8 (使用 firewalld):
# 添加永久性的 FTP 服务规则 sudo firewall-cmd --permanent --add-service=ftp # 重新加载防火墙使规则生效 sudo firewall-cmd --reload
对于 Ubuntu/Debian (使用 ufw):
# 允许 FTP 端口 (21 和 20, 以及数据通道范围) sudo ufw allow 20/tcp sudo ufw allow 21/tcp # 或者更简单的方式,直接允许 'ftp' 服务 sudo ufw allow ftp # 重新加载防火墙 sudo ufw reload
2 配置 SELinux (仅限 CentOS/RHEL)
SELinux 是一个强大的安全模块,可能会阻止 vsftpd 的某些操作(如写入文件),你需要为 vsftpd 设置正确的 SELinux 上下文。
# 安装 SELinux 管理工具(如果未安装) sudo yum install -y policycoreutils-python-utils # 为 /home/ftpuser 目录设置正确的 SELinux 上下文 # 这允许 vsftpd 在该目录下读写文件 sudo semanage fcontext -a -t public_content_rw_t "/home/ftpuser(/.*)?" # 应用新设置的 SELinux 上下文 sudo restorecon -Rv /home/ftpuser
第五步:测试连接
你可以使用 FTP 客户端(如 FileZilla, WinSCP)或命令行工具进行测试。
使用命令行 lftp 或 ftp 测试:
# 安装 lftp (如果未安装) # CentOS: sudo yum install -y lftp # Ubuntu: sudo apt install -y lftp # 连接服务器 lftp ftpuser@<你的服务器IP地址>
如果成功,你会看到 lftp ftpuser@<你的服务器IP地址>:~> 提示符,你可以使用 ls 列出文件,put 上传文件,get 下载文件进行测试。
第六步:高级安全配置
为了更高的安全性,建议进行以下配置。
1 限制用户仅能访问其主目录(Chroot Jail)
这是非常重要的安全措施,可以防止 FTP 用户通过 cd 命令访问其主目录之外的文件系统。
在 /etc/vsftpd/vsftpd.conf 中添加或修改以下两行:
# 将所有本地用户限制在其主目录内 chroot_local_user=YES # chroot_local_user=YES,则此项控制是否允许写入 chroot 目录。 # YES 表示允许,NO 表示禁止,如果禁止写入,需要配合其他方法。 allow_writeable_chroot=YES
注意: 在较新的 vsftpd 版本中,chroot_local_user=YES,默认不允许 chroot 目录是可写的,以防止安全漏洞。allow_writeable_chroot=YES 是必要的。
2 禁止匿名用户访问
确保配置文件中有 anonymous_enable=NO。
3 禁止 root 用户登录
出于安全考虑,应该禁止 root 用户通过 FTP 登录。
在 /etc/vsftpd/vsftpd.conf 中添加或取消注释并修改:
# 禁止 root 用户登录 ftpd_banner=Welcome to FTP service.
创建一个用户列表文件 /etc/vsftpd/user_list,将需要禁止的用户(如 root)写入其中,每行一个用户。
echo "root" | sudo tee -a /etc/vsftpd/user_list
并确保 vsftpd.conf 中有 userlist_enable=YES 和 userlist_file=/etc/vsftpd/user_list,如果希望这个列表中的用户禁止登录,还需添加 userlist_deny=YES。
4 启用日志记录
默认情况下,日志是开启的,日志文件通常位于 /var/log/xferlog,确保 xferlog_enable=YES 和 xferlog_file=/var/log/xferlog(如果路径不同)在配置文件中。
常见问题与解决方案
问题 1: 530 Login incorrect
- 原因:
- 用户名或密码错误。
- PAM 认证失败。
- 防火墙阻止了连接。
- SELinux 策略阻止了登录。
- 解决方案:
- 仔细核对用户名和密码。
- 检查
/etc/pam.d/vsftpd文件是否被意外修改。 - 确认防火墙已放行 FTP 端口。
- 在 CentOS/RHEL 上,尝试临时关闭 SELinux 进行测试:
sudo setenforce 0,如果可以登录,说明是 SELinux 问题,请参考第 5.2 节重新配置。
问题 2: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
- 原因: 当
chroot_local_user=YES时,出于安全考虑,vsftpd默认不允许chroot的根目录是可写的,以防止用户通过符号链接逃逸。 - 解决方案: 在
/etc/vsftpd/vsftpd.conf中添加allow_writeable_chroot=YES。
问题 3: 553 Could not create file
- 原因: 用户没有在目标目录的写权限,或者 SELinux 上下文不正确。
- 解决方案:
- 确保用户对目标目录有写权限:
sudo chmod 755 /home/ftpuser。 - 确保用户对文件有写权限:
sudo chown ftpuser:ftpuser /home/ftpuser/somefile。 - 对于 CentOS/RHEL: 检查并修复 SELinux 上下文,如第 5.2 节所示。
- 确保用户对目标目录有写权限:
问题 4: 连接被拒绝 (Connection refused)
- 原因:
vsftpd服务没有运行,或者防火墙/安全组阻止了连接。 - 解决方案:
- 检查服务状态:
sudo systemctl status vsftpd,如果未运行,启动它。 - 检查云服务器的安全组(如阿里云、腾讯云、AWS),确保已开放 20 和 21 端口。
- 再次检查本地防火墙规则,确保
vsftpd服务或端口已被允许。
- 检查服务状态:
至此,你已经拥有一个配置完善且安全的 vsftpd 服务器,你可以根据实际需求,进一步调整配置文件中的其他参数。
