CentOS Stream 9上部署FTP应用服务的两种方法(传统安装和docker-compose)

以下是CentOS Stream 9上部署FTP应用服务的两种方法详解,包括操作步骤、注意事项及生产环境应用对比:


一、原生安装 vsftpd 服务

原理:直接通过系统包管理器安装vsftpd,配置系统级服务。

操作步骤:

  1. 安装与启动

bash

sudo dnf install vsftpd -y # 安装vsftpd:cite[4]:cite[9]

sudo systemctl start vsftpd # 启动服务

sudo systemctl enable vsftpd # 设置开机自启:cite[5]

  1. 核心配置 (编辑 /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

  1. 防火墙与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]

  1. 创建FTP用户

bash

sudo useradd -m ftpuser # 创建用户

sudo passwd ftpuser # 设置密码

sudo chmod 750 /home/ftpuser # 限制目录权限:cite[4]:cite[9]

  1. 测试连接

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

原理:使用容器化技术隔离服务,简化依赖管理和部署。

操作步骤:

  1. 安装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]

  1. 安装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]

  1. 编写 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]

  1. 启动服务

bash

mkdir ftp_data # 创建数据目录

docker-compose up -d # 后台启动:cite[3]

  1. 添加多用户

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 通过配置文件批量添加,无需系统权限
升级/迁移 需备份配置,重新部署 更新镜像即可,数据卷迁移方便
适用场景 长期稳定服务、资源受限环境 快速部署、测试环境、需多实例隔离的场景

四、实际生产应用建议

  1. 原生部署适用场景
    • 对资源敏感(如小型云服务器)。
    • 需深度定制vsftpd参数(如集成系统PAM认证)。
    • 服务需长期运行且变动少。
  2. Docker部署适用场景
    • 快速搭建临时文件共享(如开发测试环境)。
    • 需多版本FTP服务共存(例:不同项目隔离)。
    • 自动化运维场景(结合CI/CD流水线)。
  3. 通用安全建议
    • 禁用匿名登录,使用强密码策略。
    • 限制用户目录(chroot),避免越权访问。
    • 敏感数据传输建议叠加TLS加密(需额外配置SSL证书)。

总结

  • 追求稳定与轻量 → 选择原生安装,适合传统服务器环境。
  • 强调灵活与隔离 → 选择Docker部署,适合云原生和快速迭代场景。
    生产环境中,若已有容器管理平台(Kubernetes),可进一步将FTP服务编排为Pod,实现高可用和弹性扩展。
相关推荐
m0_747266093 小时前
代码审计与web安全选择题1
网络安全
java叶新东老师4 小时前
git stash 命令详解
linux·运维·flink
写bug的羊羊5 小时前
CentOS 9 配置国内 YUM 源
linux·运维·centos
AKAMAI6 小时前
利用DataStream和TrafficPeak实现大数据可观察性
人工智能·云原生·云计算
编程到天明7 小时前
CTF-Web题解:“require_once(‘flag.php‘); &assert(“$i == $u“);”
网络安全·php
MetaverseMan8 小时前
GitHub Actions打包容器,推送 AWS ECR 并使 EKS 自动拉取以完成发版部署
云计算·aws
鼠鼠我捏,要死了捏8 小时前
多租户Kubernetes集群架构设计实践——隔离、安全与弹性扩缩容
kubernetes·architecture·multi-tenancy
守望时空338 小时前
RustDesk搭建指南
linux
C++ 老炮儿的技术栈8 小时前
在 Scintilla 中为 Squirrel 语言设置语法解析器的方法
linux·运维·c++·git·ubuntu·github·visual studio