FTP服务器的两种工作方式是主动模式(PORT)和被动模式(PASV),区别在于数据连接由服务器主动建立还是客户端主动建立,这直接影响防火墙穿越和连接成功率。绝大多数连接失败问题,都出在这两种模式的选择上,下面把这两种方式彻底讲透,顺便告诉你什么场景该用哪一种,以及怎么在主流软件里手动切换。
FTP主动模式(PORT)和被动模式(PASV)的核心区别在哪
FTP协议本身用TCP协议,而且一上来就占用两个通道:控制连接和数据连接,控制连接永远由客户端主动连服务器的21端口,这个没得选,真正有分歧的是数据连接的建立方向。
主动模式:服务器反过来连客户端
主动模式的流程,行业共识认为可以拆成三步看:
- 客户端从自己的随机端口(比如1025)连上服务器的21端口,控制连接建立。
- 客户端告诉服务器:“我在自己的IP地址的1026端口等你传数据。”
- 服务器收到后,主动从自己的20端口发起一条新连接,去连客户端的1026端口。
这里的关键词是服务器主动,数据连接的发起方向是从服务器到客户端,这就是“主动模式”名字的来历,早期互联网是服务器多、客户端少,这种模式天然合理。
但主动模式有个致命伤:客户端必须开放一个入站端口等着服务器来连,现在的Windows和MacOS几乎都内置防火墙,家用路由器默认拦截入站连接,你在内网还能通,一放到公网上,十有八九连不上或者连上后卡在列目录那一步。
被动模式:客户端主动连服务器的随机数据端口
被动模式把剧本倒过来写:
- 客户端照旧先连服务器的21端口。
- 客户端发出一条PASV指令,明确说:“我不接受你主动连我,请你告诉我一个空闲端口,我自己来连。”
- 服务器回复:“好的,我用端口20008,你连过来吧。”
- 客户端再发起一条到服务器20008端口的新连接,数据通道建立。
被动模式把主动权交还给客户端,服务器只需要开放监听端口即可,对客户端的防火墙和NAT环境极为友好,因为你只需要出站连接,而出站连接在绝大多数网络里是默认放行的。

主动端口和被动端口范围,配置时如何规划
这里有一个普遍存在的误解:FTP服务器只开21端口就够了,真实情况是,无论哪种模式,数据通道都需要额外的端口,区别只在谁出端口。
主动模式需要开放的端口
- 服务器侧:21端口(控制)+ 20端口(数据专用),服务器只从20端口发起数据连接,所以服务器防火墙放行TCP 20出站和入站都可。
- 客户端侧:需要开放一个高位端口段供服务器回连,这个端口范围取决于客户端操作系统动态分配,实际操作时很难精确预知,这也是主动模式在真实公网环境里越来越少见的原因。
被动模式需要开放的端口
被动模式的端口规划比主动模式清晰得多,因为服务器端可以定义一个狭窄的端口段。
| 方向 | 端口范围 | 用途 |
|---|---|---|
| 服务器入站 | 21/TCP | 控制连接 |
| 服务器入站 | 20000-20100/TCP | 被动数据连接(可自定义) |
| 客户端出站 | 全部高位端口 | 连接上述端口 |
主流FTP服务端软件(比如vsftpd、FileZilla Server)都允许你指定被动端口范围,以vsftpd为例,在配置文件中加两行:
pasv_min_port=20000
pasv_max_port=20100
然后防火墙放行这两行对应的范围,特别注意服务器返回给客户端的IP地址必须是客户端能访问到的地址,很多人在云服务器上配好了被动模式还是连不上,大概率是默认返回了内网IP,客户端根本路由不到,解决办法是加一行:
pasv_address=你的公网IP
对于FileZilla Server,在管理界面左下角的“被动模式设置”里直接填公网IP和端口范围即可。
FTP主动被动模式怎么选:不同场景下的最优解
你不需要每次都纠结,直接按使用场景对号入座。

家用网络环境和纯内网使用:主动模式更省事
如果服务器和客户端都在同一个局域网,没有防火墙拦截,主动模式完全够用,配置最简,局域网内部没有NAT转换,服务器可以轻松找到客户端IP,这种情况在测试环境、开发调试里非常常见,速度也更快。
公网云服务器和跨网络传输:被动模式是唯一选择
现在绝大部分云服务器厂商(据行业公开信息)默认都只开放少数入站端口,而且安全组规则里根本不可能为每个客户端随意开端口,被动模式只需要在安全组里放行一个固定的端口范围,配合pasv_address指向公网IP,就能稳定工作。
如果在公网环境实在搞不定被动模式,还有一个妥协方案用SFTP(SSH File Transfer Protocol)替代FTP,SFTP只占用22端口,单连接搞定认证和数据传输,不需要额外的数据端口,但要注意SFTP和FTP是两种协议,客户端软件得支持(FileZilla、WinSCP都原生支持),业内专家指出,对于新上线的项目,如果不强制要求兼容老旧的FTP客户端,直接上SFTP能规避掉大部分端口问题。
可视化管理面板里的默认选择
很多国内面板(如宝塔、WDCP)在创建FTP账户时,默认使用被动模式,并会自动放行一段端口范围,如果你自己手动禁用了被动模式,记得把数据端口同步调整,否则就会出现在面板管理页面能看到文件列表,但上传下载一直超时的怪现象。
两种模式的速度有没有差别
这是用户问得最多的:被动模式会不会因为多一次连接而变慢?
实际传输速率上,两种模式没有本质区别,TCP建连的开销只有毫秒级,对几GB的文件传输来说可以忽略不计,如果非要找细微差别,极端情况下主动模式可能略占优因为服务器主动建连时,中间少了一次PASV命令和响应交互,但这个差距在真实网络环境里你根本感知不到,瓶颈永远在磁盘读写速度和带宽上。
FTP服务器连接失败的排查思路
如果你现在正被FTP连接问题困扰,按这个顺序排查,别盲目调。
- 确认客户端能ping通服务器IP,不通先查网络层面。
- 用被动模式连接一次,如果被动能通主动不通过,基本锁定是防火墙拦截了入站数据连接。
- 检查服务器返回的PASV地址,看是否返回了0.0.0.0或内网IP,这是云服务器最常见的坑。
- 看服务器日志,vsftpd的日志位于
/var/log/vsftpd.log,FileZilla Server日志在管理界面“消息”标签页里能看到完整的握手过程。 - 测试完所有可能原因后,可以尝试用winscp的“隧道”功能,它的被动模式故障诊断比大多数工具都详细。

客户端工具里怎么切换主动和被动模式
不同工具路径不一样,说三个常用的。
- FileZilla Client(桌面客户端):顶部菜单栏“编辑” → “设置” → 连接 → FTP → 被动模式,右侧勾选“被动”或“主动”,连接信息栏会显示
状态:连接中,使用被动模式...来判断当前生效的模式。 - WinSCP:登录时选择“FTP协议”,下拉“加密”选择“不加密”,然后在“高级” → “连接” → “FTP” → “被动模式”和“主动模式”里二选一。
- 命令行ftp命令:Windows自带的ftp命令默认主动模式,想切到被动模式,在ftp提示符下输入
passive命令回车,看到提示“被动模式:开启”即为生效。
常见问题解答
FTP主动模式和被动模式连接不上时,先改模式有没有用
有时有用,绝大多数连接失败场景集中在主动模式被NAT或防火墙阻断,切换到被动模式并确保服务器返回正确的公网IP,能解决大部分问题,如果改用被动模式后依然超时,问题大概率出在服务器的被动端口范围未放行或返回地址错误。
主动模式和被动模式可以同时开放吗
可以,绝大多数FTP服务器软件允许两种模式同时启用,客户端根据自己的配置自动选择,实际运行中,服务器会在收到PORT命令时走主动,收到PASV命令时走被动,两者互不冲突,出于安全考虑,如果确认所有客户端都支持被动,建议只开启被动模式,减少端口暴露面。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/789786.html


评论列表(3条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于端口的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
@狗老8648:读了这篇文章,我深有感触。作者对端口的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于端口的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!