标题：包过滤防火墙
包过滤防火墙
在Linux系统下,包过滤功能是内建于核心的（作为一个核心模块，或者直接内建），同时还有一些可以运用于数据包之上的技巧，不过最常用的依然是查看包头以决定包的命运。 　　包过滤防火墙将对每一个接收到的包做出允许或拒绝的决定。具体地讲，它针对每一个数据报的报头，按照包过滤规则进行判定，与规则相匹配的包依据路由信息继续转发，否则就丢弃。包过滤是在IP层实现的，包过滤根据数据包的源IP地址、目的IP地址、协议类型（TCP包、UDP包、ICMP包）、源端口、目的端口等报头信息及数据包传输方向等信息来判断是否允许数据包通过。　　包过滤也包括与服务相关的过滤，这是指基于特定的服务进行包过滤，由于绝大多数服务的监听都驻留在特定TCP/UDP端口，因此，为阻断所有进入特定服务的链接，防火墙只需将所有包含特定TCP/UDP目的端口的包丢弃即可。
包过滤防火墙的工作层次
包过滤是一种内置于Linux内核路由功能之上的防火墙类型，其防火墙工作在网络层。
包过滤防火墙的工作原理
使用过滤器数据包过滤用在内部主机和外部主机之间， 过滤系统是一台路由器或是一台主机。过滤系统根据过滤规则来决定是否让数据包通过。用于过滤数据包的路由器被称为过滤路由器。数据包信息的过滤数据包过滤是通过对数据包的IP头和TCP头或UDP头的检查来实现的，主要信息有：
* IP源地址
* IP目标地址
* 协议（TCP包、UDP包和ICMP包）
* TCP或UDP包的源端口
* TCP或UDP包的目标端口
* ICMP消息类型
* TCP包头中的ACK位
* 数据包到达的端口
* 数据包出去的端口
在TCP/IP中，存在着一些标准的服务端口号，例如，HTTP的端口号为80。通过屏蔽特定的端口可以禁止特定的服务。包过滤系统可以阻塞内部主机和外部主机或另外一个网络之间的连接，例如，可以阻塞一些被视为是有敌意的或不可信的主机或网络连接到内部网络中。过滤器的实现数据包过滤一般使用过滤路由器来实现，这种路由器与普通的路由器有所不同。
普通的路由器只检查数据包的目标地址，并选择一个达到目的地址的最佳路径。它处理数据包是以目标地址为基础的，存在着两种可能性：若路由器可以找到一个路径到达目标地址则发送出去；若路由器不知道如何发送数据包则通知数据包的发送者“数据包不可达”。
过滤路由器会更加仔细地检查数据包，除了决定是否有到达目标地址的路径外，还要决定是否应该发送数据包。“应该与否”是由路由器的过滤策略决定并强行执行的。
路由器的过滤策略
* 拒绝来自某主机或某网段的所有连接。
* 允许来自某主机或某网段的所有连接。
* 拒绝来自某主机或某网段的指定端口的连接。
* 允许来自某主机或某网段的指定端口的连接。
* 拒绝本地主机或本地网络与其它主机或其它网络的所有连接。
* 允许本地主机或本地网络与其它主机或其它网络的所有连接。
* 拒绝本地主机或本地网络与其它主机或其它网络的指定端口的连接。
* 允许本地主机或本地网络与其它主机或其它网络的指定端口的连接。
过滤器操作的基本过程
下面做个简单的叙述：
（1）包过滤规则必须被包过滤设备端口存储起来。
（2）当包到达端口时，对包报头进行语法分析。大多数包过滤设备只检查IP、TCP、或UDP报头中的字段。
（3）包过滤规则以特殊的方式存储。应用于包的规则的顺序与包过滤器规则存储顺序必须相同。
（4）若一条规则阻止包传输或接收，则此包便不被允许。
（5）若一条规则允许包传输或接收，则此包便可以被继续处理。
（6）若包不满足任何一条规则，则此包便被阻塞。
包过滤技术的优点
→对于一个小型的、不太复杂的站点，包过滤比较容易实现。
→因为过滤路由器工作在IP层和TCP层，所以处理包的速度比代理服务器快。
→过滤路由器为用户提供了一种透明的服务，用户不需要改变客户端的任何应用程序，也不需要用户学习任何新的东西。因为过滤路由器工作在IP层和TCP层，而IP层和TCP层与应用层的问题毫不相关。所以，过滤路由器有时也被称为“包过滤网关”或“透明网关”，之所被称为网关，是因为包过滤路由器和传统路由器不同，它涉及到了传输层。
→过滤路由器在价格上一般比代理服务器便宜。
包过滤技术的缺点
→一些包过滤网关不支持有效的用户认证。
→规则表很快会变得很大而且复杂，规则很难测试。随着表的增大和复杂性的增加，规则结构出现漏洞的可能 性也会增加。
→这种防火墙最大的缺陷是它依赖一个单一的部件来保护系统。如果这个部件出现了问题，会使得网络大门敞开，而用户甚至可能还不知道。
→在一般情况下，如果外部用户被允许访问内部主机，则它就可以访问内部网上的任何主机。
→包过滤防火墙只能阻止一种类型的IP欺骗，即外部主机伪装内部主机的IP，对于外部主机伪装外部主机的IP欺骗却不可能阻止，而且它不能防止DNS欺骗。
虽然，包过滤防火墙有如上所述的缺点，但是在管理良好的小规模网络上，它能够正常的发挥其作用。一般情况下，人们不单独使用包过滤网关，而是将它和其他设备（如堡垒主机等）联合使用。
包过滤的工作是通过查看数据包的源地址、目的地址或端口来实现的，一般来说，它不保持前后连接信息，过滤决定是根据 当前数据包的内容来做的。管理员可以做一个可接受机和服务的列表，以及一个不可接受机和服务的列表。在主机和网络一级，利用数据包过滤很容易实现允许或禁止访问。
由此不难看出这个层次的防火墙的优点和弱点，由于防火墙只是工作在OSI的第三层（网络层）和第四层（传输层），因此包过滤的防火墙的一个非常明显的优势就是速度，这是因为防火墙只是去检查数据报的报头，而对数据报所携带的内容没有任何形势的检查，因此速度非常快。与此同时，这种防火墙的缺点也是显而易见的，比较关键的几点如下所述。
（1）由于无法对数据报的内容进行核查，一次无法过滤或审核数据报的内容
体现这一问题的一个很简单的例子就是：对某个端口的开放意味着相应端口对应的服务所能够提供的全部功能都被开放，即使通过防火墙的数据报有攻击性，也无法进行控制和阻断。例如在一个简单的Web服务器，而包过滤的防火墙无法对数据报内容进行核查。因此，未打相应补丁的提供Web服务的系统，及时在防火墙的屏蔽之后，也会被攻击着轻易获取超级用户的权限。
（2）由于此种类型的防火墙工作在较低层次，防火墙本身所能接触道德信息较少，所以它无法提供描述细致事件的日志系统。
此类防火墙生成的日志常常只是包括数据报捕获的时间、网络层的IP地址、传输层的端口等非常原始的信息。至于这个数据报内容是什么，防火墙不会理会，而这对安全管理员而言恰恰是很关键的。因为及时一个非常优秀的系统管理员，一旦陷入大量的通过/屏蔽的原始数据包信息中，往往也是难以理清头绪，这在发生安全事件时给管理员的安全审计带来很大的困难。
（3）所有可能用到的端口（尤其是大于1024的端口）都必须开放，对外界暴露，从而极大地增加了被攻击的可能性
通常对于网络上所有服务所需要的数据包进出防火墙的二端口都要仔细考虑，否则会产生意想不到的情况。然而我们知道，当被防火墙保护的设备与外界通信时，绝大多数应用要求发出请求的系统本身提供一个端口，用来接收外界返回的数据包，而且这个端口一般是在1024到65536之间不确定的，如果不开放这些端口，通信将无法完成，这样就需要开放1024以上的全部端口，允许这些端口的数据包进出。而这就带来非常大的安全隐患。例如：用户网中有一台UNIX服务器，对内部用户开放了RPC服务，而这个服务是用在高端口的，那么这台服务器非常容易遭到基于RPC应用的攻击。
（4）如果网络结构比较复杂，那么对管理员而言配置访问控制规则将非常困难
当网络发展到一定规模时，在路由器上配置访问控制规则将会非常繁琐，在一个规则甚至一个地址处出现错误都有可能导致整个访问控制列表无法正常使用。