Netfilter CONNMARK用法及分析(二)-- 内核代码分析

2020-05-25 00:00:00 规则 代码 模块 数据包 标记

本文着重分析内核中CONNMARK的实现,同时还包括MARK的match和target模块的实现。因为CONNMARK模块通常是和MARK模块搭配使用的。

1. CONNMARK及相关模块的选项
这里先列出CONNMARK、MARK和mark模块的iptables命令行的选项,随后我们再逐一分析各个模块的内核实现。iptables版本为v1.3.5。

(1)CONNMARK target的选项
选项 功能
--set-mark value[/mask] 给链接跟踪记录打标记。
--save-mark [--mask mask] 将数据包上的标记值记录到链接跟踪记录上。
--restore-mark [--mask mask] 重新设置数据包的nfmark值。

(2)MARK target 的选项
选项 功能
--set-mark value 设置数据包的nfmark值。
--and-mark value 数据包的nfmark值和value进行按位与运算。
--or-mark value 数据包的nfmark值和value进行按或与运算。

(3)MARK match的选项
选项 功能
[!] --mark value[/mask] 数据包的nfmark值与value进行匹配,其中mask的值为可选的。

其中CONNMARK和MARK match中都有mask选项,这个主要用来指定给出value值中哪几位是需要设置的。通常,如果我们不指定mask的话,其值会被默认初始为0xFFFFFFFFUL。

2. MARK target的内核实现
我这里分析的内核源码版本是2.6.18,该模块的代码见文件xt_MARK.c,其核心的target实现代码如下:

  1. 41 static unsigned int
  2. 42 target_v1(struct sk_buff **pskb,
  3. 43       const struct net_device *in,
  4. 44       const struct net_device *out,
  5. 45       unsigned int hooknum,
  6. 46       const struct xt_target *target,
  7. 47       const void *targinfo,
  8. 48       void *userinfo)
  9. 49 {
  10. 50     const struct xt_mark_target_info_v1 *markinfo = targinfo;
  11. 51     int mark = 0;
  12. 52 
  13. 53     switch (markinfo->mode) {
  14. 54     case XT_MARK_SET:
  15. 55         mark = markinfo->mark;
  16. 56         break;
  17. 57 
  18. 58     case XT_MARK_AND:
  19. 59         mark = (*pskb)->nfmark & markinfo->mark;
  20. 60         break;
  21. 61 
  22. 62     case XT_MARK_OR:
  23. 63         mark = (*pskb)->nfmark | markinfo->mark;
  24. 64         break;
  25. 65     }
  26. 66          /*将用户设置的mark值赋给数据包的nfmark*/
  27. 67     if((*pskb)->nfmark != mark)
  28. 68         (*pskb)->nfmark = mark;
  29. 69 
  30. 70     return XT_CONTINUE;

相关文章