1. 先确认是否真的需要 FTP 服务#
只给自己上传网站文件,直接使用基于 SSH 的 SFTP更简单。只有旧软件或业务流程明确要求 FTP/FTPS 时,再搭建独立服务。普通 FTP 默认不加密账户和数据;公网场景应使用带 TLS 的 FTPS,并限制用户目录。
FTP 的控制连接与数据连接分开,能登录却列不出目录,常见原因就是被动端口或 NAT 配置不完整。
2. 在 Ubuntu 上安装并备份配置#
以下以发行版软件源中的 vsftpd 为例,先在测试实例验证,不要同时安装多个占用 21 端口的 FTP 服务。
sudo apt update
sudo apt install vsftpd
sudo cp -a /etc/vsftpd.conf /etc/vsftpd.conf.before-local-change
systemctl status vsftpd创建专用上传账户,使用独立目录,不给 sudo 权限。目录可以分成不可写的隔离根目录和可写的 uploads 子目录,避免为了 chroot 报错就让用户可写整个隔离根。
3. 配置账户隔离和 TLS#
在现有配置基础上确认匿名登录关闭、允许指定本地用户、写入权限和 chroot 策略。再为 FTPS 配置有效证书与私钥,并要求登录和数据连接使用 TLS。证书路径和 TLS 选项应以当前 vsftpd 手册为准,不要沿用过期教程中的 SSLv2/SSLv3 设置。
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
ssl_enable=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES这些只是需要核对的配置项,不是可直接覆盖整份文件的完整模板。还必须设置实际证书路径、允许用户范围与目录权限。私钥应只允许服务所需账户读取。
4. 给被动模式一个明确端口范围#
例如使用 40000–40010 作为小规模测试的被动端口范围,在 vsftpd 中配置对应最小/最大值,并在服务器与上游防火墙放行 TCP 21 和这段范围,尽量限制来源 IP。服务器位于 NAT 后面时,还需按环境设置对外公布的地址。
不要只开放 21 后就关闭防火墙排错。每个并发数据连接会占用端口,范围要与预期并发匹配,但也不应无目的开放上万个端口。
5. 使用客户端验证上传和隔离#
客户端选择“显式 FTP over TLS/显式 FTPS”,核对证书域名,不要忽略证书错误。依次测试登录、列目录、上传小文件、下载并比对内容,以及尝试访问上级目录是否被限制。
sudo ss -lntp
sudo journalctl -u vsftpd --since '10 minutes ago' --no-pager能登录但传输超时,查被动端口和公布地址;认证失败,查用户策略;权限错误,查目录所有者与写入权限。上线后保留登录审计与更新机制,停用不再需要的账户。若只是临时迁移文件,结束后停止 FTP 服务并撤销临时端口规则。
完成后检查
不要向普通 FTP 用户提供系统管理员权限。需要网站更新权限时仅授权对应目录。