FTP 站点搭建(vsftpd)

安装 vsftpd 搭建 FTP 站点,通过 vsftpd.conf 配置匿名上传(anon_upload_enable)与本地用户访问(local_enable/chroot_local_user),用 ftp 客户端实测上传下载。含 vsftpd.conf 关键项、匿名与本地用户权限、主动/被动模式、时区真实回显等

文件共享FTP文件共享2026/09/29

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 vsftpdactive (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。