qpalz 发表于 2009-6-2 22:38:34

关于防火墙会话数的理解

防火墙能支持多少数量的会话标称,本来是标示防火墙性能的一个重要指标。但近来有些厂家利用部分消费者,特别是政府部门的购买者不了解参数含义的机会,对该指标进行任意拨高,已经令会话指标对许多防火墙产品的选购,在很大程度上失去了参考意义。那么,防火墙的会话,到底是一种怎么样的性能呢? 如果是普通的包过滤防火墙,无所谓会话。这种防火墙通常见第一代的国产防火墙,很多就是用ipchains改造过来的。对于这种防火墙,重要的性能指标是防火墙的吞吐量,或称滤通量;以及包过滤的时延。会话,只对提供状态检测的防火墙才有意义。 但现在的防火墙都要求提供网络连接检测。众所周知,TCP是有状态的连接,状态检测的防火墙能根据该IP包所属的连接是新的还是旧的,决定该IP包是否符合防火墙的政策约定。因此,防火墙必须在内存中保留这一记录,这就是会话的由来,每一个连接,就是一个会话。由于目前的防火墙一般工作中转接网关,存在着大转小这样的情况,如内部网是百兆,而上网的ADSL拨号是500K这种。因此,由于网络变窄,部分连接请求不能马上实施,只能在内部队列中一个个地招待,这样,对于没有连接状态的部分请求,在保持在防火墙内存排队时,目前也算是一个会话。大部分防火墙都是由linux或类似的操作系统发展来的,包括screen OS和checkpoint,因此,他们的原理有共通性。这里就以netfilter作一个例子进行说明。只要在netfilter中编译进mod_conntrack模块,防火墙就具备了进行状态检测,或称状态跟踪的功能。 防火墙支持多少会话,仅取决于防火墙的内存多少,系统会自动采用所有内存,直接内存用光,系统崩溃为止。因此,许多防火墙根据自已的内存的多少,设定一个参数ip_conntrack_max的大小。有这个限制,一旦系统记录的会话达到这个数值,系统就不再建立新的会话。所以,一个防火墙如果单纯希望增大这个参数,仅需要增加内存(10万会话约消耗45M内存),然后不顾一切地把ip_conntrack_max设定大大的,别说一百万,就是算一千万也是可以达到的。 那么一般防火墙需要多少会话呢?用两种应用举个例子。象http,每一个href都将是一个连接,包括每一个的图片,因此,浏览一个网页,常常是同时出现二十个连接以上。这种连接迅速而来,又迅速完成(网页下载都有一个速度要求)。而ftp和telnet就是另一个例子,就算下载上百兆的文件,也只是一个连接;而使用多线程下载工具,象netant,每一个线程都是一个连接。因此,假设是一个500人的网络需要上网,其中同时浏览的有100人(平均20秒刷新一次),另外200人打QQ,50人使用十个线程下载文件,还有50 人进行如telnet,数据库访问这样的会话;如果没有出口瓶颈,那么,实际的会话数估计是在千以上附近。但如果有出口限制,那么就可能升级到万以上。但无论是多大的网,达到几万以上的也是极为罕见的,真的出现了这种情况,很可能是感染了如冲击波这类的病毒。 防火墙最通常铁使用是内部的子网分隔,这部分也会产生一部分会话请求。对于百兆/千兆这种一般的网络环境来说,大致有十万以上的会话能力的防火墙,也基本上足够了。保持太多的会话对防火墙没有必要,相反,当系统资源过多地用在会话保持的话,会相应损害每秒生成会话的能力,这是一个同样重要的性能指标。设定过高的会话数量,却降低了每秒生成会话的能力,其结果,只能是保留一些永远用不到的会话虚数而已。每秒生成会话能力,也称会话速率,主要与CPU处理能力/寄存器的数量,以及操作系统内核是否利用这一处理能力有关。相对而言,这是使用X86的系统比较弱的部分,包括nokia,而使用RISC的系统,速动会话的能力就比较高,相应地,保持最大会话的能力也比较弱。 对于X86/Linux/BSD的防火墙来说,会话最大保持在10万到30万是比较合理的。如果使用非常强大的主板,而且linux针对这种主板进行了一些底层优化(主要是优化对寄存器-内存之间访问的过程),可以在不损害会话速率等性能的情况下把会话达到50万到60万。这是目前本人所知的最大极限。 会话的性能需要内存,如果考虑防火墙和操作系统本身展开需要128M内存左右的话,那么40万会话就要消耗约180M,意味着是300M内存以上才有可能。由此,也可以知道一些产品的标称是否有弄虚作假的成分。
页: [1]
查看完整版本: 关于防火墙会话数的理解