iptables命令行中的很多符号都有两种形式:短格式 (单个字母,前面还有一个连字符)和长格式(一个单词,前面有两个连字符)。为了简洁起见,大多数脚本使用短格式,而使用长格式的命令行显得有些笨重。下面两条iptables命令行是一样的效果:
$ sudo iptables --append FORWARD --in-interface eth1 --out-interface eth0 --jump ACCEPT
$ sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
表:指定命令所操作的表的名称:Filter,NAT还是Mangle。可以在任何iptables命令中指定表名。如果不指定表名,那么该命令操作的就是Filter表。用-t tablename或--table tablename来指定表。
命令:用来说明命令行剩余部分的作用,比如添加或删除规则,显示规则或添加规则链。这个示例中的命令(-A和--append)将命令行指定的规则添加到指定的表和规则链中。
规则链:指定规则所属的规则链或命令操作的规则链的名称。规则链有INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING,或者由用户定义的规则链。在指定规则链时,直接将规则链的名字放进命令行,不需要在前面放置任何连字符。本节开头的示例操作的是FORWARD规则链。
匹配条件:有两种匹配条件,分组匹配条件(匹配网络分组)和规则匹配条件(匹配已有规则)。
分组匹配:分组匹配条件用来识别网络分组,并实现规则,对匹配条件的分组采取相应的行动。
条件/规则定义:分组匹配条件和动作的组合被称为规则定义。规则定义构成了分组过滤的基础。本节开头的第一个示例使用的规则匹配条件是 --in-interface eth1 --out-interface eth0。第二个示例使用的是同一个条件,但用的是短格式:-i eth1 -o eth0。这两条规则都用来转发设备eth1上接收到的分组,并将其通过设备eth0发送到网络 。
规则匹配条件:规则匹配条件识别已有的规则。iptables命令能够修改,删除或将一条新规则放置到与规则匹配条件指定的规则相邻的地方。有两种方法可以指定某条已有规则:可以使用与曾经用来建立规则相同的规则定义,也可以使用规则的序号。规则编号从1开始,它表示的是规则链中的第一条规则,可在iptables -L(或者 --line-numbers)的结果中显示。下面的第一条命令将本节开头所列的规则删除。第二条命令将INPUT规则链中编号为3的规则替换成另一条规则,将所有来自IP地址192.168.0.10分组拒绝。
$ sudo iptables --delete FORWARD -i eth1 -o eth0 -j ACCEPT
$ sudo iptables -R INPUT 3 --source 192.168.0.10 --jump REJECT
跳转或目标用来指定内核对分组(它们匹配规则的所有匹配条件)所采取的动作。指定跳转或目标的方式为 -j target或者--jump target。本节开头的示例使用命令--jump ACCEPT和-j ACCEPT,来指定目标ACCEPT。
跳转:跳转将控制转移到同一个表中的不同规则链。下面的命令将一条规则添加(--append)到INPUT链,将使用TCP协议(--protocal tcp)的分组传递给用户定义链tcp_rules(--jump tcp_rules):
$ sudo iptables --append INPUT --protocal tcp --jump tcprules
当分组经过tcp_rules链的处理之后(假设还没有被丢弃或拒绝),它将从刚跳转的那条规则之后的规则继续经过INPUT链处理。
目标:目标指定内核对分组所采取的动作,最简单的动作是ACCEPT,DROP和REJECT,下面的命令向FORWARD链中添加一条规则,将来自FTP端口的分组拒绝,如例:
$ sudo iptables --append FORWARD --sport ftp --jump REJECT