Linux内核防火墙netfilter的原理和应用

Linux内核防火墙netfilter的原理和应用
      近年来,Linux作为高性能的网络操作系统得到了迅速发展,而Linux内核中所内嵌的防火墙起着重要作用。在Linux1.1版中使用的防火墙是从BSD UNIX中移植过来的ipfw;在Linux2.0版中则为ipfwadm;在Linux2.2版中为ipchains;而在新的2.4版中则是netfilter。

1 ipchains的缺陷

  Linux2.2版内核防火墙ipchains提供了基本的防火墙功能(如包过滤、地址伪装、透明代理等),得到广泛的应用。但是,ipchains也存在如下问题。

  (1)ipchains处理数据包的方式复杂(如IP伪装和NAT)。NAT和ipchains是作为2个独立的Linux项目各自开发的,后来才结合在一起使用,二者配合使用比较复杂。

  (2)输入链描述整个进入IP层的规则,它不区分数据包是以该主机为目的地还是通过该主机中转,混淆了input链和forward链。forward链只负责处理中转的数据包,但它总跟在input链的后面。要区别进入的数据包和中转的数据包,就必须编写复杂的规则,效率就会下降。forward链和output链之间也存在同样的问题。

  (3)ipchains没有提供传递数据包到用户空间的接口,任何对数据包进行处理的代码都必须在内核空间运行,而内核编程复杂,对内核的稳定性构成威胁。

  (4)透明代理实现复杂,必须查看每个数据包判断是否有专门处理该地址的Socket。

  (5)ipchains没有采用开放型结构,用户不能直接扩展ipchains的功能。

  为了解决这些问题,用户需要一个开放的、扩展性好的内核防火墙。Linux2.4版提供了netfilter内核防火墙,它采用更完善的框架结构,具有许多新功能,如完整的动态NAT、基于用户和MAC地址的过滤、真正基于状态的过滤等。netfilter还实现了扩展过滤规则而不必修改内核。

2 netfilter的工作原理

2.1 netfilter的框架结构

  netfilter是Linux2.4内核中实现包过滤、NAT和包处理等的功能模块,它已在IPv4、IPv6和DECnet等网络协议栈中被实现。主要包括以下3部分。

  (1)Hook函数:netfilter为每种网络协议(如IPv4、IPv6等)提供了一套Hook函数,如IPv4就有5个Hook函数。每个Hook函数分别定义了数据包进入协议栈的检查点,当数据包流过检查点时,协议栈将数据包和相关的Hook函数的标号作为参数来调用netfilter框架。

  (2)注册:内核的任一模块均可对每种协议的一个或多个Hook函数进行注册,实现链接。当数据包通过netfilter时,netfilter检查是否有模块对该协议和Hook函数注册,若已注册,则将数据包传给这些模块处理。这些模块就可以检查、修改、丢弃或指示netfilter将该数据包传送至用户空间的队列。

  (3)用户空间队列:传送至用户空间队列的数据包是异步处理的,队列中的数据包通过Hook函数被发送到用户空间,在用户空间中用户进程可以检查、修改数据包,还可以将该数据包通过离开内核的同一Hook函数重新注入到内核中。这样,内核中就没有用户自编的代码,有利于内核的稳定。

2.2 netfilter的数据包处理流程

  与ipchains相比,netfilter区分了数据包的类型。netfilter的数据包处理过程如图1所示。数据包进入netfilter后,首先进行校验和、完整性检查;然后通过路由,确定数据包的类型,否则将数据包传给输入链,如果目的地址不是本机,则将数据包传给转发链;本地进程产生的数据包只经过输出链,经路由转发出去。每条链中可设1条或数条规则。当一个数据包到达一条链时,系统会从第一条规则开始检查。若符合规则,则按规则定义的方法处理;若不符合,则继续检查下一条规则。如果该数据包不符合该链中任何一条规则,系统则按该链预先定义的策略来处理.

 

Linux内核防火墙netfilter的原理和应用_第1张图片

  下面以IPv4为例,说明数据包的处理流程及Hook函数在netfilter中的位置。在IPv4中Hook函数的位置如图2所示。

 

 5个Hook函数分别是:(1)Hook1,NF_IP_ROUTING。(2)Hook2,NF_IP_LOCAL_IN。(3)Hook3,NF_IP_FORWARD。(4)Hook4,NF_IP_POST_ROUNTING。

  (5)Hook5,NF_IP_LOCAL_OUT。

  当一个数据包进入netfilter时,首先由Hook1进行目的地址转换;然后经路由,将此数据包发往本机进程或转发至其他主机。发往本机进程前,数据包要进入Hook2进行输入包过滤;如果是转发至其他主机,则数据包要进入Hook3进行转发包过滤,再进入Hook4进行源地址转换,最后发出本机;如果数据包由本地进程产生,则先进入Hook5进行输出包过滤,然后经路由进入Hook4。这5个Hook函数运行结束后,将返回以下4个结果之一:

  (1)NF_DROP,丢弃此数据包。(2)NF_ACCEPT,允许此数据包继续传递。(3)NF_STOLEN,Hook函数接收此数据包,不再继续传递。(4)NF_QUEUE,将此数据包放入用户空间队列。

2.3 iptables的使用

    iptables是用来配置netfilter过滤规则的工具。在使用iptable命令之前必须加载netfilter内核模块,最简单的方法是使用mod probe命令:mod probe ip_tables。

  利用iptables可以实现数据包过滤(Filter表)、数据包处理(Mangle表)和网络地址转换(NAT表)功能。内核模块可注册一个新的规则表(table),并规定数据包经过指定的规则表,以实现用户所需的功能。iptables通过插入、删除和修改规则链中的规则,可以对所有的IP表进行处理,包括Filter表、Mangle表和NAT表等。它支持插件以匹配新的参数和目标动作。因此对netfilter的扩展就很简单,仅需编写一个完成目标动作的处理模块和iptables插件(动态链接库)。以上3种数据包的处理功能都是基于netfilter的Hook函数和IP表,它们是相互独立的模块,都被集成到netfilter提供的框架内。

  iptables命令基本包括以下5部分:(1)工作在哪个表上(Filter、Mangle、NAT)。(2)使用该表的哪条链(input、output、forward)。(3)进行的操作(插入、添加、删除、修改)。(4)对特定规则的目标动作。(5)匹配数据包的条件。

3 应用举例

  使用iptables工具建立一个简单的包过滤防火墙。

3.1 物理结构

  防火墙主机采用双宿主机形式,eth0为外部网络接口,eth1为内部网络接口,主机操作系统采用RedHat7.1(Linux2.4内核)。防火墙要求:允许内部主机浏览外部网页;允许外部主机浏览内部Web服务器;可以阻拦某些非法攻击。现假设内部网络IP为202.206.230.00~25;Web服务器地址为202.206.230.75:80;DNS服务器地址为212.112.20.132。

3.2 防火墙的配置

3.2.1 系统设置

  以root用户身份登录,在/etc/rc.d/目录下创建rc.firewall文件,执行命令“chmod 700 rc.firewall”。更改文件属性,防止其他用户对其访问。再编辑/etc/rc.d/rc.local文件,在末尾加上sh/etc/rc.d/rc.firewall,这样在开机时能自动执行该脚本。

3.2.2 配置步骤

  (1)清除所有链的规则

  # !/bin/sh

  /sbin/iptables-F

  (2)设置防火墙默认规则

  默认规则就是当数据包不匹配链上的任何规则时所采取的策略,此处采用禁止一切的默认策略,即:如果某个数据包没有规则与之匹配,则该数据包将被禁止。

  /sbin/iptables-P INPUT DROP

  /sbin/iptables-P OUTPUT DROP

  /sbin/iptables-P FORWARD DROP

  (3)设置服务器的包过滤规则

  由于服务器/客户机是双向交互的,所以既要设置数据包出去的规则,又要设置数据包进来的规则。

  ①允许对内部网服务器访问。下面的一条规则是指:允许目的地址是内部网Web服务器且采用TCP协议的数据包通过。

  /sbin/iptables-A FORWARD-p tcp - d

            202.206.230.75 - -dport 80-i eth0- j ACCEPT

  /sbin/iptables-A FORWARD-p tcp - s

            202.206.230.75 - -sport80-o eth0- j ACCEPT

  ②允许域名解析。对外部网服务器访问应先开放域名解析服务。域名服务器的端口为53,该规则是:允许目的地址是DNS服务器且采用UDP协议的数据包通过。

  /sbin/iptables-A FOREARD-p udp- -dport 53 - d

            212.112.20.132 - o eth0-j ACCEPT

  /sbin/iptables-A FORWARD-p udp- -sport53 - s

            212.112.20.132 - i eth0- j ACCEPT

  ③允许对外部网服务器访问。该规则是:允许目的端口为80、采用TCP协议,来自内部网地址的数据包通过。

  /sbin/iptables-A FORWARD-p tcp-s 202.206.230.00

           /25- -dport 80- o eth0-j ACCEPT

  /sbin/iptables-A FORWARD-p tcp- d 202.206.230.00

           /25 - -sport 80 -i eth0-j ACCEPT

  (4)阻拦非法攻击

  ①防止IP碎片攻击:接收所有的IP碎片,但对单位时间内通过的IP碎片数量进行限制,只允许每秒通过100个IP碎片。

  /sbin/iptables-A FORWARD-f-m limit- -limit

           100/s- -limit-burst 100-j ACCEPT

  ②防止ping攻击:ping是基于ICMP协议的一个常用网络工具,但黑客常常利用它进行攻击(如Ping Flooding、Ping of death等),所以必须对它的使用加以限制。允许每秒通过一个ICMP包,默认触发条件是5个包。

  /sbin/iptables-A FORWARD-p icmp-m limit- -limit1/s - j ACCEPT

  通过以上的步骤,可以建立一个较完整的防火墙。只对外开放有限的端口,同时又允许用户进行网络访问,并且还可以阻拦一些非法攻击。在此基础上,读者还可以根据需要对防火墙进行其他设置,如开放FTP服务和电子邮件服务等。

4 结束语

  netfilter是目前Linux各版本中较完善和强大的防火墙子系统,而且它兼容以前的ipfwadm和ipchains,并针对旧版本存在的缺陷进行了改进,使之更简便、易用。由于Linux的高效、免费的特点,其在服务器领域得到越来越广泛的应用。因此Linux防火墙子系统netfilter作为一种实现网络安全的手段,也得到了广泛的应用。

你可能感兴趣的:(Linux内核防火墙netfilter的原理和应用)