Debian 13 + vsftpd 搭建FTP服务

📦 第一步:安装 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

相关推荐
leeguoo1 小时前
让 Claude Code / Codex 用上你已登录的 Chrome
前端·chrome·ai编程
天蒙蒙亮1 小时前
打安卓apk包+“应用商城”发布
前端·uni-app
Lank_M1 小时前
视频压到指定大小总超一截?码率控制的误差拆开看
前端
达~熊迪1 小时前
IP 分配前核查:把在线状态和使用登记一起看
服务器·网络·tcp/ip
qq_谁赞成_谁反对1 小时前
甲方IT的成长之路--SG TCP网络优化工具--20261026
运维·服务器·udp·tcp
用户2054555788001 小时前
飞书运费台账同步到 MySQL:单一策略落地教程
前端
LEE2 小时前
别把 Agent 架构画成组织架构图——子代理该不该拆,用任务级 Eval 说话
前端·后端·ai编程
梦醒江南2 小时前
RAG 证据链验收:别只测答案像不像,要证明它从哪里来
前端·agent·ai编程
费曼学习法2 小时前
无人值守AI内容矩阵实战(8):把标题 A/B 实验做成可判胜的流水线
前端