2 防火墙的实现
2.1防火墙的分类
一般把防火墙分为两类:网络层防火墙、应用层防火墙。网络层的防火墙主要获取数据包的包头信息,如协议号、源地址、目的地址、目的端口等或者直接获取包头的一段数据。应用层的防火墙对于整个信息流进行分析。
实现防火墙时,共有以下几种:
① 应用网关(application gateway):检验通过此网关的所有数据包中的应用层的数据;经常是由经过修改的应用程序组成运行在防火墙上。如FTP应用网关,对于连接的client端来说是一个FTP server,对于server端来说是一个FTP client。连接中传输的所有ftp数据包都必须经过此FTP应用网关。
② 电路级网关(circuit-level gateway):此电路指虚电路。在TCP或UDP发起(open)一个连接或电路之前,验证该会话的可靠性。只有在握手被验证为合法且握手完成之后,才允许数据包的传输。一个会话建立后,此会话的信息被写入防火墙维护的有效连接表中。数据包只有在它所含的会话信息符合该有效连接表中的某一入口(entry)时,才被允许通过。会话结束时,该会话在表中的入口被删掉。电路级网关只对连接在会话层进行验证。一旦验证通过,在该连接上可以运行任何一个应用程序。以FTP为例,电路层网关只在一个FTP会话开始时,在tcp层对此会话进行验证。如果验证通过,则所有的数据都可以通过此连接进行传输,直至会话结束。
③ 包过滤(packet filter):对每个数据包按照用户所定义的进行过滤,如比较数据包的源地址、目的地址是否符合规则等。包过滤不管会话的状态,也不分析数据。如用户规定允许端口是21或者大于等于1024的数据包通过,则只要端口符合该条件,数据包便可以通过此防火墙。如果配置的规则比较符合实际应用的话,在这一层能够过滤掉很多有安全隐患的数据包。
④ 代理(proxy):通常情况下指的是地址代理,一般位于一台代理服务器或路由器上。它的机制是将网内主机的IP地址和端口替换为服务器或路由器的IP地址和端口。举例来说,一个公司内部网络的地址是129.0.0.0网段,而公司对外的正式IP地址是202.138.160.2~202.38.160.6,则内部的主机129.9.10.100以WWW方式访问网外的某一台服务器时,在通过代理服务器后,IP地址和端口可能为202.138.160.2:6080。在代理服务器中维护着一张地址对应表。当外部网络的WWW服务器返回结果时,代理服务器会将此IP地址及端口转化为内部网络的IP地址和端口80。使用代理服务器可以让所有的外部网络的主机与内部网络之间的访问都必须通过它来实现。这样可以控制对内部网络带有重要资源的机器的访问。
路由器中的防火墙主要是指包过滤加地址转换。
2.2包过滤
包过滤应用在路由器中,就为路由器增加了对数据包的过滤功能。一般情况下,指的是对IP数据包的过滤。对路由器需要转发的数据包,先获取包头信息,包括IP层所承载的上层协议的协议号,数据包的源地址、目的地址、源端口、目的端口等,然后和设定的规则进行比较,根据比较的结果对数据包进行转发或者丢弃。
包过滤在IP数据包中所取的用来判断的元素如图3所示(图中IP所承载的上层协议为TCP):
图3 包过滤元素
大多数数据包过滤系统在数据本身上不做任何事:它们不做基于内容的决定。有了数据包过滤,你可以说:
不让任何人从外界使用Te.net登录。
或者:
让每个人经由SMTP向我们发送电子邮件。
或者是:
那机器经由NNTP能把新闻发给我们,但是没有其他机器能这样做。
然而,你不可以这样说:
这个用户能从外部远程登录,但是其它用户不能这样做。
因为“用户” 不是数据包过滤系统所能辨认的。同时,你也不可以说:
你能发送这些文件而不是那些文件。
因为“文件”也不是数据包过滤系统所能辨认的。
2.3访问列表
为了过滤数据包,需要配置一些规则,规定什么样的数据包可以通过,什么样的不能通过。IP层所能获取的通用信息如上图。则配置的规则应该对这些参数作出规定。
一般采用称为访问列表的技术用来配置过滤规则。访问列表分为两类:标准访问列表、扩展访问列表。
2.3.1标准访问列表
标准访问列表的格式如下:
aclearcase/" target="_blank" >ccess-list listnumber permit|deny address [wildcard-mask]
此格式表示:允许或拒绝来自指定网络的数据包,该网络由IP地址(address)和地址通配比较位(wildcard-mask)指定。
通配比较位用法类似于子网掩码而写法不相同。IP地址与地址通配位的关系语法上规定如下:在通配位中相应位为1的地址中的位在比较中被忽略。地址与通配位都是32位的长整形数(unsigned long)。如通配位是0x00ffffff(0.255.255.255),则比较时,高8位需要比较,其他的都被忽略。又如IP地址是129.102.1.1,通配位是0.0.255.255,则地址与通配位合在一起表示129.102.0.0网段。若要表示202.38.160.0网段,地址位写成202.38.160.X(X是0~255之间的任意一个数字),通配位为0.0.0.255。在程序中,用异或等位操作高效率的实现这类比较。
标准访问列表的例子:
1) access-list 4 deny 202.38.160.0 0.0.255.255
表示该规则序号为4,禁止来自202.38.0.0网络的主机的访问。
2) access-list 4 permit 202.38.160.1 0.0.0.255
表示该规则序号为4,允许来自202.38.160.0网络的主机的访问。与2)规则一起表示禁止一个大网段上的主机但允许其中的一小部分主机的访问。
2.3.2扩展访问列表:
扩展访问列表的格式如下:
access-list listnumber permit|deny protocol source source-wildcard-mask destination destination-wildcard-mask [operator operand] [log]
此格式表示允许或拒绝满足如下条件的数据包:
; 带有指定的协议(portocol),如tcp、udp等;
; 数据包来自由source及source-wildcard-mask指定的网络;
; 数据包去往由destination及destination-wildcard-mask指定的网络;
; [可选] 该数据包的目的端口在由operator operand规定的端口范围之内;
并按要求做或不做日志。
扩展访问列表的例子:
1) 100 deny tcp 129.9.0.0 0.0.255.255 202.38.160.0 0.0.0.255 eq www log
表示该规则序号为100,禁止129.9.0.0网段内的主机建立与202.38.160.0网段内的主机的www端口(80)的连接,并对违反此规则的事件作日志。
2) 100 permit tcp 129.9.8.0 0.0.0.255 202.38.160.0 0.0.0.255 eq www
表示该规则序号为100,允许129.9.8.0网段内的主机建立与202.38.160.0网段内的主机的WWW端口(80)的连接。
3) 101 deny tcp any 202.38.160.1 0.0.0.0 eq telnet
表示该规则序号为101,禁止一切主机建立与IP地址为202.38.160.1的主机的telnet(23)的连接。
4) 102 deny udp 129.9.8.0 0.0.0.255 202.38.160.0 0.0.0.255 gt 128
表示该规则序号为102,禁止129.9.8.0网段内的主机建立与202.38.160.0网段内的主机的端口号大于128的UDP(用户数据报协议)连接。
2.3.3删除访问列表:
no access-list listnumber [subitem]
表示删除指定的listnumber的访问列表,或者删除其中的一项。
2.3.4建立访问列表的索引
建立索引的目的是:进行快速定位;即对于需要过滤的数据包,快速的确定需要和哪些规则进行比较。
索引项根据网段的大小(unsigned long类型,带地址通配位如0.0.255.255)进行排列,比较时采用二分法进行比较。如图4所示:
图4 索引及所指的值
索引项中的一个域指向一个指针链。如图中的10.0.0.0索引项指向规则2,规则2再指向规则102,表示一个源地址为10.0.0.0网段的数据包,需要和规则为2和102的进行比较。先比较规则为2的标准规则(标准规则判断的范围比较大)。
规定如下:
; 比较的时候,先比较规则序号小的(在索引指向的域中可以做到这一点)。如先比较2,再比较4,再比较103,再比较104。倘若用户将要判定的源地址属于同一个网段的规则写成了好几个不同规则序号的规则,那么过滤的效率降低也是没有办法的。一般较正常的情况下,一个索引项后跟一个或两个规则序号。如图1中所示。如果在索引中,没有那个网段的话,需要与源地址为any的规则进行比较。
•; 不同序号的规则没有时间上的先后顺序。例如:先配置103,再配102,如果这两个序号的规则序列中都有判断129.9.0.0网络的规则,则过来一个129.9.0.0网络的包,先和102的比较,再和103的比较。(和上面一点有些重合)
; 同一序号的规则的配置也没有时间上的先后顺序。在排列时,
图5 规则的组织
深度最大的那个排在前面。规则的组织图请看图5。
这一点需要加以特别说明,也是程序中应该注意的地方。例如:先配置 2 permit 129.102.1.1 0.0.0.0; 再配置一条同样序号的 2 deny 129.102.0.0 0.0.255.255;前一条直接指定了主机,它的深度最大,还是排在前面。比较时,129.102.0.0网络的数据包会在序号为4的规则中搜索。若是129.102.1.1,则被前一条满足,就不再往后比较了。这是因为规则是按照深度的大小来排的。
可以看出,深度是指通配位而言的。一般来说,深度越大,通配位越小。如
0.0.0. 0比较时的深度要比0.0.255.255的深度大。
此观点来自于:一个数据包只被一组规则中的某一个允许或拒绝,也就是最终起作用的是一条规则(该规则的深度最大)。
; 如果通配位不规则(如0.0.123.234),规则的组织仍是按照通配位的大小。这是基于这样的考虑:
1) 这种写法非常的少;
2) 倘若真的写出了这样的规则,一般不太明白这样的通配位与地址相结合表示什么样的地址范围;