@Mr-13
2019-09-17T06:29:51.000000Z
字数 14030
阅读 80
iptables
这一章来讨论数据包是以什么顺序、如何穿越不同的链和表的。稍后,在自己写规则时,就会知道这个顺序是多么的重要。一些组件是iptables与内核共用的,比如,数据包路由的判断。了解到这一点是很重要的,尤其在用iptables改变数据包的路由时。这会帮助你弄明白数据包是如何以及为什么被那样路由,一个好的例子是 DNAT 和 SNAT,不要忘了TOS的作用。
当数据包到达防火墙时,如果MAC地址符合,就会由内核里相应的驱动程序接收,然后会经过一系列操作,从而决定是发送给本地的程序,还是转发给其他主机,还是其他的什么。
先来看一个以本地为目的的数据包,它要经过以下步骤才能到达要接收它的程序:
下文中有个词 mangle,我实在没想到什么合适的词来表达这个意思,只因为我的英语太差!我只能把我理解的写出来。这个词表达的意思是,会对数据包的一些传输特性进行修改,在mangle表中允许的操作是 TOS、TTL、MARK。也就是说,今后只要我们见到这个词能理解它的作用就行了。
以本地为目标(就是我们自己的主机)的包
step(步骤) | table(表) | chain(链) | comment(注释) |
---|---|---|---|
1 | 在线路上传输(比如,internet) | ||
2 | 进入接口(比如,eth0) | ||
3 | mangle | PREROUTING | 这个链用来mangle数据包,比如改变TOS等 |
4 | nat | PERROUTING | 这个链主要用来DNAT。不要在这个链做过滤操作,因为某些情况下,包会溜过去 |
5 | 路由判断,比如,包是发往本地的还是转发的 | ||
6 | mangle | INPUT | 在路由之后,送往本地程序之前,mangle数据包 |
7 | filter | INPUT | 所有以本地为目的的包都要经过这个链,不管它们从哪来;对这些包的过滤条件就在这里设置。 |
8 | 达到本地程序(比如,服务程序或者客户程序) |
注意,相比以前(ipchain)现在数据包是由INPUT过,而不是FORWARD链。这样更符合逻辑刚看上去可能不太好理解。现在我们来看源地址是本地服务器要经过哪些步骤。
以本地为源的包
Step | Table | Chain | Comment |
---|---|---|---|
1 | 本地程序(比如,服务程序、客户程序) | ||
2 | 路由判断,要使用源地址,外出接口,还有其他一些信息。 | ||
3 | mangle | OUTPUT | 在这儿可以mangle包,建议不要在这儿做过滤,可能有负作用 |
4 | nat | OUTPUT | 这个链对从防火墙本身发出的包进行DNAT操作 |
5 | filter | POSTROUING | 这条链主要在包DNAT之后(译者注:作者把这一次DNAT称作实际路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪里去,要由NAT代码处理之后才能确定。所以把这称作实际路由。)离开本地之前,对包mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。 |
被转发的包
Step | Table | Chain | Comment |
---|---|---|---|
1 | 在线路上传输(比如:internet) | ||
2 | 进入接口(比如:th0) | ||
3 | mangle | PREROTING | mangle包,比如改变TOS |
4 | nat | PREROTING | 这个链主要用来做DNAT,不要在这个链做过滤操作,因为某些情况下包会溜过去。稍后会做SNAT。 |
5 | 路由判断,比如:包是发往本地的,还是要转发的 | ||
6 | mangle | FORWARD | 包继续被发送至mangle的FORWARD链,这是非常特殊的情况才会被用到的。在这里,包被mangle。这次mangle发生在最初的路由判断之后,在最后一次更改包的目的之前(译者注:就是下面的FORWARD链做的,因其过滤功能,可能会改变一些包的目的地,比如丢弃包) |
7 | filter | FORWARD | 包被继续发送至这条FORWARD链。只有需要转发的包才会走到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。 |
8 | mangle | POSTROTING | |
9 | |||
10 | |||
11 |
选项-t用来指定使用哪个表,它可以使下面介绍的表中的任何一个,默认的是filter表。注意,下面的介绍只是章节表和链的摘要。
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 | ilter表是专门过滤包的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作。FORWARD 链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,而 INPUT恰恰针对那些目的地是本地的包。OUTPUT 是用来过滤所有本地生成的包的。 |
上面介绍了三个不同的表的最基本的内容。应该知道它们的使用目的完全不同,还要清楚每一条链的 使用。如果你不了解,就可能会在防火墙上留下漏洞,给人以可乘之机。在章节表和链 中,已详细地讨论了这些必备的的表和链。如果没有完全理解包是怎样通过这些表、链的话,我建议回过头去再仔细看看。
这里介绍所有的Command以及它们的用途。Command指定iptables对我们提交的规则要做什么样的操作。这些操作可能是在某个表里增加或删除规则,或者其他的操作。
以下是iptables可用的command。
注意:不做特殊说明,默认的表是 filter 表。
Commands
命令 | 说明 |
---|---|
Command | -A --append |
Example | iptables -A INPUT ... |
Explanation | 在所选择的链末追加规则。当源地址或目的地址是以名字而不是IP地址形式出现时,若这些名字可以被解析为多个地址,则这条规则会和所有可用的地址结合。 |
Command | -D --delete |
Example | iptables -D INPUT --dport 80 -j DROP iptables -D INPUT 1 |
Explanation | 在所选的链中删除规则。有两种方法: 1、把规则完完整整的写出来; 2、指定规则的行号 |
Command | -R --replace |
Example | iptables -R INPUT 1 -s 192.168.0.1 -j DROP |
Explanation | 在所选;链的指定行上(编号)替换规则。他的主要作用是试验不同的规则。党员抵制或目的地址是名字而不是以ip的形式出现时,若这些名字可以被解析为多个地址,则这条Command会失败。 |
Match | -I --insert |
Example | iptables -I INPUT 1 --dport 80 -j ACCEPT |
Explanation | 根据支出的行号(规则序号)向链中插入规则,默认插入头部。 |
Match | -L --list |
Example | iptables -L INPUT |
Explanation | 显示所选链的所有规则。如果没有指定链,则限制指定表中的所有链。如果什么都没有指定,就显示默认表所有的链。精确输出受其他参数影响,如:-n 和 -v 等参数,下面会介绍。 |
Match | -F --flush |
Example | iptables -F INPUT |
Explanation | 清空所选的链。如果没有指定具体的链,则清空表中的所有链。如果什么都没有指定,就清空默认表所有的链。这个命令和一条一条删除链规则没有区别,只是这个会快些。 |
Match | -Z --zero |
Example | iptables -Z INPUT |
Explanation | 把指定链(如未指定,则默认所有链)的所有计数器归零 |
Match | -N --new-chain |
Example | iptables -N ALLOWED |
Explanation | 根据用户指定的名字创建新的链。上面创建了一个名为ALLOWED的链(系统默认的链名链名必须大写,建议自定义链也遵从该规则) 注意:所用的链名字不能和已有的链、target同名。 |
Match | -X --delete-chain |
Example | iptables -X ALLOWED |
Explanation | 删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前必须删除或者替换与之有关的规则。如果没有给出参数,这条命令会删除默认表所有的非内建链。 |
Match | -P --policy |
Example | iptables -P INPUT DROP |
Explanation | 为链设置默认的target(可用的是 ACCEPT 和 DROP,反正我暂时不知道还有别的),这个target称作策略。 所有不符合规则的包都被强制使用这个策略。只有内建的链才可以使用规则。但内建的链和用户自定义链都不能被作为策略使用,也是就是说不能像这样使用: iptables -P INPUT ALLOWED/(或者是内建链名) |
Match | -E --rename-chain |
Example | iptables -E ALLOWED DISALLOWED |
explanation | 对自定义的链进行重命名,原来的名字在前,新名字在后。这仅仅是改变链的名字,对整个表的结构、工作不会产生任何影响。 |
在使用 iptables 时,如果必须的参数没有输入就按了回车,那么它会给出一些提示:告诉你需要哪些参数等等。iptables的选项 -v 用来显示iptables的版本,-h 给出语法的简短说明。
下面介绍的是部分选项,以及它们的作用。
Options
选项 | 说明 |
---|---|
Option | -v --verbose (详细的) |
Command used with | --list、--append、--insert、--delete、--replace |
Explanation | 这个选项使得输出详细化,常与 -L (--list)连用。与--list连用时,输出中包括网络接口的地址、规则的选项、TOS掩码、字节和包计数器,其中计数器是以K、M、G(这里用的是10的幂而不是2的幂)为单位的。 如果想知道到底有多少个包、多少个字节,还要用到选项-x,下面介绍。 如果 -v 和 --append、--insert、--delete、--replace 连用,iptables会输出详细的信息告诉你规则是如何被解释的、是否正确插入等等。 |
Option | -x -exact (精确地) |
Command used with | --list |
Explanation | 使 --list 输出中的计数器显示准确数值,而不用K、M、G等估值。注意此选项只能和--list连用。 |
Option | -n --numeric (数值) |
Command used with | --list |
Explanation | 使输出中的IP地址和端口以数值形式显示,而不是默认的名字,比如:主机名、网络名、程序名等。注意此选项也只能和 --list 连用 |
Optone | --line-numbers (显示序号) |
Command used with | --list |
Explanation | 又是一个只能和--list连用的选项,作用是显示每条规则的序号,这对插入规则是很有用的 |
Option | -c --set-counters |
Command used with | --insert、--append、--replace |
Explanation | 在创建或者更改规则时设置计数器,语法如下: --set-counters 20 4000, 意思是让内核把包计数器设置20,把字节计数器设为4000。 |
Option | --modprobe |
Command used with | ALL |
Explanation | 此选项告诉iptables探测并装载要使用的模块。这是非常有用的一个选项,万一 modpeobe 命令不在搜索路径中,就要用到了。有了这个选项,在装载模块时,即使有一个需要用到的模块没装载上,iptables也知道要去搜索。 |
这里会详细的讨论一些match,把他们归为 5 类。
- Generic matches: 通用匹配,适用于所有的规则;
- TCP matches: 顾名思义,只能用于TCP的包;
- UDP matches: 只能用在UDP的包上;
- ICMP matches: 针对ICMP包的;
- Limit matches: 比较特殊,针对的是 状态(state)、所有者(owner)、和访问频率限制(limit) 等,它们已经被分到更多的小类当中,尽管它们并不是完全不同的。
希望这样分类能更容易理解。
无论是我们使用哪种协议,也不管我们又装入了匹配的哪种扩展,通用匹配都可以使用,而不需要什么前提条件,后面会介绍到,很多其他的匹配是需要其他的匹配作为前提条件的。
规则 | 注释 |
---|---|
Match | -p --protocal |
Example | iptables -A INPUT -p tcp --dport 86 ACCEPT |
Explanation | 匹配指定的协议。协议的形式有以下几种: 1、名字,部分大小写,但必须是在 /etc/protocals (点击查看) 中定义的。 2、可以使用它们相应的整数值。例如:ICMP的值是1,TCP是6,UDP是17。 3、缺省设置,ALL,相应的数值是0,但要注意这只是代表匹配TCP、UDP、ICMP,而不是 /etc/protocals 中的所有协议。 4、可以使协议列表,以英文都好为分隔符,如:udp,tcp 5、可以在协议前加英文的感叹号表示取反没注意有空格,如:--protocal ! tcp 表示非tcp协议,也就是 UDP 和 ICMP 。可以看出这个取反的范围只是在:TCP、UDP、ICMP 这三者之间。 |
Match | -s --source, --src |
Example | iptables -A INPUT -s 118.26.164.210 -p tcp --dport 8080 DROP |
Explanation | 以IP源地址匹配包。地址的形式如下: 1、单个网址,如:192.168.1.1,也可写成 192.168.1.1/255.255.255.0 或 192.168.1.1/32 2、网络,如:192.168.0.0/24,或 192.168.0.0/255.255.0.0 3、在地址钱加英文叹号取反,注意空格,如:-s ! 192.168.0.0/24 表示除此地址之外的所有地址 4、缺省是所有地址 |
Match | -d --destination |
Example | iptable -A OUTPUT -d 192.168.5.217 |
Explanation | 以目的IP地址匹配包。地址形式和 -s 完全一致 |
Match | -i --in-interface |
Example | iptables -A INPUT -i eth0 |
Explanation | 以数据报进入本机所使用的网络接口来匹配包。要注意这个匹配操作只能用于 INPUT、FORWARD、PERROUTING 这三个链,用在其它任何地方都会提示错误信息。指定接口有以下方法: 1、指定接口名称,如:eth0、ppp0等; 2、使用通配符,即英文加号,它代表字符数字串。若直接用一个加号,即 iptables -A INPUT -i + 表示匹配所有的包,而不考虑使用哪个接口。这也是不指定接口的默认行为。通配符还可以放在某一类的接口后面,如:eth + 表示所有的Ethernet接口,也就是说,匹配所有从Ethernet接口进入的包。 3、在接口前加英文叹号表示取反,注意空格,如:-i ! eth0 的意思是匹配来自除了 rth0 外的所有包。 |
Match | -o --out-interface |
Example | iptables -A FORWARD -o eth0 |
Explanation | 以离开本机所使用的网络接口来匹配包。使用的范围 |
Match | -f --fragment |
Example | iptables -A INPUT -f |
Explanation | 用来匹配一个被分片的包的第二片以及以后部分。因为它们不含源或目的地址,或ICMP类型等信息,其他规则无法匹配到它,所以才有这个匹配操作。要注意基于这类消息包的碎片攻击。 这个操作也可以加英文叹号取反,但要注意位置,如:! -f。取反时表示只能匹配到没有分片的包或者是被分片的包的第一个碎片,后续的片都不行。现在的内核有完善的碎片重组功能,所以不必使用取反功能在纺织碎片通过。如果你使用链接跟踪,是不会看到任何碎片的,因为在它们到达任何链之前就被处理过了。 |
这种匹配操作是自动的或隐含的装载入内核的。例如我们使用 --protocol tcp 时,不需要再装入任何东西就可以匹配只有IP包才有的一些特点。现在有三种隐含的匹配针对三种不同的协议,即:TCP match、UDP match、ICMP match。它们分别包括一套只适用于相应协议的判别标准。相对于隐含匹配的是显式匹配,它们必须使用 -m 或者 -match 被明确的装载,而不能自动的或隐含的,下一节会介绍到。
TCP match只能匹配TCP包或流的细节,它们必须有--protocol tcp作为前提条件。
规则 | 注释 |
---|---|
Match | --sport --source-port |
Example | iptables -A INPUT -p tcp --sport 22 |
Explanation | 基于TCP包的源端口来匹配包,端口的指定形式如下: 1、不指定此项,则按时所有端口 2、使用服务名或端口号,但名字必须是在 /etc/services 中定义的,因为iptables从这个文件里查找相应的端口号。从这里可以看出,使用端口号会是规则装入快一点儿,当然,可读性可能会差一些。但是如果想写一个包含200条或者更多的规则集,还是使用端口号规则吧,时间是主要因素(在一台配置较低的主机上,这最多可能会产生10s的差距) 3、可以使用连续端口号,如--source-port 55:80 这表示从22到80之间所有的端口,包括22和80.如果两个好的顺序反了也没有关系,如 --source-port 80:22 效果是一样的。 4、可以省略第一个端口号,默认第一个是0,如:--sourcr-port :80 表示从0~80之间的所有端口。 5、也可以省略第二个端口号,默认是65535,如:-source-port 22: 表示从22~65535之间的所有端口。 6、在端口号钱加英文感叹号表示 取反 ,注意空格,如:--source-port !22 表示除了之外的所有端口 -source-port !22:80 表示22~80之外的所有端口。 注意:这个匹配操作不能识别不连续的端口列表,如 --source-port ! 22,36,80 这样的操作是由后面将要介绍的多端口匹配扩展来完成的。 |
Match | --dport --destination port |
Example | iptables -A INPUT -p tcp --dport 22 |
Explanation | 基于TCP包的目的端口来匹配包,端口指定形式和 --sport 完全一样 |
Match | --tcp-flags |
Example | |
Explanation | 匹配指定的TCP标记。有 两个参数,他们都是列表,列表内部用英文逗号作分隔符,这两个列表之间用空格分开。 第一个参数:指定我们要检查的标记(作用就像掩码); 第二个参数:指定“在第一个列表中出现过的且必须被设定为1(即状态是打开)的”标记(第一个列表中其他标记必须置0)。 也就是说,第一个参数提供检查范围,第二个参数提供被设置的条件(就是哪些位置设置成1)。这个匹配操作可以识别以下标记:SYN、ACK、FIN、URG、PSH。他们的含义是: SYN: (synchronous)表示建立连接; FIN: (finish)表示关闭连接; ACK: (acknowledgement )表示响应; PSH: (push)表示有DATA数据传输; RST: (reset)表示连接重置; URG: (urgent)紧急。 其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示就是建立连接之后的响应,如果只是单一个的SYN,它表示只是建立连接。TCP的几次握手就是通过这样的ACK表现出来的。 但SYN与FIN是不会同时为1的,SYN表示建立连接,FIN表示断开连接。 另外还有两个词也可以使用,就是 ALL 和 NONE。 ALL 是指选定所有的标记;NONE 是指未选定任何标记。这个匹配也可在参数前加英文叹号表示取反。 例如: 1、 iptables -p tcp --tcp-flags SYN,FIN,ACK, SYN 表示匹配那些SYN标记被设置而FIN和ACK标记没被设置的包,注意个标记之间只有一个英文逗号而没有空格。 2、 --tcp-flags ALL NONE 匹配所有标记都没有设置1的包。 3、 iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN 表示匹配那些FIN和ACK被标记而SYN标记没有设置的包,注意和例1比较一下。 |
Match | --syn |
Example | iptanles -p tcp --syn |
Explanation | 这个匹配或多或少算是 ipchains 时代的遗留物,之所以还保留它,是为了后向兼容,也是为了方便规则在 iptables 和 ipchains 间的转换。它匹配那些 SYN 标记被设置而 ACK 和 RST 标记没有被设置的包,这和 iptables -p tcp --tcp-flgs SYN,ACK,RST SYN 的作用完全一样。 这样的包主要用在TCP链接初始化时发出的请求。如果你组织了这样的包,也就阻止了所有 由外向内 的链接企图,这在一定程度上防止了一些攻击。但外出的链接不受影响,恰恰现在有很多攻击就利用这一点。比如有些攻击黑掉服务器之后安装一些软件,他们能够利用已经存在的的链接到达你的主机,而不需要再新开一个端口。这个匹配也可用英文感叹号取反,如:! --syn 用来匹配那些 RST或ACK被置位的包,换句话说,就是状态为已建立链接的包。 |
Match | -tcp-option |
Example | iptables -p tcp --tcp-option 16 |
Explanation | 根据匹配包。TCP选项是TCP头中的特殊部分,有三个不同的部分。 第一个8位组表示选项的类型,第二个8位组表示现象的长度(这个长度是整个选项的长度,但不包含填充部分所占的字节,而且要注意不是每个TCP选项都有这一部分的),第三部分当然是选项的内容了。为了适应标准,我们不必执行所有选项,但我们可以查看选项的类型,如果不是我们所支持的,那就只是看看长度然后跳过数据部分。这个操作是根据选项的十进制值来匹配的,它也可以用银根感叹号取反。所有选项都在 Internet Engineering Task Force 里找到。 |
UDP matches是在指定 --protocol UDP 时自动装入的。UDP是一种无连接协议,所以在它打开、关闭连接以及在发送数据时没有多少标记要设置,他也不需要任何类型确认。数据丢失了,就丢失了(不会发送ICMP错误信息的)。这就说明UDP matches要比TCP matches少多了。即使UDP和ICMP是无连接协议,状态机制也可以很好的工作,就像在TCP上一样。
规则 | 注释 |
---|---|
Match | --sport --source-port |
Example | iptables _A INPUT -p udp --sport 53 |
Explanation | 基于UDP包的源端口来匹配包,端口的指定形式和TCP matches中的--sport完全一样。 |
Match | --dport --destination-port |
Example | iptables -A INPUT -p udp --dport 53 |
Explanation | 基于UDP包的目的端口来匹配包,端口指定形式和TCP matches中的--dport完全一样。 |
ICMP协议也是无连接协议,ICMP包更是短命鬼,比UDP的还短。ICMP协议不是IP的下属协议,而是它的辅助者,起主要作用是报告错误和连接控制。ICMP包的头和IP的很相似,但又有很多不同。这个协议的主要特点是它有很多类型,以应对不同的情况。
比如,我们想访问一个无法访问的地址,就会受到一个ICMP host unreachable信息,它的意思是主机无法到达。在附录 ICMP类型 里有完整的ICMP类型列表。虽然有这么多类型,但只有一个ICMP match,这就足够对付它们了。这个match是在指定 --protocal ICMP 时自动装入的。
注意所有的通用匹配都可以使用,这样我们就可以匹配ICMP包的源、目的地址。
规则 | 注释 |
---|---|
Match | --icmp-type |
Example | iptables -A INPUT -p icmp --icmp-type 8 |
Explanation | 根据ICMP类型匹配包,类型的指定可以使用十进制数值或相应的名字,数值在RFC792中有定义,名字可以用 iptables --protocal icmp --help 查看,或在附录 ICMP类型 中查找。 这个匹配也可用英文叹号取反,如:--icmp-type ! 8 就表示匹配除类型8之外的所有ICMP包。要注意有些ICMP类型已经废弃不用了,还有一些可能会对无房户的主机带来“危险”,因为它们可能把包重定向到错误的地方。 |
显式匹配必须使用 -m 或 --match 装载,比如要使用状态匹配就必须使用 -m state。有些匹配还需指定匹配协议,有些就不需要,比如连接状态就不要。比如:NEW、ESTABLISHED、RELATED 等等。
有些匹配还处于开发阶段,或者还只是为了说明iptables的强大能力。这说明不是所有的匹配一开始就是实用的,但以后可能会用到它。随着iptables的新版本发布,会有一些新的匹配可用。隐含匹配和显式匹配最大区别就是一个跟随协议自动装载,一个是显式装载的。
这个匹配操作必须由 -m limit 明确指定才能使用。limit match可以对指定的规则的日志数量加以限制。
比如可以事先设定一个限定值当符合条件的包的数量不超过它时,就记录;超过了,就不记录了。我们可以控制某条规则在一段时间内的匹配次数(也就是可以匹配的包的数量),这样就能够减少 DOS/SYN flood 攻击的影响、这是它的主要作用,(对于某些不常用的服务可以限制链接数量,一面影响其他服务)。
Limit match也可以用英文叹号取反,如:-m limit ! --limit5/s, 表示数量在超过了限定值之后所有的包都会被匹配。
Limit match的工作方式就像一个单位大门口的保安,有外来人员拜访时,需要从他这里领取一个通行证。保安手里有固定数量的通行证,来一个领走一个,当通行证领完之后,再来的人就进不去了;但他们不会等而是到别的地方去(在iptables里,这相当于一个包不符合某条规则,就会由后面的规则来处理,如果都不符合,就由缺省策略来处理)。但有个规定,每个一段时间,保安就要签发一个新的通行证。这样,后面的人如果恰巧赶上,也就可以进去了。如果没有人来,那通行证就保留下,以备来的人用。如果一直没人来,可用的通行证数量就增加了,但不是无限增大的,最多也就是早上保安手里有的那个数量。
简单说通行证的数量是有限的,但每隔一段时间就有新的通行证可用。limit match 有两个参数就对应这种情况:
- --limit-burst 指定刚开始有多少通行证可用;
- --limit 指定隔多长时间才能签发一个新的通行证。
这里强调的是 “签发一个新的通行证”,这是以 iptables 的角度考虑的。我们在书写规则时,就要从这个角度考虑。
比如,指定了:--limit 3/minute --limit-burst 5,意思是开始时有5个通行证,用完之后每20秒增加一个,这是从iptables的角度看,如果从用户的角度看,说法就是每分钟增加3个,或者每分钟只能过3个。要是想每20分钟过一个,只能写成:--limit 3/hour,也就是说需要把时间单位凑成整的。
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。 |
Match | --limit-burst |
Example | iptables -A INPUT -m limit --limit-burst 5 |
Explanation | 这里定义的是limit match的峰值,就是在单位时间(这个时间是由上面的--limit指定)内最多可以匹配几个包(由此可见,--limit-burst的值要比--limit的大)。默认值是5。 为了观察它是如何工作的,你可以尝试设置limit的链规则,然后用不同的时间间隔、发送不同数量的ping数据包。这样,通过返回的 echo replie 就可以看出其工作方式了。 注意:如果连规则中已经存在关于 -m state 的设定,一定要注意 limit 限制的位置(序号先后),TSTABLISHED、RELATED、NEW 的链规则会影响到limit的校验。 |
这是一个完整的ICMP类型列表:
TYPE | CODE | Description | Query | Error |
---|---|---|---|---|
0 | 0 | Echo Reply - 回显应答;Ping命令的回复包 | x | |
3 | 0 | Network Unreachable - 网络不可达 | x | |
3 | 1 | Host Unreachable - 主机不可达 | x | |
3 | 2 | Protocal Unreachable - 协议不可达 | x | |
3 | 3 | Port Unreachable - 端口不可达 | x | |
3 | 4 | Fragmentation needed but no frag.bit set - 需要进行分片但设置不分片比特 | x | |
3 | 5 | Sourcerouting failed - 源站选路失败 | x | |
3 | 6 | Destination network unknown - 目的网络未知 | x | |
3 | 7 | Destination host unknown - 目的主机未知 | x | |
3 | 8 | Source host isolated(obsolete) - 源主机被隔离(作废不用) | x | |
3 | 9 | Destination network administratively prohibited - 目的网络被强制禁止 | x | |
3 | 10 | Destination host administratively prohibited - 目的主机被强制禁止 | x | |
3 | 11 | Network unreachable for TOS - 由于服务类型TOS,网络不可达 | x | |
3 | 12 | Host unreachable for TOS - 由于服务类型TOS,主机不可达 | x | |
3 | 13 | Communication administratively prohibitedby filtering - 由于过滤,通信被强制禁止 | x | |
3 | 14 | Host precedence violation - 主机越权 | x | |
3 | 15 | Precedence cutoffineffect - 优先中止生效 | x | |
4 | 0 | Source quench - 源端被关闭(基本流控制) | ||
5 | 0 | Redirect for network - 对网络重定向 | ||
5 | 1 | Redirect for host - 对主机重定向 | ||
5 | 2 | Redirect for TOS and network - 对服务类型和网络重定向 | ||
5 | 3 | Redirect for TOS and host - 对服务类型和主机重定向 | ||
8 | 0 | Echo request - 回显请求; Ping命令的请求包 | x | |
9 | 0 | Route radvertisement - 路由器通告 | ||
10 | 0 | Route solicitation - 路由器请求 | ||
11 | 0 | TTL equals 0 during transit - 传输期间生存时间为0 | x | |
11 | 1 | TTL equals 0 during reassembly - 在数据报组装期间生存时间为0 | x | |
12 | 0 | IP header bad(catchallerror) - 坏的IP首部(包括各种差错) | x | |
12 | 1 | Require doptions missing - 缺少必需的选项 | x | |
13 | 0 | Time stampre quest(obsolete) - 时间戳请求(作废不用) | x | |
14 | Times tampreply(obsolete) - 时间戳应答(作废不用) | x | ||
15 | 0 | Information request(obsolete) - 信息请求(作废不用) | x | |
16 | 0 | Information reply(obsolete) - 信息应答(作废不用) | x | |
17 | 0 | Addressmask request - 地址掩码请求 | x | |
18 | 0 | Addressmask reply - 地址掩码应答 | x |
附录D. 其他资源和链接
- /etc/protocals - 此文件是从Slachware发行版中抽取的。可以利用此文件找到协议对应的协议号,如:IP、ICMP 或 TCP对应的协议号码。
- /etc/services - 此文件也是从Slachware发行版中抽取的。它非常值得一读,可以大致了解什么协议使用什么端口。