|
FTP 连接有两种模式,分别是“主动模式” 和 “被动模式” 。现在流行的 FTP 客户端软件一般都默认设置为“被动模式”连接,这提高了连接的成功率,反之若改为主动模式,那么连接的成功率则大为降低。为什么会这样?下面具体分析其中的原因。
实验的环境是:
公网 FTP 服务器 IP 为 :118.244.139.28
客户机通过路由器上网,其内网 IP 为 192.168.1.110 。路由器产品型号为 TL-W841N ,它是 TP-LINK 生产的一款家用路由产品(非广告^_^) 。
客户机使用的 FTP 客户端软件为 FileZilla ,开源免费且好用的一个客户端。
抓包工具为 Wireshark 。
首先,我们设置 FileZilla 的连接模式为“主动模式”,在“编辑”菜单中的“设置”选项了可以进行相关设置,如下图所示:
(图-1)
首先点选上图中红色方框里的 FTP 字样,选择传输模式为”主动“,不勾选”失败后允许返回其他传输模式“,如下图所示:
(图-2)
这么做的目的是,我们现在只关心主动模式,而不希望主动模式可能失败后自动切换到被动模式。
接着点击(图-2)红色方框中的“主动模式”选项:
(图-3)
这里先保持默认的“向您的操纵系统咨询外部 IP 地址” 。
设置完毕后,进行连接测试,这时候我们看到连接是成功的,并且传输文件也正常。这和我们的预想正好相反,我们一般会认为这会连接失败 --- 因为,在主动模式下,在最后,服务器一般会换到 20 这个端口号和客户机的一个新的端口号进行连接通讯。但这种情况,由于我们使用了路由器上网的缘故(路由器相当于一道防火墙),服务器的连接请求是会被阻挡下来的。通过路由上网的内网主机,如果是主动向外部发送请求并连接一条连接的话,那么外部服务器和内网主机在此后的通讯中就会一直利用该条已建立的连接进行通讯,比如我们可以正常的浏览网页。但是 FTP 的主动模式情况有点特殊,客户端会在中途会切换到另外一个端口,然后让服务器从 20 端口去主动连接它(主动的意思就在这里,在稍后的介绍中我们会用抓包的方式来展示这一点),问题恰恰就会出现在这里,路由器是不会允许外部主机主动和他内部的主机建立连接的,原因是内网主机使用的是内网 IP,而外部的主机看到的只是路由器上的外网 IP,这就是由外往内通信不畅的根源;而由内往外则可以,是因为路由器为这一连接提供了 NAT 的转换。
经上所述,那为什么在实际的测试中,客户端软件却可以正常连接服务器呢?让我们走到路由器的配置界面查看一下,就找到了原因,看下图:
(图-4)
由上图可以看到,我们开启了"应用层网关"。我们再单击上图中的“帮助”按钮,可以看到对“应用层网关”的解释是:
(图-5)
原来,好心的路由器已经帮我们事先考虑到了我们可能会经常使用 FTP 这一应用,所以他们就默认打开了针对 FTP 这个应用 NAT 转换功能。这也就是开始时我提到的为什么提出路由器的型号非广告的原因,因为不同厂家的路由器针对这些具体的应用会有不同的对待态度 :)
知道了这个原因后,可以在路由器里关闭这个“应用层网关”,然后再次连接 FTP 服务器时,可以看到前半段连接成功,而后半段却无法列出目录和传输文件了。
再看(图-3),我们也可以显式指定 IP,需要注意的是,这个 IP 是你客户机的内网 IP,而不是外网 IP。该项和第一项中向系统咨询 IP 的效果一样,区别是一个自动一个手动而已。是否可以连接成功,还得看在路由里打不打开那个“应用层网关”。
(图-3) 中的第 3 项是使用 FileZilla 网站上的一个 ip.php 文件获取你的 IP,经过我的测试,该项功能无法得到上述环境下的内网 IP,你可以在浏览器里试着看一下,它给你返回的是 127.0.0.1 。
到目前为止,已经感性的认识到主动连接的一个大概。那么接下来,我们使用抓包工具,具体的分析一下主动模式的通讯过程。这里,当然要事先打开“应用层网关”这一功能;在启动 wireshark 前,应该设置好过滤器,否则的话你得在一大堆无关的捕获结果中查找 FTP 相应记录是件很累人的事情。至于设置 wireshark 过滤器的相关内容,可以参考《使用 wireshark 的过滤功能(过滤器及表达式)》这篇文章,这里就赘述了。
下图是捕获结果的一部分:
(图-7)
在上图中,红色方框圈起来那条记录之前的记录和往常普通的 TCP 连接没什么区别,就是三次握手后开始相关的通信。然而,红色方框所圈起来的这条记录就是一个通信的转折点,通过图中最后一栏的梗概部分我们知道,FTP 客户端执行了一个 PORT 命令,该命令就是要让通信转入主动模式的一个命令,它后面还跟着一串参数:PORT 192,168,1,110,66,230 后面的 6 个数字是用逗号分开的,其中前面 4 个组合起来,刚好就是我们客户机的内网 IP 地址:192.168.1.110 ,那么后面的 2 个数字是什么呢?把第 1 个数字 66 先乘以 256 ,然后再和 230 这个数相加,即 66*256 + 230 = 17126 。这个 17126 就是客户端高速服务器你要主动连接的端口,然后通过该端口来传输数据。如果注意观察的话,我们可以看到(图-7)中,一开始客户端是通过 17125 这个端口连接服务器的 21 端口的。实际上,一般情况下,在进入主动模式后,服务器都会通过 20 端口连接“先前的连接端口+1” 这个端口(即 17125 + 1 = 17126) 这个端口进行通讯的。
从上面的截图分析,我们知道为什么在没有路由器的允许下,主动连接会无法成功了。
正是由于 IPv4 上的 IP 枯竭,NAT 网络的流行,对于 FTP 的应用就酝酿出了“被动模式”。在被动模式下,不再是让服务器主动连接客户机,而是让客户机主动连接服务器了。这样的途径就是由内往外,一般不会受到防火墙的组织了,其中情况和反弹式木马是比较类似的。
在 FTP 的被动模式下,FTP 客户端会随机选择一个端口连接 FTP 服务器的 21 端口。在完成连接后,需要传送数据时,客户端就会通过命令发送一个 'PASV arg' (主动连接是 PORT arg)给服务器,要求它进入被动传输模式,然后服务器就随机选择一个 TCP 端口,并用之前的控制连接告诉客户端,于是客户端就用另一个端口连接刚才服务器指定的 端口来建立数据通道。
现在,我们在 FileZilla 这个客户端里还原默认连接方式为被动连接,然后再将路由器里的"FTP 应用网关"关闭,看看能否连接成功。
经过测试,我们看到连接是成功的。这时可能会产生疑问?怎么关闭了针对 FTP 的应用网关后,还能正常连接了?需要知道的是,路由器里的 “FTP 应用网关” 开关是针对我们我们有可能采取主动连接模式的情况下所方便我们连接成功而设置的,如果我们一开始默认就使用了被动模式,那么这个开关是否开或关都形同虚设,其中道理是简单的。
同样对被动模式抓包分析:
(图-7)
从上面我们可以看到,客户端执行了一个 PASV 的命令,该命令让服务器进入被动模式。然后服务器进行了应答,应答的数据也是一串字符:118,244,139,28,173,143 。和上面分析主动模式里的 PORT 命令一样,前面的 4 个数字组成了服务器的 IP 地址,后面的 173 和 143 这两个数字,经过 173*256 + 143 = 44431 。也就是说,客户端此后就会连接这个端口,并用这个端口和服务器传输数据。
接着(图-7)中的记录,我们看一下紧接下来的几条捕获记录:
(图-8)
上图中的第 1 条记录,客户端在执行 LIST 命令时仍然用的是初始的端口号(28557)。然后接下来,客户端会使用新的端口号 28558 向服务器的 44431 发送一个 SYN 分组,这是一个新的 3 次握手。在连接建立后,在进行 FTP 数据传输时(FTP-DATA),就是 28558 和 44431 之间的事情了。需要注意的是,发送命令仍然使用的是 28557 和 21 端口。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|