每一条iptables
配置的规则(rule
)都包含了匹配条件(match
)部分和动做(target
)。当报文途径HOOK
点时,Netfilter
会逐个遍历挂在该钩子点上的表的rule
,若报文知足rule
的匹配条件,内核就会执行动做(target
)。
上面是一条普通iptables
规则,若是报文匹配前面的条件,就会执行最后的-j DROP
,它就是这条规则的动做(target
)html
动做又可分为普通target和扩展target两类,其中普通动做是指ACCEPT
(容许报文经过)、DROP
(拒绝报文经过)这类简单明了的行为,而扩展target
是指包含了其余操做的动做,好比REJECT
动做会产生ICMP
差错信息、LOG
动做记录日志、SNAT
和DNAT
用于进行地址转换。segmentfault
本文不涉及
How to
配置这些动做的规则,也不涉及这些动做各自的做用是什么,对此有兴趣的读者能够参考
连接
Netfilter
使用xt_standard_target
表示一个动做:数组
该结构由两部分组成,其中verdict
是动做的编码, 取值有NF_DROP
、NF_ACCEPT
、NF_QUEUE
等等。对于普通动做来讲,有verdict
就够了,但对于扩展动做来讲,还须要有地方存储额外的信息(eg. 如何进行NAT
),这里的target
就是存储这些额外信息的地方。与本系列上一篇中说的xt_entry_match
同样,xt_entry_target
结构一样是一个union
。它们的设计思路是同样的:内核代码和iptables
用户态代码定义这样一个一样的数据类型,用户态使用的是user
部分,设置要使用的扩展动做的name
(普通动做的name
为""),内核收到该结构后,根据name
查询到注册过的动做,将该信息挂到xt_entry_target
的target
指针上。而data
字段表示的柔性数组区域就是各类扩展模块各显神通的地方了,对NAT
来讲,这里存储转换后的地址。框架
咱们须要将target
预先注册到Netfilter
框架中,才能在以后的配置中使用这个target
。就拿本文最初的那条规则来讲,须要一个隐含的前提就是SNAT
这个xt_target
事先被注册到Netfilter
框架了。这部分工做在xt_nat.c
定义的内核模块中完成:函数
除了SNAT
, 经过xt_register_target
接口,其余各个模块均可以注册本身的动做。根据名字进行区分,全部的target
会挂到xf
链表上。编码
每一个target
上有三个函数指针,其中spa
target
:这个函数将决定skb
的后续处理结果,若是为NULL
,那么这条规则的动做就是普通target
,处理结果从外面的verdict
就能够得出。若是不为NULL
,那么就执行这个函数,这个函数返回NF_DROP
, NF_ACCEPT
, NF_STOLEN
这类动做checkentry
:这个函数在用户配置规则时被调用,若是返回0,表示配置失败。destroy
:这个函数再使用该target
的规则被删除时调用。当用户经过iptables
下发一条规则时,Netfilter
会从xf
链表上查找是否已有这样的target
.net
当数据包通过HOOK
点,若是某条rule
的匹配条件与报文一致,就会执行该rule
包含的动做。设计