FTP的主动模式与被动模式

本文详细介绍了FTP的主动模式和被动模式的工作原理,包括它们之间的主要区别、所需的防火墙配置以及各自的优缺点。通过对比两种模式,帮助读者理解如何在不同场景下选择合适的FTP工作模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. FTP主动模式

FTP客户端向服务器的FTP控制端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,客户端在命令链路上用PORT的命令告诉服务器我开放了某端口,你过来连接我。于是服务器从20端口向客户端的该端口发送连接请求,建立一条数据链路来传送数据。在数据链路建立过程中是服务器主动请求,所以称为主动模式。

针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:
1. 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)
2. FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口)
3. FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)
4. 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)

2. FTP被动模式

FTP客户端向服务器的FTP控制端口(默认21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端,我打开了某端口,你过来连我。于是客户端向服务器的该端口发送连接请求,建立一条数据链路来传送数据。在数据链路建立的过程中是服务器被动等待客户机的请求,所以称被动模式。

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1. 从任何大于1024的端口到服务器的21端口(客户端初始化的连接)
2. 服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接)
3. 从任何大于1024端口到服务器的大于1024端口(客户端初始化数据连接到服务器指定的任意端口)
4. 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)

3. FTP主动、被动模式的优缺点

主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。
被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。

### FTP 主动模式被动模式工作机制及区别 #### 文件传输协议 (FTP) 的两种主要操作模式 文件传输协议(FTP)提供两种不同的工作模式来适应不同网络环境下的需求:主动模式(Active Mode)和被动模式(Passive Mode),这两种模式的主要差异在于建立数据连接的方式。 #### 主动模式的工作流程 在主动模式下,客户端向服务器发送请求并监听任意可用的本地端口。当需要传送文件时,客户端通过命令通道通知服务器其正在监听哪个端口号用于接收来自服务器的数据流。随后,服务器尝试从自身的固定端口20发起到该指定客户端端口的数据连接。这种方式适用于防火墙配置较为宽松的情况,在某些特定场景可能会遇到访问受限的问题[^1]。 ```python # Python伪代码展示主动模式过程 client_socket.send("PORT " + client_ip_address + "," + str(client_port)) server_data_connection = server_socket.connect((client_ip_address, client_port)) ``` #### 被动模式的工作流程 为了克服主动模式可能遭遇的安全性和连通性障碍,引入了更为灵活的被动模式。在此模式中,由客户端先发出`PASV`指令给服务器;接着,服务器会选择一个未被占用的高编号临时端口并向客户端报告此端口号;最后,客户端利用这个信息创建一个新的TCP连接至服务器所选端口完成数据交换。这种方法有效地解决了因企业内部网络安全策略而导致的标准FTP通信困难的局面[^3]。 ```python # Python伪代码展示被动模式过程 response = client_socket.send("PASV") (server_ip, server_port) = parse_pasv_response(response) data_connection = socket.create_connection((server_ip, server_port)) ``` #### 关键特性对比 | 特征 | 主动模式 | 被动模式 | |--| | 数据传输方向 | 服务器->客户端 | 客户端->服务器 | | 使用端口 | 固定端口20 | 动态分配高编号端口 | | 防火墙兼容性 | 可能受阻于严格的企业级防火墙设置 | 更好地绕过大多数类型的防火墙 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值