在这篇博客中,小编要跟读者来聊聊linux下的基于封包过滤的软件iptables的使用,作为一款软件防火墙,其功能是相当强大的,如果配合squid和L7来使用那便是极好的了。

1.iptables的封包过滤机制

iptables是利用封包过滤机制来完成对用户数据的控制的,所以它会分析封包的包头数据,根据表头数据与定义的『规则』来决定该封包是否可以进入主机或者是被丢弃。意思就是说:『根据封包的分析资料 "比对" 你预先定义的规则内容,若封包数据与规则内容相同则进行动作,否则就继续下一条规则的比对!』 重点在那个『比对与分析顺序』上。

举个简单的例子,假设小编预先定义 n条防火墙规则好了,那么当 Internet 来了一个封包想要进入我的主机, 那么防火墙是如何分析这个封包的呢?小编以下的图示来说明好了:

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙

                                                                      图1-1

当一个网络封包要进入到主机之前,会先经由 NetFilter 进行检查,那就是 iptables 的规则了。 检查通过则接受 (ACCEPT) 进入本机取得资源,如果检查不通过,则可能予以丢弃 (DROP) ! 上图中主要的目的在告知读者:『规则是有顺序的』!例如当网络封包进入 Rule 1 的比对时, 如果比对结果符合 Rule 1 ,此时这个网络封包就会进行 Action 1 的动作,而不会理会后续的 Rule 2, Rule 3.... 等规则的分析了。

而如果这个封包并不符合 Rule 1 的比对,那就会进入 Rule 2 的比对了!如此一个一个规则去进行比对就是了。 那如果所有的规则都不符合怎办?此时就会透过预设动作 (封包政策, Policy) 来决定这个封包的去向。 所以啦,当你的规则顺序排列错误时,就会产生很严重的错误了。

2.iptables 的表格 (table) 与链 (chain)

事实上,那个图 1-1 所列出的规则仅是 iptables 众多表格当中的一个链 (chain) 而已。 什么是链呢?这得由 iptables 的名称说起。为什么称为 ip"tables" 呢?因为这个防火墙软件里面有多个表格 (table) ,每个表格都定义出自己的默认策略与规则, 且每个表格的用途都不相同。我们可以使用底下这张图来稍微了解一下:

iptables+layer7+squid:实现高性能软件防火墙_layer7_02

                                                  图2-1

刚刚图 1-1 的规则内容仅只是图 2-1内的某个 chain 而已! 而预设的情况下, Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。我们还可以自定义额外的链呢!真是很神奇吧!每个表格与其中链的用途分别是这样的:

1.filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table 啦!

INPUT:主要与想要进入我们 Linux 本机的封包有关;

OUTPUT:主要与我们 Linux 本机所要送出的封包有关;

FORWARD:这个咚咚与 Linux 本机比较没有关系, 它可以『转递封包』到后端的计算机中,与下列 nat table 相关性较高。

2.nat (地址转换):是 Network Address Translation 的缩写, 这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与Linux 主机后的局域网络内计算机较有相关。

PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT) 

POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE) 

OUTPUT:与发送出去的封包有关

3.mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及

FORWARD 链。 由于这个表格与特殊旗标相关性较高,所以像咱们这种单纯的环境当中,较少使用 mangle 这个表格。

当然各个表格和链的使用是相关联的,如图2-2所示:

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_03

                                 图2-2

上面的图示很复杂喔!不过基本上你依旧可以看出来,我们的 iptables 可以控制三种封包的流向:

1.封包进入 Linux 主机使用资源 (路径 A): 在路由判断后确定是向 Linux 主机要求数据的封包,主要就会透过 filter 的 INPUT 链来进行管理;

2.封包经由 Linux 主机的转递,没有使用主机资源,而是向后端主机流动 (路径 B): 在路由判断之前进行封包包头的修订作业后,发现到封包主要是要透过防火墙而去后端,此时封包就会透过路径 B 来传输。 也就是说,该封包的目标并非我们的 Linux 本机。主要经过的链是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING;

3.封包由 Linux 本机发送出去 (路径 C): 例如响应客户端的要求,或者是 Linux 本机主动送出的封包,都是透过路径 C 来传输。先是通过路由判断,决定了输出的路径后,再通过 filter 的 OUTPUT 链来传送的!当然,最终还是会经过 nat 的 POSTROUTING 链。

由于 mangle 这个表格很少被使用,如果将图2-2 的 mangle 拿掉的话,那就容易看的多了:

iptables+layer7+squid:实现高性能软件防火墙_squid_04

                                   图2-3

事实上目前企业用防火墙来管理内部主机的部分也相当的多,那么你就必须要再针对 filter 的 FORWARD 这条链,还有 nat 的 PREROUTING, POSTROUTING 以及 OUTPUT 进行额外的规则订定才行。nat 表格的使用需要很清晰的路由概念才能够设定的好。

3.iptables的基本语法

# iptables [-t tables] [-L] [-nv] --line-number

选项与参数:

-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的

filter 

-L :列出目前的 table 的规则

-n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!

-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等

--line-number:列出行号

一个小例子:

# iptables -L -n

Chain INPUT (policy ACCEPT) <==针对 INPUT 链,且预设政策为可接受

target prot opt source destination <==说明栏 

Chain FORWARD (policy ACCEPT) <==针对 FORWARD 链,且预设政策为可接受

target prot opt source destination

Chain OUTPUT (policy ACCEPT) <==针对 OUTPUT 链,且预设政策为可接受

target prot opt source destination

在上面的输出结果中,每一个 Chain 就是前面提到的每个链啦, Chain 那一行里面括号的 policy 就是预设的政策, 那下面的 target, prot 代表什么呢?

? 1.target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外,尚有 DROP (丢弃) 的项目! 当然target的值有多种,在后面的案例中小编会用到;

? 2.prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式;

? 3.opt:额外的选项说明

? 4.source :代表此规则是针对哪个『来源 IP』进行限制?

? 5.destination :代表此规则是针对哪个『目标 IP』进行限制?

4. NAT 服务器的设定

咋忽然间跳到这来了,O(∩_∩)O~,这个linux上NAT服务器的搭建主要就用到了iptables的使用,通过nat服务器的搭建,基本上就可以帮助读者去很好的使用iptables啦,对于后续的复杂应用也不用愁啦。

1. NAT 的全名是 Network Address Translation,字面上的意思是『网络地址的转换』。由字面上的意思我们来想一想,TCP/IP 的网络封包不是有 IP 地址吗?那 IP 地址不是有来源与目的吗?我们的 iptables 指令就能够修改 IP 封包的表头数据, 呀呀!连目标或来源的 IP 地址都可以修改呢!甚至连 TCP 封包表头的 port number 也能修改!真是有趣!

2. 要会使用NAT,那就要了解什么是SNAT? DNAT?如果这两个东东会使用的话,基本上NAT的应用算是掌握啦,SNAT 主要是应付内部 LAN 连接到 Internet 的使用方式,如果要实现SNAT主要会用到POSTROUTING链,至于 DNAT 则主要用在内部主机想要架设可以让 Internet 存取的服务器啦,如果要实现主要涉及到PREROUTING链

3. 一个简单的nat案例:

拓扑图:

iptables+layer7+squid:实现高性能软件防火墙_squid_05

实现目标:

     1. 内网用户能够访问外网资源

     2. 外网用户能够访问到内网发布的www服务器

简单实现:

     1. 要实现内网访问外网,那就是SNAT啦

     # iptables -t nat -A POSTROUTING -s 192.168.111.0/24 -o eth1 -j SNAT --to-source 192.168.102.230

     在192.168.111.0/24网段的客户端访问百度试试

     iptables+layer7+squid:实现高性能软件防火墙_iptables_06

     服务器端查看一下nat的匹配结果

     # iptables -t nat -L -nv --line-number

      iptables+layer7+squid:实现高性能软件防火墙_layer7_07

     当然上面的那一条规则也可以这么来写

     # iptables -t nat -A POSTROUTING -s 192.168.111.0/24 -o eth1 -j MASQUERADE

     2. 要实现外网访问内网资源那就是DNAT啦

     # iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to-destination 192.168.113.80

     外网用户访问http://192.168.102.230试试

     iptables+layer7+squid:实现高性能软件防火墙_layer7_08

     查看防火墙匹配规则

     # iptables -t nat -L -nv --line-number

     iptables+layer7+squid:实现高性能软件防火墙_iptables_09

这样的nat实现似乎没啥难度啊,请记住,这只是非常非常简单的案例,那么来个复杂点的吧。

5.综合案例

1.案例配置

公司有三个部门

工程部门 192.168.111.10-20

软件部门 192.168.111.21-30

经理办 192.168.111.31-40

上班时间 ( 08:00--20:00)

工程部门 上班时间只允许访问ftp,不允许使用qq,迅雷下载,不允许访问www,下班后无限制;

软件部门 允许访问www并且每个用户连接数最多3个不允许看图片,但是不允许访问sina,不允许使用迅雷,不允许使用QQ

不允许使用pplive ,下班后无限制

经理办公室 无限制

dmz区域www服务器进行发布

2.案例拓扑

iptables+layer7+squid:实现高性能软件防火墙_layer7_10

先分析一下需求,你会发现这些功能单纯的iptables根本没法实现啊,因为包过滤机制只是适用于传输层啦,那禁用QQ,禁用迅雷的,又是不能看图片啥的,都是应用层干的事,咋办呢,想想啊,还有一个神奇的东东,代理服务器啊,squid,想起来没啊,当然对与禁用QQ、迅雷那一类的东东还是可以用iptables来实现的,只不过是得做做手脚,把你的iptables改造一下,打上补丁啦,当然iptables是和内核紧密相关的啦,为了能支持打了补丁的iptables,咱得使用新内核打上补丁重新编译啦,咱先得把根基打牢才能建大楼啦,为了完成这个案例,可是花了小编不少时间,内核编译累死人啦。至于那个补丁是啥东东,居然会那么的强大啊,估计补丁的名称读者听过啦layer7,打完之后就可以实现应用层的过滤啦,至于l7的介绍小编就不细讲了,读者如果想搞懂原理的话可以自己去搜索一下相关资料,这里小编直讲应用。

3. 重新编译内核

     1、合并kernel+layer7补丁

     # tar jxvf linux-2.6.25.19.tar.gz2 -C /usr/src/     
     # tar zxvf netfilter-layer7-v2.20.tar.gz -C /usr/src/

     # cd /usr/src/linux-2.6.25.19/     
     # patch -p1 < /usr/src/netfilter-layer7-v2.22/kernel-2.6.25-layer7-2.22.patch

     2、配置新内核

     # cp /boot/config-2.6.18-8.el5 .config    //偷个懒,沿用旧的内核配置     
     # make menuconfig

配置内核时,在“Networking ---> Networking Options ---> Network Packet filtering framework (Netfilter) ”处主要注意两个地方:

iptables+layer7+squid:实现高性能软件防火墙_iptables_11

iptables+layer7+squid:实现高性能软件防火墙_iptables_12

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_13

1) ---> Code Netfilter Configuration

iptables+layer7+squid:实现高性能软件防火墙_layer7_14

        //将“Netfilter connection tracking suport (NEW)”选择编译为模块(M),需选取此项才能看到layer7支持的配置。

iptables+layer7+squid:实现高性能软件防火墙_layer7_15

        //将layer7、string、state、time、IPsec、iprange、connlimit……等编译成模块,根据需要看着办。

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_16

2) ---> IP: Netfilter Configuration

        //将“IPv4 connection tracking support (require for NAT)”编译成模块。

iptables+layer7+squid:实现高性能软件防火墙_layer7_17

    //将“Full NAT”下的“MASQUERADE target support”和“REDIRECT target support”编译成模块。

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_18

3、编译及安装模块、新内核

# make && make modules_install && make install

        //编译安装成后后,重启选择使用新的内核(2.6.25.19)引导系统

4. 重新编译iptables

     1、卸载现有iptables,但是其启动脚本可以留下来,作为后续新iptables使用

     # cp /etc/init.d/iptables /etc/init.d/iptables.bak

     # rpm -e iptables iptstat --nodeps

     2、合并iptables+layer7补丁

     # tar jxvf iptables-1.4.3.tar.bz2 -C /usr/src/

     # cd /usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/

     # cp libxt_layer7.c libxt_layer7.man /usr/src/iptables-1.4.3/extensions/

     3、编译安装

     # cd /usr/src/iptables-1.4.3/

     # ./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.25.19

     # make && make install

     # cp /etc/init.d/iptables.bak /etc/init.d/iptables

     # chkconfig –add iptables

     # chkconfig iptables on

     4、安装l7-protocols模式包

     # tar zxvf l7-protocols-2009-05-10.tar.gz -C /etc/

     # mv /etc/l7-protocols-2009-05-10 /etc/l7-protocols

好了,准备工作算是完成了,下面开始来实现吧

5.案例实现

因为小编是使用终端连接防火墙的,如果对filter表的INPUT和OUPUT链做了操作后,有可能终端就断了,所以小编在这里做一下设置啦,小编的IP是192.168.111.2,所以要这样设置

# iptables -t filter -A INPUT -s 192.168.111.2 -p tcp --dport 22 -j ACCEPT

# iptables -t filter -A OUTPUT -d 192.168.111.2 -p tcp --sport 22 -j ACCEPT

# iptables -t filter -P INPUT DROP //将默认策略修改为丢弃

# iptables -t filter -P OUTPUT DROP //将默认策略修改为丢弃

先进行全员NAT吧,之后的策略再详细添加

# iptables -t filter -P FORWARD DROP //将默认策略修改为丢弃

# iptables -t nat -A POSTROUTING -s 192.168.111.0/24 -o eth1 -j MASQUERADE //SNAT

     1.工程部门 上班时间只允许访问ftp,不允许使用qq、迅雷下载,不允许访问www,下班后无限制;

# iptables -A FORWARD -d 192.168.113.21 -p tcp --dport 21 -m iprange --src-range 192.168.111.10-192.168.111.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri,Sat,Sun -j ACCEPT

# iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# iptables -t filter -A FORWARD -m iprange --src-range 192.168.111.10-192.168.111.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri,Sat,Sun -m layer7 --l7proto qq -j DROP 

# iptables -t filter -A FORWARD -m iprange --src-range 192.168.111.10-192.168.111.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri,Sat,Sun -m layer7 --l7proto xunlei -j DROP

# iptables -A FORWARD -s 192.168.111.0/24 -o eth1 -m time --timestart 20:01:00 --timestop 07:59:00 -j ACCEPT

     2.软件部门 允许访问www但是每个用户连接数最多3个不允许看图片,但是不允许访问sina,不允许使用迅雷,不允许使用QQ不允许使用pplive ,下班后无限制 这里可以结合squid来实现

# iptables -t nat -A PREROUTING -m iprange --src-range 192.168.111.21-192.168.111.30 -p tcp --dport 80 -j REDIRECT --to-port 3128 

# iptables -t filter -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT

# iptables -t filter -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -t filter -A FORWARD -m iprange --src-range 192.168.111.21-192.168.111.40 -p udp --dport 53 -o eth1 -j ACCEPT

# iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT

# iptables -t filter -A FORWARD -m iprange --src-range 192.168.111.21-192.168.111.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri,Sat,Sun -m layer7 --l7proto qq -j DROP

# iptables -t filter -A FORWARD -m iprange --src-range 192.168.111.21-192.168.111.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri,Sat,Sun -m layer7 --l7proto xunlei -j DROP

# iptables -t filter -A FORWARD -m iprange --src-range 192.168.111.21-192.168.111.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri,Sat,Sun -m layer7 --l7proto pplive -j DROP

     3.经理办公室 无限制

# iptables -A FORWARD -m iprange --src-range 192.168.111.31-192.168.111.40 -j ACCEPT

     4.Dmz区域www服务器进行发布

# iptables -t nat -A PREROUTING -d 192.168.102.230 -p tcp --dport 80 -i eth1 -j DNAT --to-destination 192.168.113.80

# iptables -A FORWARD -d 192.168.113.80 -p tcp --dport 80 -j ACCEPT

6.集中测试

     1.工程部门测试

iptables+layer7+squid:实现高性能软件防火墙_iptables_19

工作时间

# date

2013年 05月 18日 星期六 11:29:51 CST

访问ftp试试

iptables+layer7+squid:实现高性能软件防火墙_layer7_20

服务器端匹配结果

# iptables -L -nv --line-number

iptables+layer7+squid:实现高性能软件防火墙_iptables_21

客户端访问外网试试

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_22

服务器端匹配数据

iptables+layer7+squid:实现高性能软件防火墙_squid_23

客户端访问QQ

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_24

服务器端日志情况

# tail -f /var/log/messages

iptables+layer7+squid:实现高性能软件防火墙_layer7_25

至于迅雷的封杀,小编这里的迅雷版本太高,l7停止维护已经很久了,所以没办法做到,估计对老版的迅雷有效吧,如果小编以后找到解决方案会及时附上的

非工作时间

# date 

2013年 05月 18日 星期六 20:30:00 CST

客户端来测试

iptables+layer7+squid:实现高性能软件防火墙_iptables_26

     2.软件部门测试

软件部门客户端主机IP

iptables+layer7+squid:实现高性能软件防火墙_squid_27

工作时间

# date 

2013年 05月 18日 星期六 12:20:00 CST

客户端测试

访问百度正常,注意这里百度的logo是个gif格式的,所以会显示出来

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_28

无法访问新浪

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_29

打开网站图片不会加载,QQ无法访问

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_30

非工作时间

# date 

2013年 05月 18日 星期六 20:41:00 CST

客户端测试,访问新浪,站点有图片

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_31

     3. 经理部门

不管是上班还是下班,都没有任何限制

iptables+layer7+squid:实现高性能软件防火墙_layer7_32

iptables+layer7+squid:实现高性能软件防火墙_软件防火墙_33

     4. 外部访问内部发布的服务器

iptables+layer7+squid:实现高性能软件防火墙_squid_34

好啦,所有小编想讲的东东都结束啦,读者要是感觉很实用的话就自己动手做一做哈,温馨提示,一定要搞懂2-3的图啦,精髓在那里,(*^__^*) 嘻嘻……,其他都是浮云啦