被动模式解决什么问题
FTP 用两条连接:21 端口的控制连接负责命令,数据连接负责目录列表与文件内容。主动模式下由服务器反向连回客户端,遇到 NAT 与客户端防火墙基本无法通过;被动模式改为服务器开一个临时端口等客户端来连,因此成为现代客户端与浏览器的默认选择。EPSV 是被动模式的 IPv6 友好版本,只用端口号而不再传 IP。
基本信息
| 控制连接 | 固定 TCP 21(FTPS 显式模式仍为 21,隐式模式为 990) |
|---|---|
| 数据连接 | 每次传输临时建立,端口由 PASV 或 EPSV 应答给出 |
| 服务端端口范围 | vsftpd 用 pasv_min_port / pasv_max_port 固定,Pure-FTPd 用 PassivePortRange |
| 客户端行为 | 现代客户端与浏览器默认被动,主动模式需显式开启 |
模式对照
| 模式 | 命令 | 连接方向 |
|---|---|---|
| 主动(PORT) | PORT h1,h2,h3,h4,p1,p2 | 服务器 → 客户端高位端口 |
| 被动(v4) | PASV | 客户端 → 服务器临时端口 |
| 扩展被动 | EPSV | 客户端 → 服务器临时端口(不传 IP) |
| 强制扩展被动 | EPSV ALL | 其后的会话只接受 EPSV,拒绝 PORT 与 PASV |
被动数据连接全过程
被动数据连接全过程
C: PASV
S: 227 Entering Passive Mode (203,0,113,9,195,80)
# 括号内六个数:前四是 IP,后两位算端口 195*256+80=50000
C: (客户端连 203.0.113.9:50000)
C: LIST
S: 150 Here comes the directory listing.
S: 226 Directory send OK.
# 226 表示数据连接正常结束;425 表示数据连接没能建立典型使用场景
- 客户端在 NAT 后面时首选被动模式,避免服务器回连被拦
- 防火墙只允许 21 出站时,需要在服务端固定被动端口范围并放行
- IPv6 环境用 EPSV,某些老客户端不支持 EPSV 时需要回退处理
- 排查「登录成功但列目录卡死」:直接看数据连接是否建立
服务端应固定被动端口范围并同步放行防火墙与云安全组,否则登录与控制命令都正常,只有 LIST、RETR、STOR 会一直挂到超时,是最经典的 FTP 假故障。
部分云负载均衡与容器环境需要额外处理:把被动端口段一并发布到 LB,或改用 FTPS、SFTP 等单连接协议彻底绕开双连接问题。