函数名:ipt_do_table
作用:执行一个iptables表中的规则链,决定一个网络数据包的处理方式。
参数:
- struct sk_buff *skb:要处理的网络数据包。
- const struct nf_hook_state *state:网络钩子的状态,包含了网络数据包的一些信息,如输入输出设备、协议等。
- struct xt_table *table:iptables表的指针。
返回值:处理方式,可以是NF_ACCEPT、NF_DROP、XT_CONTINUE等。
实现细节:
- 初始化变量
初始化变量包括:
- 将verdict(处理方式)初始化为NF_DROP。
- 获取当前网络数据包的输入输出设备名称,如果没有则使用nulldevname。
- 初始化acpar结构体,其中包含了网络数据包的一些信息和状态信息。
- 读取iptables表的私有数据private(具体内容随内核版本而异)。
- 寻找匹配的规则
从iptables规则链中依次遍历每个规则,并进行匹配判断。具体步骤包括:
- 判断当前规则是否匹配该网络数据包,如果不匹配则跳过该规则。
- 依次调用规则中的所有匹配模块(match),如果某个匹配模块不匹配该网络数据包,则跳过该规则。
- 统计该规则被匹配到的次数。
- 如果规则中的目标(target)是标准的目标(standard target),则根据目标的处理方式进行相应的处理。
- 处理非标准目标
如果规则中的目标不是标准的目标,则需要根据目标的类型调用相应的目标处理函数。在该函数中可能会修改网络数据包的内容,然后根据返回值决定下一步的处理方式。
- 检查是否强制丢弃
如果处理过程中出现了错误或者某些情况需要强制丢弃该网络数据包,则将verdict设置为NF_DROP,并返回。如果没有出现错误,则返回处理方式。