先将iptables命令会用到的组成部分根据man手册先写置前面,便于后续说明。
iptables [-t table] {-A|-C|-D} chain rule-specification
rule-specification = [matches...] [target]
match = -m matchname [per-natch-options]
target = -j targetname [per-target-options]
iptables可以理解为上层应用,通过下发相应的规则给内核,由底层去实现生效。
-t 参数用于指定所要操作的表。内核默认维护三张表:filter过滤表、nat地址转换表、mangle数据包修改表
本文只讲述数据包的过滤,因此只使用filter过滤表。该表是默认使用的表,固可以不显示使用-t参数
filter过滤表包含三个内建链表:INPUT(送往该设备的数据包)、FORWARD(不是送往该设备的数据包,待转)、OUTPUT(设备数据包发送出去)。也就是命令中chain所要指定的链表。
对这三个表的理解,可通过如下图所示:
每个链表由一条条的规则组成(即命令中的组成部分 rule-specification)
对于一个链表可以添加规则、删除规则、检测是否存在该条规则等操作,相应的命令选项如下:
-A, --append chain rule-specification 在指定链表chain末尾添加规则rule-specification
(--append 可以代替 -A 选项使用)
-C, --check chain rule-specification 检测是否存在该规则
-D, --delete chain rule-specification 删除指定规则
-D, --delete chain rulenum 删除指定规则序号对应的那条规则
上面的rulenum 可通过 --line-numbers 附加选项显示,每个链表的第一条规则对应序号1
-I, --insert chain [rulenum] rule-specification 向指定链表的对应规则序号前面插入规则,默认是序号1
-R, --replace chain rulenum rule-specification 替换规则
-L, --list [chain] 显示所有的规则,一般紧跟使用-n选项,避免转换成主机名形式,默认显示所有链表
([] 中括号表示该参数是可选的)
-S, --list-rules [chain] 显示所有的规则
-F, --flush [chain] 默认删除所有链表里的规则
-Z, --zero [chain, [rulenum]] 清空包和字节的个数 (可能理解有误)
-N, --new-chain chain 建立新的用户自定义链表
-X, --delete-chain [chain] 删除用户自定义的链表,且必须是空的,无规则的
-P, --policy chain target 指定该链表的默认操作
-E, --rename-chain old-chain new-chain 重命名用户自定义的链表名称
通用匹配
[!] -p, --protocol protocol 指定协议,如tcp、udp等,或对应的数字,可查看/etc/protocols。 数字0和‘all’表示所有的协议。可选参数 ! 表示取反的意思
[!] -s, --source address[/mask][,...] 指定源地址,可以是主机名也可以是IP形式的地址,主机名会先dns解析得到相应的IP地址再添加到过滤表当中
[!] -d, --destionation address[/mask][,...]
-j, --jump target 指定要进行的处理动作
-g, --goto chain
[!] -i, --in-interface name 对于链表INPUT、FORWARD、PREROUTING的数据指定接口名
[!] -o, --out-interface name
显示匹配
通过-m选项指定所要加载的匹配模块名称,后面再跟相应的选项即可。
如过滤mac地址操作,指定模块mac,选项如下:
[!] --mac-source address
匹配的源MAC地址,格式必须是XX:XX:XX:XX:XX:XX,只能用于过滤进入的数据
例子:过滤从XX:XX:XX:XX:XX:XX发过来的数据包
iptables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX
最后说下基本的
目标部分,通过参数-j指定
ACCEPT
:允许
DROP
:丢弃
源码下载地址:www.netfilter.org