规则可以这么描述,它能够指导防火墙何时阻塞或者允许链上的连接或者报文通行。你所书写的每一行就被认为是一个规则,我们将会讨论基本的matches/target以及如何使用他们,另外我们如何构建自定义的链。
iptables命令格式如下,假如所有的判定条件或者matches被匹配上,那么我们执行target或者jump指令
iptables [-t table] command [match] [target/jump]
具体表示如下
SYNOPSIS iptables [-t table] {-A|-C|-D} chain rule-specification ip6tables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options]
表(Tables)
-t选项指明你准备操作哪个表,默认情况下,filter表会被使用。
Table |
Explanation |
raw |
Raw表和它的链都在netfilter的模块之前,他主要就是用来完成NOTRACK功能,如果我们想使用这个功能,需要2.6以及之后的内核。Raw表里面有PREROUTING和OUTPUT两条链,在这两条链上他们早于netfilter处理报文。PREROUTING用于到本机的所有报文,而OUTPUT链用于本机发送的所有报文。 |
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明确的就是用来完成报文过滤的,和操作其他表一样,我们在filter里面可以丢弃/记录/接受/拒绝报文。FORWARD链主要用来处理非本机报文,INPUT链处理所有目的地址为本机的报文,而OUTPUT则处理所有本机发送的报文。 |
nat |
nat表的主要用处是网络地址转换,即Network Address |
命令(Commands)
本节我们会覆盖所有不同的命令(Commands)以及用他们能够做什么。命令(Commands)告诉Iptables要对我们的规则做什么,通常情况下,我们也许是增加或则删除一些信息,下列命令(Commands)我们可以使用。
Commands
Command |
-A, –append |
Example |
iptables -A INPUT |
Explanation |
这个命令在链尾追加一条规则,换句话讲这条规则会被放置在规则集的尾部,也就是最后才被检查,除非你后来又追加了另一条规则。 |
Command |
-D, –delete |
Example |
iptables -D INPUT |
Explanation |
这条命令删除链里面的一条规则,我们有两种方式输出一条规则,第一是输入一条完整的规则,另外就是通过序号删除。假如你用第一种方法删除,那么你输入的规则必须和你想删除的规则完全一致。如果你想用第二种方法来删除规则,你必须制定删除的序号,链的序号从顶部开始从1编号。 |
Command |
-R, –replace |
Example |
iptables -R INPUT 1 |
Explanation |
这条命令替换指定位置的旧规则,它和delete工作方式一样的,但是不同在于它不完全删除这条规则,而是替换上一条新的规则。这个主要用于你做一些测试,实际工作中很少使用。 |
Command |
-I, –insert |
Example |
iptables -I INPUT 1 |
Explanation |
在链里面插入一条规则,这条规则会在我们指定的地方插入。换句话讲,上面的这条命令会把这条规则插入到第一个位置,所有它就是第一条规则。 |
Command |
-L, –list |
Example |
iptables -L INPUT |
Explanation |
这条命令列出指定链的所有规则,在上面的例子里面,我们会列出INPUT链里面的所有规则。如果你不指定链名称,那么就列出这张表里面所有的链上规则,上面没有指定表名称,默认就是filter表,如果想查看特定表用-t参数。他的输出还受到其他参数的影响,例如-n和-v。 |
Command |
-F, –flush |
Example |
iptables -F INPUT |
Explanation |
这个命令清除链上的所有规则,它等同于逐条删除所有规则,只是它更快。没有指定参数的话,他会把指定表上面所有链的规则删除干净。 |
Command |
-Z, –zero |
Example |
iptables -Z INPUT |
Explanation |
这个命令告诉应用程序情况链上的所有计数器值,没有指定链就是所有链。假如你用-v参数加上-L查看,你就会在开头看到统计值。清空这个计数你可以用-Z参数。-Z参数的使用和-L一个样,除了-Z没有输出。当然-L和-Z可以合用,这样首先列出规则,但是报文的计数都被清空。 |
Command |
-N, –new-chain |
Example |
iptables -N allowed |
Explanation |
这个命令让我们在指定的表上面创建一条新的用户自定义链,在上面的例子里面,我们创建了一条叫做allowed的用户自定义链。请注意,名字不能和系统内建的重合。 |
Command |
-X, –delete-chain |
Example |
iptables -X allowed |
Explanation |
这条命令会从表上删除指定的链,要想删除这个链,这儿必须没有任何规则关联到这个链。换句话讲,你要删除或者替换所有相关的规则,然后才能删除这条链。另外这个命令只能删除用户自定义链,而且没有指定链名称的时候,会尝试把指定表中所有的用户自定义链删除。 |
Command |
-P, –policy |
Example |
iptables -P INPUT |
Explanation |
为链设置默认的target(可用的是DROP 和ACCEPT),这个target称作策略。所有不符合规则的包都被强制使用这个策略。只有内建的链才可以使用规则。但内建的链和用户自定义链都不能被作为策略使用,也就是说不能象这样使用:iptables -P INPUT allowed(或者是内建的链)。 |
Command |
-E, –rename-chain |
Example |
iptables -E allowed |
Explanation |
这条命令会把这个链的第一个名字改成第二个,例如上面,我们会把allowed改成disallowed。注意我们所修改的仅仅是名称罢了,所有的规则都不会有任何变化。 |
Options
Option |
-v, –verbose |
Commands used with |
–list, –append, |
Explanation |
这个选项主要和—list一起使用。假如两个一起用的话,输出信息就包含接口地址/规则选项以及TOS的标记。 –list命令还会列出字节和报文统计。其中计数器是以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 |
–line-number命令和—list一起合用,他们用来控制输出数字。用了这个选项后,每一条规则都带有序号,这样我们就很方便的知道每条规则的位置。这条命令只能和—list合用。 |
Option |
-c, –set-counters |
Commands used with |
–insert, |
Explanation |
这个选项可以让我们在创建或者修改规则的时候,设置字节或者报文的计数值。语法大致是这个样子的,–set-counters 20 4000,这个命令设置报文计数值为20而字节计数值为4000. |
Option |
–modprobe |
Commands used with |
All |
Explanation |
此选项告诉iptables探测并装载要使用的模块。这是非常有用的一个选项,万一modprobe命令不在搜索路径中,就要用到 |