logo资料库

FTP协议父子连接.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
FTP 协议使用两个连接。一个叫控制连接,另一个叫数据连接。FTP 的命令 和应答通过控制连接来交换,这个连接会存在于整个 FTP 会话过程中。另一方面, 一个文件(或一个文件列表)通过数据连接来传送,这个连接是当每次文件传输 时才新建立的。 通常出于网络安全的考虑,大多数防火墙不允许除 FTP 控制连接之外的任何 连接连到 FTP 的服务端口(默认是 TCP 的 21 端口)。虽然如此,当一个文件传 输时,防火墙临时地认可数据连接。为了做到这点,防火墙跟踪控制连接的状态, 并检测跟文件传输相关的命令。这就是所谓的状态检测。 PORT 命令的格式如下: PORTh1,h2,h3,h4,p1,p2 这里字符串“h1,h2,h3,h4”表示点分十进制的客户端的 IP 地址 “h1.h2.h3.h4”。字符串“p1,p2”表示一个数据端口号(= p1 * 256 + p2)。 地址和端口号都是十进制数。数据端口由客户端动态指定。另外,命令和应答以 字符序列结尾。 Netfilter 跟踪一个 FTP 控制连接,并获取 TCP 序列号和包含一个 FTP 命令 行(以结尾)的数据包的数据长度。然后基于这些信息,它计算出下一个命 令数据包的序列号。当一个这样序列号的数据包到达时,Netfilter 分析数据包 中的数据是否包含一个 FTP 命令。如果数据的头部是“PORT”,并且数据以 结尾,于是 Netfilter 认为它是一个有效的 PORT 命令(实际的代码会更复杂), 并从中取出 IP 地址和端口号。然后,Netfilter“期待”服务器主动建立一个到 客户端指定的端口号的数据连接。当数据连接请求确实到达时,它会认可连接, 同时连接建立。一个没完成的命令,即所谓的“不完全的”命令,会因为无法真 实的跟踪而丢弃。 从大的方面来说,netfilter 就是一张大的流转发表,这个转发表的查找是基 于流的五元组(sip/dip/sport/dport/type),流是有方向的,我们分别定义为 正向和反向。用一个图更为形象的说明流表的组织形式。
通过上图,我相信一定能够客观真实的反映流表的组织形式了吧,正向流和反向流分别对 应两个方向,他们在 hash 表里面映射不同的表项,但是他们所关联到的是同一个连接 跟踪表项。 系统的连接跟踪会在四个地方进行处理,分别是路由前,路由后,本地收以及发。本地收发 也不在讨论范围内,需要的自己察看看,关键在于触类旁通。首先说说最简单的,没有动态 协议的情况。在路由前接收到一个报文,接着跟踪报文信息调用二层以及三层的回调函数, 构造出报文的 5 元组信息(tuple,后文简称为元组)。接着通过这个 5 元组即我们 上文所说的正向流或者反向流来查找对应的连接跟踪信息(nf_conn).情况简单的说 就是两种,存在或者不存在,存在就返回这个结构。如果不存在就创建连接信息 即 nf_conn,但是这个时候并没有加入 hash 表里面去,所以还挂在 unconform 链 上。 因为上文说了我们暂时不讨论动态协议,所以在创建连接信息的时候,查找 expectation 和 helper 肯定都没有,所以也就直接返回了。这儿可以看到两者的不同在于创建新的 连接与否。有了这个 nf_conn 连接跟踪表,我们就需要对这个连接的的状态进行调整。具 体的状态机可以参考代码,TCP 的比较复杂一些,ICMP 和 UDP 的差不多。到此为止,路 由前就处理完了,我们可以看到要么查找到简单处理,要么构建一个新连接,但是挂到 全局的未决链上。
接下来的处理就是路由后了,在发出报文之前,这个时候主要就是做一些错误检查,然后 把前面处理的未决的连接跟踪加入到前面看到的 hash 表项里,让系统能够检索到。 现在我们加入动态协议再重新看一下这个流程,以 tftp 或者 ftp 为例都可以,简单起见,tftp 吧。下面这个大的流程很重要,切记切记,不懂也首先记住,然后再分析。在创建新 的连接跟踪信息时候,首先判断一下这个连接是不是期望连接,如果是就关联到之前 的主链接上面。然后不管是主链接还是期望连接都查找相应的 helper 函数,当然主连 接通过全局表查找,而子连接是在主连接的 help 创建时候赋的值。对于简单的动态 协议,其子连接是没有 helper 函数的,例如 tftp 或者 ftp。 上面的话记牢了吧,首先查找期望连接,然后查找 helper 函数。这是因为一些动态 协议,其控制协议创建好了 expectation 后,挂到全局表,接下来就是数据通道,而这个 数据通道就是期望连接,所以虽然是新建连接,但是也是我们所预知的,所以和其 master 关联。 另外就是 helper 函数,例如 tftp 在模块加载时候就注册了这个 helper,当我们新建一个连 接,会查找这个表看是否是其中的一种协议,很幸运,我们就是 tftp 那么首先把这个 helper 关联到这个连接。路由器的处理就完了,对于 helper 的调用要在路由后我们才能看到了。 最近终于到了路由后,在路由后的处理流程里面,首先做的工作就是对前面的 helper 进行 调用,当然 help 主要完成的工作就是 expectation 的创建,然后挂到全局链表,等待数据 通道报文。解析来的工作和前面就是一样了,把新建的连接加入 hash 表。
分享到:
收藏