核心概念:FTP vs. SFTP
在开始之前,请务必理解一个重要区别:

- FTP (File Transfer Protocol): 是一种传统的文件传输协议,它最大的问题是所有数据(包括用户名和密码)都以明文形式传输,非常不安全。强烈建议使用 FTPS (FTP over SSL/TLS) 来加密连接。
- SFTP (SSH File Transfer Protocol): 它是 SSH (Secure Shell) 协议的一部分,通过加密的 SSH 通道进行文件传输,它不是 FTP,但通常被用作安全的文件传输替代方案,如果只是需要安全地传输文件,SFTP 通常是更好的选择。
本指南将重点介绍如何安装和配置 安全的 vsftpd (FTPS)。
安装和配置 vsftpd (Very Secure FTP Daemon)
vsftpd 是一个在 Linux 上最流行、最安全、最稳定的 FTP 服务器软件,我们将以 Ubuntu/Debian 和 CentOS/RHEL 为例进行说明。
第一步:更新系统包
在安装任何新软件之前,最好先更新系统包列表。
对于 Ubuntu/Debian:

sudo apt update sudo apt upgrade -y
对于 CentOS/RHEL (使用 dnf):
sudo dnf update -y
第二步:安装 vsftpd
对于 Ubuntu/Debian:
sudo apt install vsftpd -y
对于 CentOS/RHEL:
sudo dnf install vsftpd -y
安装完成后,vsftpd 服务通常会自动启动,我们可以检查其状态:

sudo systemctl status vsftpd
如果看到 active (running),说明服务正在运行。
第三步:创建 FTP 用户
为了安全,我们不建议使用 root 用户或系统已有的用户来登录 FTP,我们创建一个专门的用户 ftpuser。
# 创建新用户 sudo adduser ftpuser # 为用户设置密码 (系统会提示你输入并确认密码) sudo passwd ftpuser
这个用户的主目录(/home/ftpuser)将是它的 FTP 默认根目录。
第四步:配置 vsftpd
这是最关键的一步。vsftpd 的主配置文件是 /etc/vsftpd.conf。
-
备份原始配置文件(这是一个好习惯):
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
-
编辑配置文件:
sudo nano /etc/vsftpd.conf
(或者使用
vim) -
修改以下关键配置项:
-
允许匿名用户登录? (默认不允许,更安全)
anonymous_enable=NO -
允许本地用户登录? (我们刚刚创建的
ftpuser就是本地用户)local_enable=YES -
允许用户上传文件? (默认只允许下载)
write_enable=YES -
限制用户在自己的主目录内 (非常重要!防止用户通过
cd ..浏览系统文件)chroot_local_user=YES -
启用 SSL/TLS 加密 (强烈推荐,实现 FTPS)
# 启用 SSL ssl_enable=YES # 强制所有数据连接使用加密 force_local_data_ssl=YES force_anon_data_ssl=YES # 强制所有控制连接使用加密 force_local_logins_ssl=YES force_anon_logins_ssl=YES # 指定 SSL 证书和私钥文件 # 如果没有,可以自己生成一个 (见下一步) rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key注意: 上述证书路径是 Ubuntu/Debian 系统自带的测试证书,CentOS/RHEL 系统可能没有,你需要自己生成。
-
允许被动模式 (由于防火墙和 NAT 的存在,被动模式通常是必须的)
pasv_enable=YES pasv_min_port=10020 pasv_max_port=10040这里我们指定了被动模式的端口范围,方便在防火墙中放行。
-
-
保存并退出 (在
nano中是Ctrl+X,然后按Y,再按Enter)。
第五步:处理防火墙和 SELinux
为了让外部机器能够访问 FTP 服务器,必须开放相应的端口。
对于 Ubuntu/Debian (使用 UFW):
# 开放 21 端口 (FTP控制端口) sudo ufw allow 21/tcp # 开放我们配置的被动模式端口范围 sudo ufw allow 10020:10040/tcp # 重新加载防火墙规则 sudo ufw reload
对于 CentOS/RHEL (使用 FirewallD):
# 开放 21 端口 sudo firewall-cmd --permanent --add-service=ftp # 开放我们配置的被动模式端口范围 sudo firewall-cmd --permanent --add-port=10020-10040/tcp # 重新加载防火墙规则 sudo firewall-cmd --reload
如果使用的是 CentOS/RHEL,还需要处理 SELinux: SELinux 默认可能会阻止 FTP 服务的文件写入。
# 设置 SELinux 布局,允许 FTP 用户写入其主目录 setsebool -P ftpd_full_access on
第六步:重启 vsftpd 服务
应用所有配置更改:
sudo systemctl restart vsftpd
第七步:测试连接
-
获取虚拟机的 IP 地址:
ip addr
找到你的网络接口(如
ens33或eth0),其inet后面的地址就是 IP 地址。 -
使用 FTP 客户端连接:
- 在你的 Windows/macOS 主机上打开一个 FTP 客户端(如 FileZilla, WinSCP 等)。
- 主机: 填入虚拟机的 IP 地址。
- 端口:
21 - 用户名:
ftpuser - 密码: 你为
ftpuser设置的密码。 - 加密: 选择 "要求显式 FTP over TLS" (Explicit FTPS),这是对应
force_local_logins_ssl=YES的设置。
如果连接成功,并且能够看到文件,就说明配置成功了!
安装和配置 ProFTPD
ProFTPD 是另一个功能强大且配置灵活的 FTP 服务器,有些人更喜欢它的配置语法。
第一步:安装 ProFTPD
对于 Ubuntu/Debian:
sudo apt install proftpd -y
安装过程中可能会弹出一个对话框,询问是作为独立服务器还是从 inetd 运行,选择 "standalone" 并点击 OK。
对于 CentOS/RHEL:
sudo dnf install proftpd -y
第二步:配置 ProFTPD
ProFTPD 的配置文件是 /etc/proftpd/proftpd.conf。
-
备份并编辑文件:
sudo cp /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.bak sudo nano /etc/proftpd/proftpd.conf
-
修改关键配置:
-
服务器名称 (可选)
ServerName "My FTP Server" -
监听地址 (可选,默认监听所有)
# DefaultAddress 0.0.0.0 -
允许匿名用户?
<Anonymous ~ftp> User ftp Group nogroup # ... UserAlias anonymous ftp <Limit LOGIN> DenyAll </Limit> </Anonymous>将
<Anonymous>部分注释掉或删除,以禁用匿名登录。 -
允许本地用户
DefaultRoot ~这行配置和
vsftpd的chroot_local_user=YES类似,限制用户在自己的主目录。 -
启用 TLS/SSL
<IfModule mod_tls.c> TLSEngine on TLSProtocol TLSv1.2 TLSv1.3 TLSRequired on TLSRSACertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem TLSRSACertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key TLSCACertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem </IfModule>确保这些配置没有被注释掉,并指向正确的证书文件。
-
-
保存并退出。
第三步:防火墙和 SELinux
配置与 vsftpd 类似。
对于 Ubuntu/Debian (UFW):
sudo ufw allow 21/tcp sudo ufw allow 60000:61000/tcp # ProFTPD 默认被动端口范围 sudo ufw reload
对于 CentOS/RHEL (FirewallD):
sudo firewall-cmd --permanent --add-service=ftp sudo firewall-cmd --permanent --add-port=60000-61000/tcp sudo firewall-cmd --reload setsebool -P ftpd_full_access on
第四步:重启并测试
sudo systemctl restart proftpd
然后使用与 vsftpd 相同的方法进行测试。
总结与排错
- 首选 vsftpd:对于绝大多数用户,
vsftpd是简单、安全且稳定的选择。 - 安全第一:始终使用 FTPS 或 SFTP,避免使用明文 FTP。
- 端口问题:如果连接超时,首先检查防火墙是否开放了
21端口和被动模式的端口范围。 - 权限问题:如果用户无法上传或下载文件,检查目录和文件的权限,确保 FTP 用户对其主目录有读写执行 (
rwx) 权限。 - SELinux:在 CentOS/RHEL 系统上,SELinux 是排错时必须考虑的因素,使用
setsebool -P ftpd_full_access on是一个快速解决权限问题的方法。 - 日志:如果遇到问题,查看日志文件是关键。
vsftpd日志通常在/var/log/vsftpd.log。proftpd日志通常在/var/log/proftpd/proftpd.log。- 系统日志也可能包含相关信息:
/var/log/syslog(Ubuntu) 或/var/log/messages(CentOS)。
