目录
- 第一步:选择并安装 FTP 服务器软件
- 推荐 vsftpd
- 安装步骤 (以 Ubuntu/Debian 和 CentOS/RHEL 为例)
- 第二步:启动并设置开机自启
- 第三步:基本配置 (允许本地用户登录)
- 备份原始配置文件
- 修改核心配置项
- 重启服务并测试
- 第四步:创建专用的 FTP 用户
- 为什么需要专用用户?
- 创建用户并设置密码
- 为用户设置 FTP 专用目录
- 限制用户仅能通过 FTP 访问,不能 SSH 登录
- 第五步:高级安全配置 (非常重要)
- 禁止匿名用户登录
- 限制用户在其主目录下 (Chroot)
- 禁止 root 用户登录
- 配置防火墙
- 使用更安全的 SFTP (SSH File Transfer Protocol) 替代 FTP
- 第六步:常见问题与排查
- 连接被拒绝 (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 发行版选择对应的命令。
对于 Ubuntu / Debian 系统:
打开终端,更新软件包列表,然后安装 vsftpd:
# 更新软件包列表 sudo apt update # 安装 vsftpd sudo apt install vsftpd
对于 CentOS / RHEL / Rocky Linux / AlmaLinux 系统:

打开终端,使用 yum 或 dnf 安装 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+):

# 启动 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
修改核心配置项
使用你喜欢的文本编辑器(如 nano 或 vim)打开配置文件:
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
测试:
- 在另一台电脑上打开 FTP 客户端(如 FileZilla, WinSCP)。
- 主机地址填你的 FTP 服务器的 IP 地址。
- 协议选择 "FTP"。
- 用户名和密码填入你系统中的一个已存在的用户名和密码。
- 端口默认为 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 (用户名或密码错误)
- 原因:
- 用户名或密码输错。
- 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查看目录权限。 - 确保用户是文件/目录的所有者,或者属于拥有该权限的用户组。
- 使用
chown和chmod修改权限。sudo chown ftpuser:ftpuser /path/to/file,sudo chmod 755 /path/to/dir。
- 使用
通过以上步骤,你已经成功搭建了一个相对安全、功能完善的 FTP 服务器。
核心要点回顾:
- 安装:使用
vsftpd,它是稳定且安全的首选。 - 基本配置:允许本地用户登录,并启用
chroot限制其活动范围。 - 专用用户:为 FTP 创建独立的、权限受限的用户,禁止其 SSH 登录。
- 安全第一:关闭匿名登录,配置防火墙,强烈建议使用 SFTP 替代 FTP 以确保数据传输安全。
希望这份详细的教程能对你有所帮助!
