This link has been bookmarked by 12 people . It was first bookmarked on 03 Aug 2006, by June.
-
18 Apr 09
-
它的存在有 一个很好的理由,那就是我们可以欺骗一些ISP。为什么要欺骗他们呢?因为他们不愿意让我们共享 一个连接。那些ISP会查找一台单独的计算机是否使用不同的TTL,并且以此作为判断连接是否被共享 的标志。
-
-
15 Apr 09
-
Iptables
-
Iptables
-
-
31 Mar 09
-
21 Mar 08
-
26 Mar 07
-
27 Feb 07
-
6.1. 基础
我们已经解释了什么是规则,在内核看来,规则就是决定如何处理一个包的语句。如果一个包符合所有 的条件(就是符合matche语句),我们就运行target或jump指令。书写规则的语法格式是:
iptables [-t table] command [match] [target/jump]
对于这个句法没什么可说的,但注意target指令必须在最后。为了易读,我们一般用这种语法。总之, 你将见到的大部分规则都是按这种语法写的。因此,如果你看到别人写的规则,你很可能会发现用的也是这 种语法,当然就很容易理解那些规则了。
如果你不想用标准的表,就要在[table]处指定表名。一般情况下没有必要指定使用的表,因为iptables 默认使用filter表来执行所有的命令。也没有必要非得在这里指定表名,实际上几乎可在规则的任何地方。 当然,把表名在开始处已经是约定俗成的标准。
尽管命令总是放在开头,或者是直接放在表名后面,我们也要考虑考虑到底放在哪儿易读。command告诉 程序该做什么,比如:插入一个规则,还是在链的末尾增加一个规则,还是删除一个规则,下面会仔细地介 绍。
match细致地描述了包的某个特点,以使这个包区别于其它所有的包。在这里,我们可以指定包的来源IP 地址,网络接口,端口,协议类型,或者其他什么。下面我们将会看到许多不同的match。
最后是数据包的目标所在。若数据包符合所有的match,内核就用target来处理它,或者说把包发往 target。比如,我们可以让内核把包发送到当前表中的其他链(可能是我们自己建立的),或者只是丢弃这 个包而没有什么处理,或者向发送者返回某个特殊的应答。下面有详细的讨论。
-
6.1. 基础
我们已经解释了什么是规则,在内核看来,规则就是决定如何处理一个包的语句。如果一个包符合所有 的条件(就是符合matche语句),我们就运行target或jump指令。书写规则的语法格式是:
iptables [-t table] command [match] [target/jump]
对于这个句法没什么可说的,但注意target指令必须在最后。为了易读,我们一般用这种语法。总之, 你将见到的大部分规则都是按这种语法写的。因此,如果你看到别人写的规则,你很可能会发现用的也是这 种语法,当然就很容易理解那些规则了。
如果你不想用标准的表,就要在[table]处指定表名。一般情况下没有必要指定使用的表,因为iptables 默认使用filter表来执行所有的命令。也没有必要非得在这里指定表名,实际上几乎可在规则的任何地方。 当然,把表名在开始处已经是约定俗成的标准。
尽管命令总是放在开头,或者是直接放在表名后面,我们也要考虑考虑到底放在哪儿易读。command告诉 程序该做什么,比如:插入一个规则,还是在链的末尾增加一个规则,还是删除一个规则,下面会仔细地介 绍。
match细致地描述了包的某个特点,以使这个包区别于其它所有的包。在这里,我们可以指定包的来源IP 地址,网络接口,端口,协议类型,或者其他什么。下面我们将会看到许多不同的match。
最后是数据包的目标所在。若数据包符合所有的match,内核就用target来处理它,或者说把包发往 target。比如,我们可以让内核把包发送到当前表中的其他链(可能是我们自己建立的),或者只是丢弃这 个包而没有什么处理,或者向发送者返回某个特殊的应答。下面有详细的讨论。
-
4.3. 数据包在用户空间的状态
就象前面说的,包的状态依据IP所包含的协议不同而不同,但在内核外部,也就是用户空间里,只有4种 状态:NEW,ESTABLISHED,RELATED 和INVALID。它们主要是和状态匹配一起使用。下面就简要地介绍以下这几种状态:
Table 4-1. 数据包在用户空间的状态
State(状态) Explanation(注释) NEW NEW说明这个包是我们看到的第一个 包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在 我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。 ESTABLISHED ESTABLISHED已经注意到两个方向上 的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容 易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我 们所发出的信息的应答。 RELATED RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应 答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。 INVALID INVALID说明数据包不能被识别属于 哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。 这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打 开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那 些有应答数据的端口,其他的都可以关闭。这样就安全多了。
-
6.2. Tables
选项-t用来指定使用哪个表,它可以是下面介绍的表中的任何一个,默认的是 filter表。注意,下面的介绍只是章节表和链的摘要。
Table 6-1. Tables
Table (表名) Explanation (注释) nat nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行 的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自 动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就 是我们为什么不应该在这个表中做任何过滤的主要原因,对这一点,后面会有更加详细的讨论。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地 址。POSTROUTING链在包就要离开防火墙之前改变其源地址。 mangle 这个表主要用来mangle数据包。我们可以改变不同的包及包 头的内容,比如 TTL,TOS或MARK。 注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙 内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: PREROUTING,POSTROUTING, OUTPUT,INPUT和 FORWARD。PREROUTING在包进入防火墙之后、路由判断之前改变 包,POSTROUTING是在所有路由判断之后。 OUTPUT在确定包的目的之前更改数据包。INPUT在包被路由到本地 之后,但在用户空间的程序看到它之前改变包。FORWARD在最初的路由判 断之后、最后一次更改包的目的之前mangle包。注意,mangle表不能做任何NAT,它只是改变数据包的 TTL,TOS或MARK,而不是其源目地 址。NAT是在nat表中操作的。 filter filter表是专门过滤包 的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作。FORWARD 链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,而 INPUT恰恰针对那些目的地是本地的包。OUTPUT 是用来过滤所有本地生成的包的。 -
<h1 class="SECTION"><a rel="nofollow" name="COMMANDS">6.3. Commands</a></h1><br/><p>在这一节里,我们将要介绍所有的command以及它们的用途。command指定<b class="COMMAND">iptables<br/></b>对我们提交的规则要做什么样的操作。这些操作可能是在某个表里增加或删除一些东西,或做点儿其他<br/>什么。以下是iptables可用的command(要注意,如不做说明,默认表的是 filter表。):</p><br/><div class="TABLE"><a rel="nofollow" name="TABLE.COMMANDS"></a><br/><p><b>Table 6-2. Commands</b></p><br/><table border="1" class="CALSTABLE"><br/> <tbody><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-A</b>, <b class="COMMAND">--append</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -A INPUT <br/> ...</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">在所选择的链末添加规则。当源地址或目的地址是以名字而<br/>不是ip地址的形式出现时,若这些名字可以被解析为多个地址,则这条规则会和所有可用的地址结合。<br/></td><br/></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-D</b>, <b class="COMMAND">--delete</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -D INPUT <br/> --dport 80 -j DROP</b>或<b class="COMMAND">iptables -D INPUT 1</b> </td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">从所选链中删除规则。有两种方法指定要删除的规则:一是<br/>把规则完完整整地写出来,再就是指定规则在所选链中的序号(每条链的规则都各自从1被编号)。</td><br/></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-R</b>, <b class="COMMAND">--replace</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -R INPUT 1 <br/> -s 192.168.0.1 -j DROP</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">在所选中的链里指定的行上(每条链的规则都各自从1被编<br/>号)替换规则。它主要的用处是试验不同的规则。当源地址或目的地址是以名字而不是ip地址的形式出现<br/>时,若这些名字可以被解析为多个地址,则这条command会失败。</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-I</b>, <b class="COMMAND">--insert</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -I INPUT 1 <br/> --dport 80 -j ACCEPT</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">根据给出的规则序号向所选链中插入规则。如果序号为1,<br/>规则会被插入链的头部,其实默认序号就是1。</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-L</b>, <b class="COMMAND">--list</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -L <br/> INPUT</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">显示所选链的所有规则。如果没有指定链,则显示指定表中<br/>的所有链。如果什么都没有指定,就显示默认表所有的链。精确输出受其它参数影响,如<b class="COMMAND">-n<br/></b><br/>和<b class="COMMAND">-v</b>等参数,下面会介绍。</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-F</b>, <b class="COMMAND">--flush</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -F <br/> INPUT</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">清空所选的链。如果没有指定链,则清空指定表中的所有<br/>链。如果什么都没有指定,就清空默认表所有的链。当然,也可以一条一条地删,但用这个command会快些。<br/></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-Z</b>, <b class="COMMAND">--zero</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -Z <br/> INPUT</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">把指定链(如未指定,则认为是所有链)的所有计数器归<br/>零。</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-N</b>, <b class="COMMAND">--new-chain</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -N <br/> allowed</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">根据用户指定的名字建立新的链。上面的例子建立了一个名<br/>为<b class="COMMAND">allowed</b>的链。注意,所用的名字不能和已有的链、target同名。</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-X</b>, <b class="COMMAND">--delete-chain</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -X <br/> allowed</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">删除指定的用户自定义链。这个链必须没有被引用,如果被<br/>引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将会删除默认表所有<br/>非内建的链。</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-P</b>, <b class="COMMAND">--policy</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -P INPUT <br/> DROP</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">为链设置默认的target(可用的是<b class="COMMAND">DROP<br/></b>和<b class="COMMAND">ACCEPT</b>,如果还有其它的可用,请告诉我),这个target称作策略。所有不<br/>符合规则的包都被强制使用这个策略。只有内建的链才可以使用规则。但内建的链和用户自定义链都不能被<br/>作为策略使用,也就是说不能象这样使用:iptables -P INPUT allowed(或者是内建的链)。</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Command</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-E</b>, <b class="COMMAND">--rename-chain</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Example</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">iptables -E allowed <br/> disallowed</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">对自定义的链进行重命名,原来的名字在前,新名字在后。<br/>如上,就是把<tt class="VARNAME">allowed</tt>改为<tt class="VARNAME">disallowed</tt>。这仅仅是改变<br/>链的名字,对整个表的结构、工作没有任何影响。<br/></td></tr></tbody></table></div><br/><p>在使用<b class="COMMAND">iptables</b>时,如果必须的参数没有输入就按了回车,那么它就会给出一些<br/>提示信息:告诉你需要哪些参数等等。iptables的选项<b class="COMMAND">-v</b>用来显示iptables的版<br/>本,<b class="COMMAND">-h</b>给出语法的简短说明。。下面将要介绍的就是部分选项,还有它们的作用。<br/></p><br/><div class="TABLE"><a rel="nofollow" name="TABLE.OPTIONS"></a><br/><p><b>Table 6-3. Options</b></p><br/><table border="1" class="CALSTABLE"><br/> <tbody><br/> <tr><br/> <td width="14%" align="left" valign="top">Option(选项)</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-v</b>, <b class="COMMAND">--verbose(详细的)</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">可用此选项的命令</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">--list</b>, <b class="COMMAND">--append</b>, <b class="COMMAND">--insert</b>, <b class="COMMAND">--delete</b>, <b class="COMMAND">--replace</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation(说明)</td><br/> <td width="86%" align="left" valign="top">这个选项使输出详细化,常与<b class="COMMAND">--list<br/></b>连用。与<b class="COMMAND">--list</b>连用时,输出中包括网络接口的地址、规则的选项、TOS掩码、<br/>字节和包计数器,其中计数器是以K、M、G(这里用的是10的幂而不是2的幂哦)为单位的。如果想知道到底<br/>有多少个包、多少字节,还要用到选项<b class="COMMAND">-x</b>,下面会介绍。如果<b class="COMMAND">-v<br/></b>和<b class="COMMAND">--append</b>、<b class="COMMAND">--insert</b>、<b class="COMMAND">--delete<br/></b>或<b class="COMMAND">--replace</b>连用,iptables会输出详细的信息告诉你规则是如何被解释的、是<br/>否正确地插入等等。</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Option</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-x</b>, <b class="COMMAND">--exact(精确的)</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Commands used with</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">--list</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">使<b class="COMMAND">--list</b>输出中的计数器显示准确<br/>的数值,而不用K、M、G等估值。注意此选项只能和<b class="COMMAND">--list</b>连用。</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Option</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-n</b>, <b class="COMMAND">--numeric(数值)</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Commands used with</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">--list</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">使输出中的IP地址和端口以数值的形式显示,而不是默认的<br/>名字,比如主机名、网络名、程序名等。注意此选项也只能和<b class="COMMAND">--list</b>连用。</td><br/></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Option</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">--line-numbers</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Commands used with</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">--list</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">又是一个只能和<b class="COMMAND">--list</b>连用的选<br/>项,作用是显示出每条规则在相应链中的序号。这样你可以知道序号了,这对插入新规则很有用哦。</td><br/></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Option</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">-c</b>, <b class="COMMAND">--set-counters</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Commands used with</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">--insert</b>, <b class="COMMAND">--append</b>, <b class="COMMAND">--replace</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">在创建或更改规则时设置计数器,语法如下:<b class="COMMAND">--set-counters 20 4000</b>,意思是让内核把包计数器设为20,把字节计数器设为4000。<br/></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Option</td><br/> <td width="86%" align="left" valign="top"><b class="COMMAND">--modprobe</b></td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Commands used with</td><br/> <td width="86%" align="left" valign="top">All</td></tr><br/> <tr><br/> <td width="14%" align="left" valign="top">Explanation</td><br/> <td width="86%" align="left" valign="top">此选项告诉iptables探测并装载要使用的模块。这是非常有<br/>用的一个选项,万一<b class="COMMAND">modprobe</b>命令不在搜索路径中,就要用到了。有了这个选项,<br/>在装载模块时,即使有一个需要用到的模块没装载上,iptables也知道要去搜索。</td></tr></tbody></table></div>
-
6.4.3.1. 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,也就是说你要把时间单位凑成整的。
Table 6-8. Limit match options
Match --limit Example iptables -A INPUT -m limit --limit 3/hour Explanation 为limit match设置最大平均匹配速 率,也就是单位时间内limit match可以匹配几个包。它的形式是一个数值加一个时 间单位,可以是/second /minute /hour /day 。默认值是每小时3次(用户角度),即3/hour ,也就是每20分钟一次(iptables角度)。 Match --limit-burst Example iptables -A INPUT -m limit --limit-burst 5 Explanation 这里定义的是limit match的峰值, 就是在单位时间(这个时间由上面的--limit指定)内最多可匹配几个包(由此可 见,--limit-burst的值要比--limit的大)。默认值是5。 为了观察它是如何工作的,你可以启动“只有一条规则的脚本”Limit- match.txt,然后用不同的时间间隔、发送不同数量的ping数据包。这样,通过返回的 echo replies就可以看出其工作方式了。
-
-
04 Dec 06
Would you like to comment?
Join Diigo for a free account, or sign in if you are already a member.