今天有人问倒iptables的一些问题,记得以前提到过用iptables封P2P软件,其实还可以借助开源软件进行好多类似的功能,贴个以前的资料。
准备知识:
什么是防火墙?防火墙的作用?
对于连接到网络上的 Linux 系统来说,防火墙是必不可少的防御机制,它可以控制允许合法的网络流量进出系统,而禁止其它任何网络流量。为了确定网络流量是否合法,防火墙依靠它所包含的由网络或系统管理员预定义的一组规则来匹配数据包。这些规则告诉防火墙某个流量是否合法以及对于来自某个源、至某个目的地或具有某种协议类型的网络流量要做些什么操作。网络流量由 IP 信息包(以流的形式从源系统传输到目的地系统的一些小块数据)组成。这些信息包前面所附带的一些数据位,它们包含有关信息包的源、目的地和协议类型的信息。防火墙根据一组规则检查这些头信息,以确定接受哪个信息包以及拒绝哪个信息包。我们将该过程称为信息包过滤。
什么是iptables?
iptables是linux中最有名的防火墙过滤工具,它其实是由netfilter/iptables两部分组成,netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。有时简化名称,一般直接称为 iptables。 netfilter/iptables IP信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。你可能正在使用Linux系统默认安装的版本,如果你没有,可以从 netfilter.org 下载该工具并安装使用它。
Iptables能干什么?
通过使用iptables,用户可以构建自己的规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有目标,它们告诉内核对来自某些源、前往某些目的地或具有某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用动作ACCEPT 允许该信息包通过。也可以使用动作DROP 或 REJECT 来阻塞并杀死信息包。根据规则所处理的信息包的类型,可以将规则分组在链中。包过滤表中共包括三张表:
l filter:过滤主表,也是默认表,主要处理:所有的入站信息包的规则被添加到 INPUT 链中。所有出站信息包的规则被添加到 OUTPUT 链中。所有正在转发的信息包的规则被添加到 FORWARD 链中。这三个链存在于基本信息包过滤表中内置的缺省主链filter中。
l nat:网络地址转换表,如果你要使用源地址转换SNAT和目标地址转换DNAT保护内网时就会需要对这张表进行操作。这张表包括三个链:PREROUTING,POSTROUTING,OUTPUT.
l Mangle:mangle表提供了修改数据报各个字段的值的方法,针对数据包处理的目标扩展,如MARK标志和TOS标志。它位于包过滤中的所有规则的最前端。它包括的链表有:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING。
下图是iptables在包过滤流程中将会流经的各个表中的链的示意图:
另外,还提供用户自己定义的链。每个链都可以有一个策略,它定义“缺省目标”,也就是要执行的缺省操作,当信息包与链中的任何规则都不匹配时,执行此操作。
建立规则并将链放在适当的位置之后,就可以开始进行真正的信息包过滤工作了。这时内核空间从用户空间接管工作。当信息包到达防火墙时,内核先检查信息包的头信息,尤其是信息包的目的地。我们将这个过程称为路由。
要弄清楚上面的图,可以这样考虑。在第一个路由判断处,不是发往本地的包,我们会发送它穿过 FORWARD链。若包的目的地是本地监听的IP地址,我们就会发送这个包穿过INPUT链,最后到达本地。
值得注意的是,在做NAT的过程中,发往本机的包的目的地址可能会在PREROUTING链里被改变。这个操作发生在第一次路由之前,所以在地址被改变之后,才能对包进行路由。注意,所有的包都会经过上图中的某一条路径。如果你把一个包DNAT回它原来的网络,这个包会继续走完相应路径上剩下的链,直到它被发送回原来的网络。
下图为netfilter/iptables的信息包过滤流程图
iptables的优点:
netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains ,ISA等以前的工具都无法提供的一种重要功能。有状态的防火墙是能够在内存中保存穿过防火墙的每条连接,指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以有效增强处理效率和处理速度。这里有四种有效状态,它们分别为 ESTABLISHED、INVALID、NEW 和 RELATED。
l 状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。
l INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头,也有可能是人为构造的非法或恶意的数据包。
l 状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。
l 状态RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。
netfilter/iptables 的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。
另外,netfilter/iptables 是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。
Iptables的缺点:
根据已有的了解,我们知道iptables是工作在OSI第三层,对于有针对性地对源地址,目标地址,端口和协议类型进行分析,它是非常管用。除此之外,你无法再想对数据包进一步的封锁。而现实当中,基于应用层的应用就相当复杂,如国内流行的QQ,BT客户端都可以通过很多无规则变化的代理地址或监听端口连接服务器,再比如说应用层攻击,这个就要复杂得多,因为攻击数据包在绝大多数情况下是合法的数据包,不同的只是内容具有攻击性,而且因为IP数据包是分段传输的,其内容的判别需要将所有相关的包重组后才能准确进行。一旦这种攻击数据包通过了防火墙,它们通常会开始有条不紊地利用目标系统的漏洞制造缓冲区溢出,获得系统的控制权,然后以此为平台开始寻找周围其他系统的漏洞或者其他的蠕虫留下的后门,进而展开攻击。再比如说,大多数的包含不良非法内容的垃圾邮件和携带病毒的邮件传输等。因此,如果真得要对这些信息内容进行控制和过滤,势必只有通过分析OSI的四到七层的数据内容才能真正确定数据中所包含的信息特征代码,从而被防火墙规则所识别。这方面如MS的ISA就做得相当不错,ISA2004版本中对于FTP,SMTP的内容过滤功能还是很强大的。除此之外,目前很多的IPS(入侵防御系统)也都可以做到四到七层的过滤,但是IPS造价普遍偏高,如果产品是采用NP、ASIC专用芯片(网络处理器),价格就更昂贵了。这显然不在本文的讨论范围中,有兴趣的同志可以比较一下IPS的工作参数和性能指标。当然,这是大势所向,我相信以后的iptables肯定会支持应用层的过滤。
我们要做什么?
我们的目标很明确,就是设法通过其它软件的帮助,让iptables也能够支持七层过滤,什么样的软件可以做到呢?L7-filter就是一个很好的软件,它可以帮助我们完成这个愿望。简单介绍一下这个软件,L7-filter实际上是一个netfilter/iptables的增强型补丁插件,它的核心是通过一个工作在内核级的可进行数据包分类的补丁程序与iptables进行联动,与其它基于端口(比如说,80端口跑web服务,21端口是FTP服务)包分类工具不同处在于,它是基于数据内容匹配和分析的。它一共包括如下三个软件:
1. 一个是kernel的补丁,通过它可以让新内核支持七层过滤,目前只提供了2.4.21和2.6.7内核的补丁包。
2. 另一个是iptables工具的补丁,通过它给iptables打补丁,可以调用内核中的函数实现防火墙的联动。
3. 还有一个是目录,其中包括了已经可以被支持的一些应用层的特征码:如http协议的请求特征,还有msnmessager,msn-filetransfer,RTSP,VNC,MUTE,Gnutella等等。你也可以添加一些特征代码在这里。
简单介绍完了这个软件的组成部分后,下面就开始安装这个软件吧!
安装程序过程:
1. 安装操作平台是TLS(Trustix Linux Server2.1),gcc为3.3.3-4版本。
2. 首先下载需要的所有软件包:我们需要
· 从kernel.org 上下载所需的内核包,建议下载2.4.26或者2.6.7版本。本文中使用的是2.6.7内核。
· 从 netfilter.org 上下载iptables-1.2.11版本。
· 从 http://sourceforge.net/projects/l7-filter上下载最新l7-filter软件包和协议包为netfilter-layer7-v0.9.1.tar.gz和l7-protocols-2004_11_22.tar.gz
3. 给内核打补丁并编译内核使之支持七层过滤
我下载的是linux-2.6.7.tar.bz2包,使用以下命令:
# tar jxvf linux-2.6.7.tar.bz2 –C /usr/src ** 解压内核到指定位置
# tar zxvf netfilter-layer7-v0.9.1.tar.gz –C /usr/src **同上
# cd /usr/src/linux-2.6.7
# patch -p1 < /usr/src/netfilter-layer7-v0.9.1/kernel-2.6.7-layer7-0.9.1.patch **打补丁
# make menuconfig ** 如果是崭新的内核,就直接执行,如果不是,先用make mrproper清除一些已经存在的垃圾文件
# ………
这里省略配置过程,要注意的是以下几个选项必须有效:
1. EXPERIMENTAL (代码的成熟度,要使用新特性必须要打开)
2. 打开netfilter支持,在(Device Drivers→ Networking support→ Networking Options→ Network packet filtering)
3. 打开connection tracking支持,在(Network packet filtering→ IP: Netfilter Configuration→ Connection tracking).最好把所有选项都选上,注意FTP support" 和"IP tables support"以及"Layer 7 match support"这些选项。
4. 注意:最好把对ext3文件系统的支持直接编译,不要用模块方式。
# make all ** 在2.6内核编译中,此开关已经包括了make vmlinux/bzImage,make modules这几个命令的组合
# make modules_install
# make install ** 系统自动会把启动信息加入到引导程序中
4. 给iptables打补丁,让它支持"-m layer7 --l7proto [http|ftp|etc...]".格式
# tar zxvf iptables-1.2.11.tar.gz –C /usr/src ** 方便起见,全部解压到/usr/src目录下
# cd /usr/src/iptables-1.2.11
# patch –p1 < /usr/src/netfilter-layer7-v0.9.1/iptables-layer7-0.9.1.patch
# chmod +x extensions/.layer7-test ** 这一步别漏掉
# make KERNEL_DIR=/usr/src/linux-2.4.26 ** 这一步很关键,也是安装过程中最费解的。为什么是2.4.26呢?原作者在文档中指出打了补丁后的iptables不能和2.6.7内核结合编译,但这不是l7-filter的问题,可以与其它内核编译完成后使用。
# 我认为读者如果没有需要,就不必编译2.6.7内核。因为编译2.6.7内核需要升级诸如lsmod,rmmod,modprobe命令包,详情请见参考7。对于新手会有一些麻烦,建议直接使用2.4.26内核。
# make install KERNEL_DIR=/usr/src/linux-2.4.27
# make install-devel
5. 下面安装l7-filter所用到特征码匹配文件
# tar zxvf l7-protocols-2004_11_22.tar.gz
# cd l7-protocols-2004_11_22
# make install ** 默认安装会自动拷贝到/etc目录下,里面是一些默认的规则信息
软件使用方法:
安装以后,我们就可以使用新的Iptables参数-m layer7 和 –l7dir及 –l7proto。关于iptables的使用和规则创建防火墙内容也是很重要的,它既是linux下防火墙搭建的重要组成部份,同时也是保证linux 安全的重要措施之一,因此,掌握iptables的技能非常关键,在这强调一点,有机会要好好掌握iptables的用法,具体可以参见网上资料,或者 <<开放系统世界>>第1期的《使用iptables构建防火墙》。
这里假设iptables的所有命令安装在/sbin或者是/usr/local/sbin下,如:
# iptables –t mangle –A POSTROUTING –m layer7 –l7proto http –j MARK –set-mark 1
这里我们使用了mangle的POSTROUTING链,这是因为我们注意它是所有出去包的必经这路,在这里做设置是最有效。
如果l7protocols并不是安装在默认的/etc目录下,我们可以指定参数--l7dir来指定路径:
# iptables –t mangle –A POSTROUTING –m layer7 –l7dir /usr/local/etc/patterns
–l7proto http –j MARK –set-mark 1
实际应用过程中,我们可以有多种操作,如阻止数据包发送,做带宽限制,处理子进程等。
l 阻止数据包发送,我们只需要将上面的命令的MARK标志换作–j DROP(-j REJECT)就可以了。
注意:原作者建议,尽量少做这个操作,因为这个软件所使用的内容匹配并不十分的准确,比如说:有些基于FTP协议的web页面很容易被误导用FTP的特征去匹配,显然这是不正确的。原作者认为,尽量用带宽限制来对你想阻止的数据包进行处理。
l 带宽限制操作就和我们前面的格式一样,我们可以借助tc(traffic control),iproute2工具中的一个程序来过滤那些被MARK的数据包。如:
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
这是属于linux高级路由和流量控制部分的内容,也是需要花时间和精力去研究的。对此我没有研究,不便发表建议,具体应用可以通过参考资料5了解更多。
l 处理FTP,IRC等其它服务。有些服务可以衍生出很多子连接来传输数据,比如说FTP服务或者IRC/IRC-DCC等。如果你在内核编译中已经加入了对ip_conntrack_ftp的支持,l7-filter就可以分类出FTP和它所有的子连接并进行处理。
# iptables –t mangle –A POSTROUTING –m –helper ftp –l7proto ftp –j MARK –set-mark 3
注意:默认情况下,l7-filter会匹配数据中的前8个包或者是2KB的包大小。如果你想匹配更多的数据包,通过修改/proc/net/layer7_numpackets,如
echo "12" > /proc/net/layer7_numpackets
或者你可以在内核编译中的过程中修改配置文件中的:CONFIG_IP_NF_MATCH_LAYER7_MAXDATALEN这个参数来让内核中匹配更多的数据大小。
结束语
以上这是l7-filter的一些基本使用方法,在我使用过程中,发现此软件仍然存在一些不足之处,比如说,一旦启用-m layer7参数后,满屏都是过滤数据,让人眼花缭乱,切换终端也无济于事,只能通过ssh连接查看。还有就是匹配准确程度并不高,还有待提高。但是作为目前iptables尚没有的功能的过渡产物来说,它的存在还是给了我们极大的方便。到此,对这个软件的简单介绍做一个段落,目前这个项目正在发展中,请多多关注其发展动态。
参考资料:
1. netfilter简介http://www.xagoogle.com/resource/netfilter/netfilter005.htm
2. netfilter/iptables概念http://www-900.ibm.com/developerWorks/cn/linux/network/s-netip/index.shtml
3. 通过 改变TOS优化性能http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=proxy&Number=455795&page=0&view=collapsed&sb=5&o=all&fpart=
4. iptables的配置工具:http://www.cngnu.org/technology/9607/294.html
5. linux高级路由和流量控制的文档:http://lartc.org/
6. l7-filter的官方网站:http://l7-filter.sourceforge.net/
7. 如何编译2.6.x内核:http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=489871&page=0&view=collapsed&sb=7&o=7&fpart=