在Linux系统中搭建FTP服务器是常见的需求,vsftpd(Very Secure FTP Daemon)是当前最流行、最安全的FTP服务器软件之一,适用于大多数Linux发行版,以下将详细介绍基于vsftpd的FTP服务器搭建、配置及使用流程。

准备工作
- 系统环境:以CentOS 7/Ubuntu 20.04为例,确保系统已更新,并具备root权限(或使用sudo提权)。
- 关闭防火墙(临时):若防火墙开启,需先放行FTP相关端口(21命令端口、20数据端口,以及被动模式下的随机端口),或暂时关闭防火墙测试:
- CentOS 7:
systemctl stop firewalld - Ubuntu 20.04:
ufw disable
- CentOS 7:
- SELinux配置(CentOS):若SELinux为 enforcing 模式,需执行:
setsebool -P ftpd_full_access on,避免权限问题。
安装vsftpd
不同发行版的安装命令不同:
- CentOS/RHEL:
yum install vsftpd -y # CentOS 7及以下 dnf install vsftpd -y # CentOS 8及以上
- Ubuntu/Debian:
apt update && apt install vsftpd -y
安装完成后,启动vsftpd服务并设置开机自启:
systemctl start vsftpd systemctl enable vsftpd
配置vsftpd
vsftpd的主配置文件为/etc/vsftpd/vsftpd.conf,可通过备份原文件后修改:

cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak vim /etc/vsftpd/vsftpd.conf
关键配置项说明(可通过表格整理):
| 配置项 | 作用说明 | 推荐值 |
|---|---|---|
| anonymous_enable | 是否允许匿名用户登录 | NO(默认NO) |
| local_enable | 是否允许本地用户登录 | YES |
| write_enable | 是否允许本地用户上传文件 | YES |
| chroot_local_user | 是否将本地用户限制在其主目录下(防止越权访问) | YES |
| allow_writeable_chroot | 当chroot_local_user=YES时,是否允许用户在主目录内写入(需配合write_enable) | YES |
| pasv_enable | 是否启用被动模式(解决客户端因防火墙无法连接数据端口的问题) | YES |
| pasv_min_port | 被动模式最小端口 | 10000 |
| pasv_max_port | 被动模式最大端口 | 10100 |
| userlist_enable | 是否启用用户列表文件(/etc/vsftpd/user_list) | YES |
| userlist_file | 用户列表文件路径 | /etc/vsftpd/user_list |
| userlist_deny | 是否拒绝user_list中的用户登录(YES=拒绝,NO=仅允许列表内用户) | YES |
核心配置示例:
# 禁止匿名用户,允许本地用户登录 anonymous_enable=NO local_enable=YES write_enable=YES # 限制用户主目录,防止越权 chroot_local_user=YES allow_writeable_chroot=YES # 启用被动模式,指定端口范围 pasv_enable=YES pasv_min_port=10000 pasv_max_port=10100 # 启用用户列表,拒绝非列表用户 userlist_enable=YES userlist_file=/etc/vsftpd/user_list userlist_deny=YES
创建FTP用户及目录
- 创建系统用户(推荐使用非登录用户,禁止SSH登录):
useradd -s /sbin/nologin -d /home/ftpuser ftpuser # 创建用户ftpuser,主目录为/home/ftpuser
- 设置用户密码:
passwd ftpuser
- 设置用户目录权限:
chown -R ftpuser:ftpuser /home/ftpuser # 设置目录所有者为ftpuser chmod -R 755 /home/ftpuser # 设置目录权限(755确保用户可读写)
- 将用户加入user_list(若配置了userlist_deny=YES,需将允许登录的用户加入列表):
echo "ftpuser" >> /etc/vsftpd/user_list
重启服务并测试
- 重启vsftpd服务:
systemctl restart vsftpd
- 测试连接:
- 命令行测试(本地或远程客户端):
ftp 127.0.0.1 # 或FTP服务器IP Name: ftpuser # 输入用户名 Password: # 输入密码 登录后可执行ls、get、put等命令测试上传下载
- 图形化工具测试:使用FileZilla,输入服务器IP、用户名、密码,端口选择21(主动模式)或自动检测(被动模式)。
- 命令行测试(本地或远程客户端):
常见问题排查
-
无法连接,提示“Connection refused”:
- 检查vsftpd服务是否启动:
systemctl status vsftpd - 检查防火墙是否放行端口:CentOS执行
firewall-cmd --add-port=21/tcp --permanent && firewall-cmd --add-port=10000-10100/tcp --permanent,然后firewall-cmd --reload;Ubuntu执行ufw allow 21/tcp && ufw allow 10000:10100/tcp。
- 检查vsftpd服务是否启动:
-
用户登录后无法上传文件,提示“553 Could not create file”:
- 检查用户目录权限:
ls -ld /home/ftpuser,需为755(所有者可读写执行,其他用户可读执行); - 检查
write_enable是否设置为YES,allow_writeable_chroot是否为YES。
- 检查用户目录权限:
相关问答FAQs
Q1:如何限制FTP用户只能访问自己的主目录,且无法切换到其他目录?
A:通过配置chroot_local_user=YES可将用户限制在主目录下,但需确保主目录权限正确(755),若需更精细控制(如仅允许特定用户),可创建chroot_list_file(如/etc/vsftpd/chroot_list),添加用户名后设置chroot_list_enable=YES和chroot_list_file=/etc/vsftpd/chroot_list,此时列表内用户将被限制在主目录,其他用户不受限(需配合userlist_deny=NO仅允许列表内用户登录)。

Q2:FTP连接时提示“530 Login incorrect”,但用户名和密码正确,如何解决?
A:通常由以下原因导致:
- 用户被
/etc/vsftpd/ftpusers(默认拒绝登录的用户列表)或/etc/vsftpd/user_list(若userlist_deny=YES)拦截,检查文件是否包含该用户名,若有则删除; - SELinux限制:执行
getsebool -a | grep ftpd,确认ftpd_full_access为off,则执行setsebool -P ftpd_full_access on; - 密码错误或用户不存在,确认
/etc/shadow中用户密码正确,且/etc/passwd中用户shell未被禁用(如/sbin/nologin仅禁止SSH登录,不影响FTP)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/25881.html