本教程将以 Ubuntu/Debian 和 CentOS/RHEL 两大主流 Linux 发行版为例,并重点讲解如何配置用户隔离和 SSL/TLS 加密,以确保安全。

目录
- 第一步:准备工作
- 更新系统
- 获取服务器信息
- 第二步:安装 vsftpd
- Ubuntu/Debian
- CentOS/RHEL
- 第三步:基本配置
- 备份原始配置文件
- 编辑
vsftpd.conf - 核心配置项详解
- 第四步:创建 FTP 用户
- 创建系统用户
- 设置密码
- 设置用户主目录和权限
- 第五步:配置防火墙
- Ubuntu/Debian (使用 UFW)
- CentOS/RHEL (使用 Firewalld)
- 第六步:启动并测试 FTP 服务
- 启动并设置开机自启
- 使用 FTP 客户端测试
- 第七步(可选但推荐):配置 SSL/TLS 加密(安全传输)
- 生成 SSL 证书
- 修改
vsftpd.conf启用加密 - 测试加密连接
- 第八步:常见问题排查
- 连接被拒绝 (530 Login incorrect)
- 连接超时或无法列出目录 (500 OOPS)
- 权限问题 (550 Permission denied)
第一步:准备工作
你需要一台已经安装好 Linux 发行版(如 Ubuntu 20.04+ 或 CentOS 7/8)的服务器,并且拥有 sudo 或 root 权限。
-
登录服务器
ssh your_user@your_server_ip
-
更新系统包管理器 确保所有软件包都是最新的。
-
对于 Ubuntu/Debian:
(图片来源网络,侵删)sudo apt update && sudo apt upgrade -y
-
对于 CentOS/RHEL:
sudo yum update -y
-
-
获取服务器信息 记录下你的服务器 IP 地址,后面会用到。
ip a
第二步:安装 vsftpd
vsftpd 是一个轻量级、高性能且非常安全的 FTP 服务器软件,是 Linux 下的首选。
-
对于 Ubuntu/Debian:
(图片来源网络,侵删)sudo apt install vsftpd -y
-
对于 CentOS/RHEL:
sudo yum install vsftpd -y
安装完成后,vsftpd 服务通常不会自动启动。
第三步:基本配置
这是最关键的一步,我们将配置 vsftpd 以实现安全、独立的用户访问。
-
备份原始配置文件
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
-
编辑配置文件 使用你喜欢的文本编辑器(如
nano或vim)打开配置文件。sudo nano /etc/vsftpd.conf
-
修改核心配置项 将以下配置项取消注释(去掉 )或修改为如下值,我会解释每个选项的作用。
# 禁止匿名登录 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许写入文件 write_enable=YES # 将用户限制在其主目录中(非常重要!) chroot_local_user=YES # 当 chroot_local_user=YES 时,此项允许写入 chroot 目录 # 否则,用户无法上传文件 allow_writeable_chroot=YES # 启用用户列表功能 userlist_enable=YES # 指定用户列表文件,只有在此文件中的用户才能登录 userlist_file=/etc/vsftpd.userlist # 指定用户列表文件中的用户是“允许”还是“禁止” # NO 表示只有在此列表中的用户才被允许登录 userlist_deny=NO # 使用 UTF-8 编码,避免中文文件名乱码 utf8_filesystem=YES # 日志记录 xferlog_enable=YES xferlog_file=/var/log/vsftpd.log dual_log_enable=YES vsftpd_log_file=/var/log/vsftpd.log
-
保存并退出
- 在
nano中,按Ctrl + X,然后按Y,最后按Enter。
- 在
第四步:创建 FTP 用户
我们创建一个专门用于 FTP 访问的用户。
-
创建系统用户 我们将创建一个名为
ftpuser的用户。-m参数会自动为其创建主目录。sudo useradd -m -s /bin/false ftpuser
-m: 创建用户的主目录。-s /bin/false: 禁用该用户的 shell 登录,增强安全性,它只能用于 FTP,无法通过 SSH 登录服务器。
-
为用户设置密码
sudo passwd ftpuser
系统会提示你输入并确认密码。
-
将用户添加到允许列表 根据我们之前的配置,只有
/etc/vsftpd.userlist文件中的用户才能登录。- 创建用户列表文件并添加用户:
echo "ftpuser" | sudo tee -a /etc/vsftpd.userlist
- 检查文件内容:
cat /etc/vsftpd.userlist
你应该能看到
ftpuser这一行。
- 创建用户列表文件并添加用户:
-
设置用户主目录权限(非常重要!) 当
chroot_local_user=YES时,vsftpd会将用户锁定在其主目录,为了让用户能够上传文件,其主目录的权限设置必须遵循一个原则:用户对其主目录必须有执行(x)权限,但其上级目录不能有写入(w)权限,否则chroot会失败。# 设置 ftpuser 主目录的所有者为 ftpuser sudo chown -R ftpuser:ftpuser /home/ftpuser # 设置主目录权限为 755 (rwxr-xr-x) sudo chmod 755 /home/ftpuser
第五步:配置防火墙
为了能从外部访问 FTP 服务器,必须在防火墙上开放端口,FTP 默认使用 21 端口进行控制连接。
-
对于 Ubuntu/Debian (使用 UFW):
# 开放 21 端口 sudo ufw allow 21/tcp # 如果需要开放被动模式的端口范围 (见第七步) # sudo ufw allow 60000:61000/tcp # 重新加载防火墙规则 sudo ufw reload
-
对于 CentOS/RHEL (使用 Firewalld):
# 添加永久规则,开放 21 端口 sudo firewall-cmd --permanent --add-service=ftp # 如果需要开放被动模式的端口范围 # sudo firewall-cmd --permanent --add-port=60000-61000/tcp # 重新加载防火墙以应用新规则 sudo firewall-cmd --reload
第六步:启动并测试 FTP 服务
-
启动 vsftpd 服务并设置开机自启
# 启动服务 sudo systemctl start vsftpd # 设置开机自启 sudo systemctl enable vsftpd
-
检查服务状态
sudo systemctl status vsftpd
你应该看到绿色的
active (running)字样。 -
使用 FTP 客户端测试 在你的本地电脑上,使用 FileZilla、WinSCP 或命令行 FTP 客户端进行连接。
- 主机: 你的服务器 IP 地址
- 用户名:
ftpuser - 密码: 你设置的密码
- 端口:
21
如果连接成功并能看到
/home/ftpuser目录下的文件,说明基本配置已经完成!
第七步(可选但推荐):配置 SSL/TLS 加密
默认的 FTP 传输是明文的,非常不安全,配置 SSL/TLS 可以对数据进行加密,防止信息泄露。
-
生成自签名 SSL 证书 在生产环境中,你应该使用受信任的 CA 签发的证书,这里我们生成一个自签名证书用于测试。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
过程中会要求你填写一些信息,如 Country Name, Common Name 等,可以随意填写,但 Common Name 建议填你的服务器域名或 IP。
-
修改
vsftpd.conf文件 再次打开配置文件,添加或修改以下选项:# 启用 SSL/TLS ssl_enable=YES # 强制所有非匿名用户使用安全连接 force_local_data_ssl=YES force_local_logins_ssl=YES # 指定 SSL 证书文件路径 rsa_cert_file=/etc/vsftpd/vsftpd.pem
-
重启 vsftpd 服务
sudo systemctl restart vsftpd
-
测试加密连接 在你的 FTP 客户端(如 FileZilla)中,连接时需要选择 "Require explicit FTP over TLS" 模式(有时也叫 "FTPES")。
- 主机/用户名/密码/端口 不变。
- 加密: 选择 "Require explicit FTP over TLS"。
如果连接成功,说明你的 FTP 服务器已经可以安全地传输数据了。
第八步:常见问题排查
-
问题:连接被拒绝,提示
530 Login incorrect- 原因1: 用户名或密码错误。
- 原因2: 用户不在
/etc/vsftpd.userlist文件中。 - 原因3: 用户密码为空(虽然我们设置了密码,但可以检查一下)。
- 解决: 检查以上三点。
-
问题:连接超时或无法列出目录,提示
500 OOPS: vsftpd: cannot locate user specified in 'ftp_username': ftpuser或500 OOPS: chroot- 原因: 通常是
chroot配置导致的权限问题,用户主目录或其父目录的权限不正确。 - 解决: 严格按照第四步的权限设置操作,确保
/home/ftpuser目录权限为755,且其父目录(/home)没有777权限。
- 原因: 通常是
-
问题:用户无法上传或创建文件,提示
550 Permission denied- 原因:
write_enable未开启,或者用户对目标目录没有写权限。 - 解决:
- 检查
vsftpd.conf中write_enable=YES是否存在。 - 确保用户对其操作的目录有写权限(
chmod 755 /home/ftpuser/my_upload_folder)。
- 检查
- 原因:
恭喜!至此,你已经成功搭建了一个功能完善且相对安全的 FTP 服务器。
