iptables入门教程配置详解--iptables规则
本章将详细地讨论如何构件你自己的iptables规则。规则就是指向标,在一条链上,对不同的连接和数据包阻塞或允许它们去向何处。插入链的每一行都是一条规则。我们也会讨论基本的matche及其用法,还有各种各样的target,以及如何建立我们自己的target(比如,一个新的子链)。
MRDoP90U(
1. 基础 WCxMm^"s
我们已经解释了什么是规则,在内核看来,规则就是决定如何处理一个包的语句。如果一个包符合所有的条件(就是符合matche语句),我们就运行target或jump指令。书写规则的语法格式是: qs@tBJ
&.V U Qg
iptables [-t table] command [match] [target/jump] DQmt<
R`u; }0
对于这个句法没什么可说的,但注意target指令必须在最后。为了易读,我们一般用这种语法。总之,你将见到的大部分规则都是按这种语法写的。因此,如果你看到别人写的规则,你很可能会发现用的也是这种语法,当然就很容易理解那些规则了。 Sw =8@Bt5
如果你不想用标准的表,就要在
上面介绍了三个不同的表的最基本的内容。你应该知道它们的使用目的完全不同,还要清楚每一条链的使用。如果你不了解,就可能会在防火墙上留下漏洞,给人以可乘之机。在章节
表和链 中,我们已详细地讨论了这些必备的的表和链。如果你没有完全理解包是怎样通过这些表、链的话,我建议你回过头去再仔细看看。
6 qin/,
3. Commands ?G ~PDuhR
在这一节里,我们将要介绍所有的command以及它们的用途。command指定iptables 对我们提交的规则要做什么样的操作。这些操作可能是在某个表里增加或删除一些东西,或做点儿其他什么。以下是iptables可用的command(要注意,如不做说明,默认表的是 filter表。): J>@?+4]P
Table 6-2. Commands J o;nqz
在使用iptables时,如果必须的参数没有输入就按了回车,那么它就会给出一些提示信息:告诉你需要哪些参数等等。iptables的选项-v用来显示iptables的版本,-h给出语法的简短说明。。下面将要介绍的就是部分选项,还有它们的作用。
y+< H"2
Table 6-3. Options w %HhS:
6.4. Matches ]Q*o7"q&r
这一节,我们会详细讨论一些matche,我把它们归为五类。第一类是generic matches(通用的匹配),适用于所有的规则;第二类是TCP matches,顾名思义,这只能用于 TCP包;第三类是UDP matches,当然它只能用在 UDP包上了;第四类是ICMP matches ,针对 ICMP包的;第五类比较特殊,针对的是状态(state),所有者(owner)和访问的频率限制(limit)等,它们已经被分到更多的小类当中,尽管它们并不是完全不同的。我希望这是一种大家都容易理解的分类。 Pc 359 <
6.4.1. 通用匹配 L2Hpk] vm
无论我们使用的是何种协议,也不管我们又装入了匹配的何种扩展,通用匹配都使可用的。也就是说,它们可以直接使用,而不需要什么前提条件,在后面你会看到,有很多匹配操作是需要其他的匹配作为前提的。 ));<faT,
Table 6-4. Generic matches !%&wc .
1. 基础 WCxMm^"s
我们已经解释了什么是规则,在内核看来,规则就是决定如何处理一个包的语句。如果一个包符合所有的条件(就是符合matche语句),我们就运行target或jump指令。书写规则的语法格式是: qs@tBJ
&.V U Qg
iptables [-t table] command [match] [target/jump] DQmt<
R`u; }0
对于这个句法没什么可说的,但注意target指令必须在最后。为了易读,我们一般用这种语法。总之,你将见到的大部分规则都是按这种语法写的。因此,如果你看到别人写的规则,你很可能会发现用的也是这种语法,当然就很容易理解那些规则了。 Sw =8@Bt5
如果你不想用标准的表,就要在
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 是用来过滤所有本地生成的包的。 |
3. Commands ?G ~PDuhR
在这一节里,我们将要介绍所有的command以及它们的用途。command指定iptables 对我们提交的规则要做什么样的操作。这些操作可能是在某个表里增加或删除一些东西,或做点儿其他什么。以下是iptables可用的command(要注意,如不做说明,默认表的是 filter表。): J>@?+4]P
Table 6-2. Commands J o;nqz
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被编号)。 |
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(可用的是DROP 和ACCEPT,如果还有其它的可用,请告诉我),这个target称作策略。所有不符合规则的包都被强制使用这个策略。只有内建的链才可以使用规则。但内建的链和用户自定义链都不能被作为策略使用,也就是说不能象这样使用:iptables -P INPUT allowed(或者是内建的链)。 |
Command | -E, --rename-chain |
Example | iptables -E allowed disallowed |
Explanation | 对自定义的链进行重命名,原来的名字在前,新名字在后。如上,就是把allowed改为disallowed。这仅仅是改变链的名字,对整个表的结构、工作没有任何影响。 |
Table 6-3. Options w %HhS:
Option(选项) | -v, --verbose(详细的) |
可用此选项的命令 | --list, --append, --insert, --delete, --replace |
Explanation(说明) | 这个选项使输出详细化,常与--list 连用。与--list连用时,输出中包括网络接口的地址、规则的选项、TOS掩码、字节和包计数器,其中计数器是以K、M、G(这里用的是10的幂而不是2的幂哦)为单位的。如果想知道到底有多少个包、多少字节,还要用到选项-x,下面会介绍。如果-v 和--append、--insert、--delete 或--replace连用,iptables会输出详细的信息告诉你规则是如何被解释的、是否正确地插入等等。 |
Option | -x, --exact(精确的) |
Commands used with | --list |
Explanation | 使--list输出中的计数器显示准确的数值,而不用K、M、G等估值。注意此选项只能和--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也知道要去搜索。 |
6.4. Matches ]Q*o7"q&r
这一节,我们会详细讨论一些matche,我把它们归为五类。第一类是generic matches(通用的匹配),适用于所有的规则;第二类是TCP matches,顾名思义,这只能用于 TCP包;第三类是UDP matches,当然它只能用在 UDP包上了;第四类是ICMP matches ,针对 ICMP包的;第五类比较特殊,针对的是状态(state),所有者(owner)和访问的频率限制(limit)等,它们已经被分到更多的小类当中,尽管它们并不是完全不同的。我希望这是一种大家都容易理解的分类。 Pc 359 <
6.4.1. 通用匹配 L2Hpk] vm
无论我们使用的是何种协议,也不管我们又装入了匹配的何种扩展,通用匹配都使可用的。也就是说,它们可以直接使用,而不需要什么前提条件,在后面你会看到,有很多匹配操作是需要其他的匹配作为前提的。 ));<faT,
Table 6-4. Generic matches !%&wc .
Match | -p, --protocol |
Example | iptables -A INPUT -p tcp |
Explanation | 匹配指定的协议。指定协议的形式有以下几种: 1、名字,不分大小写,但必须是在/etc/protocols中定义的。 /x:e87A1+M 2、可以使用它们相应的整数值。例如,ICMP的值是1,TCP是6,UDP是17。 xh/nev 3、缺省设置,ALL,相应数值是0,但要注意这只代表匹配TCP、UDP、ICMP,而不是/etc/protocols中定义的所有协议。 ]-/~3Qqov 4、可以是协议列表,以英文逗号为分隔符,如:udp,tcp fFGY2A 5、可以在协议前加英文的感叹号表示取反,注意有空格,如: --protocol ! tcp 表示非tcp协议,也就是UDP和ICMP。可以看出这个取反的范围只是TCP、UDP和ICMP。 *j2g9U* |
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.255或192.168.1.1/32 d7i+d&v^ 2、网络,如192.168.0.0/24,或 192.168.0.0/255.255.255.0 G+!(E!zVF 3、在地址前加英文感叹号表示取反,注意空格,如--source ! 192.168.0.0/24 表示除此地址外的所有地址 $#!X 4、缺省是所有地址 N<`"( Z |
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 | 以包进入本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于INPUT,FORWARD和 PREROUTING这三个链,用在其他任何地方都会提示错误信息。指定接口有一下方法: 1、指定接口名称,如:eth0、ppp0等 7XiE9# 2、使用通配符,即英文加号,它代表字符数字串。若直接用一个加号,即iptables -A INPUT -i +表示匹配所有的包,而不考虑使用哪个接口。这也是不指定接口的默认行为。通配符还可以放在某一类接口的后面,如:eth+表示所有Ethernet接口,也就是说,匹配所有从Ethernet接口进入的包。 . `~(- l 3、在接口前加英文感叹号表示取反,注意空格,如:-i ! eth0意思是匹配来自除eth0外的所有包。 `}s JF_b |
Match | -o, --out-interface |
Example | iptables -A FORWARD -o eth0 |
Explanation | 以包离开本地所使用的网络接口来匹配包。使用的范围和指定接口的方法与--in-interface完全一样。 |
Match | -f, --fragment |
Example | iptables -A INPUT -f |
Explanation | 用来匹配一个被分片的包的第二片或及以后的部分。因为它们不包含源或目的地址,或ICMP类型等信息,其他规则无法匹配到它,所以才有这个匹配操作。要注意碎片攻击哦。这个操作也可以加英文感叹号表示取反,但要注意位置,如:! -f 。取反时,表示只能匹配到没有分片的包或者是被分片的包的第一个碎片,其后的片都不行。现在内核有完善的碎片重组功能,可以防止碎片攻击,所以不必使用取反的功能来防止碎片通过。如果你使用连接跟踪,是不会看到任何碎片的,因为在它们到达任何链之前就被处理过了。 |