本教程将涵盖从安装到安全配置的完整步骤,包括:

- 安装 vsftpd
- 基本配置
- 创建 FTP 用户
- 配置防火墙
- 连接测试
- 常见问题与安全加固
第一步:安装 vsftpd
更新你的软件包列表,然后安装 vsftpd。
# 更新软件包列表 sudo apt update # 安装 vsftpd sudo apt install vsftpd
安装完成后,vsftpd 服务会自动启动,我们可以检查其状态:
sudo systemctl status vsftpd
如果看到绿色的 active (running) 字样,说明服务已成功启动。
第二步:基本配置
我们需要编辑 vsftpd 的主配置文件 /etc/vsftpd.conf。

sudo nano /etc/vsftpd.conf
在打开的文件中,我们需要修改或取消注释(删除行首的 )以下几项,这是最核心的配置部分:
# 禁止匿名用户登录 anonymous_enable=NO # 允许本地用户登录(我们在下一步会创建专门的用户) local_enable=YES # 允许 FTP 用户执行写操作(上传、创建目录、删除等) write_enable=YES # 启用用户目录的限制,这是关键一步,它会将用户锁定在其主目录下。 chroot_local_user=YES # 允许对被限制在主目录下的用户进行写操作 allow_writeable_chroot=YES # 设置本地用户的 umask 值,控制上传文件的权限 local_umask=022 # 启用目录消息功能,当用户进入目录时显示 .message 文件的内容 dirmessage_enable=YES # 启用上传和下载的日志记录 xferlog_enable=YES xferlog_std_format=YES # 监听 IPv4 地址 listen=YES # (可选)监听 IPv6 地址,如果不需要可以注释掉 # listen_ipv6=YES # 设置 PAM 服务名,用于用户认证 pam_service_name=vsftpd # 设置用户配置文件的目录,可以为不同用户设置不同配置 user_config_dir=/etc/vsftpd_user_conf # 设置被动模式端口范围,这有助于防火墙配置 pasv_min_port=10020 pasv_max_port=10220
配置说明:
anonymous_enable=NO:出于安全考虑,我们禁止匿名访问。local_enable=YES:允许系统用户登录。write_enable=YES:允许用户有写入权限。chroot_local_user=YES:非常重要,这会将用户“囚禁”在其自己的主目录下,防止他们访问服务器上其他目录,这是 FTP 安全的基本要求。allow_writeable_chroot=YES:配合chroot_local_user使用,允许被限制的用户在目录内进行写操作(在较新的 vsftpd 版本中需要此选项)。pasv_min_port和pasv_max_port:我们为被动模式(推荐使用)定义了一个端口范围,后续配置防火墙时需要开放这个范围内的端口。
保存并退出文件:
在 nano 编辑器中,按 Ctrl + X,然后按 Y,最后按 Enter。
配置完成后,重启 vsftpd 服务使配置生效:

sudo systemctl restart vsftpd
第三步:创建 FTP 用户
为了安全,强烈建议不要使用系统已有的 root 或其他管理用户,我们应该为 FTP 服务创建一个专用的用户。
这里我们创建一个名为 ftpuser 的用户,并为其设置一个强密码。
# 创建新用户 sudo adduser ftpuser # 系统会提示你设置密码和用户信息,一路回车或填写即可
这个用户会自动拥有一个主目录,通常位于 /home/ftpuser,这就是该用户登录 FTP 后能看到的根目录。
第四步:配置防火墙
Ubuntu 默认使用 ufw (Uncomplicated Firewall) 防火墙,我们需要开放 FTP 服务的端口以及我们为被动模式设置的端口范围。
FTP 协议比较特殊,它需要两个端口:
- 命令端口:默认为
21,这是客户端连接服务器时使用的端口。 - 数据端口:用于传输文件,在被动模式下,这个端口是动态的,所以我们之前定义了一个范围
10020-10220。
# 开放 21 端口 sudo ufw allow 21/tcp # 开放被动模式的端口范围 sudo ufw allow 10020:10220/tcp # (可选)如果你希望从同一局域网的其他电脑访问,可以允许端口转发 # sudo ufw allow from 192.168.1.0/24 to any port 21 proto tcp # sudo ufw allow from 192.168.1.0/24 to any port 10020:10220 proto tcp # 重新加载防火墙规则使其生效 sudo ufw reload
第五步:连接测试
你的 FTP 服务器已经准备就绪,你可以使用任何 FTP 客户端软件来连接,
- Windows: FileZilla, WinSCP
- macOS: FileZilla, Cyberduck
- Linux: FileZilla,
lftp命令行工具
这里以 FileZilla 为例:
- 打开 FileZilla。
- 在顶部菜单栏填写以下信息:
- 主机: 你的服务器 IP 地址 (
168.1.100或your_domain.com)。 - 用户名:
ftpuser(你刚才创建的用户名)。 - 密码: 你为
ftpuser设置的密码。 - 端口:
21
- 主机: 你的服务器 IP 地址 (
- 点击“快速连接”。
如果一切正常,你应该能够成功连接,并且只能看到 /home/ftpuser 目录下的文件和文件夹,你可以尝试上传、下载、创建和删除文件来测试权限。
第六步:常见问题与安全加固
问题:连接被拒绝或超时
这通常是由于 被动模式 和 防火墙 的配置问题。
- 确认防火墙:确保你已经开放了
21和10020-10220端口。 - 客户端设置:在 FileZilla 中,确保被动模式是开启的,进入
编辑 -> 设置 -> 连接 -> FTP,勾选“被动模式”。
问题:用户被 chroot 但无法写入 (550 Failed to open file)
错误信息可能类似于 OOPS: vsftpd: refusing to run with writable root inside chroot()。
这是因为在新版本的 vsftpd 中,出于安全考虑,不允许被 chroot 的用户拥有一个可写的根目录。
有两种解决方案:
-
方案A (推荐):不要让用户的根目录 (
/home/ftpuser) 可写,而是创建一个子目录(如ftp或files)用于上传,这样既安全又符合逻辑。# 登录为 ftpuser su - ftpuser # 在其主目录下创建一个用于上传的文件夹 mkdir files chmod 755 files exit
ftpuser登录后,应该进入/home/ftpuser,并有一个files文件夹可以写入。 -
方案B (不推荐):在
/etc/vsftpd.conf中添加一行,强制允许可写chroot,这会降低安全性。allow_writeable_chroot=YES
如果你之前已经添加了这一行,请确保它存在,如果仍有问题,请检查文件夹权限。
安全加固建议
-
使用 SFTP (SSH File Transfer Protocol):强烈建议,SFTP 使用 SSH 协议进行文件传输,默认端口是
22,并且所有数据都是加密的,比 FTP 安全得多,在 Ubuntu 上,你已经有 SSH 服务器,可以直接使用 SFTP,无需额外安装,大多数 FTP 客户端(如 FileZilla)都支持 SFTP。 -
限制用户访问:如果你只想让用户访问特定目录,而不是他们的主目录,可以使用符号链接。
# 假设你想让 ftpuser 访问 /var/www/html # 先创建链接 sudo ln -s /var/www/html /home/ftpuser/www # 然后修改所有者和组 sudo chown -h ftpuser:ftpuser /home/ftpuser/www
-
禁用 root 登录:确保
vsftpd.conf中的anonymous_enable=NO和local_enable=YES只用于你创建的普通用户,不要给 root 用户 FTP 权限。
至此,你已经成功在 Ubuntu 上搭建并配置好了一个功能完善且相对安全的 FTP 服务器。
