Chinaunix首页 | 论坛 | 博客
  • 博客访问: 650010
  • 博文数量: 197
  • 博客积分: 4858
  • 博客等级: 上校
  • 技术积分: 2162
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-06 22:46
文章分类

全部博文(197)

文章存档

2011年(30)

2010年(21)

2009年(25)

2008年(80)

2007年(41)

分类: LINUX

2008-05-18 15:57:54

iptables对包的处理和ipchains很不同,已经从链变成了堆叠表,更重要的是iptables可以是基于状态的,用它可以构建强大的防火墙,说实话,国内的很多产品,其实就是用这个做的,反正象netscreen 那样搞个netscreent os的没有(或者我不知道)



防火墙的任务

防火墙在实施安全的过程中,至关重要的。一个防火墙策略要符合四个目标,而每个目标通常都不是一个单独的设备或软件来实现的。大多数情况下防火墙的组件放在一起使用以满足公司安全目的需求。防火墙要能满足以下四个目标:

1> 实现一个公司的安全策略

防火墙的主要意图是强制执行你的安全策略,比如你的安全策略需要对MAIL服务器的SMTP流量做限制,那么你要在防火墙上强制这些策略

2> 创建一个阻塞点

防火墙在一个公司的私有网络和分网间建立一个检查点。这种实现要求所有的流量都要经过这个检查点。一旦检查点被建立,防火墙就可以监视,过滤和检查所有进出的流量。网络安全中称为阻塞点。通过强制所有进出的流量都通过这些检查点,管理员可以集中在较少的地方来实现安全目的。

3> 记录internet活动

防火墙还能强制记录日志,并且提供警报功能。通过在防火墙上实现日志服务,管理员可以监视所有从外部网或互联网的访问。好的日志是适当网络安全的有效工具之一。

4> 限制网络暴露

防火墙在你的网络周围创建了一个保护的边界。并且对于公网隐藏了内部系统的一些信息以增加保密性。当远程节点侦测你的网络时,他们仅仅能看到防火墙。远程设备将不会知道你内部网络的布局以及都有些什么。防火墙提高认证功能和对网络加密来限制网络信息的暴露。通过对所能进入的流量进行检查,以限制从外部发动的攻击。



状态究竟是什么



    首先让我们看一下服务器/客户机的交互原理。服务器提供某特定功能的服务总是由特定的后台程序提供的。在TCP/IP网络中,常常把这个特定的服务绑定到特定的TCP或UDP端口。之后,该后台程序就不断地监听(listen)该端口,一旦接收到符合条件的客户端请求,该服务进行TCP握手后就同客户端建立一个连接,响应客户请求。与此同时,再产生一个该绑定的拷贝,继续监听客户端的请求。

    举一个具体的例子:假设网络中有一台服务器A(IP地址为1.1.1.1)提供WWW服务,另有客户机B(2.2.2.2)、C(3.3.3.3)。首先,服务器A运行提供WWW服务的后台程序(比如Apache)并且把该服务绑定到端口80,也就是说,在端口80进行监听。当B发起一个连接请求时,B将打开一个大于1024的连接端口(1024内为已定义端口),假设为1037。A在接收到请求后,用80端口与B建立连接以响应B的请求,同时产生一个80端口绑定的拷贝,继续监听客户端的请求。假如A又接收到C的连接请求(设连接请求端口为1071),则A在与C建立连接的同时又产生一个80端口绑定的拷贝继续监听客户端的请求。如下所示,因为系统是以源地址、源端口、目的地址、目的端口来标识一个连接的,所以在这里每个连接都是唯一的。



  服务器           客户端

连接1:1.1.1.1:80   2.2.2.2:1037

连接2:1.1.1.1:80   3.3.3.3:1071



从上边我们可以看出,每个网络连接包括以下信息:源地址、目的地址、源端口和目的端口,叫作套接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息叫作状态(stateful),能够检测每个连接状态的防火墙叫作状态包过滤防火墙。它除了能够完成简单包过滤防火墙的包过滤工作外,还在自己的内存中维护一个跟踪连接状态的表,比简单包过滤防火墙具有更大的安全性。

每一种特定的服务都有自己特定的端口,一般说来小于1024的端口多为保留端口,或者说是已定义端口,低端口分配给众所周知的服务(如WWW、FTP等等),从512到1024的端口通常保留给特殊的UNIX TCP/IP应用程序,具体情况请参考/etc/services文件或RFC1700。

  iptables中的状态检测功能是由state选项来实现的。对这个选项,在iptables的手册页中有以下描述:

  state

  这个模块能够跟踪分组的连接状态(即状态检测)。 

  --state state

这里,state是一个用逗号分割的列表,表示要匹配的连接状态。

在iptables中有四种状态:NEW,ESTABLISHED,RELATED,INVALID。

NEW,表示这个分组需要发起一个连接,或者说,分组对应的连接在两个方向上都没有进行过分组传输。NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。比如一个特意发出的探测包,可能只有RST位,但仍然是NEW。

ESTABLISHED,表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。

RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data连接就是和FTP-control有RELATED的。还有其他的例子,

INVAILD,表示分组对应的连接是未知的,说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西。

这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那些有应答数据的端口,其他的都可以关闭。这样就安全多了。



TCP的三次握手

  一个TCP连接是通过三次握手的方式完成的。首先,客户程序发出一个同步请求(发出一个SYN分组);接着,服务器端回应一个SYN|ACK分组;最后返回一个ACK分组,连接完成。整个过程如下所示:

Client          Server



SYN --->

        

        

   

接下来我们看具体的过程,假设client(192.168.10.7)要访问server(192.168.10.100,同时启用iptables)的WEB主页,过程如下:

1 client首先发出一个SYN的连线请求(注意ack,rst等的值),源端口是1286,目的端口是80,如图



  2 Server收到着请求后应答一个SYN+ACK,因为是SERVER应答client,所以源端口是80,目的端口是1286,如图



3 client再答复一个ACK,至此三步握手的过程结束,一个正常的连接建立





从以上的三步中可以看出,一个正常的连接建立的过程,值得注意的是一个正常的发起的请求,SYN位是1,意味着如果一个新的包但是SYN却不置位,这个包肯定有问题。

  为了跟踪一个TCP连接的状态,我们在SERVER使用了如下命令

iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT



接着看在连接建立过程中状态表的变化

1>由于CLIENT和SERVER之前没有任何连接,CLIENT发送的SYN(此时的TCP状态是SYN_SENT)请求进入iptables 的INPUT链,发现是一个新包,那么此时iptables将此状态定义为NEW,因为我们的规则允许,这个请求包被接受。

2>server返回一个SYN+ACK的包(此时的TCP状态是SYN_RECIV),这个包要经过OUTPUT链(因为这个包是从本机发出的,目的地址是client),由于之前曾经收到一个包,此时个状态,已经变成了ESTABLISHED,按照规则,这个包成功发送出去。

3>接下来client发送一个ACK,同样由于INPUT中允许,server接受这个包,至此连接完成,在整个过程中状态从NEW变为ESTABLISHED(此时的TCP也是established)

注意:在第二步的时候,server上TCP的状态是SYN_RECVD,对于iptables来讲,状态已经是established,但此时的三次握手并没有完成,实际是半连接(对与TCP来讲,必须是三次握手完成以后,状态才是established)。所以iptables面对SYNFLOOD攻击,可以通过SYN流量来控制。具体连接过程中TCP状态的变化可以看TCP/IP V1等著作(douglas E.comer经典中很详细)。



注意状态机制在用户空间里的部分不会查看TCP包的标志位(也就是说TCP标志对它而言是透明的)。如果我们想让NEW状态的包通过防火墙,就要指定NEW状态,我们理解的NEW状态的意思就是指SYN包,可是iptables又不查看这些标志位。这就是问题所在。有些没有设置SYN或ACK的包,也会被看作NEW状态的。这样的包可能会被冗余防火墙用到,但对只有一个防火墙的网络是很不利的(可能会被攻击哦)。那我们怎样才能不受这样的包的影响呢?可以使用tcp-flags进行检查。



ICMP

在iptables看来,只有四种ICMP分组,以下分组类型可以被归为NEW、ESTABLISHED



ECHO请求(ping,8)和ECHO应答(ping,0)

时间戳请求(13)和应答(14)

信息请求(15)和应答(16)

地址掩码请求(17)和应答(18)



  这些ICMP分组类型中,请求分组属于NEW,应答分组属于ESTABLISHED。而其它类型的ICMP分组不基于请求/应答方式,一律被归入RELATED。

  我们先看一个简单的例子:

iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED, RELATED -j ACCEPT

iptables -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT



  这链条规则进行如下的过滤:

一个ICMP echo请求是一个NEW连接。因此,允许ICMP echo请求通过OUTPUT链。

当请求的应答返回,由于两个方向上都发包了,此时连接的状态是ESTABLISED,因此允许通过INPUT链。而INPUT链没有NEW状态,因此不允许echo请求通过INPUT链。也就是说,这两条规则允许内部主机ping外部主机,而不允许外部主机ping内部主机。

一个重定向ICMP(5)分组不是基于请求/应答方式的,因此属于RELATED。INPUT和OUTPUT链都允许RELATED状态的连接,因此重定向(5)分组可以通过INPUT和OUTPUT链。



二.包在IPTABLES中如何走?

当一个包进入或者送出或者被转发的时候,是依据什么呢?都会经过哪些表和哪些链呢?

先看一下流程图





从上图我们看出:

iptabeles中内建有三个表,分别为MANGLE,NAT,FILTER,当为未指定规则表时,则默认为filter表,若要将role加到其他表中,则要用-t来指明。

其中有个表叫mangle,这个词难以表达,我只能把我理解的写出来。意思就是,会对数据包的一些传输特性进行修改,在mangle表中允许的操作是TOS、TTL、MARK。也就是说,今后只要我们见到这个词能理解它的作用就行了。

强烈建议你不要在这个表里做任何过滤,不管是DANT,SNAT或者Masquerade。

Nat表就是地址转换了,可以做DNAT,SNAT,可做一对一,一对多,多对对转换,该表有Prerouting 和 postrouting两条规则链。DNAT操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。SNAT改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。如果使用类似192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络(还有其他的)为私有的,只能用于LAN内部。MASQUERADE的作用和SNAT完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的



Filter表就是我们最常用的了,包过滤就靠这个了,系统默认建有三个链,INPUT,OUTPUT还有FORWARD,这个表用来进行封包过滤的处理(如:DROP,ACCEPT,LOG,REJECT,ULOG等),基本规则都建在这个表中。

注:所谓的链就是规则的集合,也可以自定义链

当数据包到达防火墙时,如果MAC地址符合,就会由内核里相应的驱动程序接收,然后会经过一系列操作,从而决定是发送给本地的程序,还是转发给其他机子,还是其他的什么。

以本地为目标(就是我们自己的机子了)的包

Step(步骤) Table(表) Chain(链) Comment(注释)

1 在线路上传输(比如,Internet)

2 进入接口 (比如,eth0)

3 mangle PREROUTING 这个链用来mangle数据包,比如改变TOS等

4 Nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。

5 路由判断,比如,包是发往本地的,还是要转发的。

6 mangle INPUT 在路由之后,被送往本地程序之前,mangle数据包。

7 filter INPUT 所有以本地为目的的包都要经过这个链,不管它们从哪儿来,对这些包的过滤条件就设在这里。

8 到达本地程序了(比如,服务程序或客户程序)

现在我们来看看源地址是本地器的包要经过哪些步骤:

以本地为源的包

Step Table Chain Comment

1 本地程序(比如,服务程序或客户程序)

2 路由判断,要使用源地址,外出接口,还有其他一些信息。

3 mangle OUTPUT 在这儿可以mangle包。建议不要在这儿做过滤,可能有副作用哦。

4 nat OUTPUT 这个链对从防火墙本身发出的包进行DNAT操作。

5 filter OUTPUT 对本地发出的包过滤。

6 mangle POSTROUTING 这条链主要在包DNAT之后(译者注:作者把这一次DNAT称作实际的路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪儿去,要由NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对包 mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。

7 nat POSTROUTING 在这里做SNAT。但不要在这里做过滤,因为有副作用,而且有些包是会溜过去的,即使你用了DROP策略。

8 离开接口(比如: eth0)

9 在线路上传输(比如,Internet)

在这个例子中,我们假设一个包的目的是另一个网络中的一台机子。让我们来看看这个包的旅程:

转发包

Step Table Chain Comment

1 在线路上传输(比如,Internet)

2 进入接口(比如, eth0)

3 mangle PREROUTING mangle数据包,,比如改变TOS等。

4 nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。稍后会做SNAT。

5 路由判断,比如,包是发往本地的,还是要转发的。

6 mangle FORWARD 包继续被发送至mangle表的FORWARD链,这是非常特殊的情况才会用到的。在这里,包被mangle(还记得mangle的意思吗)。这次mangle发生在最初的路由判断之后,在最后一次更改包的目的之前(译者注:就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包的目的地,如丢弃包)。

7 filter FORWARD 包继续被发送至这条FORWARD链。只有需要转发的包才会走到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。

8 mangle POSTROUTING 这个链也是针对一些特殊类型的包(译者注:参考第6步,我们可以发现,在转发包时,mangle表的两个链都用在特殊的应用上)。这一步mangle是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。

9 nat POSTROUTING 这个链就是用来做SNAT的,当然也包括Masquerade(伪装)。但不要在这儿做过滤,因为某些包即使不满足条件也会通过。

10 离开接口(比如: eth0)

11 又在线路上传输了(比如,LAN)

就如你所见的,包要经历很多步骤,而且它们可以被阻拦在任何一条链上,或者是任何有问题的地方。所有要经防火墙/路由器转发的包都要经过FORWARD链。

由上边的表格和图可以看出,iptables 处理包的流动,分述如下:

INPUT:只有要到本机的封包才会 由 INPUT 处理,所以会让來自內部网络的封包无条件放行,而来自外部的封包則过滤,是否为回应包,若是則放行。

PREROUTING:需要转送处理的封包由此处理,用来做目的地 IP 的翻译(DNAT)。

FORWARD:源IP和目的IP都不是本机的,就要被转发,所有要转发的封包都在这里处理,这部分的过滤规则最为复杂。

POSTROUTING:转发封包送出之前,先同过这个来进行源IP的翻译(SNAT)。

OUTPUT:从本机发送出去的包都有此处理,通常放行所有封包。

从上边看得出,对于iptables来说,是依据IP地址进行决策,也就是说包中的IP地址决定一个包的流向。

进入FORWRAD的一定不会进入到INPUT和OUTPUT。

在处理过程中如果符合某条规则将会进行处理,处理动作除有ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 外还有LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等。



我们可以使用<  iptables save file > 将结果保存到指定文件中,然后用< iptables restore file > 将指定文件的内容加载,或者写成脚本,然后执行脚本就可以了。我推荐使用脚本,因为可以使用shell编程,从而写出强大,灵活的脚本来。



规则是如何练成的

规则就是指向标,在一条链上,对不同的连接和数据包阻塞或允许它们去向何处。插入链的每一行都是一条规则。我们也会讨论基本的matche及其用法,还有各种各样的target,以及如何建立我们自己的target(比如,一个新的子链)。

我们已经解释了什么是规则,在内核看来,规则就是决定如何处理一个包的语句。如果一个包符合所有的条件(就是符合matche语句),我们就运行target或jump指令。书写规则的语法格式是:

iptables [-t table] command [match] [target/jump]

对于这个句法没什么可说的,但注意target指令必须在最后。为了易读,我们一般用这种语法。总之,你将见到的大部分规则都是按这种语法写的。因此,如果你看到别人写的规则,你很可能会发现用的也是这种语法,当然就很容易理解那些规则了。

如果你不想用标准的表,就要在[table]处指定表名。一般情况下没有必要指定使用的表,因为iptables 默认使用filter表来执行所有的命令。也没有必要非得在这里指定表名,实际上几乎可在规则的任何地方。当然,把表名在开始处已经是约定俗成的标准。

尽管命令总是放在开头,或者是直接放在表名后面,我们也要考虑考虑到底放在哪儿易读。command告诉程序该做什么,比如:插入一个规则,还是在链的末尾增加一个规则,还是删除一个规则,具体的可以参考iptables的手册。

match细致地描述了包的某个特点,以使这个包区别于其它所有的包。在这里,我们可以指定包的来源IP 地址,网络接口,端口,协议类型,或者其他什么。下面我们将会看到许多不同的match。

最后是数据包的目标所在。若数据包符合所有的match,内核就用target来处理它,或者说把包发往 target。比如,我们可以让内核把包发送到当前表中的其他链(可能是我们自己建立的),或者只是丢弃这个包而没有什么处理,或者向发送者返回某个特殊的应答。



一个简单的脚本

(注意大小写)



Client-----------------------server(web server,dns)

192.168.10.7                         192.168.55.55



#实验环境,redhat 7.2

#客户机:192.168.10.7

# linux: 192.68.55.55   安装apache,dns



#清除所有规则

iptables -F 

# set policy

#设置默认策略,均为删除

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD DROP



# add chains

#加入自定义链

iptables -N bad_tcp_packets

iptables -N allowed

iptables -N tcp_packets

iptables -N udp_packets

# bad tcp

#对坏包的处理为reset,和扫描等有关

iptables -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset

#一个新包,SYN不置位,因此不是一个正常的连接请求,删除

iptables -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

#allow chain

#正常的TCP包都允许,其他的都删除

iptables -A allowed -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -A allowed -p tcp -j DROP



#tcp roles

#TCP链的处理,允许WEB服务

iptables -A tcp_packets -p tcp -s 0/0 --dport 80 -j allowed

#udp roles

#UDP链的处理,允许DNS

iptables -A udp_packets -p udp -s 0/0 --dport 53 -j ACCEPT





#所有进入的包先检查是否正常,然后转到TCP,UDP进行处理

#192.168.10.7是网管机,允许该机的ICMP

iptables -A INPUT -p tcp -j bad_tcp_packets

iptables -A INPUT -p tcp -j tcp_packets

iptables -A INPUT -p udp -j udp_packets

#允许来自192.168.10.7发起ICMP的请求

iptables -A INPUT -p icmp -s 192.168.10.7 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#本机ICMP请求包返回时,进入INPUT,所以状态是ESTABLISHED,RELATED

#允许从本机往外发ICMP的请求包

iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#HTTP的请求收到后允许出去,所以状态是ESTABLISHED,RELATED

#当然还有DNS的UDP包

iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT



关于LIMIT的解释:

Limit match

这个匹配操作必须由-m limit明确指定才能使用。有了它的帮助,就可以对指定的规则的日志数量加以限制,以免你被信息的洪流淹没哦。比如,你可以事先设定一个限定值,当符合条件的包的数量不超过它时,就记录;超过了,就不记录了。我们可以控制某条规则在一段时间内的匹配次数(也就是可以匹配的包的数量),这样就能够减少DoS syn flood攻击的影响。这是它的主要作用,当然,还有很多其他作用(译者注:比如,对于某些不常用的服务可以限制连接数量,以免影响其他服务)。limit match也可以用英文感叹号取反,如:-m limit ! --limit 5/s表示在数量超过限定值后,所有的包都会被匹配。



(译者注:为了更好地理解这个匹配操作,我们通过一个比喻来解释一下。原文也做了类似地比喻,但我觉得对于初学者不易理解,故未采用。)limit match的工作方式就像一个单位大门口的保安,当有人要进入时,需要找他办理通行证。早上上班时,保安手里有一定数量的通行证,来一个人,就签发一个,当通行证用完后,再来人就进不去了,但他们不会等,而是到别的地方去(在iptables里,这相当于一个包不符合某条规则,就会由后面的规则来处理,如果都不符合,就由缺省的策略处理)。但有个规定,每隔一段时间保安就要签发一个新的通行证。这样,后面来的人如果恰巧赶上,也就可以进去了。如果没有人来,那通行证就保留下来,以备来的人用。如果一直没人来,可用的通行证的数量就增加了,但不是无限增大的,最多也就是刚开始时保安手里有的那个数量。也就是说,刚开始时,通行证的数量是有限的,但每隔一段时间就有新的通行证可用。limit match有两个参数就对应这种情况,--limit-burst指定刚开始时有多少通行证可用,--limit指定要隔多长时间才能签发一个新的通行证。要注意的是,我这里强调的是“签发一个新的通行证”,这是以iptables的角度考虑的。在你自己写规则时,就要从这个角度考虑。比如,你指定了--limit 3/minute --limit-burst 5 ,意思是开始时有5个通行证,用完之后每20秒增加一个(这就是从iptables的角度看的,要是以用户的角度看,说法就是每一分钟增加三个或者每分钟只能过三个)。你要是想每20分钟过一个,只能写成--limit 3/hour --limit-burst 5,也就是说你要把时间单位凑成整的。

Example rc.flush-iptables script



#!/bin/sh

#

# rc.flush-iptables - Resets iptables to default values.

#

# Copyright (C) 2001  Oskar Andreasson

#

# This program is free software; you can redistribute it and/or modify

# it under the terms of the GNU General Public License as published by

# the Free Software Foundation; version 2 of the License.

#

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

# GNU General Public License for more details.

#

# You should have received a copy of the GNU General Public License

# along with this program or from the site that you downloaded it

# from; if not, write to the Free Software Foundation, Inc., 59 Temple

# Place, Suite 330, Boston, MA  02111-1307   USA



#

# Configurations

#

IPTABLES="/usr/sbin/iptables"



#

# reset the default policies in the filter table.

#

$IPTABLES -P INPUT ACCEPT

$IPTABLES -P FORWARD ACCEPT

$IPTABLES -P OUTPUT ACCEPT



#

# reset the default policies in the nat table.

#

$IPTABLES -t nat -P PREROUTING ACCEPT

$IPTABLES -t nat -P POSTROUTING ACCEPT

$IPTABLES -t nat -P OUTPUT ACCEPT



#

# reset the default policies in the mangle table.

#

$IPTABLES -t mangle -P PREROUTING ACCEPT

$IPTABLES -t mangle -P OUTPUT ACCEPT



#

# flush all the rules in the filter and nat tables.

#

$IPTABLES -F

$IPTABLES -t nat -F

$IPTABLES -t mangle -F

#

# erase all chains that's not default in filter and nat table.

#

$IPTABLES -X

$IPTABLES -t nat -X

$IPTABLES -t mangle -X

 

 

转自:http://blogcup.com/user1/9514/250761.shtml


阅读(1377) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~