当前位置:Linux教程 - Linux资讯 - 实现Linux网络防火墙

实现Linux网络防火墙

防火墙作为一种网络或系统之间强制实行访问控制的机制,是确保网络安全的重要手段。针对不同的需求和应用环境,可以量身定制出不同的防火墙系统。防火墙大到可由若干路由器和堡垒主机构成,也可小到仅仅是网络操作系统上一个防火墙软件包所提供的包过滤功能。 在众多网络防火墙产品中,Linux操作系统上的防火墙软件特点显著。首先是Linux操作系统作为一个类Unix网络操作系统,在系统的稳定性、健壮性及价格的低廉性方面都独具优势。更为重要的是,Linux不但本身的源代码完全开放,而且系统包含了建立Internet网络环境所需要的所有服务软件包,如Apache Web服务器、DNS服务器、Mail服务器、Database服务器等。同样,基于Linux的防火墙软件不但具有强大的功能,而且大部分都是开放软件。 随着Internet的飞速发展,安全问题越来越重要。利用Linux构建企业网深受中小企业的青睐,而利用Linux构建企业网的防火墙系统也成为众多中小企业的理想选择。 Linux内核从1.1版本开始,就已经具备包过滤功能。在2.0内核中,开始采用Ipfwadm来操作内核的包过滤规则。到2.2版本时,Linux内核采用了Ipchains来控制内核的包过滤规则。发展到2.4.x时,Ipchains被一个全新的包过滤管理工具Iptables所替代。新发布的 2.6版内核也在安全方面进行了改进。因此,无论拥有哪个版本的Linux内核,无论选择哪个版本的Linux来构建自己的企业网,都可以利用现有的系统构建出一个理想实用的防火墙。 防火墙系统可分为包过滤型、应用级网关(也叫代理服务器型防火墙)和电路级网关三种基本类型。Linux提供的防火墙软件包内置于Linux内核中,是一种基于包过滤型的防火墙实现技术。其中心思想是根据网络层IP包头中的源地址、目的地址及包类型等信息来控制包的流向。更彻底的过滤则是检查包中的源端口、目的端口以及连接状态等信息。 本文主要介绍Linux提供的IPFW、Ipchains、Iptables这三种非常实用的防火墙和具体实现。 IPFW防火墙 IPFW是比较老的Linux内核版本提供的防火墙软件包。该软件包的全称是Ipfwadm。Ipfwadm程序包提供了建立规则的能力,根据这些规则来确定允许什么样的包进出本网络。简单说来,防火墙就是一对开关,一个开关允许包通过,另一个开关禁止包通过。现代防火墙系统一般都会附加审计跟踪、加密认证、地址伪装和VPN等多种功能。作为一个安全开关,防火墙可定义的安全策略有两个:(1)一切未被允许的都被禁止;(2)一切未被禁止的都被允许。 显然,策略1的安全性明显高于策略2,但它是以牺牲灵活性和可访问资源为代价来提高安全性的。Ipfwadm系统同样提供IP封装,它允许用户使用Internet上的一个公共IP地址空间。 下面以Red Hat系统为例,说明Linux系统上IPFW防火墙的实现。 在Red Hat系统上(在其它系统上一样)安装Ipfwadm防火墙,需要以root用户登录,然后执行如下命令:#rpm -ivh /mnt/cdrom/RedHat/RPMS/ Ipfwadm-2.3.0-5.i386.rpm 在安装好Ipfwadm后,就可以交互方式指定Ipfwadm的包过滤规则。过滤规则对每一个进入系统的IP包进行检查,从而决定哪些包允许通过防火墙,哪些包则禁止通过。Ipfwadm命令的一般格式为:/sbin/ ipfwadm category commands parameters [options] Ipchains(IP链)和IP伪装 在更新版本的Linux内核中,Ipchains替代Ipfwadm,提供了更为严格的包过滤控制机制。Ipchains提供完整的防火墙功能,包括包过滤、地址伪装、透明代理。 Linux 2.2内核中提供的Ipchains,通过四类防火墙规则列表来提供防火墙规则控制,这些列表称为防火墙链。它们分别是IP input链(IP输入链)、IP output链(IP输出链)、IP forward链(IP转发链)和user defined链(用户定义链)。一个链实际上就是一个规则表。所谓规则,即当被检测的包头符合规则的定义时,就按预先的设定对该包进行某种处理。输入链是指对内连接请求的过滤规则;输出链是对外连接请求的过滤规则;转发链是对内部与外部通信包转发的过滤规则;用户定义链是用户自己定义的规则。 当一个数据包进入Linux防火墙系统时,Linux内核使用输入链决定对这个包的操作;如果这个包不被丢弃,内核则使用转发链来决定是否将这个包转发到某个出口;当这个包到达一个出口被发出前,内核使用输出链最后确定是丢弃该包还是转发该包。在上面的过程中,如果输入链已经决定处理这个包,则核心需要决定下一步包应该发到什么地方,即进行路由。假如此时该数据包是发到另一台主机的,则核心就运用转发链;如果没找到匹配的设置,则这个包就需要进入目标值指定的下一条链,此时目标值有可能是一条用户自定义链,也有可能是一个特定的值。例如:ACCEPT 允许通过。DENY 直接丢弃。REJECT 丢弃并通过ICMP回复通知发送者包被丢弃。 MASQ 通知核心将该包伪装,该值只对转发链和用户自定义链起作用。 REDIRECT 通知核心将包改送到一个本地端口,该值只对输入链和用户自定义链起作用,并且只有UDP和TCP协议才可以使用该值。 RETURE 通知内核将该包跳过所有的规则,直接到达所有链的链尾。 在Linux系统IP链的转发链上可以配置IP伪装。实际上,IP伪装是一个比包过滤策略更安全的解决方案,它不仅能够提供一种安全机制,还同时解决了 Internet中IP地址资源不足的问题。IP伪装使一台计算机在访问Internet时,能够将本台机器的真正IP地址伪装成其它地址。如果连接到 Internet上的一台主机具有IP伪装功能,则这台机器不管是通过局域网,还是PPP拨号都可以与Internet连接。尽管在使用PPP时,这样的主机根本没有自己正式的IP地址。这说明可以将一台主机隐藏在一个网关后面来访问Internet,使得这台主机既实现了对Internet的访问,又实现了其访问对外界的不可见性(即隐藏性)。显然,这种隐藏性使得系统非常安全,因为外界根本意识不到主机的存在,也就不可能对主机实施存取操作,更不能入侵和破解。通常情况下,使用IANA保留的私有地址来进行伪装。 在防火墙转发链配置IP伪装后,内部网络上的主机向Internet发送访问IP包时,内核将源IP地址换成网关的IP地址,并记录被伪装的IP地址后再转发该IP包。当这个包的Internet应答包从Internet进入网关时,内核执行去除IP伪装的操作,即将目的地址替换成内部地址。 通过适当的设置,IP伪装可以在某个网段、某台主机、某个接口、某个协议甚至是某个协议的某些端口上实现,非常灵活。IP伪装可以将内部网络的细节对外部网络屏蔽掉,因此,IP伪装提供了很好的安全性。 一般来说,安装相应版本的Linux系统时,系统会自动将Ipchains安装上。如果系统没有安装IP链软件包,可以通过光盘或从网上下载软件包来安装。 如果是rpm包,使用如下命令安装:#rpm -ivh *.rpm 如果是.tar.gz包,则先需要将压缩包解压: #tar xvfz *.tar.gz 然后再到解压后所在目录执行如下命令完成安装:#./configure#make#make install 这样就将IP链防火墙成功安装在系统中。成功安装Ipchains后,接下来就是启动并配置包过滤规则。启用Ipchains需要完成如下操作:◆ 手工修改/proc/sys/net/ipv4/ipforward文件,将其内容置为1。◆ 在/etc/rc.d/目录下用toUCh命令建立rc.ipfwadm文件。◆ 在/etc/rc.d目录下的rc.local文件中加上下面这段代码:if [-f /etc/rc.ipfwadm];then /etc/rc.d/rc.ipfwadm;fi; 这使得以后所有Ipchains的配置命令都将在rc.ipfwadm文件里修改。 和IPFW一样,Ipchains也是基于配置策略进行包过滤的。使用的策略方式也是两种:(1)首先允许所有的包都可通过,然后禁止有危险的包;(2)首先禁止所有的包,然后再根据所需要的服务允许特定的包通过。 Iptables Iptables是一个管理内核包过滤的工具,可以加入、插入或删除核心包过滤表格中的规则。实际上真正来执行这些过滤规则的是Netfilter 。Netfilter是Linux核心中一个通用架构,它提供一系列的表(tables),每个表由若干链(chains)组成,而每条链中可以由一条或数条规则(rule)组成。

图 Netfilter的总体结构 相对于2.2内核提供的IP链来说,2.4内核提供了更好的灵活性和可扩展性。2.4内核中的防火墙并不是2.2内核的简单增强,而是一次完全的重新实现,2.4内核提供的防火墙软件包在结构上发生了非常大的变化。与IP链相比,2.4内核提供的Iptables的检测点变成了5个,并在每个检测点上登记需要处理的函数,登记通过nf-register-hook()函数保存在全局变量nf-hook中来实现。当包到达此检测点时,实现登记的函数按照事先定义好的优先级别来执行。相对于2.2内核提供的IP链来说,Iptables实现的不仅仅是包过滤功能,而是通过Netfilter实现一整套框架结构,在这个框架之上实现包过滤、NAT等模块功能,从而提供更好的可扩展性和灵活性。 系统缺省的表为filter,该表包含了INPUT链(输入链)、FORWARD链(转发链)和OUTPUT链(输出链)。每一条链中可以定义一条或数条规则,每一条规则都以如下格式定义:条件/处理方式。 当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件。如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足,则继续检查下一条规则。如果该数据包不符合该链中任一条规则,系统则会根据该链预先定义的策略(policy)来处理该数据包。 和前面介绍的两个软件包一样,Iptables及Netfilter也是内置在Linux内核中,可以将相应的软件包编译到内核中,从而完成 Iptables防火墙的安装。Netfilter框架能够在内核2.3.5及以上版本实现。在将软件包重新编译进内核时,要求选择和Netfilter 相关的项目。这些项目通常都是位于“Networking options”子项下。以2.4.0内核为例,应该选中的项目有:

[*] Kernel/User netlink socket [ ] Routing messages <*> Netlink device emulation [*] Network packet filtering (replaces ipchains) 在“IP: Netfilter Configuration ---->”选中如下选项: <M> Connection tracking (required for masq/NAT) <M> FTP protocol support <M> IP tables support (required for filtering/masq/NAT) <M > limit match support <M> MAC address match support <M> Netfilter MARK match support <M> Multiple port match support <M> TOS match support <M> Connection state match support <M> Packet filtering <M> REJECT target support <M> Full NAT <M> MASQUERADE target support <M> REDIRECT target support <M> Packet mangling <M> TOS target support <M> MARK target support <M> LOG target support <M> ipchains (2.2-style) support <M> ipfwadm (2.0-style) support上面最后两个项目可以不选,如果将其选中,则可以在2.4内核中使用Ipchains或Ipfwadm。需要注意的是,Iptables和 Ipchains/Ipfwadm是相对立的,在使用Iptables时就不能同时使用Ipchains/Ipfwadm。选择完所需选项后,就可以执行编译操作了。编译成功后,这些模块文件都位于目录/lib/modules/2.4.0/kernel/net/ipv4/netfilter中。 编译2.4.0新内核时还应该注意,要在“Processor type and features”中选择与所用CPU相对应的、正确的CPU选项,否则新内核可能无法正常工作。 成功安装Iptables后,不能直接使用Iptables,还必须载入相关模块。使用以下命令载入相关模块:#modprobe iptable_tables modprobe命令会自动载入指定模块及其相关模块。iptables_filter模块会在运行时自动载入。 Iptables实际上是一个操作过滤规则的工具。利用Iptables工具,可以对Netfilter中的链和规则进行操作。Iptables使用与 IP链基本相同的语法和命令格式。除了对链和规则进行操作外,Iptables还提供其它一些操作。如通过--source/--src/-s指定源地址;通过--destination/--dst/-s指定目的地址;通过--protocol/-p选项指定协议,比如-p tcp;使用--in-interface/-i或--out-interface/-o)指定网络接口;指定IP碎片等。这里不一一介绍相关语法。读者可以从HOWTO文档获得相关内容。

(出处:http://www.sheup.com)