Netfilter 是如何工做的(四):动做(target)

每一条 iptables配置的规则( rule)都包含了匹配条件( match)部分和动做( target)。当报文途径 HOOK点时, Netfilter会逐个遍历挂在该钩子点上的表的 rule,若报文知足 rule的匹配条件,内核就会执行动做( target)。

one-rule

上面是一条普通iptables规则,若是报文匹配前面的条件,就会执行最后的-j DROP,它就是这条规则的动做(target)html

普通动做 & 扩展动做

动做又可分为普通target扩展target两类,其中普通动做是指ACCEPT(容许报文经过)、DROP(拒绝报文经过)这类简单明了的行为,而扩展target是指包含了其余操做的动做,好比REJECT动做会产生ICMP差错信息、LOG动做记录日志、SNATDNAT用于进行地址转换。segmentfault

本文不涉及 How to 配置这些动做的规则,也不涉及这些动做各自的做用是什么,对此有兴趣的读者能够参考 连接

表示 target

Netfilter使用xt_standard_target表示一个动做:数组

pic

该结构由两部分组成,其中verdict是动做的编码, 取值有NF_DROPNF_ACCEPTNF_QUEUE等等。对于普通动做来讲,有verdict就够了,但对于扩展动做来讲,还须要有地方存储额外的信息(eg. 如何进行NAT),这里的target就是存储这些额外信息的地方。与本系列上一篇中说的xt_entry_match同样,xt_entry_target结构一样是一个union。它们的设计思路是同样的:内核代码和iptables用户态代码定义这样一个一样的数据类型,用户态使用的是user部分,设置要使用的扩展动做的name(普通动做的name为""),内核收到该结构后,根据name查询到注册过的动做,将该信息挂到xt_entry_targettarget指针上。而data字段表示的柔性数组区域就是各类扩展模块各显神通的地方了,对NAT来讲,这里存储转换后的地址。框架

注册 target

咱们须要将target预先注册到Netfilter框架中,才能在以后的配置中使用这个target。就拿本文最初的那条规则来讲,须要一个隐含的前提就是SNAT这个xt_target事先被注册到Netfilter框架了。这部分工做在xt_nat.c定义的内核模块中完成:函数

pic

除了SNAT, 经过xt_register_target接口,其余各个模块均可以注册本身的动做。根据名字进行区分,全部的target会挂到xf链表上。编码

pic

每一个target上有三个函数指针,其中spa

  • target:这个函数将决定skb的后续处理结果,若是为NULL,那么这条规则的动做就是普通target,处理结果从外面的verdict就能够得出。若是不为NULL,那么就执行这个函数,这个函数返回NF_DROP, NF_ACCEPT, NF_STOLEN这类动做
  • checkentry:这个函数在用户配置规则时被调用,若是返回0,表示配置失败。
  • destroy:这个函数再使用该target的规则被删除时调用。

查找 target

当用户经过iptables下发一条规则时,Netfilter会从xf链表上查找是否已有这样的target
pic.net

执行 target

当数据包通过HOOK点,若是某条rule的匹配条件与报文一致,就会执行该rule包含的动做。设计

pic

REF

netfilter-hacking-HOWTO3d

相关文章
相关标签/搜索