FTP 被动模式 (PASV) 详解
在 Linux 环境下配置 FTP 服务时,被动模式 (Passive Mode) 是解决防火墙和 NAT(网络地址转换)导致连接失败的关键技术。
什么是 FTP 被动模式?
FTP 协议在传输数据时会建立两个独立的通道:
- 命令通道 (Command Channel):用于发送指令(如
ls,get,put),默认使用 21 端口。 - 数据通道 (Data Channel):用于实际传输文件内容或目录列表。
在 被动模式 (PASV) 下,数据通道的建立是由客户端主动发起的,客户端通过命令通道询问服务器:“请告诉我你应该在哪个端口接收数据?”服务器返回一个高位端口号,然后客户端连接该端口。
主动模式 (Active) vs 被动模式 (Passive)
| 特性 | 主动模式 (Active/PORT) | 被动模式 (Passive/PASV) |
|---|---|---|
| 数据连接发起方 | 服务器连接客户端 |
客户端连接服务器 |
| 客户端要求 | 客户端必须开放端口并允许外部连接 | 客户端只需能访问互联网 |
| 防火墙友好度 | 对客户端防火墙极不友好 | 对客户端非常友好 |
| 服务器要求 | 服务器只需开放 21 端口 | 服务器需开放 21 端口及一段随机端口范围 |
核心结论:在现代互联网环境下,由于大多数用户处于路由器(NAT)或防火墙之后,被动模式是目前最常用的连接方式。
Linux (vsftpd) 配置被动模式步骤
以最常用的 vsftpd 为例,配置被动模式需要明确指定端口范围和服务器的公网 IP。
修改配置文件
编辑 /etc/vsftpd.conf 文件:
sudo vi /etc/vsftpd.conf
添加或修改以下参数
在文件中添加以下配置项:
- 启用被动模式:
pasv_enable=YES - 设置被动模式端口范围(非常重要,用于防火墙放行):
pasv_min_port=30000
pasv_max_port=31000 - 设置服务器的公网 IP(如果服务器在云端或 NAT 后):
pasv_address=你的服务器公网IP - 强制使用被动模式(可选):
pasv_addr_resolve=YES
重启服务
保存退出后,重启 vsftpd 使配置生效:
sudo systemctl restart vsftpd
防火墙配置
配置了被动模式端口范围后,必须在服务器的防火墙中放行这些端口,否则客户端会卡在“正在获取目录列表”或“连接超时”阶段。
使用 firewalld (CentOS/RHEL)
# 放行 FTP 命令端口 sudo firewall-cmd --permanent --add-service=ftp # 放行被动模式定义的端口范围 sudo firewall-cmd --permanent --add-port=30000-31000/tcp # 重新加载防火墙 sudo firewall-cmd --reload
使用 ufw (Ubuntu/Debian)
# 放行 FTP 命令端口 sudo ufw allow 21/tcp # 放行被动模式定义的端口范围 sudo ufw allow 30000:31000/tcp # 重新加载防火墙 sudo ufw reload
常见问题排查
-
现象:能登录,但执行
ls或dir时卡住/报错- 原因:命令通道连接成功,但数据通道被防火墙拦截。
- 检查点:
- 是否在
vsftpd.conf中设置了pasv_min_port和pasv_max_port? - 服务器防火墙(iptables/firewalld/ufw)是否放行了该范围?
- 云服务器厂商(如简米云、AWS)的安全组是否放行了该范围?
- 是否在
-
现象:报错 “Failed to retrieve directory listing”
- 原因:服务器返回给客户端的 IP 地址是内网 IP,导致客户端无法连接。
- 检查点:
- 必须在
vsftpd.conf中配置pasv_address=你的公网IP。
- 必须在
-
现象:连接超时
- 检查点:
- 确认 21 端口是否正常工作。
- 确认网络路径上是否存在拦截高位端口的中间设备。
- 检查点:
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/493474.html
![[java漫谈系列153]ftp主动模式和被动(PASV)模式](https://i0.hdslb.com/bfs/archive/f77a66f62e02ee26a3f489464fdf79e6ac21e444.png)


