以下是CentOS Stream 9上部署FTP应用服务的两种方法详解,包括操作步骤、注意事项及生产环境应用对比:
一、原生安装 vsftpd 服务
原理:直接通过系统包管理器安装vsftpd,配置系统级服务。
操作步骤:
- 安装与启动
 
bash
sudo dnf install vsftpd -y # 安装vsftpd:cite[4]:cite[9]
sudo systemctl start vsftpd # 启动服务
sudo systemctl enable vsftpd # 设置开机自启:cite[5]
- 核心配置(编辑 /etc/vsftpd/vsftpd.conf)
 
ini
anonymous_enable=NO # 禁用匿名登录:cite[4]:cite[9]
local_enable=YES # 允许本地用户
write_enable=YES # 开放写权限
chroot_local_user=YES # 限制用户在家目录
allow_writeable_chroot=YES # 允许写受限目录:cite[4]
# 被动模式配置(解决防火墙/NAT问题)
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50010
pasv_address=服务器公网IP # 若在NAT后需填写:cite[4]:cite[9]
保存后重启:sudo systemctl restart vsftpd
- 防火墙与SELinux
 
bash
# 防火墙放行端口
sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-port=50000-50010/tcp:cite[4]:cite[9]
sudo firewall-cmd --reload
# SELinux策略(若启用)
sudo setsebool -P ftp_home_dir 1 # 允许FTP访问家目录
sudo semanage port -a -t ftp_port_t -p tcp 50000-50010 # 开放被动端口:cite[4]
- 创建FTP用户
 
bash
sudo useradd -m ftpuser # 创建用户
sudo passwd ftpuser # 设置密码
sudo chmod 750 /home/ftpuser # 限制目录权限:cite[4]:cite[9]
- 测试连接
 
bash
ftp localhost # 本地测试
> put test.txt # 上传文件
> ls # 查看文件
注意事项:
- 目录权限:确保用户目录权限为 750(命令 ls -ld /home/ftpuser 验证)。
 - 被动模式超时:检查 pasv_address 是否为公网IP,防火墙需开放被动端口范围。
 - SELinux干扰:若遇权限问题,可临时 setenforce 0 测试,但生产环境建议配置策略而非禁用。
 - 日志排查:实时监控日志 tail -f /var/log/vsftpd.log 定位错误。
 
二、Docker-Compose 部署 vsftpd
原理:使用容器化技术隔离服务,简化依赖管理和部署。
操作步骤:
- 安装Docker环境
 
bash
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io -y
sudo systemctl start docker && sudo systemctl enable docker:cite[3]
- 安装Docker-Compose
 
bash
sudo curl -L "https://github.com/docker/compose/releases/download/v2.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose:cite[3]:cite[10]
- 编写 docker-compose.yml
 
yaml
version: '3'
services:
vsftpd:
image: fauria/vsftpd # 推荐镜像:cite[2]:cite[3]
container_name: vsftpd
ports:
- "20:20"
- "21:21"
- "21100-21110:21100-21110" # 被动端口范围
volumes:
- ./ftp_data:/home/vsftpd # 宿主机目录映射
environment:
- FTP_USER=admin
- FTP_PASS=admin123
- PASV_ADDRESS=宿主机公网IP # 必须指定:cite[2]:cite[6]
- PASV_MIN_PORT=21100
- PASV_MAX_PORT=21110
restart: always:cite[3]:cite[10]
- 启动服务
 
bash
mkdir ftp_data # 创建数据目录
docker-compose up -d # 后台启动:cite[3]
- 添加多用户
 
bash
docker exec -it vsftpd bash # 进入容器
echo -e "user1\npass1\nuser2\npass2" >> /etc/vsftpd/virtual_users.txt # 追加用户
db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db # 生成数据库
exit
docker restart vsftpd # 重启生效:cite[2]:cite[3]
注意事项:
- 目录映射权限:宿主机目录需开放写权限(例:chmod 777 ftp_data)避免容器写入失败。
 - 被动模式配置:PASV_ADDRESS 必须为宿主机公网IP,否则客户端无法连接数据端口。
 - 端口冲突:确保宿主机20、21及被动端口未被占用。
 - 用户隔离:每个用户需在容器内创建独立目录(例:mkdir /home/vsftpd/user1)。
 
三、两种方法优劣势对比
| 
 维度  | 
 原生安装 vsftpd  | 
 Docker-Compose 部署  | 
| 
 安装复杂度  | 
 需手动配置依赖、防火墙、SELinux  | 
 一键启动,依赖容器化隔离  | 
| 
 隔离性  | 
 直接暴露系统环境,安全性较低  | 
 容器隔离,减少宿主机攻击面  | 
| 
 资源占用  | 
 轻量级,无额外开销  | 
 需占用约100MB内存(容器引擎开销)  | 
| 
 多用户管理  | 
 需系统级用户操作(useradd)  | 
 通过配置文件批量添加,无需系统权限  | 
| 
 升级/迁移  | 
 需备份配置,重新部署  | 
 更新镜像即可,数据卷迁移方便  | 
| 
 适用场景  | 
 长期稳定服务、资源受限环境  | 
 快速部署、测试环境、需多实例隔离的场景  | 
四、实际生产应用建议
- 原生部署适用场景:
 - 对资源敏感(如小型云服务器)。
 - 需深度定制vsftpd参数(如集成系统PAM认证)。
 - 服务需长期运行且变动少。
 - Docker部署适用场景:
 - 快速搭建临时文件共享(如开发测试环境)。
 - 需多版本FTP服务共存(例:不同项目隔离)。
 - 自动化运维场景(结合CI/CD流水线)。
 - 通用安全建议:
 - 禁用匿名登录,使用强密码策略。
 - 限制用户目录(chroot),避免越权访问。
 - 敏感数据传输建议叠加TLS加密(需额外配置SSL证书)。
 
总结:
- 追求稳定与轻量 → 选择原生安装,适合传统服务器环境。
 - 强调灵活与隔离 → 选择Docker部署,适合云原生和快速迭代场景。
生产环境中,若已有容器管理平台(Kubernetes),可进一步将FTP服务编排为Pod,实现高可用和弹性扩展。 
