一,iptables概述

     iptables 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

     iptables 是与 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

   netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。

虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。

netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。

netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains 等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。

状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后, RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。

netfilter/iptables 的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。

另外,netfilter/iptables 是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。

二,iptables与linux2.6.25的结合实现七层过滤案例

     1,iptables与linux2.6.25的结合

     一、重新编译内核
    1、合并kernel+layer7补丁
shell> tar jxvf linux-2.6.25.19.tar.gz2 -C /usr/src/
shell> tar zxvf netfilter-layer7-v2.20.tar.gz -C /usr/src/
shell> cd /usr/src/linux-2.6.25.19/
shell&gt; patch -p1 < /usr/src/netfilter-layer7-v2.20/kernel-2.6.25-layer7-2.20.patch
    2、配置新内核
shell> cp /boot/config-2.6.18-8.el5 .config    //偷个懒,沿用旧的内核配置
shell&gt; make menuconfig
    //配置内核时,在“Networking ---&gt; Networking Options ---&gt; Network Packet filtering framework (Netfilter) ”处主要注意两个地方:
    1) ---&gt; Code Netfilter Configuration
        //将“Netfilter connection tracking suport (NEW)”选择编译为模块(M),需选取此项才能看到layer7支持的配置。
        //将layer7、string、state、time、IPsec、iprange、connlimit,tftp……等编译成模块,根据需要。
    2) ---&gt; IP: Netfilter Configuration
        //将“IPv4 connection tracking support (require for NAT)”编译成模块。
        //将“Full NAT”下的“MASQUERADE target support”和“REDIRECT target support”编译成模块。
    3、编译及安装模块、新内核
shell&gt; make && make modules_install && make install
        //编译安装成后后,重启选择使用新的内核(2.6.25.19)引导系统

     二、重新编译iptables
    1、卸载现有iptables
shell&gt; rpm -e iptables iptstate --nodeps
    2、合并iptables+layer7补丁
shell&gt; tar jxvf iptables-1.4.2.tar.bz2 -C /usr/src/
shell&gt; cd /usr/src/netfilter-layer7-v2.20/iptables-1.4.1.1-for-kernel-2.6.20forward/
shell&gt; cp libxt_layer7.c libxt_layer7.man /usr/src/iptables-1.4.2/extensions/
3、编译安装
shell&gt; cd /usr/src/iptables-1.4.2/

shell&gt; ./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.25.19
shell&gt; make && make install

    4、安装l7-protocols模式包
shell&gt; tar zxvf l7-protocols-2008-10-04.tar.gz -C /etc/
shell&gt; mv /etc/l7-protocols-2008-10-04 /etc/l7-protocols

layer7规则示例
    1、layer7 match
shell&gt; iptables -A FORWARD -m layer7 --l7proto qq -j DROP 过滤QQ等软件
shell&gt; iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP
shell&gt; iptables -A FORWARD -m layer7 --l7proto msn-filetransfer -j DROP
shell&gt; iptables -A FORWARD -m layer7 --l7proto xunlei -j DROP
shell&gt; iptables -A FORWARD -m layer7 --l7proto edonkey -j DROP
shell&gt; iptables -A FORWARD -m layer7 --l7proto bittorrent -j DROP
    2、string match 过滤关键字
shell&gt; iptables -A FORWARD -p udp --dport 53 -m string --string "tencent" --algo bm -j DROP
shell&gt; iptables -A FORWARD -p udp --dport 53 -m string --string "verycd" --algo bm -j DROP
shell&gt; iptables -A FORWARD -p tcp --dport 80 -m string --string "sex" --algo bm -j DROP
    3、state match   多次连接FTP
shell&gt; iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
shell&gt; iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    4、connlimit match
shell&gt; iptables -A FORWARD -p tcp --syn -m connlimit --connlimit-above 100 --connlimit-mask 24 -j DROP
    5、time match  基于时间过滤
shell&gt; iptables -A FORWARD -p tcp --dport 80 -m time --timestart 8:00 --timestop 17:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT

三,案例

实现内网对外网服务器的访问(snat)及外网对内网的远程登录(dnat)

2012-09-18_004910

[root@mail ~]# vim /etc/sysctl.conf 打开linux数据包转发功能
2012-09-17_181523
[root@mail ~]# sysctl -v
[root@mail ~]# iptables -t nat -A POSTROUTING -s 192.168.220.0/24 -o eth1 -j SNAT --to 192.168.101.199
测试xp与2003连通性
2012-09-17_182149
在2003上建立webftp站点
2012-09-17_183350 
2012-09-17_183435

2012-09-17_183554
[root@mail ~]# modprobe ip_nat_ftp
2012-09-17_184708

2012-09-17_183718

实现外网对内网的远程登录
[root@mail ~]# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3389 -j DNAT --to 192.168.220.20
2012-09-17_185355

2012-09-17_185456

2012-09-17_185714

2012-09-17_191250

测试软件部门不许访问非法站点
[root@mail ~]# iptables -t filter -A FORWARD -s 192.168.220.0/24 -o eth1 -m time --timestart 20:01 --timestop 07:59 -j ACCEPT
下班无限制

小案例

禁止220.21-30人员上baidu上班时间
默认拒绝
[root@mail ~]#iptables -P INPUIT DROP
ip[root@mail ~]#tables -A INPUT -s 192.168.220.2 -p tcp --dport 22 -j ACCEPT 实现ssh操作

[root@mail ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.220.21-192.168.220.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tun,Wed,Thu,Fri -m string --string "baidu" --algo bm -j DROP
允许http
[root@mail ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.220.21-192.168.220.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tun,Wed,Thu,Fri -p tcp --dport 80 -j ACCEPT
允许dns通过
[root@mail ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.220.21-192.168.220.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tun,Wed,Thu,Fri -p udp --dport 53 -j ACCEPT

[root@mail ~]# iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

[root@mail ~]# date 091715002012上班时间拒绝baidu但可以上sina

2012-09-18_002453 


[root@mail ~]# date 091722002012下班时间可以访问

2012-09-17_212217 

[root@mail ~]# iptables -L

 

 ftp

出去

i[root@mail ~]#ptables -t filter -A FORWARD -m iprange -m iprange --src-range 192.168.220.21-192.168.220.30  -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Tur,Fri -p tcp --dport 21 -j ACCEPT
进来
[root@mail ~]#iptables -t filter -A FORWARD -p tcp --sport 21 -j ACCEPT
此时可以ftp
无法dir
要想dir
[root@mail ~]#iptables -t filter -A FORWARD -p tcp --sport 20  -j ACCEPT

[root@mail ~]#iptables -t filter -A -FORWARD -p tcp --dport 20 -j ACCEPT
或除了进来的 其余删除后加一条
[root@mail ~]#iptables -t filter -A  FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT 就可以实现ftp通讯二次连接 及返回ACK唯1的establish