凌峰创科服务平台

linux vsftp服务器配置

目录

  1. 简介: 什么是 vsftpd?
  2. 第一步:安装 vsftpd
  3. 第二步:基本配置
    • 启动并设置开机自启
    • 备份原始配置文件
    • 主配置文件 /etc/vsftpd/vsftpd.conf 详解
  4. 第三步:创建 FTP 用户
  5. 第四步:配置防火墙和 SELinux
  6. 第五步:测试连接
  7. 第六步:高级安全配置 (非常重要)
    • 限制用户仅能访问其主目录
    • 禁止匿名用户访问
    • 禁止 root 用户登录
    • 启用日志记录
  8. 常见问题与解决方案
    • 530 Login incorrect
    • 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
    • 553 Could not create file
    • 连接被拒绝 (Connection refused)

简介

vsftpd 是 "Very Secure FTP Daemon" 的缩写,它是一个在 Linux 系统上非常流行、稳定且安全的 FTP 服务器软件,它专注于安全性、性能和易用性,是许多系统管理员的首选。

linux vsftp服务器配置-图1
(图片来源网络,侵删)

本指南将以 CentOS/RHEL 7/8Ubuntu/Debian 为例进行说明,因为它们的包管理器和防火墙配置略有不同。


第一步:安装 vsftpd

对于 CentOS/RHEL 系统

使用 yumdnf 包管理器进行安装。

# 更新软件包列表
sudo yum update -y
# 安装 vsftpd
sudo yum install -y vsftpd

对于 Ubuntu/Debian 系统

使用 apt 包管理器进行安装。

# 更新软件包列表
sudo apt update
# 安装 vsftpd
sudo apt install -y vsftpd

第二步:基本配置

1 启动并设置开机自启

安装完成后,需要启动服务并设置为开机自启。

linux vsftp服务器配置-图2
(图片来源网络,侵删)
# 启动 vsftpd 服务
sudo systemctl start vsftpd
# 设置开机自启
sudo systemctl enable vsftpd

2 备份原始配置文件

vsftpd 的主配置文件是 /etc/vsftpd/vsftpd.conf,在修改之前,强烈建议先备份原始文件。

# 对于 CentOS/RHEL
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
# 对于 Ubuntu/Debian
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

3 主配置文件 /etc/vsftpd/vsftpd.conf 详解

使用你喜欢的文本编辑器(如 vi, nano)打开配置文件。

sudo vi /etc/vsftpd/vsftpd.conf

下面是几个最核心的配置项及其说明,你可以根据需要取消注释(去掉 )或修改它们。

配置项 默认值 说明
anonymous_enable=NO YES 是否允许匿名用户登录,为了安全,通常设为 NO
local_enable=YES YES 是否允许本地用户登录,设为 YES 以允许系统用户登录。
write_enable=YES YES 是否允许 FTP 命令修改文件,如上传、删除、重命名,设为 YES 以启用写功能。
local_umask=022 022 设置本地用户上传文件后的默认权限掩码。022 意味着上传的文件权限为 755(目录)或 644(文件)。
dirmessage_enable=YES YES 如果用户进入一个目录,会显示该目录下 .message 文件的内容。
xferlog_enable=YES YES 启用上传/下载日志记录。
connect_from_port_20=YES YES 启用 FTP 的数据端口 20,用于主动模式(PORT)。
xferlog_std_format=YES YES 使用标准的 FTP 日志格式。
listen=YES YES vsftpd 以独立模式监听,而不是由 xinetd 管理。
listen_ipv6=NO (注释) 如果你的服务器不使用 IPv6,保持 NO 或注释掉。
pam_service_name=vsftpd vsftpd 指定 PAM (Pluggable Authentication Modules) 认证服务的配置文件名。
userlist_enable=YES YES 启用用户列表功能。
tcp_wrappers=YES YES 使用 TCP Wrappers 进行主机访问控制。

一个简单的初始配置示例:

linux vsftp服务器配置-图3
(图片来源网络,侵删)
# 禁止匿名用户登录
anonymous_enable=NO
# 允许本地用户登录
local_enable=YES
# 允许写操作
write_enable=YES
# 本地用户上传文件的 umask
local_umask=022
# 记录上传下载日志
xferlog_enable=YES
connect_from_port_20=YES
# 使用标准日志格式
xferlog_std_format=YES
# 让 vsftpd 独立运行
listen=YES
listen_ipv6=NO
# 指定 PAM 认证文件
pam_service_name=vsftpd
# 启用用户列表
userlist_enable=YES

修改完成后,保存并退出文件,然后重启 vsftpd 服务使配置生效:

sudo systemctl restart vsftpd

第三步:创建 FTP 用户

为了安全,最好不要使用系统已有的用户(如 root),我们创建一个专门用于 FTP 的用户。

假设我们要创建一个名为 ftpuser 的用户,并将其主目录设置为 /home/ftpuser

# 创建用户 ftpuser,并设置其主目录
sudo useradd -m -d /home/ftpuser ftpuser
# 为该用户设置密码
sudo passwd ftpuser
# New password: [输入密码]
# Retype new password: [再次输入密码]

ftpuser 就可以通过 FTP 访问其主目录 /home/ftpuser 了。


第四步:配置防火墙和 SELinux

这是最关键的一步,否则即使配置正确,也无法连接。

1 配置防火墙

对于 CentOS/RHEL 7/8 (使用 firewalld):

# 添加永久性的 FTP 服务规则
sudo firewall-cmd --permanent --add-service=ftp
# 重新加载防火墙使规则生效
sudo firewall-cmd --reload

对于 Ubuntu/Debian (使用 ufw):

# 允许 FTP 端口 (21 和 20, 以及数据通道范围)
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
# 或者更简单的方式,直接允许 'ftp' 服务
sudo ufw allow ftp
# 重新加载防火墙
sudo ufw reload

2 配置 SELinux (仅限 CentOS/RHEL)

SELinux 是一个强大的安全模块,可能会阻止 vsftpd 的某些操作(如写入文件),你需要为 vsftpd 设置正确的 SELinux 上下文。

# 安装 SELinux 管理工具(如果未安装)
sudo yum install -y policycoreutils-python-utils
# 为 /home/ftpuser 目录设置正确的 SELinux 上下文
# 这允许 vsftpd 在该目录下读写文件
sudo semanage fcontext -a -t public_content_rw_t "/home/ftpuser(/.*)?"
# 应用新设置的 SELinux 上下文
sudo restorecon -Rv /home/ftpuser

第五步:测试连接

你可以使用 FTP 客户端(如 FileZilla, WinSCP)或命令行工具进行测试。

使用命令行 lftpftp 测试:

# 安装 lftp (如果未安装)
# CentOS: sudo yum install -y lftp
# Ubuntu: sudo apt install -y lftp
# 连接服务器
lftp ftpuser@<你的服务器IP地址>

如果成功,你会看到 lftp ftpuser@<你的服务器IP地址>:~> 提示符,你可以使用 ls 列出文件,put 上传文件,get 下载文件进行测试。


第六步:高级安全配置

为了更高的安全性,建议进行以下配置。

1 限制用户仅能访问其主目录(Chroot Jail)

这是非常重要的安全措施,可以防止 FTP 用户通过 cd 命令访问其主目录之外的文件系统。

/etc/vsftpd/vsftpd.conf 中添加或修改以下两行:

# 将所有本地用户限制在其主目录内
chroot_local_user=YES
# chroot_local_user=YES,则此项控制是否允许写入 chroot 目录。
# YES 表示允许,NO 表示禁止,如果禁止写入,需要配合其他方法。
allow_writeable_chroot=YES

注意: 在较新的 vsftpd 版本中,chroot_local_user=YES,默认不允许 chroot 目录是可写的,以防止安全漏洞。allow_writeable_chroot=YES 是必要的。

2 禁止匿名用户访问

确保配置文件中有 anonymous_enable=NO

3 禁止 root 用户登录

出于安全考虑,应该禁止 root 用户通过 FTP 登录。

/etc/vsftpd/vsftpd.conf 中添加或取消注释并修改:

# 禁止 root 用户登录
ftpd_banner=Welcome to FTP service.

创建一个用户列表文件 /etc/vsftpd/user_list,将需要禁止的用户(如 root)写入其中,每行一个用户。

echo "root" | sudo tee -a /etc/vsftpd/user_list

并确保 vsftpd.conf 中有 userlist_enable=YESuserlist_file=/etc/vsftpd/user_list,如果希望这个列表中的用户禁止登录,还需添加 userlist_deny=YES

4 启用日志记录

默认情况下,日志是开启的,日志文件通常位于 /var/log/xferlog,确保 xferlog_enable=YESxferlog_file=/var/log/xferlog(如果路径不同)在配置文件中。


常见问题与解决方案

问题 1: 530 Login incorrect

  • 原因:
    1. 用户名或密码错误。
    2. PAM 认证失败。
    3. 防火墙阻止了连接。
    4. SELinux 策略阻止了登录。
  • 解决方案:
    1. 仔细核对用户名和密码。
    2. 检查 /etc/pam.d/vsftpd 文件是否被意外修改。
    3. 确认防火墙已放行 FTP 端口。
    4. 在 CentOS/RHEL 上,尝试临时关闭 SELinux 进行测试:sudo setenforce 0,如果可以登录,说明是 SELinux 问题,请参考第 5.2 节重新配置。

问题 2: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

  • 原因: 当 chroot_local_user=YES 时,出于安全考虑,vsftpd 默认不允许 chroot 的根目录是可写的,以防止用户通过符号链接逃逸。
  • 解决方案: 在 /etc/vsftpd/vsftpd.conf 中添加 allow_writeable_chroot=YES

问题 3: 553 Could not create file

  • 原因: 用户没有在目标目录的写权限,或者 SELinux 上下文不正确。
  • 解决方案:
    1. 确保用户对目标目录有写权限:sudo chmod 755 /home/ftpuser
    2. 确保用户对文件有写权限:sudo chown ftpuser:ftpuser /home/ftpuser/somefile
    3. 对于 CentOS/RHEL: 检查并修复 SELinux 上下文,如第 5.2 节所示。

问题 4: 连接被拒绝 (Connection refused)

  • 原因: vsftpd 服务没有运行,或者防火墙/安全组阻止了连接。
  • 解决方案:
    1. 检查服务状态: sudo systemctl status vsftpd,如果未运行,启动它。
    2. 检查云服务器的安全组(如阿里云、腾讯云、AWS),确保已开放 20 和 21 端口。
    3. 再次检查本地防火墙规则,确保 vsftpd 服务或端口已被允许。

至此,你已经拥有一个配置完善且安全的 vsftpd 服务器,你可以根据实际需求,进一步调整配置文件中的其他参数。

分享:
扫描分享到社交APP
上一篇
下一篇