目录

  1. 第一步:选择并安装 FTP 服务器软件
    • 推荐 vsftpd
    • 安装步骤 (以 Ubuntu/Debian 和 CentOS/RHEL 为例)
  2. 第二步:启动并设置开机自启
  3. 第三步:基本配置 (允许本地用户登录)
    • 备份原始配置文件
    • 修改核心配置项
    • 重启服务并测试
  4. 第四步:创建专用的 FTP 用户
    • 为什么需要专用用户?
    • 创建用户并设置密码
    • 为用户设置 FTP 专用目录
    • 限制用户仅能通过 FTP 访问,不能 SSH 登录
  5. 第五步:高级安全配置 (非常重要)
    • 禁止匿名用户登录
    • 限制用户在其主目录下 (Chroot)
    • 禁止 root 用户登录
    • 配置防火墙
    • 使用更安全的 SFTP (SSH File Transfer Protocol) 替代 FTP
  6. 第六步:常见问题与排查
    • 连接被拒绝 (Connection refused)
    • 530 Login incorrect (用户名或密码错误)
    • 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
    • 550 Permission denied (权限不足)

第一步:选择并安装 FTP 服务器软件

在 Linux 中,有多种 FTP 服务器软件可供选择,如 vsftpd, proftpd, pure-ftpd 等。vsftpd 是最流行、最稳定且最注重安全的 FTP 服务器,是本教程的首选。

完整的linux安装ftp教程
(图片来源网络,侵删)

安装步骤

根据你的 Linux 发行版选择对应的命令。

对于 Ubuntu / Debian 系统:

打开终端,更新软件包列表,然后安装 vsftpd:

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

对于 CentOS / RHEL / Rocky Linux / AlmaLinux 系统:

完整的linux安装ftp教程
(图片来源网络,侵删)

打开终端,使用 yumdnf 安装 vsftpd:

# 对于 CentOS 7, RHEL 7 或使用 dnf 的新系统
sudo dnf install vsftpd
# 对于 CentOS 6, RHEL 6 或仅使用 yum 的旧系统
sudo yum install vsftpd

安装完成后,vsftpd 服务会自动启动。


第二步:启动并设置开机自启

为了确保 FTP 服务器在系统重启后能自动运行,我们需要启用并启动它。

对于使用 systemd 的现代系统 (Ubuntu 16.04+, CentOS 7+):

完整的linux安装ftp教程
(图片来源网络,侵删)
# 启动 vsftpd 服务
sudo systemctl start vsftpd
# 设置开机自启
sudo systemctl enable vsftpd
# 检查服务状态,确保运行正常
sudo systemctl status vsftpd

对于使用 init.d 的旧系统 (如 CentOS 6):

# 启动 vsftpd 服务
sudo service vsftpd start
# 设置开机自启
sudo chkconfig vsftpd on
# 检查服务状态
sudo service vsftpd status

第三步:基本配置 (允许本地用户登录)

默认情况下,vsftpd 可能不允许本地用户登录,或者配置非常严格,我们需要修改其配置文件。

备份原始配置文件

这是一个好习惯,以防配置错误后可以快速恢复。

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

修改核心配置项

使用你喜欢的文本编辑器(如 nanovim)打开配置文件:

sudo nano /etc/vsftpd.conf

找到并修改/取消注释以下关键行:

# 允许匿名用户登录?默认是 YES,为了安全,我们通常设为 NO
anonymous_enable=NO
# 允许本地用户(系统用户)登录 FTP
local_enable=YES
# 允许对 FTP 目录执行写操作(上传、创建文件/目录等)
write_enable=YES
# 当本地用户登录后,会被限制在其主目录下
# 这是非常重要的安全设置
chroot_local_user=YES
# 启用用户列表文件来控制允许登录的用户
# userlist_enable=YES
# userlist_file=/etc/vsftpd.user_list
# userlist_deny=NO  # NO表示只允许 user_list 文件中的用户登录,YES表示禁止

解释:

  • anonymous_enable=NO: 关闭匿名访问,这是最基本的安全措施。
  • local_enable=YES: 允许系统用户登录。
  • write_enable=YES: 允许用户在上传/下载目录中进行写操作。
  • chroot_local_user=YES: 将用户“囚禁”在其主目录,防止他们浏览服务器上的其他文件,这是 强烈推荐 的安全配置。

重启服务并测试

保存并关闭配置文件,然后重启 vsftpd 服务使配置生效。

sudo systemctl restart vsftpd

测试:

  1. 在另一台电脑上打开 FTP 客户端(如 FileZilla, WinSCP)。
  2. 主机地址填你的 FTP 服务器的 IP 地址。
  3. 协议选择 "FTP"。
  4. 用户名和密码填入你系统中的一个已存在的用户名和密码。
  5. 端口默认为 21。

如果连接成功并能看到用户的主目录,说明基本配置成功。


第四步:创建专用的 FTP 用户

出于安全考虑,最好不要使用系统管理员(如 root)或有其他系统权限的用户来登录 FTP,我们应该为 FTP 创建一个专用的、权限受限的用户。

创建用户并设置密码

假设我们要创建一个名为 ftpuser 的用户。

# 创建用户 ftpuser,并会自动创建其主目录 /home/ftpuser
sudo adduser ftpuser
# 为 ftpuser 设置密码
sudo passwd ftpuser

按照提示输入两次新密码。

为用户设置 FTP 专用目录

默认情况下,用户的主目录是 /home/ftpuser,我们可以创建一个专门用于文件传输的目录,/home/ftpuser/ftp

# 创建 ftp 目录
sudo mkdir /home/ftpuser/ftp
# 设置该目录的所有者为 ftpuser
sudo chown ftpuser:ftpuser /home/ftpuser/ftp
# 设置合适的权限,确保用户可以读写
sudo chmod 755 /home/ftpuser/ftp

ftpuser 登录后,他会被 chroot 限制在 /home/ftpuser 目录下,我们可以将需要共享的文件放在 /home/ftpuser/ftp 目录中。

限制用户仅能通过 FTP 访问,不能 SSH 登录

为了进一步增强安全性,我们可以禁止 ftpuser 通过 SSH 登录服务器。

编辑 /etc/passwd 文件:

sudo nano /etc/passwd

找到 ftpuser 那一行,类似这样: ftpuser:x:1001:1001::/home/ftpuser:/bin/bash

将其末尾的 /bin/bash (默认 Shell) 改为 /usr/sbin/nologin/sbin/nologin,这表示该用户无法登录系统。

修改后如下: ftpuser:x:1001:1001::/home/ftpuser:/usr/sbin/nologin

保存文件即可。


第五步:高级安全配置

禁止匿名用户登录

在第三步的配置中,我们已经设置了 anonymous_enable=NO,请确保这一行没有被注释掉且值为 NO

限制用户在其主目录下 (Chroot)

同样,在第三步中我们已经设置了 chroot_local_user=YES,这已经是一个很好的默认设置。

禁止 root 用户登录

编辑 /etc/vsftpd.conf 文件,添加或取消注释以下行:

# 禁止 root 用户登录 FTP
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
userlist_deny=YES # YES表示禁止 user_list 文件中的用户登录

编辑 /etc/vsftpd.user_list 文件,确保 root 在其中:

sudo nano /etc/vsftpd.user_list

在文件中添加 root 这一行。

配置防火墙

FTP 协议比较特殊,它使用 21 端口进行控制连接,但数据连接是动态的,需要配置防火墙才能正常工作。

对于使用 ufw (Uncomplicated Firewall) 的系统 (如 Ubuntu):

# 允许 FTP 流量
sudo ufw allow 21/tcp
# 如果你的 FTP 服务器在被动模式下运行,还需要开放一个端口范围
# 假设我们使用 60000-61000 这个范围
sudo ufw allow 60000:61000/tcp
# 重新加载防火墙规则
sudo ufw reload

对于使用 firewalld 的系统 (如 CentOS/RHEL):

# 添加一个永久性的服务规则 "ftp"
sudo firewall-cmd --permanent --add-service=ftp
# 如果使用被动模式,也需要开放端口范围
sudo firewall-cmd --permanent --add-port=60000-61000/tcp
# 重新加载防火墙
sudo firewall-cmd --reload

使用更安全的 SFTP (SSH File Transfer Protocol)

强烈建议:FTP 协议在传输数据时是明文的,包括用户名和密码,非常不安全,如果你的服务器允许,请优先使用 SFTP

  • SFTP 不是 FTP:它是 SSH File Transfer Protocol,通过 SSH 协议(默认端口 22)运行,所有传输都是加密的。
  • 如何使用:你不需要安装任何额外的服务器软件,只要你的 SSH 服务器 (sshd) 在运行,SFTP 就已经可用了。
  • 客户端连接:在 FileZilla 中,协议选择 "SFTP",主机填 IP,用户名和密码不变,它会使用 22 端口进行安全连接。

第六步:常见问题与排查

连接被拒绝 (Connection refused)

  • 原因vsftpd 服务未启动,或防火墙阻止了 21 端口。
  • 解决
    • 检查服务状态:sudo systemctl status vsftpd
    • 启动服务:sudo systemctl start vsftpd
    • 检查并配置防火墙,允许 21 端口流量。

530 Login incorrect (用户名或密码错误)

  • 原因
    1. 用户名或密码输错。
    2. PAM (Pluggable Authentication Modules) 认证失败,这通常是因为配置文件中 pam_service_name=vsftpd 指向了不存在的或配置错误的 PAM 文件。
  • 解决
    • 确认用户名密码。
    • 检查 /etc/pam.d/vsftpd 文件是否存在且内容正确。
    • 检查 /etc/vsftpd.conf 中的 pam_service_name 设置。

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

  • 原因:当 chroot_local_user=YES 时,vsftpd 默认不允许用户被“囚禁”在一个可写的根目录下,这是一个安全措施。
  • 解决
    • 方法一(推荐):在 chroot 目录下创建一个专门的读写目录,用户主目录是 /home/ftpuser,它被 chroot,在其中创建一个 ftp 目录,并设置用户对这个 ftp 目录有读写权限。
    • 方法二(不推荐,降低安全性):在 /etc/vsftpd.conf 中添加 allow_writeable_chroot=YES,这会关闭该安全检查,但可能带来风险。

550 Permission denied (权限不足)

  • 原因:用户对要操作的文件或目录没有读写权限。
  • 解决
    • 使用 ls -l /path/to/dir 查看目录权限。
    • 确保用户是文件/目录的所有者,或者属于拥有该权限的用户组。
    • 使用 chownchmod 修改权限。sudo chown ftpuser:ftpuser /path/to/filesudo chmod 755 /path/to/dir

通过以上步骤,你已经成功搭建了一个相对安全、功能完善的 FTP 服务器。

核心要点回顾:

  1. 安装:使用 vsftpd,它是稳定且安全的首选。
  2. 基本配置:允许本地用户登录,并启用 chroot 限制其活动范围。
  3. 专用用户:为 FTP 创建独立的、权限受限的用户,禁止其 SSH 登录。
  4. 安全第一:关闭匿名登录,配置防火墙,强烈建议使用 SFTP 替代 FTP 以确保数据传输安全。

希望这份详细的教程能对你有所帮助!