在使用阿里云服务器配置 FTP 服务时,主被动模式(Active vs Passive Mode) 是一个常见问题,尤其是在涉及防火墙、安全组或 NAT 环境(如云服务器)时。以下是关于如何切换主被动模式的详细说明:
一、FTP 主动模式(Active Mode)与被动模式(Passive Mode)的区别
| 模式 | 数据连接方向 | 说明 |
|---|---|---|
| 主动模式 | 客户端开一个端口,服务器主动连接客户端 | 服务器从20端口连接到客户端指定端口,容易被客户端防火墙拦截 |
| 被动模式 | 服务器开一个端口,客户端连接服务器 | 服务器告诉客户端一个端口,客户端去连接,适合客户端在防火墙后 |
在阿里云等云服务器环境中,推荐使用被动模式(Passive Mode),因为主动模式通常会被客户端防火墙或服务器安全组阻止。
二、为什么需要切换为主动/被动模式?
- 主动模式失败原因:云服务器的安全组和客户端防火墙通常只开放了21端口(控制连接),但主动模式需要服务器反向连接客户端的随机高端口,这通常被阻止。
- 被动模式更可靠:数据连接由客户端发起,只需在服务器上开放控制端口 + 被动模式端口范围即可。
三、如何在 FTP 服务器中配置被动模式(以 vsftpd 为例)
1. 编辑 vsftpd 配置文件
sudo vim /etc/vsftpd/vsftpd.conf
2. 启用被动模式并设置参数
添加或修改以下内容:
# 启用被动模式
pasv_enable=YES
# 被动模式使用的端口范围(建议使用固定范围,便于配置安全组)
pasv_min_port=30000
pasv_max_port=31000
# 服务器公网 IP(重要!尤其当服务器有内网IP时)
pasv_address=你的阿里云服务器公网IP
# 可选:监听地址
listen=YES
listen_ipv6=NO
⚠️
pasv_address必须填写服务器的公网 IP,否则客户端获取的是内网 IP,无法连接。
3. 重启 vsftpd 服务
sudo systemctl restart vsftpd
四、配置阿里云安全组规则
登录 阿里云控制台:
- 进入 ECS 实例管理
- 找到你的实例,点击进入 安全组配置
- 添加以下规则:
| 协议类型 | 端口范围 | 授权对象 |
|---|---|---|
| TCP | 21 | 0.0.0.0/0 或指定IP |
| TCP | 30000-31000 | 0.0.0.0/0 或指定IP(用于被动模式数据连接) |
🔐 建议限制授权对象为可信 IP,避免全网开放。
五、客户端如何切换主被动模式?
FileZilla 客户端设置:
- 打开站点管理器
- 选择你的站点 → “传输模式” → 选择:
- 主动(Active)
- 被动(推荐)(Passive)
- 推荐选择 “被动”
命令行 FTP 工具:
ftp your-server-ip
ftp> passive # 输入此命令切换为被动模式
六、常见问题排查
| 问题 | 解决方案 |
|---|---|
| 连接后卡在列表目录 | 检查是否启用被动模式,安全组是否放行 pasv 端口 |
| 提示 “425 Failed to establish connection” | 通常是防火墙或 pasv_address 配置错误 |
| 只能登录不能传文件 | 检查数据连接端口是否开放 |
| 使用内网 IP 导致连接失败 | 确保 pasv_address 设置为公网 IP |
总结
✅ 阿里云服务器建议使用 FTP 被动模式
✅ 配置 pasv_enable, pasv_min/max_port, pasv_address
✅ 安全组开放 21 和 pasv 端口范围(如 30000-31000)
✅ 客户端设置为被动模式
如果你使用的是其他 FTP 服务(如 ProFTPD、Pure-FTPd),配置方式略有不同,欢迎提供具体信息,我可以给出对应配置方法。
需要我帮你生成完整的 vsftpd.conf 示例吗?
CDNK博客