📦 第一步:安装 vsftpd
sudo apt update
sudo apt install vsftpd -y
👤 第二步:创建 FTP 专用用户
sudo adduser admin
sudo usermod -s /usr/sbin/nologin admin # 禁止 SSH 登录,仅用于 FTP
⚙️ 第三步:编辑 /etc/vsftpd.conf
先备份,再修改。以下是经过验证、能正常启动 的关键配置项:
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
sudo nano /etc/vsftpd.conf
需要确保的配置:
listen=YES
listen_ipv6=NO # ⚠️ 必须关掉!与 listen=YES 互斥,同时开启会报 status=2 启动失败
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES # ⚠️ 必须加!否则用户主目录可写时登录报 500 OOPS
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
xferlog_enable=YES
🔐 第四步:解决 PAM 对 nologin 的拦截
这是登录失败最常见的原因。admin 的 shell 是 /usr/sbin/nologin,PAM 的 pam_shells.so 会拒绝它。
echo "/usr/sbin/nologin" | sudo tee -a /etc/shells
这样做的效果:FTP 认证通过,但 SSH 登录仍然被
nologin阻止,安全隔离不破。
🏠 第五步:让 admin 登录后直接看到 /mnt/Data
默认 chroot 会把用户锁在 /home/admin,看到的是空目录。把主目录改过去即可:
sudo chown -R admin:admin /mnt/Data
sudo chmod 755 /mnt/Data
sudo usermod -d /mnt/Data admin
前提是第三步已经加了
allow_writeable_chroot=YES,否则/mnt/Data可写会导致 chroot 登录被拒。
🔒 第六步:防火墙放行(如启用 UFW)
sudo ufw allow 20,21/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw reload
🚀 第七步:启动并验证
sudo systemctl restart vsftpd
sudo systemctl enable vsftpd
systemctl status vsftpd --no-pager # 应为 active (running)
ss -tlnp | grep ':21'
🧪 第八步:本地测试
ftp 127.0.0.1
# Name: admin
# Password: (admin 密码)
pwd # 应显示 /mnt/Data
ls -la # 应看到 /mnt/Data 内容
put /etc/hostname test.txt
get test.txt /tmp/test_download.txt
bye
验证文件落地:
ls -l /mnt/Data/test.txt
cat /tmp/test_download.txt
🧯 排错速查表
| 现象 | 原因 | 解决 |
|---|---|---|
服务启动失败 status=2/INVALIDARGUMENT |
listen 与 listen_ipv6 同时为 YES |
listen_ipv6=NO |
登录报 500 OOPS: refusing to run with writable root inside chroot |
主目录可写但未允许 | 加 allow_writeable_chroot=YES |
530 Login incorrect,日志有 pam_shells 拒绝 |
shell 是 nologin 不在 /etc/shells |
把 /usr/sbin/nologin 加入 /etc/shells |
| 登录成功但目录为空 | chroot 锁在 /home/admin |
usermod -d /mnt/Data admin |
日志 Refused user root |
root 在 /etc/ftpusers 黑名单 |
正常安全行为,用 admin 登录即可 |
能登录但 ls 报权限错误 |
AppArmor 拦截 /mnt |
sudo aa-complain /usr/sbin/vsftpd 测试,或改 profile 加 /mnt/Data/** rwk, |
✅ 最终达成的状态
-
admin通过 FTP 登录后,根目录就是/mnt/Data,可直接上传/下载 -
admin无法通过 SSH 登录(nologin生效) -
root无法通过 FTP 登录(/etc/ftpusers拦截) -
明文 FTP 已可用;如需加密,另加
ssl_enable=YES+ 自签名证书配置 FTPS