第一步:选择并安装 FTP 服务器软件
我们选择 vsftpd,因为它以其安全性、速度和稳定性而闻名。

在 CentOS / RHEL / Rocky Linux / AlmaLinux 系统上
-
更新系统包列表
sudo dnf update -y # 对于使用 dnf 的系统 (CentOS 8+, RHEL 8+, Rocky Linux 8+) # 或者 sudo yum update -y # 对于使用 yum 的旧版系统 (CentOS 7, RHEL 7)
-
安装 vsftpd
sudo dnf install vsftpd -y # 或者 sudo yum install vsftpd -y
在 Ubuntu / Debian 系统上
-
更新系统包列表
sudo apt update sudo apt upgrade -y
-
安装 vsftpd
(图片来源网络,侵删)sudo apt install vsftpd -y
第二步:启动并设置开机自启
安装完成后,需要启动服务并设置为开机自动启动,这样服务器重启后 FTP 服务也能自动运行。
# 启动 vsftpd 服务 sudo systemctl start vsftpd # 设置开机自启 sudo systemctl enable vsftpd # 检查服务状态,确保正在运行 sudo systemctl status vsftpd
如果看到 active (running),说明服务已成功启动。
第三步:配置防火墙
为了能让外部计算机访问 FTP 服务,必须开放相应的端口,FTP 默认使用 21 端口进行控制连接。
对于 CentOS / RHEL / Rocky Linux / AlmaLinux (使用 firewalld)
# 永久开放 21 端口 sudo firewall-cmd --permanent --add-service=ftp # 重新加载防火墙规则以使更改生效 sudo firewall-cmd --reload
对于 Ubuntu / Debian (使用 ufw)
# 允许 FTP 流量 sudo ufw allow ftp # 重新加载防火墙(可选,ufw 通常会自动处理) sudo ufw reload
第四步:创建 FTP 用户
出于安全考虑,不建议使用 root 用户或系统用户来管理 FTP,我们创建一个专用的 FTP 用户。

-
创建新用户 假设我们创建一个名为
ftpuser的用户,并将其主目录设置为/home/ftpuser。sudo useradd -m -s /sbin/nologin ftpuser
-m: 自动创建用户主目录/home/ftpuser。-s /sbin/nologin: 禁止该用户通过 SSH 或控制台登录系统,增强安全性。
-
设置用户密码
sudo passwd ftpuser # 系统会提示你输入并确认新密码
-
为用户设置密码(可选但推荐) 如果用户是通过
adduser命令创建的,可能需要单独设置密码。sudo passwd ftpuser
第五步:配置 vsftpd
这是最关键的一步,决定了 FTP 服务器的行为。
-
备份原始配置文件
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
-
编辑配置文件 使用你喜欢的文本编辑器(如
vi,nano)打开主配置文件。sudo vi /etc/vsftpd/vsftpd.conf
-
修改关键配置项 将以下配置项的值进行修改或取消注释(去掉前面的 ),这是一个安全且功能完善的配置示例:
# 禁止匿名用户登录 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许 FTP 用户上传文件 write_enable=YES # 允许对 FTP 目录执行更改所有者、更改组、更改模式等操作 # 如果用户需要创建、删除目录,此项需要开启 chroot_local_user=YES # 当用户被限制在其主目录时,是否允许写入 # 重要:为了安全,当 chroot_local_user=YES 时,此项必须为 NO # 否则用户可能通过 `chmod` 等命令 "越狱" allow_writeable_chroot=NO # 设置用户只能访问其自己的主目录,不能切换到其他目录 # 这是 chroot 的一种更安全的实现方式 # 如果你的系统是较新的(如 CentOS 7+, Ubuntu 18.04+),推荐使用这个 # chroot_list_enable=YES # chroot_list_file=/etc/vsftpd/chroot_list # (注释掉上面两行,改用下面的方式) user_sub_token=$USER local_root=/home/$USER # 启用用户列表,只有列表中的用户才能登录 # 这是最安全的用户控制方式 userlist_enable=YES userlist_file=/etc/vsftpd/user_list userlist_deny=NO # NO 表示只允许 user_list 文件中的用户登录 # 启用数据端口连接 # PASV 模式是被动模式,可以解决大部分防火墙和 NAT 的问题 pasv_enable=YES pasv_min_port=10020 pasv_max_port=10220
配置解释:
anonymous_enable=NO: 必须关闭匿名登录,否则任何人都可以访问你的服务器。chroot_local_user=YES: 将用户限制在其主目录内,防止他们浏览系统其他文件。allow_writeable_chroot=NO: 非常重要! 在chroot环境下禁止写入,防止安全漏洞。userlist_deny=NO: 结合userlist_enable=YES,这是一种白名单机制,只有/etc/vsftpd/user_list文件中列出的用户才能登录。pasv_enable=YES和相关端口:启用被动模式,并指定一个端口范围,这有助于客户端穿过防火墙连接到你的服务器。
-
创建用户白名单文件 根据上面的配置,我们需要创建
user_list文件,并将我们之前创建的ftpuser添加进去。# 创建或编辑用户白名单文件 sudo vi /etc/vsftpd/user_list
在文件中添加你的用户名,每行一个:
ftpuser -
确保用户目录权限正确 为了让
ftpuser能正常上传文件,其主目录的权限设置要正确,所有者应该是ftpuser,组也应该是ftpuser,并且权限不能是777。# 设置主目录所有者和组 sudo chown -R ftpuser:ftpuser /home/ftpuser # 设置主目录权限为 755 (所有者可读写执行,组和其他用户可读和执行) sudo chmod -R 755 /home/ftpuser
第六步:重启 vsftpd 服务
保存并关闭配置文件后,重启 vsftpd 服务以使所有新配置生效。
sudo systemctl restart vsftpd
第七步:客户端连接测试
你的 FTP 服务器已经搭建完成!可以使用 FTP 客户端软件进行测试。
使用命令行 FTP 客户端
在你的本地电脑或另一台服务器上,打开终端,输入以下命令:
ftp <你的服务器IP地址> # ftp 192.168.1.100
然后输入你创建的用户名 (ftpuser) 和密码。
使用图形化 FTP 客户端
推荐使用 FileZilla,它支持 FTP, SFTP, FTPS 等多种协议。
- 打开 FileZilla。
- 在主机栏输入你的服务器 IP 地址。
- 在用户名栏输入
ftpuser。 - 在密码栏输入你设置的密码。
- 端口保持
21。 - 点击“快速连接”。
如果连接成功,你应该能看到服务器上的文件列表,并且可以上传、下载文件。
常见问题排查
如果连接失败,请检查以下几点:
-
防火墙问题:再次确认 21 端口和被动模式端口范围(如 10020-10220)已在防火墙中开放。
-
SELinux (仅限 CentOS/RHEL):这是一个常见的问题,如果开启了 SELinux,可能会阻止 FTP 访问。
-
临时关闭(用于测试):
sudo setenforce 0
-
永久解决(推荐):为 FTP 设置正确的 SELinux 上下文。
# 安装 selinux-policy-devel 包 sudo dnf install -y selinux-policy-devel # 创建一个 SELinux 策略模块,允许 vsftpd 写入用户目录 # 创建文件 /tmp/vsftpd.te,内容如下: cat > /tmp/vsftpd.te << EOF module vsftpd 1.0; require { type user_home_dir_t; type usr_t; type var_t; type ftpd_log_t; type ftpd_t; class file { write read getattr open }; class dir { write add_name remove_name read }; } #============= ftpd_t ============== allow ftpd_t user_home_dir_t:dir { write add_name remove_name }; allow ftpd_t user_home_dir_t:file { write read getattr open }; allow ftpd_t usr_t:file { write read getattr open }; allow ftpd_t var_t:dir { write add_name remove_name }; allow ftpd_t var_t:file { write read getattr open }; allow ftpd_t ftpd_log_t:file { write read getattr open append }; EOF # 编译并加载策略 checkmodule -M -m -V /tmp/vsftpd.te -o /tmp/vsftpd.mod semodule_package -o /tmp/vsftpd.pp -m /tmp/vsftpd.mod sudo semodule -i /tmp/vsftpd.pp
-
-
用户名或密码错误:确认输入的用户名和密码完全正确。
-
用户列表问题:确认
/etc/vsftpd/user_list文件中包含了你的用户名。 -
文件权限问题:确认
/home/ftpuser目录的权限和所有者设置正确。
进阶:使用更安全的 FTPS
为了数据传输的安全性,强烈建议使用 FTPS (FTP over SSL/TLS),它对用户名、密码和传输的数据都进行加密。
-
安装 SSL 证书 你可以使用免费的 Let's Encrypt 证书,或者生成一个自签名证书用于测试。
# 生成自签名证书 (仅用于测试) sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
-
修改 vsftpd.conf 在配置文件中添加以下内容:
# 启用 SSL/TLS ssl_enable=YES # 指定证书文件 rsa_cert_file=/etc/vsftpd/vsftpd.pem # 强制客户端使用加密连接 force_local_data_ssl=YES force_local_logins_ssl=YES # 要求客户端提供证书 (可选) require_ssl_reuse=NO
-
重启 vsftpd 服务
sudo systemctl restart vsftpd
在 FileZilla 中连接时,需要在“协议”下拉菜单中选择“FTP-文件传输协议”,然后在“加密”选项中选择“如果可用,使用显式 FTP over TLS”。
至此,你已经成功搭建了一个功能完善且相对安全的 FTP 文件服务器。
