# 确实需要 FTP 时如何限定访问范围

一般文件管理可以直接使用 SFTP。已有业务必须使用 FTP 时，需要同时考虑加密、被动端口、用户隔离和外部防火墙。

更新日期：2026-09-16

规范地址：https://stock.iftalking.com/guides/ftp-server/

## 1. 先确认是否真的需要 FTP 服务

只给自己上传网站文件，直接使用[基于 SSH 的 SFTP](https://stock.iftalking.com/guides/files-transfer/)更简单。只有旧软件或业务流程明确要求 FTP/FTPS 时，再搭建独立服务。普通 FTP 默认不加密账户和数据；公网场景应使用带 TLS 的 FTPS，并限制用户目录。

FTP 的控制连接与数据连接分开，能登录却列不出目录，常见原因就是被动端口或 NAT 配置不完整。

## 2. 在 Ubuntu 上安装并备份配置

以下以发行版软件源中的 vsftpd 为例，先在测试实例验证，不要同时安装多个占用 21 端口的 FTP 服务。

```bash
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 设置。

```ini
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”，核对证书域名，不要忽略证书错误。依次测试登录、列目录、上传小文件、下载并比对内容，以及尝试访问上级目录是否被限制。

```bash
sudo ss -lntp
sudo journalctl -u vsftpd --since '10 minutes ago' --no-pager
```

能登录但传输超时，查被动端口和公布地址；认证失败，查用户策略；权限错误，查目录所有者与写入权限。上线后保留登录审计与更新机制，停用不再需要的账户。若只是临时迁移文件，结束后停止 FTP 服务并撤销临时端口规则。


## 完成后检查

不要向普通 FTP 用户提供系统管理员权限。需要网站更新权限时仅授权对应目录。

## 参考资料

- [Ubuntu Server 文档](https://documentation.ubuntu.com/server/)
