重要提醒:FTP 的安全性问题
传统的 FTP 协议在传输用户名、密码和文件时都是明文传输,存在巨大的安全风险,在今天的网络环境中,强烈建议使用 SFTP(基于 SSH 协议)或 FTPS(FTP over SSL/TLS)。

- SFTP (SSH File Transfer Protocol):不是 FTP 的安全版,而是 SSH 协议的一部分,它通过一个加密通道传输所有数据,安全性极高,大多数 Linux 系统默认都支持,无需额外安装 FTP 服务器。
- FTPS (FTP Secure):在标准的 FTP 基础上增加了 SSL/TLS 加密层。
本教程会先教你搭建传统 FTP,然后重点介绍如何配置更安全的 FTPS。
使用 vsftpd (Very Secure FTP Daemon) - 推荐
vsftpd 是目前 Linux 下最流行、最安全的 FTP 服务器之一,配置简单,性能稳定。
步骤 1:安装 vsftpd
在大多数基于 Debian/Ubuntu 的系统上:
sudo apt update sudo apt install vsftpd
在大多数基于 CentOS/RHEL/Fedora 的系统上:

sudo yum install vsftpd # 或者 (对于较新版本的 CentOS/RHEL/Fedora) sudo dnf install vsftpd
安装完成后,vsftpd 服务会自动启动,我们可以检查其状态:
sudo systemctl status vsftpd
步骤 2:配置防火墙
FTP 协议比较特殊,它使用两个端口:
- 控制连接 (21端口):用于发送命令,如登录、列出目录。
- 数据连接:用于传输文件,端口不固定(默认是 20 端口,但也可以是其他高位端口)。
我们需要在防火墙中打开 21 端口,并启用 FTP 服务所需的被动模式端口范围。
对于 UFW (Debian/Ubuntu):

# 打开 21 端口 sudo ufw allow 21/tcp # 允许被动模式端口范围 (这里以 10000-10100 为例,请根据你的配置修改) sudo ufw allow 10000:10100/tcp # 重启防火墙以应用规则 sudo ufw reload
对于 firewalld (CentOS/RHEL/Fedora):
# 打开 21 端口 sudo firewall-cmd --permanent --add-service=ftp # 这条命令会自动处理 21 端口和被动模式所需的相关端口 # 或者手动添加端口范围 # sudo firewall-cmd --permanent --add-port=10000-10100/tcp # 重新加载防火墙 sudo firewall-cmd --reload
步骤 3:配置 vsftpd
主配置文件位于 /etc/vsftpd.conf,我们先用一个备份文件来开始,以防配置错误。
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
然后打开配置文件进行编辑:
sudo nano /etc/vsftpd.conf
下面是一个推荐的、相对安全的配置,你可以根据需要取消注释或修改以下参数:
# 禁止匿名登录 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许写入文件 write_enable=YES # 允许上传文件和目录 local_umask=022 # 当用户 chroot 到家目录时,禁止使用 writeable-root 权限 chroot_local_user=YES # 启用用户目录的写权限(需要配合下面的配置) allow_writeable_chroot=YES # 启用 FTP 数据端口的数据连接 connect_from_port_20=YES # 启用被动模式 (PASV),这是现代网络环境(如NAT)所必需的 pasv_enable=YES pasv_min_port=10000 pasv_max_port=10100 # 这里的端口范围需要和你在防火墙中设置的保持一致 # 启用目录消息 dirmessage_enable=YES # 启用上传和下载的日志记录 xferlog_enable=YES xferlog_std_format=YES # 当用户登录时,显示欢迎信息 ftpd_banner=Welcome to my FTP service. # 设置用户只能访问其自己的家目录,不能切换到上级目录 # (chroot_local_user=YES,这个选项可能不是必须的,但加上更安全) chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list # 创建一个空文件来启用这个功能 sudo touch /etc/vsftpd.chroot_list
重要配置说明:
pasv_min_port和pasv_max_port:定义了被动模式下数据连接可用的端口范围。请确保这个范围在防火墙中是开放的。allow_writeable_chroot=YES:这是一个较新的安全特性,允许在 chroot 环境中进行写入操作,在旧版 vsftpd 中,你可能需要设置为NO并将用户家目录的权限设置为 555。
保存并关闭文件(在 nano 中是 Ctrl+X,Y,Enter)。
步骤 4:创建 FTP 用户
假设我们要创建一个名为 ftpuser 的用户。
# 创建新用户 sudo useradd -m -s /sbin/nologin ftpuser # -m: 自动创建用户家目录 # -s /sbin/nologin: 禁止该用户通过 SSH 登录系统,提高安全性 # 为用户设置密码 sudo passwd ftpuser
步骤 5:启动并启用 vsftpd 服务
# 启动服务 sudo systemctl start vsftpd # 设置开机自启 sudo systemctl enable vsftpd
步骤 6:测试连接
现在你可以使用任何 FTP 客户端(如 FileZilla、WinSCP)进行连接了。
- 主机: 你的服务器 IP 地址
- 用户名:
ftpuser - 密码: 你刚刚设置的密码
- 端口: 21
如果连接成功,说明基本 FTP 服务器已经搭建完成。
配置更安全的 FTPS (FTP over SSL/TLS)
强烈建议你将服务器升级为 FTPS,以保护用户凭据和数据。
步骤 1:生成 SSL/TLS 证书
你可以使用自签名证书进行测试,或者使用 Let's Encrypt 等权威证书机构签发的证书。
这里我们创建一个自签名证书:
# 创建证书存放目录 sudo mkdir -p /etc/ssl/private # 生成证书 (注意:Common Name 部分填入你的域名或服务器IP) sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
在生成过程中,会提示你输入一些信息,直接回车使用默认值即可。
步骤 2:修改 vsftpd.conf 配置
再次编辑 /etc/vsftpd.conf 文件,添加或修改以下参数:
# ... (保留之前的配置) ... # 启用 SSL/TLS ssl_enable=YES # 强制所有数据连接都使用加密 force_local_data_ssl=YES force_local_logins_ssl=YES # 指定证书文件路径 rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.pem # 设置 SSL 的安全级别,建议为中等或高 ssl_tlsv1_2=YES ssl_tlsv1_1=YES ssl_sslv2=NO ssl_sslv3=NO # 控制客户端是否需要提供证书 require_ssl_reuse=NO
保存并关闭文件。
步骤 3:重启 vsftpd 服务
sudo systemctl restart vsftpd
步骤 4:客户端连接 (以 FileZilla 为例)
- 新建站点。
- 协议: 选择 "FTP - 文件传输协议"。
- 主机: 你的服务器 IP。
- 用户名:
ftpuser。 - 密码: 你的密码。
- 端口: 21。
- 点击 "连接" 按钮。
- 如果一切正常,FileZilla 会弹出一个 "证书警告" 对话框,因为我们是自签名证书,点击 "确定" 或 "始终接受" 即可。
- 在弹出的 "要求安全连接" 对话框中,选择 "要求显式 FTP over TLS"。
你的所有登录和文件传输都将在加密通道中进行。
使用 ProFTPD (替代方案)
如果你觉得 vsftpd 配置不够灵活,可以尝试 ProFTPD。
步骤 1:安装 ProFTPD
# Debian/Ubuntu sudo apt install proftpd # CentOS/RHEL/Fedora sudo yum install proftpd # 或 sudo dnf install proftpd
步骤 2:基本配置
ProFTPD 的配置文件是 /etc/proftpd/proftpd.conf,你可以直接编辑它,或者更推荐地,在 /etc/proftpd/conf.d/ 目录下创建独立的配置文件。
# 编辑主配置文件 sudo nano /etc/proftpd/proftpd.conf
一个简单的配置示例:
# 以 standalone 模式运行(推荐)
ServerType standalone
# 服务器标识
ServerName "My ProFTPD Server"
ServerIdent on "FTP Server Ready."
# 禁止匿名登录
<Anonymous ~ftp>
User ftp
Group nogroup
# 用户进入目录后看到的欢迎信息
UserAlias anonymous ftp
DirFakeUser on ftp
DirFakeGroup on ftp
RequireValidShell off
# 用户权限
<Limit WRITE>
DenyAll
</Limit>
</Anonymous>
# 允许本地用户登录
DefaultRoot ~
步骤 3:启动并设置防火墙
# 启动服务 sudo systemctl start proftpd sudo systemctl enable proftpd # 防火墙规则 (和 vsftpd 类似) # UFW sudo ufw allow 21/tcp sudo ufw allow 10000:10100/tcp sudo ufw reload # firewalld sudo firewall-cmd --permanent --add-service=ftp sudo firewall-cmd --reload
ProFTPD 的配置非常灵活,支持模块化扩展,你可以根据官方文档深入研究其高级功能。
总结与排错
| 步骤 | vsftpd (推荐) | ProFTPD |
|---|---|---|
| 安装 | sudo apt install vsftpd |
sudo apt install proftpd |
| 主配置文件 | /etc/vsftpd.conf |
/etc/proftpd/proftpd.conf |
| 创建用户 | sudo useradd -m -s /sbin/nologin ftpuser |
同左 |
| 防火墙 | 开放 21 和被动端口范围 | 同左 |
| 启动服务 | sudo systemctl start vsftpd |
sudo systemctl start proftpd |
常见问题排查
-
连接被拒绝 (Connection refused)
- 原因: vsftpd/proftpd 服务未启动,或防火墙阻止了 21 端口。
- 解决: 检查服务状态
sudo systemctl status vsftpd,并确认防火墙规则正确。
-
530 Login incorrect
- 原因: 用户名或密码错误。
- 解决: 确认用户名和密码是否正确,检查用户是否被锁定(
sudo passwd -S ftpuser)。
-
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
- 原因: 在较新版本的 vsftpd 中,当用户被限制在家目录时,该目录不能被写入。
- 解决: 在
/etc/vsftpd.conf中设置allow_writeable_chroot=YES。
-
425 Security: Bad IP connecting
- 原因: 通常是由于被动模式的端口范围没有在防火墙中开放,或者客户端无法连接到服务器报告的 IP 地址(可能是内网 IP)。
- 解决: 检查防火墙规则,确保被动端口范围(如 10000-10100)已开放,在客户端尝试使用服务器的公网 IP 进行连接。
希望这份详细的指南能帮助你成功搭建 FTP 服务器!如果遇到任何问题,欢迎随时提问。
