vsftpd 核心概念
vsftpd(Very Secure FTP Daemon) 是 Linux 上最常用的 FTP 服务端,以:
- 🔒 安全性高
- ⚡ 性能好
- ☘️ 架构简单、可控
- 🐧 默认内置于多数发行版
著称,广泛用于:
- 文件上传 / 下载
- 软件仓库
- 内网文件分发
- 运维自动化(已逐步被 SFTP 取代)
FTP 不是单连接协议,而是:
| 连接类型 | 端口 | 作用 |
|---|---|---|
| 控制连接 | TCP 21 | 发送命令(USER / PASS / LIST 等) |
| 数据连接 | 随机端口 | 实际传输文件数据 |
👉 控制连接始终存在,数据连接按需建立
客户端随机端口 -> 服务端 21
服务端 20 -> 客户端随机端口
❌ 问题:
- 客户端在 NAT / 防火墙后面几乎不可用
客户端 -> 服务端 21
客户端 -> 服务端 随机端口
✅ 优点:
- 防火墙友好
- 云环境 / NAT 必须使用
👉 vsftpd 默认推荐 PASV
vsftpd 的设计目标:
- 每个用户 尽量运行在独立、受限环境
- 严格区分:
- 未认证用户
- 已认证本地用户
- 虚拟用户
vsftpd 使用 多进程模型(非多线程):
主进程
├── 接收连接
├── fork 子进程
├── 认证用户
├── 降权
└── 处理会话
优点:
- 一个会话崩溃 ≠ 整个服务崩溃
- 权限隔离清晰
- 更安全
- 用户名:anonymous / ftp
- 不需要系统账号
- 典型场景:
- 公共下载站
- 镜像仓库
anonymous_enable=YES
anon_root=/data/ftp
⚠️ 安全风险高,生产一般关闭
- Linux 系统用户(/etc/passwd)
- 使用系统账号登录
local_enable=YES
write_enable=YES
📌 特点:
- 权限受系统控制
- 默认可 chroot
- vsftpd 自己维护
- 不是真实系统用户
- 常见做法:
- PAM + db 文件
- 映射到一个系统用户
👉 企业生产最常用
优点:
- 不污染系统账号
- 权限高度可控
- 批量管理方便
把用户 限制在某个目录内,无法访问系统其它路径:
用户看到的 / -> 实际是 /data/ftp/user1
chroot_local_user=YES
或
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
安全原因:
- 用户如果能写自己所在的 chroot 目录,
- 可能通过漏洞逃逸。
解决方案(慎用):
allow_writeable_chroot=YES
vsftpd 不绕过 Linux 权限模型:
- 文件属主 / 属组
- r / w / x
- umask
local_umask=022
| 配置 | 作用 |
|---|---|
| write_enable=YES | 是否允许写操作 |
| anon_upload_enable | 匿名用户上传 |
| anon_delete_enable | 匿名删除 |
👉 vsftpd 允许 ≠ 文件系统允许
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
pasv_address=公网IP
📌 原理:
- 服务端从端口池中选一个
- 告诉客户端连接哪个端口
👉 云服务器 / NAT / K8S 环境 必须配置
xferlog_enable=YES
xferlog_std_format=YES
常见路径:
/var/log/vsftpd.log
/var/log/xferlog
- 登录用户
- 上传 / 下载
- 文件名
- IP
- 时间
👉 安全审计 & 问题排查核心依据
| 对比项 | vsftpd (FTP) | SFTP |
|---|---|---|
| 端口 | 21 + 多端口 | 22 |
| 加密 | 需 FTPS | 原生加密 |
| 防火墙 | 复杂 | 简单 |
| 推荐场景 | 内网 / 兼容系统 | 现代生产环境 |
📌 现代生产优先 SFTP,但 vsftpd 仍大量存在
vsftpd 是一个以“安全隔离”为核心设计思想的 FTP 服务,通过多进程、chroot、PAM、严格权限模型,实现高性能、可控的文件传输服务。