FTP 站点搭建(vsftpd)
安装 vsftpd 搭建 FTP 站点,通过 vsftpd.conf 配置匿名上传(anon_upload_enable)与本地用户访问(local_enable/chroot_local_user),用 ftp 客户端实测上传下载。含 vsftpd.conf 关键项、匿名与本地用户权限、主动/被动模式、时区真实回显等
FTP 站点搭建(vsftpd)
目标:在 Ubuntu 22.04 上安装 vsftpd 搭建 FTP 站点,同时支持匿名用户上传与本地用户(验证用户)登录,并实测文件上传/下载。本文在 Ubuntu 22.04(x86_64)+ vsftpd 实测,记录了匿名与本地用户的权限差异、chroot 与被动模式等关键配置。
环境信息
- 操作系统:Ubuntu 22.04 LTS
- FTP 服务:vsftpd
- 监听端口:21(控制)、20(主动模式数据)
- 匿名目录:
/srv/ftp(anonymous 用户) - 本地用户目录:
/srv/www(local_root) - 测试用户:ftpuser(本地用户)/ anonymous(匿名)
一、安装 vsftpd
sudo apt-get update
sudo apt-get install -y vsftpd
安装后自动创建 ftp 系统用户(uid≈106)与 /srv/ftp 匿名目录:
id ftp
ls -ld /srv/ftp
实测回显:
uid=106(ftp) gid=108(ftp) groups=108(ftp)
drwxr-xr-x 2 root ftp 4096 ... /srv/ftp
二、创建本地 FTP 测试用户
sudo useradd -m -s /bin/bash ftpuser
echo 'ftpuser:yourpass' | sudo chpasswd
三、配置 vsftpd.conf
编辑 /etc/vsftpd.conf。默认文件 anonymous_enable=NO、local_enable=YES,按需开启匿名上传并规划本地用户之地:
sudo vi /etc/vsftpd.conf
追加或修改关键项:
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
# 匿名上传
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_root=/srv/ftp
# 本地用户的根目录与 chroot(禁锢在 home 内)安全
local_root=/srv/www
chroot_local_user=YES
allow_writeable_chroot=YES
# 被动模式端口段
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
各键含义:
| 键 | 作用 |
|---|---|
anonymous_enable | 是否允许匿名登录 |
local_enable | 是否允许本地(系统)用户登录 |
write_enable | 是否允许写入(上传/删除) |
anon_upload_enable | 是否允许匿名上传 |
anon_root | 匿名用户的根目录(chroot 内) |
local_root | 本地用户登录后的根目录 |
chroot_local_user | 是否把本地用户禁锢在自己的 root 内(更安全,但默认禁止在 home 有写权限) |
allow_writeable_chroot | 允许 chroot 目录本身可写(否则会拒绝该目录可写的用户) |
pasv_* | 被动模式数据端口范围(NAT/防火墙环境用) |
⚠️ 目录权限要点:匿名上传需要匿名目录对
ftp用户可写。实测把anon_root下的上传目录设为 777(或 owner=ftp)才能使匿名put成功:sudo mkdir -p /srv/ftp/test sudo chown ftp:ftp /srv/ftp/test # 或 chmod 777 /srv/ftp/test本地用户(local_root)目录则 owner 应为该用户:
sudo chown ftpuser:ftpuser /srv/www。
创建目录并设置权限:
sudo mkdir -p /srv/www /srv/ftp/test
sudo chown ftpuser:ftpuser /srv/www
sudo chown ftp:ftp /srv/ftp/test
四、启动 vsftpd
sudo systemctl restart vsftpd
sudo systemctl enable vsftpd
sudo systemctl status vsftpd --no-pager -l
实测回显(Ubuntu 22.04 直接由 systemd 启动):
● vsftpd.service - vsftpd FTP server
Loaded: loaded (...) ; enabled
Active: active (running) since Tue 2026-09-29 12:56:37 CST ...
Main PID: 6253 (vsftpd)
确认监听:
sudo ss -tlnp | grep vsftpd
回显:
LISTEN 0 32 *:21 *:* users:(("vsftpd",pid=6253,fd=3))
五、测试上传下载
在客户端机器(任意能访问 FTP 的机器)用 ftp 交互,或写命令文件批处理。
本地用户登录并上传
cd /tmp
echo "hello-local" > local.txt
# 批处理脚本
cat > l.cmd <<EOF
open <服务器IP>
user ftpuser yourpass
put local.txt local_up.txt
ls
bye
EOF
ftp -n < l.cmd
服务端核对上传成功(可看到 local_up.txt 出现在 /srv/www,内容一致):
cat /srv/www/local_up.txt
实测回显:
hello-local-1790657842
匿名上传
cd /tmp
echo "hello-anon" > anon.txt
cat > a.cmd <<EOF
open <服务器IP>
user anonymous a@b.com
cd test
put anon.txt anon_up.txt
bye
EOF
ftp -n < a.cmd
⚠️ 匿名
put报Could not create file:几乎都是匿名目录 write 权限不足。把anon_root的上传目录 owner 改为ftp或chmod 777即可(见第三节)。
下载验证
cat > d.cmd <<EOF
open <服务器IP>
user ftpuser yourpass
get local_up.txt ./down_here.txt
bye
EOF
ftp -n < d.cmd
cat down_here.txt # 内容应与上传一致
六、验证清单
| 检查项 | 预期 |
|---|---|
vsftpd --version | 输出版本 |
sudo systemctl status vsftpd | active (running),监听 :21 |
本地用户 put | 上传成功,服务端能看到文件 |
匿名用户 put | 上传成功(目录可写时) |
get | 下载内容与上传一致 |
七、常见问题 / 踩坑
500 OOPS: vsftpd: refusing to run with writable root inside chroot():chroot_local_user=YES且用户 home/chroot 目录可写。解决:加allow_writeable_chroot=YES,或用local_root指向专门目录且不写 home 根。- 匿名上传
Could not create file:anon_root目录对ftp用户不可写,chmod 777或chown ftp:ftp解决。 - 数据连接失败(
425 / timeout,主动模式不通):内网/NAT 环境建议开被动模式,放行pasv_min_port~pasv_max_port并在vsftpd.conf配好pasv_enable=YES。 user ftpuser登录后 dir 为空且无法写:local_root=/srv/www若目录 owner 不是该用户也会失败,用chown <user>:<user> /srv/www。ftp: (to) usage: open host-name:批处理文件里open行大小写/参数错误,写成open <IP>即可。
八、卸载或恢复
sudo systemctl stop vsftpd
sudo apt-get remove --purge -y vsftpd
sudo userdel -r ftpuser # 删除测试用户
提示:若要恢复匿名/本地配置为初始状态,重新安装即恢复到默认
anonymous_enable=NO、local_enable=YES。