isos系统工作笔记3

1 基本介绍

2001年,ISOSAshley-Laurent购买了AL Firewall软件,为适应ISOS的软件架构,AL Firewall软件做了很大的整合及改动,配置方式已从以前的文件配置方式改为ISOSVMI方式,但基本结构及相关命名方式得到了保留。

本文档主要参考《DO-409018-TC-C》《DO-419238-TC》对ISOSCyberWALL的基本概念及主要软件架构进行学习,并对其源代码进行简单分析。

2 代码架构

AL Firewall包括三个目录文件,分别是al_commoncyberwallmapi,除此之外,最初的文件还有一个al_store目录用于解析及保存Firewall的配置文件,ISOS使用VMI后拿掉了这部分。AL设计的目标之一是多平台适用性,因此al_commoncyberwall都有一个atmos子目录用于提供平台相关代码的实现。与ISOS的其于软件模块一样,mapi包含所有的VMICLIWEB的代码。

文件的命名及其前缀取决于其基本功能,比如,“al”的前缀代表是一个通用处理类型文件,“cw”则为CyberWall通用处理文件,而“csfe”则为CyberShield防火墙引擎,这是安全模块的核心部分。最初的AL软件中与al_store目录相对应有“cspm”前缀,用于AL配置文件的管理工作。

       所有函数代码的命名方式与此类似,但cw_public_api文件除外,后者以Security开始,其代表安全模块的公共接口。

3 基本概念

31 会话(Sessions

      安全模块中的所有处理都是基于会话。当收到一个数据包,如果其对应的会话不存在,则会新建一个。会话由原IP、目的IP及原端口、目的端口组成。特别的,对于ICMP echo的消息,将使用标识符代替其端口号。

会话相关的信息内容存储于套接状态块(SSB)中,有两种类型的地址及端口号存储于每一个会话,分别为实的和映射的,实地址及端口在NAT内网可见,而映射地址及端口在NAT外部可见。当关闭NAT功能时,本地实及映射的地址及端口号是相同的。但不管怎样,外部实及映射地址及端口是一样的。下图说明了实及映射IP地址及端口间的关系。

32 等待会话(Waiting Sessions

      等待会话是预会话的集合,用于供安全模块了解所等待的数据流。最初,等待会话仅供ALG架构使用以允许二次会话,但现在也应用于UPnP。一个等待会话必须至少有指定的本地及映射IP地址,其它参数,如协议、端口号可以类似指定。然而,指定的参数越多,安全级别也就越高。同样,为一个新的会话指定ALG处理句柄也是可能的,这在某些场合很有用,比如,MSN Messenger使用了非标准的SIP端口建立SIP会话。

      当一个数据包到达时,如果不属于任何一个已存在的会话,则将会检查是否匹配期待会话,一旦匹配,则新建立的SSB中的参数将会根据期待会话进行更新,这也就意味着,SSBNAT转换将被跳过,同时,会话层的PPOs(见下节包处理对象)也将跳过,因为该会话正是所等待的。

33 上下文境(Contexts

      安全模块的处理基于上下文境(CSFE_CONTEXT),每一个会话都有原接口与目的接口,对于到本地设备的流量,则原及目的接口有可能是相同的。上下文境是基于原接口及目的接口,其中包括三种类型的接口,分别是InternalExternalDMZ,其中Internal-External上下文境总是存在的。如果系统编译时打开了DMZ的支持,则有Internal-DMZExternal-DMZ上下文。

如前所述,如果原接口与目的接口相同,则另一个视为Internal,请注意,对Internal接口,安全模块并没有注册多个过滤接口,因此,安全模块决不会看到Internal-Internal流量。

34 全局命名空间

每一个接口都有两个全局的命名空间,一个是到Internal接口的会话,另一个是到DMZ接口的会话,它们供每一个会话对应的External接口的NAT使用,这就意味着,Internal接口及DMZ接口并没有使用到命名空间(注:是否意味着只有External接口才会有两个全局的命名空间?)。

全局命名空间保存有接口的地址映射表及全局地址池,每一个全局命名空间的全局地址池最大可到MAXIMUM_MAPPING_POOL_NUMBER,其缺省值为4。当两个接口间NAT开启,全局地址池将自动在对应的External接口建立,并包含该接口的IP地址。另外VMI是看不到全局地址池的。

35 Triggers

TriggersAshley-Laurent发明的设计,用于处理一些在数据净荷中开启第二个端口或IP地址的协议。当主端口中有数据流时,Trigger将被激发,例如,NetMeetingTrigger将开启1720的端口。

351 二次端口(Secondary Ports

Trigger激发后,它能允许在第二个端口进入的会话。当收到一数据包,但没有任何存在的规则(如保留的NAT映射、期待会话或存在的会话)时,将使用Trigger机制以决定是否接受进入的数据包,这是NAT处理中认证过程的一部分。

首先,找出所有活动的待匹配的Triggers,如果进入数据的目的地址与Trigger的本地映射地址相匹配,同时数据包的原地址与Trigger的远端IP地址匹配的话,则说明匹配了该Trigger

如果该Trigger的定义是接受多主机的话,则将跳过上述的第二步检查。对于每一个已匹配到的Trigger,将发送一个探测包到本地主机,以判断该端口是否允许接收数据包,实际的处理中,该探测包通常是刚收到的数据包的拷贝。每发送一个探测包,该会话将被加入到无定义表中,该无定认的会话包含一个到激活该Trigger的主会话的链接。

如果本地主机在该端口中不接受该探测包,它将返回一下RST包(TCP)或端口不可达包(UDP),一旦收到这些数据包后,其相对应的无定义会话将会从无定义表中删除。然而,如果从本地主机中收到任何其它响应,就认为本地主机在该端口接受这些数据包,从而这些会话将会从无定义表中移到其它TCPUCP对应的表中。

352 二进制地址转换

Trigger同样可以完成数据净荷中二进制地址的转换工作,通过在主会话或其它二次会话的数据净荷中搜索匹配四字节的地址进行IP地址转换。但要注意,该功能的实现会带来Performance的降低,因此使用专用ALG将会是更好的解决方法。

36 包处理对象(PPOs

包处理对象是Firewall的核心部分,其采用模块化的设计以便为Firewall增加不同类型的规则。初始化时,PPOs链表将存储于全局CSFE的上下文境,当增加PPOs时,需要特别注意其链表的顺序。

目前只实现了两种PPOs,即过滤PPO及验证PPO 当建立一个新的会话后,需要从全局PPOs链表中搜索比加入到当前会话链表PPOsessionpacket or fragment)更高级别的PPO。正常初始化的PPO的级别是0,它比预定义的值低,然而,如果一个数据包因为一个期待会话而被接受,则初始化的PPO级别就是session。因此,对新的或已存在的会话,如果级别等于或大于该数据包的PPO处理级别,该会会链表的所有PPO都将会被调用。

如果数据包是该会话的第一个包,则其级别为session,若为IP报文的第一个分片包则级别为packet,而不是第一个分片包则为fragment。当所有的PPO调用处理完后,session级别的PPO将从新会话中移职工队伍除,因为它们不会再被使用。

目前,过滤PPO和验证PPO都在session级别实现,验证PPOIP地址上进行过滤,同样也有不完整的架构在主机名上进行过滤(过滤DNS请求)。最初,过滤PPO仅仅针对端口进行过滤,现在已加强功能可以过滤IP地址,因此,在一定程度上,验证PPO是多余的了。

37 ZIPBZero Install PPP Bridge

ZIPB为本地主机提供一种共享路由器外部IP地址的方式,从而使得路由器扮演桥的角色。路由器通过PPP链路获取其外部接口IP,本地主机通过DHCP获取IP地址,动态ZIPB允许获取外部IP地址的主机变成另一台主机。

38 内存管理

ISOS安全模块从其私有池中获取内存空间,从而保证在受功击的耗尽资源(分配太多的SSB)情况下,已存在的会话能持续工作,当然在内存空间释放之前,没有新的会话可以建立。内存池的大小在al_dependent.c中由AL_DYN_MEMORY_POOL_SIZE进行定义,建议该值由内存的实际大小决定,但目前使用固定值。

4.包处理流程

ISOS安全模块包括四个主要部分:会话管理、NATFirewall及入侵检测。无论Security是开启还是关闭,会话管理都是需要的,而入侵检测是可选的。NAT工作在安全模块的外部接口,也就是outbound数据包的最后一步及inbound的最开始,这就意味着Firewall过滤总是基于实IP地址,而不是映射后的IP地址。在这里,我们将主要讨论Internal-External的流量,DMZ是类似的,所不同的只是方向问题。

在介绍Firewall包处理流程之前,先说明Ip Filter的注册过程。如下图所示,通过系统的消息机制,Firewall模块将Filter的处理函数接口ALCWIPFilter注册到IP协议栈。后者在收到数据包后,不管是Inbound(入)还是Outbound(出)都会调用ALCWIPFilter进行处理。ISOS的这种Filter注册、调用机制可以适用于包含多种不同Filter类型的加构中,但事实上,目前只注册使用了Ip Firewall Filter

ALCWIPFilter中,除了一些通用检查处理函数外,将会调用ALCWInterfaceFilter,该函数将CYAN buffer的内容转到CW_PACKET_BUFFER,通过判断数据包的流向(Inbound/Outbound)及接口类型(Internal/External/DMZ)调用相应的接口处理句柄。我们以Outbound/External数据包为例进行说明。

41 Outbound/External

Outbound的处理从函数ALCWIPOutputFilterOnExternalInterface开始。

411 获取上下文境(Context

如上所示,该函数传递的参数只包括External接口及数据包相关信息,因此,为决定该数据包该使用哪一个上下文境(Context),则首先要调用函数ALCWSearchSourceNetworkInterfaceForExternal获取该数据包的Internal接口信息。

412 会话处理

会话处理的过程在ALCSFESessionProcessInternalPacket中执行,根据3.2节中对Waiting Session的描述中可以看到,当一数据包到达一个接口上时,需要搜索与之匹配的会话,如果不能找到,则需检查无定义会话表,看该数据包是否为一探测包的响应(参考3.5.1二次端口说明),如果不是建立新的SSB

413 Firewall处理

通过调用ALCWInvokeFirewall执行Firewall相关处理,这是一个通用接口,可供所有过滤接口调用。其通过调用ALCSFEQueryPacketProcessingObjects,根据其返回值对数据包进行处理。

414 NAT处理

NAT功能开启时,通过函数ALCSFENSMProcessInternalPacketNAT进行处理。如果一个SSB是新建的,处理函数将调用ALCSFENSMTranslateInternalSSB以设置SSB的转换参数,其映射地址及端口取决于所匹配的保留映射表,而如果没有匹配的映射,则使用HASH算法从全局地址池中选择一个源IP地址。一旦选择了映射的源IP地址及端口,将调用ALCSFENSMGetUniqueMappingPort以保证所映射源端口的唯一性,这使得NAT可以区分外部网络不同的会话。

下一步是调用ALCSFEQueryNATBox,该函数调用与该会话对应的ALG进行处理,返回后,数据净荷内容将根据NAT_QUERY_INFO结构进行更新。

最后,调用ALCSFETranslateIPAddress函数转换IP地址及TCP/UDP头,如果该会话与一个需转换数据净荷的Trigger相关,则调用函数ALCSFETranslateIPAddressesInTransportPayload对数据净荷的二进制IP地址进行转换,当然,Checksum也同样需要进行更新。

成功处理完这些后,如果是一个新的SSB,则需将其插入到合适的链表中,供后继数据包使用。

你可能感兴趣的:(工作,session,Security,filter,路由器,triggers)