FTP连接模式分析

FTP,毕竟是老生常谈(yong)的一个东西,可能大部分人只知道其默认端口是21。其实在不同的传输模式下端口也会发生变化。FTP服务通常有两种,PORT和PASV,即主动和被动两种模式。

主动模式下,Client发送“PORT”命令到FTP Server,之后执行upload/download等操作。

被动模式下,Client发送“PASV”命令到FTP Server,之后执行upload/download等操作。

看起来只是用了不同的连接方式,实际上有很大差别。
主动模式下,Client和Server的TCP port 21建立连接,之后如果进行文件操作,则发送PORT命令,命令中包含了使用Client哪个端口接收数据。在传送数据时(例如GET),FTP Server会通过自身的TCP port 20连接到Client指定的端口发送数据。即除了port 21之外,在进行一个新的TCP连接进行传输数据。
Server port20&&Server port21 --------- Client port>=1024

被动模式下,建立控制通道的方式和主动类似,但是发送的是PASV命令。Server收到PASV后,会随机打开一个TCP port>=1024,并向客户端发送通知信息,如果port处于空闲状态,则发送ACK;反之则UNACK,然后Client继续发送PASV直至成功。Client连接上这个端口后就可以进行操作了。这样Server就不需要重新建立一个新连接进行传输操作。
Server port>=1024 --------- Client port >=1024

从网络连接方向来说,主动向外,被动向内。这一点对于iptable的配置比较重要,因为对于大多数防火墙来说,是不允许接受外部发起的连接。如果Server在防火墙后面,且不支持被动连接的话,Client连接就会被禁止;相同的对于内网环境的Client来说,也无法使用主动模式连接外部的Server,因为TCP port 20无法和Client建立有效连接。这都会使FTP无法正常工作。
顺带一提CMD里面的FTP只有主动模式,即使强制使用被动"QUOTE PASV"也还是主动模式进行操作的。