下面我将详细介绍如何使用 vsftpd 来搭建一个 FTP 服务器,并提供详细的配置和排错指南。

第一步:选择并安装 FTP 服务器软件
我们以最流行的 vsftpd 为例。
更新软件包列表
在安装任何新软件之前,这是一个好习惯。
sudo apt update # 对于 Debian/Ubuntu 系统
或者
sudo yum check-update # 对于 CentOS/RHEL 系统
安装 vsftpd
对于 Debian / Ubuntu 系统:

sudo apt install vsftpd
对于 CentOS / RHEL / Fedora 系统:
sudo yum install vsftpd
安装完成后,vsftpd 服务通常会自动启动,你可以检查其状态:
# 对于使用 systemd 的新系统 (Ubuntu 16.04+, CentOS 7+) sudo systemctl status vsftpd # 对于旧系统 (可能使用 SysVinit) sudo service vsftpd status
第二步:配置 FTP 服务器
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:允许本地用户有写权限(上传、创建目录等)。
用户权限限制(非常重要):
chroot_local_user=YES:将所有本地用户限制在其主目录中。(这是关键的安全设置,防止用户访问系统其他目录)allow_writeable_chroot=YES:允许被限制在主目录的用户进行写操作。(在较新的 vsftpd 版本中,如果启用了chroot,通常需要开启此选项,否则用户可能无法登录)
安全加固:
pasv_min_port=30000和pasv_max_port=31000:设置被动模式(Passive Mode)使用的端口范围,这有助于配置防火墙规则。userlist_enable=YES:启用用户列表功能。userlist_file=/etc/vsftpd.user_list:指定用户列表文件。userlist_deny=NO:只允许/etc/vsftpd.user_list文件中列出的用户登录。(比白名单更安全)
示例配置文件内容:
你可以将以下内容复制到你的 /etc/vsftpd.conf 文件中,这是一个相对安全和通用的配置。
# 示例 vsftpd.conf 配置文件 # 匿名登录相关 anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES # 用户限制 chroot_local_user=YES allow_writeable_chroot=YES # 安全和访问控制 user_sub_token=$USER local_root=/home/$USER pasv_min_port=30000 pasv_max_port=31000 userlist_enable=YES userlist_file=/etc/vsftpd.user_list userlist_deny=NO
配置解释:
local_root=/home/$USER:指定每个用户登录后的根目录为他们的主目录,这是chroot的一个很好的补充。listen=NO和listen_ipv6=YES:让vsftpd同时监听 IPv4 和 IPv6,并让系统通过systemd或xinetd来管理服务,这是现代 Linux 系统的推荐做法。
第三步:创建 FTP 用户并设置权限
创建系统用户
假设我们要创建一个名为 ftpuser 的用户,并为其设置密码。
sudo adduser ftpuser
系统会提示你输入该用户的密码和一些基本信息。
将用户添加到允许登录列表
因为我们配置了 userlist_deny=NO,所以用户必须存在于 /etc/vsftpd.user_list 文件中才能登录。
打开该文件并添加你的用户名:
sudo nano /etc/vsftpd.user_list
在文件末尾添加一行:
ftpuser
保存并退出。
(可选) 设置用户主目录权限
为了确保 chroot 和文件上传正常工作,建议将用户主目录的所有者设置为该用户,并设置正确的权限。
sudo chown ftpuser:ftpuser /home/ftpuser sudo chmod 755 /home/ftpuser
第四步:配置防火墙和 SELinux
这是最容易被忽略但又至关重要的一步,否则用户将无法连接。
防火墙配置
对于使用 UFW 的系统 (如 Ubuntu):
# 允许 FTP 服务 (它会自动处理 21 和被动模式的端口) sudo ufw allow ftp # 或者手动开放端口 sudo ufw allow 21/tcp sudo ufw allow 30000:31000/tcp # 开放我们设置的被动模式端口范围
对于使用 firewalld 的系统 (如 CentOS 7+):
# 添加永久的服务规则 sudo firewall-cmd --permanent --add-service=ftp sudo firewall-cmd --permanent --add-port=30000-31000/tcp # 重新加载防火墙使配置生效 sudo firewall-cmd --reload
SELinux 配置 (仅限 CentOS/RHEL)
如果你的系统启用了 SELinux,它可能会阻止 FTP 服务,你需要设置正确的 SELinux 布尔值。
# 允许 FTP 在 home 目录中写入和读取 sudo setsebool -P ftpd_full_access on
注意:-P 选项会使这个设置永久生效,重启后仍然有效。
第五步:重启 vsftpd 服务并测试
重启服务
sudo systemctl restart vsftpd
确保服务设置为开机自启:
sudo systemctl enable vsftpd
测试连接
你可以使用以下几种方式进行测试:
-
使用命令行
ftp客户端:ftp localhost
输入用户名
ftpuser和密码,如果能成功登录并看到ftp>提示符,说明服务器工作正常,可以尝试上传或下载文件来测试读写权限。 -
使用图形化 FTP 客户端:
- FileZilla: 这是最流行的 FTP 客户端之一。
- 主机: 你的服务器 IP 地址 (
168.1.100) - 协议: FTP - 快速传输
- 加密: 如果你的服务器配置了 SSL/TLS,可以选择 "要求显式 FTP over TLS",否则,选择 "不加密"。
- 用户名:
ftpuser - 密码: 你设置的密码
-
使用 Web 浏览器: 在浏览器地址栏输入
ftp://ftpuser@你的服务器IP,然后输入密码。
常见问题与排错
如果连接失败,请按以下步骤排查:
-
检查服务状态:
sudo systemctl status vsftpd
确保服务是
active (running)状态。 -
检查防火墙和端口:
- 确认防火墙已经开放了
21(控制端口) 和30000-31000(被动模式数据端口)。 - 可以使用
netstat或ss命令检查端口是否在监听:sudo ss -tulnp | grep vsftpd
- 确认防火墙已经开放了
-
检查日志文件:
/var/log/vsftpd.log:这是vsftpd的主要日志文件,里面会记录连接尝试、登录成功/失败、文件传输等信息,仔细查看日志是排错的关键。
-
检查 SELinux (仅限 CentOS/RHEL):
- 如果怀疑是 SELinux 导致的问题,可以临时将其设置为
Permissive模式(只记录警告,不阻止操作)来测试:sudo setenforce 0
如果此时可以连接,那么问题肯定是 SELinux 引起的,请确保执行了正确的
setsebool命令。
- 如果怀疑是 SELinux 导致的问题,可以临时将其设置为
-
检查用户权限和目录:
- 确认用户
ftpuser在/etc/vsftpd.user_list文件中。 - 确认用户主目录
/home/ftpuser的权限是755。 - 确认用户对该目录有写入权限(如果需要上传功能)。
- 确认用户
通过以上步骤,你应该就能成功在 Linux 系统上搭建一个功能完善且相对安全的 FTP 服务器了。
