Iptables规则是如何练成的

回复 收藏
Iptables规则是如何练成的
让我们一起讨论如何构建Iptables规则。Iptables 包含三个表(filternat mangle),默认使用filter表,每个表包含若干条链(PREROUTINGPOSTROUTINGOUTPUTINPUTFORWARD,每条规则就添加到相应的链上。规则就是指向标,在一条链上,对不同的连接和数据包阻塞或允许它们去向何处。插入链的每一行都是一条规则。我们也会讨论基本的matche及其用法,还有各种各样的target
流程图
1. 基础
我们已经解释了什么是规则,在内核看来,规则就是决定如何处理一个包的语句。如果一个包符合所有的条件(就是符合matche语句),我们就运行targetjump指令。书写规则的语法格式是:
iptables [-t table] command [chain] [match] [-j target/jump]
     
注意target指令必须在最后。如果你不想用标准的表,就要在处指定表名。一般情况下没有必要指定使用的表,因为iptables 默认使用filter表来执行所有的命令。也没有必要非得在这里指定表名,实际上几乎可在规则的任何地方。当然,把表名在开始处已经是约定俗成的标准。
尽管命令总是放在开头,或者是直接放在表名后面,我们也要考虑考虑到底放在哪儿易读。command告诉程序该做什么,比如:插入一个规则,还是在链的末尾增加一个规则,还是删除一个规则,下面会仔细地介绍。
Chain 指定表的哪条规则链。
match细致地描述了包的某个特点,以使这个包区别于其它所有的包。在这里,我们可以指定包的来源IP 地址,网络接口,端口,协议类型,或者其他什么。下面我们将会看到许多不同的match
最后是数据包的目标所在。若数据包符合所有的match,内核就用target来处理它,或者说把包发往 target。比如,我们可以让内核把包发送到当前表中的其他链(可能是我们自己建立的),或者只是丢弃这个包而没有什么处理,或者向发送者返回某个特殊的应答。下面有详细的讨论。
2. Tables
选项 -t用来指定使用哪个表,它可以是下面介绍的表中的任何一个,默认的是 filter表。
Table 2-1. Tables
[table]
Table(表名)
Explanation (注释)

nat
nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NATMasqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。

mangle
这个表主要用来mangle数据包。我们可以改变不同的包及包头的内容,比如 TTLTOS(服务类型)MARK。注意MARK并没有真正地改动数据包,它只是为包设了一个标记。防火墙内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。注意,mangle表不能做任何NAT,它只是改变数据包的 TTLTOSMARK,而不是其源目地址。NAT是在nat表中操作的。

filter
filter表是专门过滤包的,内建三个链,可以毫无问题地对包进行DROPLOGACCEPTREJECT等操作。FORWARD链过滤所有不是本地产生的并且目的地不是本地的包,而 INPUT恰恰针对那些目的地是本地的包。OUTPUT是用来过滤所有本地生成的包的。
上面介绍了三个不同的表的最基本的内容。应该知道它们的使用目的完全不同,还要清楚每一条链的使用。
3. Commands
在这一节里,我们将要介绍所有的command以及它们的用途。command指定iptables对我们提交的规则要做什么样的操作。这些操作可能是在某个表里增加或删除一些东西,或做点儿其他什么。以下是iptables可用的command(要注意,如不做说明,默认表的是 filter。):
Table 3-1. Commands
Command
-A, --append
Example
iptables -A INPUT ...
Explanation
在所选择的链末添加规则。当源地址或目的地址是以名字而不是ip地址的形式出现时,若这些名字可以被解析为多个地址,则这条规则会和所有可用的地址结合。
Command
-D, --delete
Example
iptables -D INPUT --dport 80 -j DROPiptables -D INPUT 1
Explanation
从所选链中删除规则。有两种方法指定要删除的规则:一是把规则完完整整地写出来,再就是指定规则在所选链中的序号(每条链的规则都各自从1被编号)。
Command
-R, --replace
Example
iptables -R INPUT 1 -s 192.168.0.1 -j DROP
Explanation
在所选中的链里指定的行上(每条链的规则都各自从1被编号)替换规则。当源地址或目的地址是以名字而不是ip地址的形式出现时,若这些名字可以被解析为多个地址,则这条command会失败。
Command
-I, --insert
Example
iptables -I INPUT 1 --dport 80 -j ACCEPT
Explanation
根据给出的规则序号向所选链中插入规则。如果序号为1,规则会被插入链的头部,其实默认序号就是1
Command
-L, --list
Example
iptables -L INPUT
Explanation
显示所选链的所有规则。如果没有指定链,则显示指定表中的所有链。如果什么都没有指定,就显示默认表所有的链。精确输出受其它参数影响,如-n-v等参数,下面会介绍。
Command
-F, --flush
Example
iptables -F INPUT
Explanation
清空所选的链。如果没有指定链,则清空指定表中的所有链。如果什么都没有指定,就清空默认表所有的链。当然,也可以一条一条地删,但用这个command会快些。
Command
-Z, --zero
Example
iptables -Z INPUT
Explanation
把指定链(如未指定,则认为是所有链)的所有计数器归零。
Command
-N, --new-chain
Example
iptables -N allowed
Explanation
根据用户指定的名字建立新的链。上面的例子建立了一个名为allowed的链。注意,所用的名字不能和已有的链、target同名。
Command
-X, --delete-chain
Example
iptables -X allowed
Explanation
删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将会删除默认表所有非内建的链。
Command
-P, --policy
Example
iptables -P INPUT DROP
Explanation
为链设置默认的target(可用的是DROPACCEPT),这个target称作策略。所有不符合规则的包都被强制使用这个策略。只有内建的链才可以使用规则。但内建的链和用户自定义链都不能被作为策略使用,也就是说不能象这样使用:iptables -P INPUT allowed(或者是内建的链)。
Command
-E, --rename-chain
Example
iptables -E allowed disallowed
Explanation
对自定义的链进行重命名,原来的名字在前,新名字在后。如上,就是把allowed改为disallowed。这仅仅是改变链的名字,对整个表的结构、工作没有任何影响。
4. Chain
规则链名一般放在命令后面,表示对哪条规则链进行操作。
总共有五个规则链:
PREROUTINGPOSTROUTINGOUTPUTINPUTFORWARD
PREROUTING     在数据包进入防火墙之后、路由判断之前经过的链。
FORWARD        在最初的路由判断之后、决定该数据包不是发往本地时经过的链。
INPUT            在最初路由判断之后,决定该数据包是发往本地程序时经过的链。
OUTPUT          从本地发出的数据包,经过路由判断准备发送出去时经过的链。
POSTROUTING    数据包离开本地之前经过的链。
在使用iptables时,如果必须的参数没有输入就按了回车,那么它就会给出一些提示信息:告诉你需要哪些参数等等。iptables的选项-v用来显示iptables的版本,-h给出语法的简短说明。下面将要介绍的就是部分选项,还有它们的作用。
Table 3-2. Options
Option(选项)
-v, --verbose(详细的)
可用此选项的命令
--list, --append, --insert, --delete, --replace
Explanation(说明)
这个选项使输出详细化,常与--list连用。与--list连用时,输出中包括网络接口的地址、规则的选项、TOS掩码、字节和包计数器,其中计数器是以KMG(这里用的是10的幂而不是2的幂哦)为单位的。如果想知道到底有多少个包、多少字节,还要用到选项-x,下面会介绍。如果-v--append--insert--delete--replace连用,iptables会输出详细的信息告诉你规则是如何被解释的、是否正确地插入等等。
Option
-x, --exact(精确的)
Commands used with
--list
Explanation
使--list输出中的计数器显示准确的数值,而不用KMG等估值。注意此选项只能和--list连用。
Option
-n, --numeric(数值)
Commands used with
--list
Explanation
使输出中的IP地址和端口以数值的形式显示,而不是默认的名字,比如主机名、网络名、程序名等。注意此选项也只能和--list连用。
Option
--line-numbers
Commands used with
--list
Explanation
又是一个只能和--list连用的选项,作用是显示出每条规则在相应链中的序号。这样你可以知道序号了,这对插入新规则很有用哦。
Option
-c, --set-counters
Commands used with
--insert, --append, --replace
Explanation
在创建或更改规则时设置计数器,语法如下:--set-counters 20 4000,意思是让内核把包计数器设为20,把字节计数器设为4000
Option
--modprobe
Commands used with
All
Explanation
此选项告诉iptables探测并装载要使用的模块。这是非常有用的一个选项,万一modprobe命令不在搜索路径中,就要用到了。有了这个选项,在装载模块时,即使有一个需要用到的模块没装载上,iptables也知道要去搜索。
5. Matches
这一节,我们会详细讨论一些matche,我把它们归为五类。第一类是generic matches(通用的匹配),适用于所有的规则;第二类是TCP matches,顾名思义,这只能用于TCP包;第三类是UDP matches,当然它只能用在UDP包上了;第四类是ICMP matches,针对ICMP包的;第五类比较特殊,针对的是状态(state),所有者(owner)和访问的频率限制(limit)等,它们已经被分到更多的小类当中,尽管它们并不是完全不同的。
5.1. 通用匹配
无论我们使用的是何种协议,也不管我们又装入了匹配的何种扩展,通用匹配都使可用的。也就是说,它们可以直接使用,而不需要什么前提条件,在后面你会看到,有很多匹配操作是需要其他的匹配作为前提的。
Table 5-1. Generic matches
Match
-p, --protocol
Example
iptables –A INPUT -p tcp
Explanation
匹配指定的协议。指定协议的形式有以下几种:
1、名字,不分大小写,但必须是在/etc/protocols中定义的。
2、可以使用它们相应的整数值。例如,ICMP的值是1TCP6UDP17
3、缺省设置,ALL,相应数值是0,但要注意这只代表匹配TCPUDPICMP,而不是/etc/protocols中定义的所有协议。
4、可以是协议列表,以英文逗号为分隔符,如:udp,tcp
5、可以在协议前加英文的感叹号表示取反,注意有空格,如: --protocol ! tcp表示非tcp协议,也就是UDPICMP。可以看出这个取反的范围只是TCPUDPICMP
Match
-s, --src, --source
Example
iptables -A INPUT -s 192.168.1.1
Explanation
IP源地址匹配包。地址的形式如下:
1、单个地址,如192.168.1.1,也可写成 192.168.1.1/255.255.255.255192.168.1.1/32
2、网络,如192.168.0.0/24,或 192.168.0.0/255.255.255.0
3、在地址前加英文感叹号表示取反,注意空格,如--source ! 192.168.0.0/24 表示除此地址外的所有地址
4、缺省是所有地址
Match
-d, --dst, --destination
Example
iptables -A INPUT -d 192.168.1.1
Explanation
IP目的地址匹配包。地址的形式和 -- source完全一样。
Match
-i, --in-interface
Example
iptables -A INPUT -i eth0
Explanation
以包进入本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于INPUTFORWARDPREROUTING这三个链,用在其他任何地方都会提示错误信息。指定接口有一下方法:
1、指定接口名称,如:eth0ppp0
2[size=10.5000pt] 使用通配符,即英文加号,它代表字符数字串。若直接用一个加号,即iptables -A INPUT -i +表示匹配所有的包,而不考虑使用哪个接口。这也是不指定接口的默认行为。通配符还可以放在某一类接口的后面,如:eth+表示所有Ethernet接口,也就是说,匹配所有从Ethernet接口进入的包。
3、在接口前加英文感叹号表示取反,注意空格,如:-i ! eth0意思是匹配来自除eth0外的所有包。
Match
-o, --out-interface
Example
iptables -A FORWARD -o eth0
Explanation
以包离开本地所使用的网络接口来匹配包。使用的范围和指定接口的方法与--in-interface完全一样。
Match
-f, --fragment
Example
iptables -A INPUT -f
Explanation
用来匹配一个被分片的包的第二片或及以后的部分。因为它们不包含源或目的地址,或ICMP类型等信息,其他规则无法匹配到它,所以才有这个匹配操作。要注意碎片攻击哦。这个操作也可以加英文感叹号表示取反,但要注意位置,如:! -f 。取反时,表示只能匹配到没有分片的包或者是被分片的包的第一个碎片,其后的片都不行。现在内核有完善的碎片重组功能,可以防止碎片攻击,所以不必使用取反的功能来防止碎片通过。如果你使用连接跟踪,是不会看到任何碎片的,因为在它们到达任何链之前就被处理过了。
5.2. 隐含匹配
这种匹配操作是自动地或隐含地装载入内核的。例如我们使用--protocol tcp 时,不需再装入任何东西就可以匹配只有IP包才有的一些特点。现在有三种隐含的匹配针对三种不同的协议,即TCP matchesUDP matchesICMP matches。它们分别包括一套只适用于相应协议的判别标准。相对于隐含匹配的是显式匹配,它们必须使用-m--match被明确地装载,而不能是自动地或隐含地,下一节会介绍到。
5.2.1. TCP matches
TCP matches只能匹配TCP包或流的细节,它们必须有--protocol tcp作为前提条件。
Table5-2. TCP matches
Match
--sport, --source-port
Example
iptables -A INPUT -p tcp --sport 22
Explanation
基于TCP包的源端口来匹配包,端口的指定形式如下:
1、不指定此项,则暗示所有端口。
2、使用服务名或端口号,但名字必须是在/etc/services 中定义的,因为iptables从这个文件里查找相应的端口号。从这可以看出,使用端口号会使规则装入快一点儿,当然,可读性就差些了。但是如果你想写一个包含200条或更多规则的规则集,那你还是老老实实地用端口号吧,时间是主要因素(在一台稍微慢点儿地机子上,这最多会有10秒地不同,但要是1000条、10000 条呢)。
3、可以使用连续的端口,如:--source-port 22:80这表示从2280的所有端口,包括2280。如果两个号的顺序反了也没关系,如:--source-port 80:22这和 --source-port 22:80的效果一样。
4、可以省略第一个号,默认第一个是0,如:--source-port :80表示从080的所有端口。
5、也可以省略第二个号,默认是65535,如:--source-port 22:表示从2265535的所有端口
6、在端口号前加英文感叹号表示取反,注意空格,如:--source-port ! 22表示除22号之外的所有端口;--source-port ! 22:80表示从2280(包括2280)之外的所有端口。
注意:这个匹配操作不能识别不连续的端口列表,如:--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)。这个匹配操作可以识别以下标记:SYNACKFINRSTURGPSH。另外还有两个词也可使用,就是ALLNONE。顾名思义,ALL是指选定所有的标记,NONE是指未选定任何标记。这个匹配也可在参数前加英文的感叹号表示取反。例如:
1iptables -p tcp --tcp-flags SYN,FIN,ACK SYN表示匹配那些SYN标记被设置而FINACK标记没有设置的包,注意各标记之间只有一个逗号而没有空格。
2--tcp-flags ALL NONE匹配所有标记都未置1的包。
3iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN表示匹配那些FINACK标记被设置而SYN标记没有设置的包,注意和例1比较一下。
Match
--syn
Example
iptables -p tcp --syn
Explanation
这个匹配或多或少算是ipchains时代的遗留物,之所以还保留它,是为了向后兼容,也是为了方便规则在iptablesipchains间的转换。它匹配那些SYN标记被设置而 ACKRST标记没有设置的包,这和iptables -p tcp --tcp-flags SYN,RST,ACK SYN 的作用毫无二样。这样的包主要用在TCP连接初始化时发出请求。如果你阻止了这样的包,也就阻止了所有由外向内的连接企图,这在一定程度上防止了一些攻击。但外出的连接不受影响,恰恰现在有很多攻击就利用这一点。比如有些攻击黑掉服务器之后安装会一些软件,它们能够利用已存的连接到达你的机子,而不要再新开一个端口。这个匹配也可用英文感叹号取反,如:! --syn用来匹配那些 RSTACK被置位的包,换句话说,就是状态为已建立的连接的包。
Match
--tcp-option
Example
iptables -p tcp --tcp-option 16
Explanation
根据匹配包。TCP选项是TCP头中的特殊部分,有三个不同的部分。第一个8位组表示选项的类型,第二个8位组表示选项的长度(这个长度是整个选项的长度,但不包含填充部分所占的字节,而且要注意不是每个TCP选项都有这一部分的),第三部分当然就是选项的内容了。为了适应标准,我们不必执行所有的选项,但我们可以查看选项的类型,如果不是我们所支持的,那就只是看看长度然后跳过数据部分。这个操作是根据选项的十进制值来匹配的,它也可以用英文感叹号取反。
5.2.2. UDP matches
UDP matches是在指定--protocol UDP时自动装入的。UDP是一种无连接协议,所以在它打开、关闭连接以及在发送数据时没有多少标记要设置,它也不需要任何类型的确认。数据丢失了,就丢失了(不会发送ICMP错误信息的)。这就说明UDP matches要比TCP matches少多了。即使UDPICMP是无连接协议,状态机制也可以很好的工作,就象在TCP上一样,这在前面讨论过。
Table 5-3. UDP matches
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中的--sport完全一样。
5.2.3. ICMP matches
ICMP协议也是无连接协议,ICMP包更是短命鬼,比UDP的还短。ICMP协议不是IP协议的下属协议,而是它的辅助者,其主要作用是报告错误和连接控制。ICMP包的头和IP的很相似,但又有很多不同。这个协议最主要的特点是它有很多类型,以应对不同的情况。比如,我们想访问一个无法访问的地址,就会收到一个ICMP host unreachable信息,它的意思是主机无法到达。这个matche是在指定--protocol ICMP时自动装入的。注意所有的通用匹配都可以使用,这样我们就可以匹配ICMP包的源、目地址。
Table 5-4. ICMP matches
Match
--icmp-type
Example
iptables -A INPUT -p icmp --icmp-type 8
Explanation
根据ICMP类型匹配包,类型的指定可以使用十进制数值或相应的名字,数值在RFC792中有定义,名字可以用iptables --protocol icmp --help 查看。这个匹配也可用英文感叹号取反,如:--icmp-type ! 8就表示匹配除类型8之外的所有ICMP包。要注意有些ICMP 类型已经废弃不用了,还有一些可能会对无防护的主机带来危险,因为它们可能把包重定向到错误的地方。
5.3. 显式匹配
显式匹配必须用-m--match装载,比如要使用状态匹配就必须使用-m state。有些匹配还需要指定协议,有些就不需要,比如连接状态就不要。这些状态是NEW(还未建立好的连接的第一个包), ESTABLISHED(已建立的连接,也就是已经在内核里注册过的),RELATED(由已经存在的、处于已建立状态的连接生成的新连接),等等。有些匹配还处在开发阶段,或者还只是为了说明iptables的强大能力。这说明不是所有的匹配一开始就是实用的,但以后你可能会用到它。随着iptables 新版本的发布,会有一些新的匹配可用。隐含匹配和显式匹配最大的区别就是一个是跟随协议匹配自动装载的,一个是显式装载的。
5.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 5-5. 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就可以看出其工作方式了。
5.3.2. MAC match
基于包的MAC源地址匹配包。到写这篇文章时,这个match还有一点限制(就是只能匹配MAC源地址匹),但今后定会有所发展,会更有用的。
注意,这个match是由-m mac装入的,而不是一些人想当然的-m mac-source,后者只是前者的选项而已。
Table 5-6. MAC match options
Match
--mac-source
Example
iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
Explanation
基于包的MAC源地址匹配包,地址格式只能是XX:XX:XX:XX:XX:XX,当然它也可以用英文感叹号取反,如--mac- source ! 00:00:00:00:00:01,意思很简单了,就是除此之外的地址都可接受嘛。注意,因为 MAC addresses只用于Ethernet类型的网络,所以这个match只能用于Ethernet接口。而且,它还只能在PREROUTINGFORWARDINPUT链里使用。
5.3.3. Mark match
以包被设置的mark来匹配包,这个值只能由内核更改。前面曾经提到过,mark比较特殊,它不是包本身的一部分,而是在包穿越计算机的过程中由内核分配的和它相关联的一个字段。它可能被用来改变包的传输路径或过滤。时至今日,在linux里只有一种方法能设置mark,即iptablesMARK target,以前在ipchains里是FWMARK target。这就是为什么在高级路由里我们仍要参照FWMARK的原因。mark字段的值是一个无符号的整数,在32位系统上最大可以是4294967296(就是232次方),这足够用的了)
Table 5-7. Mark match options
Match
--mark
Example
iptables -t mangle -A INPUT -m mark --mark 1
Explanation
以包被设置的mark值来匹配包,这个值是是由下面将要介绍的 MARK target来设置的,它是一个无符号的整数。所有通过 Netfilter的包都会被分配一个相关联的mark field。但要注意mark值可不是在任何情况下都能使用的,它只能在分配给它值的那台机子里使用,因为它只是由内核在内存里分配的和包相关的几个字节,并不属于包本身,所以我们不能在本机之外的路由器上使用。mark的格式是--mark value[/mask],如上面的例子是没有掩码的,带掩码的例子如--mark 1/1。如果指定了掩码,就先把mark值和掩码取逻辑与,然后再和包的mark值比较。
5.3.4. Multiport match
多端口匹配扩展使我们能够在一条规则里指定不连续的多个端口,如果没有这个扩展,我们只能按端口来写规则了。其实这只是标准端口匹配的增强版罢了,使我们书写规则更方便而已。
注意:不能在一条规则里同时使用标准端口匹配和多端口匹配,如--sport 1024:63353 -m multiport --dport 21,23,80。这条规则并不能想你想象的那样工作,但也不是不能工作,iptables会使用第一个合法的条件,那么这里多端口匹配就白写了:)
Table 5-8. Multiport match options
Match
--source-port
Example
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
Explanation
源端口多端口匹配,最多可以指定15个端口,以英文逗号分隔,注意没有空格。使用时必须有-p tcp-p udp为前提条件。
Match
--destination-port
Example
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
Explanation
目的端口多端口匹配,使用方法和源端口多端口匹配一样,唯一的区别是它匹配的是目的端口。
Match
--port
Example
iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
Explanation
同端口多端口匹配,意思就是它匹配的是那种源端口和目的端口是同一个端口的包,比如:端口80到端口80的包,110110的包等。使用方法和源端口多端口匹配一样。
5.3.5. Owner match
基于包的生成者(也就是所有者,或称作拥有者,owner)的ID来匹配包,owner可以是启动进程的用户的ID,或用户所在的组的ID,或进程的ID,或会话的ID。这个扩展原本只是为了说明iptables可以做什么,现在发展到实用阶段了。但要注意,此扩展只能用在OUTPUT中,原因显而易见:我们几乎不可能得到发送端例程的ID的任何信息,或者在去往真正目的地的路上哪儿有路由。甚至在 OUTPUT链里,这也不是十分可靠,因为有些包根本没有owner,比如 ICMP responses,所以它们从不会被这个match抓到:)
Table 5-9. Owner match options
Match
--uid-owner
Example
iptables -A OUTPUT -m owner --uid-owner 500
Explanation
按生成包的用户的IDUID)来匹配外出的包。使用这个匹配可以做这样一些事,比如,阻止除root外的用户向防火墙外建立新连接,或阻止除用户http外的任何人使用HTTP端口发送数据。
Match
--gid-owner
Example
iptables -A OUTPUT -m owner --gid-owner 0
Explanation
按生成包的用户所在组的IDGID)来匹配外出的包。比如,我们可以只让属于network组的用户上Internet,而其他用户都不行;或者只允许http组的成员能从HTTP端口发送数据。
Match
--pid-owner
Example
iptables -A OUTPUT -m owner --pid-owner 78
Explanation
按生成包的进程的IDGID)来匹配外出的包。比如,我们可以只允许PID94的进程(http进程当然不能是多线程的)使用http端口。这个匹配使用起来有一点难度,因为你要知道进程的ID号。当然,你也可以写一个小小的脚本,先从ps的输出中得到PID,再添加相应的规则。
Match
--sid-owner
Example
iptables -A OUTPUT -m owner --sid-owner 100
Explanation
按生成包的会话的IDSID)来匹配外出的包。一个进程以及它的子进程或它的多个线程都有同一个SID。比如,所有的HTTPD进程的SID和它的父进程一样(最初的 HTTPD进程),即使HTTPD是多线程的(现在大部分都是,比如ApacheRoxen)也一样。
5.3.6. State match
状态匹配扩展要有内核里的连接跟踪代码的协助,因为它是从连接跟踪机制中得到包的状态的。这样我们就可以了解连接所处的状态。它几乎适用于所有的协议,包括那些无状态的协议,如ICMPUDP。针对每个连接都有
2016-04-18 22:57 举报
已邀请:
0

flyingfishzxf

赞同来自:

mark一下慢慢看

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
  • 评分区间
  • 学分
  • -30 ~ 30
可选评分理由: