凌峰创科服务平台

Linux系统FTP服务器配置步骤有哪些?

使用 vsftpd (Very Secure FTP Daemon) - 推荐

vsftpd 是目前最流行、最安全的 FTP 服务器之一,适用于绝大多数场景。

Linux系统FTP服务器配置步骤有哪些?-图1
(图片来源网络,侵删)

安装 vsftpd

在基于 Debian/Ubuntu 的系统上:

sudo apt update
sudo apt install vsftpd

在基于 CentOS/RHEL/Fedora 的系统上:

sudo yum install vsftpd  # 对于 CentOS 7/8, RHEL 7/8, Fedora
# 或者使用 dnf (对于较新的版本)
sudo dnf install vsftpd

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

备份并编辑主配置文件

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

Linux系统FTP服务器配置步骤有哪些?-图2
(图片来源网络,侵删)
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

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

sudo nano /etc/vsftpd.conf

下面是一些关键配置项的说明和推荐设置:

核心安全设置:

  • anonymous_enable=NO
    • 作用:禁止匿名用户登录。这是安全的第一步,必须设置为 NO
  • local_enable=YES
    • 作用:允许本地系统用户登录。
  • write_enable=YES
    • 作用:允许本地用户对 FTP 服务器有写入权限(上传、修改、删除文件),如果只允许下载,可以设为 NO
  • chroot_local_user=YES
    • 作用非常重要! 将所有本地用户限制在其主目录(/home/username)中,他们无法访问系统上的其他目录,这是防止提权攻击的关键。
  • allow_writeable_chroot=YES
    • 作用:当 chroot_local_user=YES 时,如果用户的主目录是可写的,默认情况下 vsftpd 会拒绝登录,此选项允许用户在可写的主目录中进行 chroot(注意:在某些旧版本或特定安全策略下,可能需要创建一个文件或设置 user_sub_token 来绕过此限制,但现代 vsftpd 版本通常直接支持此选项)

访问控制设置:

Linux系统FTP服务器配置步骤有哪些?-图3
(图片来源网络,侵删)
  • userlist_enable=YES
    • 作用:启用用户列表功能。
  • userlist_file=/etc/vsftpd.user_list
    • 作用:指定用户列表文件,此文件中的用户名将被禁止允许登录(取决于下面一项的设置)。
  • userlist_deny=NO
    • 作用:结合上一项,设置为 NO 表示 /etc/vsftpd.user_list 文件中的用户是允许登录的用户列表。这是更安全的做法,创建一个白名单,只有名单上的人可以访问。

性能和连接设置:

  • listen=YES
    • 作用:让 vsftpd 以独立模式监听,而不是由 xinetd 或 systemd.socket 管理。
  • listen_ipv6=NO
    • 作用:如果不需要 IPv6,可以禁用它。
  • pasv_min_port=10000
  • pasv_max_port=10100
    • 作用:设置被动模式(Passive Mode)使用的端口范围。强烈建议设置,以便在防火墙中开放这些特定端口,而不是开放一个大的端口范围。

示例配置文件 (/etc/vsftpd.conf) 内容:

# 匿名登录禁止
anonymous_enable=NO
# 允许本地用户登录
local_enable=YES
# 允许写入
write_enable=YES
# 用户被限制在主目录
chroot_local_user=YES
# 允许用户在可写主目录中进行 chroot
allow_writeable_chroot=YES
# 启用用户列表
userlist_enable=YES
# 用户列表文件
userlist_file=/etc/vsftpd.user_list
# 用户列表是允许登录的用户 (白名单)
userlist_deny=NO
# 独立模式监听
listen=YES
listen_ipv6=NO
# 被动模式端口范围
pasv_min_port=10000
pasv_max_port=10100

创建允许登录的用户列表

编辑 /etc/vsftpd.user_list 文件,将允许登录的用户名逐行添加进去。

sudo nano /etc/vsftpd.user_list

如下:

# vsftpd user list
# Each username must be on a separate line.
ftpuser1
ftpuser2

创建 FTP 用户并设置密码

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

  1. 创建用户并设置其主目录为 /home/ftpuser1

    sudo useradd -m -s /sbin/nologin ftpuser1
    • -m:创建用户主目录。
    • -s /sbin/nologin:禁止该用户通过 SSH 等方式直接登录系统,只允许 FTP 访问,这是非常重要的安全措施
  2. 为该用户设置密码:

    sudo passwd ftpuser1
    # 输入两次密码

设置目录权限

确保用户对其主目录有正确的读写权限,并且对上级目录没有写权限(这是 chroot 工作的前提)。

# 设置用户主目录的所有者为 ftpuser1
sudo chown ftpuser1:ftpuser1 /home/ftpuser1
# 设置主目录权限为 755 (所有者可读写执行,组和其他用户可读执行)
sudo chmod 755 /home/ftpuser1

配置防火墙和 SELinux (如果启用)

防火墙 (以 UFW 为例,适用于 Ubuntu/Debian):

# 允许 FTP 服务 (UFW 会自动处理 20 和 21 端口,以及被动模式的端口范围)
sudo ufw allow ftp
# 如果指定了被动端口范围,也需要开放这些端口
sudo ufw allow 10000:10100/tcp
# 重启防火墙以应用规则
sudo ufw reload

防火墙 (以 firewalld 为例,适用于 CentOS/RHEL/Fedora):

# 添加永久的服务规则
sudo firewall-cmd --permanent --add-service=ftp
# 添加被动模式的端口范围
sudo firewall-cmd --permanent --add-port=10000-10100/tcp
# 重新加载防火墙
sudo firewall-cmd --reload

SELinux (在 CentOS/RHEL 系统上): 如果系统启用了 SELinux,需要进行额外配置。

# 安装 SELinux FTP 策略包
sudo yum install -y vsftpd_selinux
# 设置 SELinux 布尔值,允许 FTP 写入公共目录和用户主目录
sudo setsebool -P ftpd_full_access on
# 检查状态
getsebool -a | grep ftpd

重启 vsftpd 服务并设置为开机自启

# 重启服务
sudo systemctl restart vsftpd
# 设置开机自启
sudo systemctl enable vsftpd

测试连接

使用 FTP 客户端(如 FileZilla)或命令行 lftp 进行测试。

  • 主机: 你的服务器 IP 地址
  • 用户名: ftpuser1
  • 密码: 你设置的密码

如果连接成功,并且你被限制在 /home/ftpuser1 目录下,说明配置成功。


使用 ProFTPD

ProFTPD 是另一个功能强大且灵活的 FTP 服务器,其配置方式更像 Apache HTTP Server。

安装 ProFTPD

Debian/Ubuntu:

sudo apt update
sudo apt install proftpd

CentOS/RHEL/Fedora:

sudo yum install proftpd
# 或
sudo dnf install proftpd

安装时,它可能会询问是作为独立服务还是从 inetd 运行,选择 standalone

编辑配置文件

ProFTPD 的主配置文件是 /etc/proftpd/proftpd.conf,同样,先备份。

sudo cp /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.bak
sudo nano /etc/proftpd/proftpd.conf

关键配置项:

  • DefaultRoot ~
    • 作用:将所有用户限制在其主目录 ( 符号代表用户主目录),等效于 vsftpd 的 chroot_local_user=YES
  • RequireValidShell off
    • 作用:允许没有有效登录 shell 的用户(如我们为 FTP 创建的用户)登录。
  • PassivePorts 10000 10100
    • 作用:设置被动模式的端口范围,与 vsftpd 类似。

示例配置片段:

# ... 其他配置 ...
# 不允许匿名登录
<Anonymous ~>
    # ... 如果需要匿名配置,可以放在这里 ...
</Anonymous>
# 将所有用户限制在其主目录
DefaultRoot ~
# 允许没有有效 shell 的用户登录
RequireValidShell off
# 被动模式端口范围
PassivePorts 10000 10100
# ... 其他配置 ...

创建用户和防火墙规则

创建用户、设置密码、配置防火墙和 SELinux 的步骤与 vsftpd 基本相同。

重启服务并测试

sudo systemctl restart proftpd
sudo systemctl enable proftpd

然后使用 FTP 客户端进行测试。


安全最佳实践总结

  1. 禁止匿名登录:这是最基本的安全要求。
  2. 使用专用用户:为 FTP 创建专门的系统用户,并禁止其 SSH 登录 (/sbin/nologin)。
  3. 限制用户主目录:始终使用 chroot 功能,将用户锁定在其 FTP 目录中。
  4. 使用白名单:通过 userlist_deny=NOuserlist_file 创建一个允许登录的用户白名单,而不是黑名单。
  5. 使用 SFTP 替代 FTP强烈建议,FTP 是一种不安全的协议,所有数据(包括用户名和密码)都以明文传输。
    • SFTP (SSH File Transfer Protocol) 实际上是基于 SSH 协议的,所有数据都是加密的,现代 Linux 服务器默认都支持 SSH,因此使用 SFTP 无需额外安装服务器端软件,只需要一个支持 SFTP 的客户端(如 FileZilla)即可。
    • 如果你的用户只需要文件传输,请优先引导他们使用 SFTP。

通过以上步骤,你就可以在 Linux 系统上成功配置一个安全、可用的 FTP 服务器了,对于新项目,请务必考虑使用 SFTP。

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