防火墙从原理上主要有三种技术:包过滤(Packet Filtering)技术、代理服务(Proxy Service)技术不和状态检测(State Inspection)技术。
3.1.1 包过滤(packet Filtering)技术
包过滤技术是一种简单、有效的安全控制技术,它通过在网络间相互连接的设备上加载允许、禁止来自某些特定的源地址、目的地址和TCP端口号等规则,对通过设备的数据包进行检查,限制数据包在内部网络的进出。由于包过滤技术要求内外通信的数据包必须通过使用这项技术的计算机,才能进行过滤,因而,包过滤技术必须用在路由器上。它通常由包过滤路由器对IP包进行选择,允许或拒绝特定的包通过。
包过滤技术具有数据包过滤对用户透明、一个过滤路由器能协助保护整个网络、过滤路由器速度快、效率高等优点。
包过滤技术的缺点:配置访问控制列表比较复杂,要求网络管理员对Interne服务有深入了解,其性能随访问控制列表的长度的增加而呈指数下降,没有跟踪记录能力,不能从日志记录中发现黑客的攻击记录,不能在用户级别上进行过滤,即不能鉴别不同的用户和防止IP地址盗用,只检查地址和端口,对通过网络应用链路层协议实现的威胁无防范能力,无法抵御数据驱动型攻击不能理解特定服务的上下文环境和数据包过滤防火墙技术虽然能实现定的安全保护,但有许多优点,但是包过滤毕竟是第一代防火墙技术,本身存在较多缺陷,不能提供较高的安全性。在实际应用中,很少把包过滤技术当作单独的安全解决力案,而是把它与其他防火墙技术结合在一起使用。
TCP/IP是一种端对端协议,每个网络节点都具有唯一的地址。网络节点的应用层也是这样,处于应用层的每个应用程序和服务都具有自己的对应“地址”,也就是端口号。地址和端口都具备了才能建立客户机和服务器的各种应用之间的有效通信联系。比如(如图3-4),telnet服务器在端口23侦听入站连接。同时telnet客户机也有一个端口号,否则客户机的IP栈怎么知道某个数据包是属于哪个应用程序的呢?
由于历史的原因,几乎所有的TCP/IP客户程序都使用大于1023的随机分配端口号。只有UNIX计算机上的root用户才可以访问1024以下的端口,而这些端口还保留为服务器上的服务所用。所以,除非我们让所有具有大于1023端口号的数据包进入网络,否则各种网络连接都没法正常工作。
还有一种情况,你可以命令防火墙拒绝那台PC机的信息,别人的数据包都让过就它不行。这正是防火墙最基本的功能:根据IP地址做转发判断。但由于黑客们可以采用IP地址欺骗技术,伪装成合法地址的计算机就可以穿越信任这个地址的防火墙了。不过根据地址的转发决策机制还是最基本和必需的。另外要注意的一点是,不要用DNS主机名建立过滤表,对DNS的伪造比IP地址欺骗要容易多了。
3.2.2.2 服务器TCP/UDP 端口过滤
仅仅依靠地址进行数据过滤在实际运用中是不可行的,还有个原因就是目标主机上往往运行着多种通信服务,比方说,我们不想让用户采用 telnet的方式连到系统,但这绝不等于我们非得同时禁止他们使用SMTP/POP邮件服务器吧?所以说,在地址之外我们还要对服务器的TCP/ UDP端口进行过滤。
图3-3 服务器的TCP/ UDP端口过滤
这对防火墙而言可就麻烦了,如果阻塞入站的全部端口,那么所有的客户机都没法使用网络资源。因为服务器发出响应外部连接请求的入站(就是进入防火墙的意思)数据包都没法经过防火墙的入站过滤。反过来,打开所有高于1023的端口就可行了吗?也不尽然。由于很多服务使用的端口都大于1023,比如X client、基于RPC的NFS服务以及为数众多的非UNIX IP产品等(NetWare/IP)就是这样的。那么让达到1023端口标准的数据包都进入网络的话网络还能说是安全的吗?连这些客户程序都不敢说自己是足够安全的。
图3-4 客户端的TCP/ UDP端口过滤
3.2.2.4 双向过滤
现在换个思路。我们给防火墙这样下命令:已知服务的数据包可以进来,其他的全部挡在防火墙之外。比如,如果我们知道用户要访问Web服务器,那就只让具有源端口号80的数据包进入网络:(如图3-5)
比如,(如图3-3),默认的telnet服务连接端口号是23。假如我们不许PC客户机建立对UNIX计算机(在这时我们当它是服务器)的telnet连接,那么我们只需命令防火墙检查发送目标是UNIX服务器的数据包,把其中具有23目标端口号的包过滤就行了。但这样,我们还是不能把IP地址和目标服务器TCP/UDP端口结合起来作为过滤标准来实现相当可靠的防火墙。
3.2.2.3 客户机TCP/UDP端口