使用 vsftpd (Very Secure FTP Daemon) - 推荐
vsftpd 是目前最流行、最安全的 FTP 服务器之一,适用于绝大多数场景。

安装 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,在修改前,强烈建议先备份一份。

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

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=10000pasv_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 的用户。
-
创建用户并设置其主目录为
/home/ftpuser1:sudo useradd -m -s /sbin/nologin ftpuser1
-m:创建用户主目录。-s /sbin/nologin:禁止该用户通过 SSH 等方式直接登录系统,只允许 FTP 访问,这是非常重要的安全措施。
-
为该用户设置密码:
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。
- 作用:将所有用户限制在其主目录 ( 符号代表用户主目录),等效于 vsftpd 的
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 客户端进行测试。
安全最佳实践总结
- 禁止匿名登录:这是最基本的安全要求。
- 使用专用用户:为 FTP 创建专门的系统用户,并禁止其 SSH 登录 (
/sbin/nologin)。 - 限制用户主目录:始终使用
chroot功能,将用户锁定在其 FTP 目录中。 - 使用白名单:通过
userlist_deny=NO和userlist_file创建一个允许登录的用户白名单,而不是黑名单。 - 使用 SFTP 替代 FTP:强烈建议,FTP 是一种不安全的协议,所有数据(包括用户名和密码)都以明文传输。
- SFTP (SSH File Transfer Protocol) 实际上是基于 SSH 协议的,所有数据都是加密的,现代 Linux 服务器默认都支持 SSH,因此使用 SFTP 无需额外安装服务器端软件,只需要一个支持 SFTP 的客户端(如 FileZilla)即可。
- 如果你的用户只需要文件传输,请优先引导他们使用 SFTP。
通过以上步骤,你就可以在 Linux 系统上成功配置一个安全、可用的 FTP 服务器了,对于新项目,请务必考虑使用 SFTP。
