FTP协议的主动模式和被动模式 有啥区别?
首先明确一点:
所谓的主动和被动是发生在数据连接阶段,而控制连接时是没有区别的
理解这两种模式的前提是知道FTP协议使用两个独立的TCP连接:
-
控制连接:始终由客户端主动向服务器的21端口发起,用于传输FTP命令(如LIST, RETR)和响应。这个连接在整个会话期间保持打开。
-
数据连接:用于实际传输文件内容或目录列表。这个连接的建立方式,就是主动模式和被动模式区别的根本所在。
下面针对 数据连接的主动模式和被动模式进行说明
一、主动模式
在主动模式下,数据连接由服务器主动发起,连接到客户端指定的一个端口。
工作流程(以客户端下载文件为例):
建立控制连接:客户端随机开启一个端口(例如 1025),连接到FTP服务器的21端口。
客户端告知端口:客户端通过控制连接发送 PORT 命令给服务器。该命令包含客户端的IP地址和一个客户端临时开启的、用于数据连接的端口号(例如 1026)。
命令格式类似:PORT 192,168,1,100,4,2(IP: 192.168.1.100,端口: 4*256+2=1026)。
为什么是4乘以256 ?
这是FTP协议内写好的规则。
服务器发起数据连接:当需要传输数据(如LIST或RETR命令)时,服务器从自己的20端口(传统约定,非强制)主动向客户端在PORT命令中指定的IP和端口(192.168.1.100:1026)发起连接。
数据传输:数据连接建立成功后,通过此连接传输文件或列表。
示意图
客户端 (端口: 1025, 1026) 服务器 (端口: 21, 20)
|--- 控制连接 (客户端:1025 -> 服务器:21) --->| (建立会话)
|<- 欢迎消息 ------------------------------|
|--- PORT 192,168,1,100,4,2 -------------->| (告诉服务器"请连接我的1026端口")
|(客户端在1026端口上监听等待) |
| |--- 数据连接 (服务器:20 -> 客户端:1026) --->| (服务器主动连接)
|<- 目录列表/data --------------------------| (通过数据连接传输)
优点:
服务器配置简单,符合FTP的原始设计。
缺点与问题:
客户端防火墙问题:客户端的防火墙会看到一个来自外部服务器20端口的入站连接请求,如果防火墙策略严格,通常会阻止此连接,导致无法建立数据连接,出现"Connection timed out"或"425 Can't open data connection"错误。
客户端NAT问题:如果客户端处于路由器/NAT之后,它发送给服务器的IP(如192.168.1.100)是私有地址,服务器无法直接路由到该地址,导致连接失败。
结论:主动模式在现代互联网环境下(客户端普遍位于防火墙或NAT后)很难正常工作。
二、被动模式
为了解决主动模式的问题,被动模式被引入。在这种模式下,数据连接由客户端主动发起,连接到服务器指定的一个端口。
工作流程(同样以下载文件为例):
建立控制连接:与主动模式相同,客户端连接到服务器的21端口。
客户端发起被动请求:客户端通过控制连接发送 PASV 命令给服务器。
服务器告知端口:服务器收到PASV命令后,会在自己的主机上临时开启一个随机的高位端口(例如 2024),并通过控制连接将服务器的IP和这个端口号告诉客户端。响应格式类似:227 Entering Passive Mode (192,168,5,10,7,232)(IP: 192.168.5.10,端口: 7*256+232=2024)。
客户端发起数据连接:客户端从自己的一个随机端口(例如 1027)主动向服务器告知的IP和端口(192.168.5.10:2024)发起连接。
数据传输:数据连接建立成功后,进行数据传输。
示意图:
客户端 (端口: 1025, 1027) 服务器 (端口: 21, 2024)
|--- 控制连接 (客户端:1025 -> 服务器:21) --->| (建立会话)
|<- 欢迎消息 ------------------------------|
|--- PASV -------------------------------->| (请求进入被动模式)
|<- 227 Entering Passive Mode (...,7,232) -| (服务器说:"请连接我的2024端口")
|--- 数据连接 (客户端:1027 -> 服务器:2024) ->| (客户端主动连接服务器)
|<- 目录列表/data --------------------------| (通过数据连接传输)
优点:
解决了客户端防火墙/NAT问题:由于数据连接是由客户端向外发起的,这符合常见防火墙"允许内部主机发起外出连接"的规则,穿越NAT也更容易。
对客户端网络环境更友好。
缺点与问题:
服务器端防火墙问题:服务器需要在防火墙上开放一大段随机的高位端口以供被动模式使用,安全策略配置更复杂。
服务器安全风险:开放大量端口增加了被攻击的面。
结论:被动模式是现代FTP客户端(如FileZilla, WinSCP)的默认模式,也是互联网环境下最常用、兼容性最好的模式。
对比总结
特性 主动模式 被动模式
英文名称 Active Mode / PORT Mode Passive Mode / PASV Mode
数据连接发起方 服务器 主动连接客户端 客户端 主动连接服务器
关键命令 PORT PASV
服务器数据端口 通常为 20 一个随机的高位端口 (如 1024-65535)
客户端角色 在指定端口监听等待服务器连接 主动连接服务器指定的端口
主要问题 客户端防火墙/NAT会阻挡入站连接 服务器防火墙需要开放大量端口
适用场景 服务器要求使用,或客户端位于无防火墙的公网 现代网络默认选择,客户端位于防火墙/NAT后
在实际应用中的选择
FTP客户端(如浏览器、资源管理器、专业FTP工具)默认都会尝试使用被动模式。如果失败,可能会提示"切换到主动模式"或"PASV模式失败"。
服务器管理员需要根据网络环境配置FTP服务端(如vsftpd, FileZilla Server)。在被动模式下,通常需要指定一个端口范围(如 50000-55000),并在服务器的防火墙中放行这个范围。
在一些高度安全限制的内网或特定企业环境中,可能会强制使用主动模式。
简而言之,被动模式是为适应现代网络环境(客户端受保护)而生的解决方案,是目前绝大多数FTP会话采用的方式。
对比总结

在实际应用中的选择
FTP客户端(如浏览器、资源管理器、专业FTP工具)默认都会尝试使用被动模式。如果失败,可能会提示"切换到主动模式"或"PASV模式失败"。
服务器管理员需要根据网络环境配置FTP服务端(如vsftpd, FileZilla Server)。在被动模式下,通常需要指定一个端口范围(如 50000-55000),并在服务器的防火墙中放行这个范围。
在一些高度安全限制的内网或特定企业环境中,可能会强制使用主动模式。
简而言之,被动模式是为适应现代网络环境(客户端受保护)而生的解决方案,是目前绝大多数FTP会话采用的方式。
案例
ftp server (172.16.54.100) ---- Cisco ASA firewall --- client (10.248.1.100)
被动模式
客户端连接 FTP SERVER成功,但是无法传输文件
通过在ASA上抓包发现,数据连接的报文被防火墙drop
检查ASA的策略,发现ASA上放行了client到ftp server的21
access-list out-in line 11 extend permit tcp host 10.284.1.100 host 172.16.54.100 eq ftp
通过capture抓包发现,数据连接的报文被ASA drop,原因是并没有明细的放行策略.
那么ASA上应该如何放行? 因为被动模式下, FTP SERVER的数据端口是1个随机的高位端口。
有1个办法是permit ip any any ,但这样缺点显而易见,所有端口开放,风险太高。
解决方法:
在ASA上启用inspect ftp后,就可以实现数据连接正常了
命令如下:
policy-map global_policy
class inspection_default
inspect ftp
这个inspect ftp是个啥功能?
一句话:
本质上就是一种 ALG(应用层网关) 功能, 它是 ASA算法中应用层检查机制的一部分,专门用于解决 FTP 协议在防火墙/NAT 环境下的特殊问题。
详细解释:
- 问题所在
如前所述,FTP 协议(特别是主动模式)会在控制连接中通过 PORT 或 PASV 命令明文传输 IP 地址和端口号。
主动模式:PORT 192,168,1,100,4,2(IP:192.168.1.100,端口:1026)
被动模式:227 Entering Passive Mode (10,1,1,1,15,100)(IP:10.1.1.1,端口:3940)
这些信息是数据连接的"寻址指令"。如果没有 ALG,防火墙会出现以下问题:
NAT 问题:如果客户端在内部私有网络(如 192.168.1.100),服务器在公网,客户端发送的 PORT 命令里是它的私有 IP,公网服务器无法路由回来。
安全策略问题:防火墙会看到服务器尝试主动连接到一个内部端口(主动模式),但这个连接并没有明确的安全策略允许。
- inspect ftp(FTP ALG)如何工作
当启用 inspect ftp 后,ASA 会执行以下关键操作:
a. 动态修改 FTP 命令/响应中的 IP 和端口
对于出站连接(内部客户端访问外部服务器):
当 ASA 看到 PORT 192,168,1,100,4,2 时,它会将内部的私有 IP 地址(192.168.1.100)替换为 ASA 外部接口的公有 IP,并可能同时进行端口转换。
同时,ASA 自动在状态表中创建一条临时通道(pinhole),允许外部服务器返回到这个转换后端口的数据连接。
b. 动态创建临时访问规则
对于主动模式,ASA 会自动允许外部服务器发起的、到那个特定转换端口的数据连接,而无需管理员在 ACL 中手动配置 permit tcp host <server> eq 20 host <asa-outside> range ... 这样的复杂规则。
这解决了 FTP 数据连接与状态化防火墙的矛盾:数据连接是由会话的另一方(服务器)发起的,而不是初始发起方(客户端)。
c. 同时支持主动和被动模式
inspect ftp 会解析 PORT 和 PASV 命令,因此能处理两种模式。
对于被动模式,当服务器返回 227 响应包含其 IP 和端口时,ASA 也会进行必要的 NAT 处理,并确保数据连接能被正确建立。
- 在 Cisco ASA 上的配置
这是典型的默认或基础配置:
cisco
! 在全局策略或特定策略映射中启用 FTP 检查
policy-map global_policy
class inspection_default
inspect ftp ! 这就是 FTP ALG
如果没有它,FTP 协议在穿越 ASA 时,很可能只有控制连接能建立,而数据连接会失败,出现诸如"425 Can't open data connection"的错误。
重要注意事项和局限性:
加密/隐式 TLS FTPS 问题:
inspect ftp 只对明文 FTP(端口 21)有效。
对于 FTPS(FTP over SSL/TLS) 或 SFTP(SSH File Transfer Protocol),控制信道是加密的,ASA 无法解析其中的 PORT/PASV 命令,因此 ALG 失效。
解决方案:使用 被动模式 + 固定被动端口范围,并在 ASA ACL 中静态放行服务器被动端口范围到客户端的流量。
与其他特性的交互:
在与 NAT、MPF(模块化策略框架)等结合使用时,需要确保配置顺序和位置正确。
安全考量:
ALG 需要对应用层流量进行深度检查,理论上可能引入复杂性。
现代部署中,更安全的 FTP 替代方案(如 SFTP, HTTPS)越来越普遍,这些协议不依赖 ALG。