jiufei19 发表于 2010-06-20 20:38

关于netfilter中ip_packet_match函数的问题【已解决】

本帖最后由 jiufei19 于 2010-06-22 22:41 编辑

我在继续阅读netfilter的源码时,发现对ip_packet_match这个验证匹配规则的函数中的如下宏无法理解,望大家解惑!

#define FWINV(bool,invflg) ((bool) ^ !!(ipinfo->invflags & invflg))

我的疑问是如下:
1、那个invflag(ipinfo->invflags)到底是什么意思?反转标记是对什么的反转,怎样反转?具体到下面这个使用该宏的例子:

FWINV((ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr, IPT_INV_SRCIP)

a、ip->saddr & ipinfo->smsk.s_addr,这个按位与的结果是什么意思? ipinfo->smsk.s_addr是规则中所存放的源掩码,那么2者与的意思是得到该分组源ip所在的网络号吗(在规则的源掩码条件下)?

b、ipinfo->src.s_addr表示规则中设置的源地址

c、比较a和b的值相等或不相等分别是啥子意思?

d、c中的"!="逻辑结果再和IPT_INV_SRCIP(0x08)按宏FWINV进行运算含义是什么呢?彻底晕了!


2、连续两个!!求反的意思是什么,闹不明白呢?比如ipinfo->invflags & invflg的结果为0011,那么连续两次!!的结果就是自身呀?(此问题已经由斑竹帮助解决了,仍留在这里)

Godbach 发表于 2010-06-20 21:12

2、连续两个!!求反的意思是什么,闹不明白呢?比如ipinfo->invflags & invflg的结果为0011,那么连续两次!!的结果就是自身呀?
为什么两次就是自身了,你怎么算出来的。

jiufei19 发表于 2010-06-20 21:20

回复 2# Godbach


    谢谢!不好意思,看昏头了,的确我搞错了哈,“!!”的结果要么是0(false),要么是非0(true),那么其他问题呢,还望斑竹解惑

snriyt 发表于 2010-06-21 01:37

其实这里有 独孤九贱的分析 好像提到这了吧

jiufei19 发表于 2010-06-21 09:27

本帖最后由 jiufei19 于 2010-06-21 09:52 编辑

回复 4# snriyt


    感谢指导,的确我在论坛上搜了九贱的一篇文章:http://linux.chinaunix.net/bbs/viewthread.php?tid=670248&extra=&page=2,其中描述了这个处理,但是可能我理解力稍差些,还是没有能理解九剑前辈的说明,因此希望大家能解惑!

PS:下面是几个相关问题

1、struct ipt_ip是标准规则的定义:

struct ipt_ip {
   39   /* Source and destination IP addr */
   40   struct in_addr src, dst;
   41   /* Mask for src and dest IP addr */
   42   struct in_addr smsk, dmsk;
   43   char iniface, outiface;
   44   unsigned char iniface_mask, outiface_mask;
   45
   46   /* Protocol, 0 = ANY */
   47   u_int16_t proto;
   48
   49   /* Flags word */
   50   u_int8_t flags;
   51   /* Inverse flags */
   52   u_int8_t invflags;
   53 };

我现在正在看packet_filter表,根据netfilter的定义,packet_filter表在LOCAL_IN,LOCAL_OUT,FORWARD这3个hook点处被执行,那么这个ipt_ip中的所谓源ip,目的ip(以及所谓的源、目的掩码)到底是指什么?例如如果目前正在处理一个LOCAL_IN的分组,那么源ip是收到分组的源ip地址,但是如果是正在处理一个LOCAL_OUT分组,那么源ip是指本地发出分组的源ip了

2、ipt_ip中的flags和invflags是什么意思?

jiufei19 发表于 2010-06-21 15:17

本帖最后由 jiufei19 于 2010-06-21 15:19 编辑

回复 5# jiufei19


    自己又仔细思考了下关于源和目的ip的含义,发现自己原来可能理解错误了,下面我把重新思考的结果贴出来,望大家指正:

1、因为每一个ipt_entry都有一个ipt_ip,也就是说每个rule其实都有一个对应的ipt_ip,所以ipt_ip中的源ip和目的ip的概念就很清楚了,就是设置过滤规则时指定的源和目的
2、至于一个正在被检测的分组是一个out分组还是一个in分组或者一个forward分组,其实无所谓,反正这个分组携带有源ip和目的ip,于是netfilter就将此分组的源ip和目的ip去和规则中的源ip和目的ip进行匹配,如果不匹配就继续下一个规则继续检测。换句话讲,netfilter本身并不会根据到底一个分组是in还是out,然后去挑选某个规则进行检测,而是很简单地直接一一比对。

platinum 发表于 2010-06-21 15:39

反转标记可能是 iptables 命令中 ! 的状态
假如 iptables -A FORWARD -p ! icmp -j DROP
则表示只有 ICMP 协议才能通过
那么可能就是这里这个 ! 反转标记

jiufei19 发表于 2010-06-21 15:56

回复 6# jiufei19


    为了更清楚地描述我的问题,我现在给出一个场景,望大家指正:

1、因为hook总是在某个特定的点(chain)设置的,因此假定是在INPUT链上设置了一个规则1,其中指定了src_ip和dest_ip,那么这个src_ip和dest_ip就被记入到对应此规则的ipt_entry的ipt_ip结构体中。

2、同理,我们也在对应的OUTPUT链上设置一个规则2,其中也指定对应的src_ip和dest_ip。那么这个src_ip和dest_ip就被记入到对应此规则的ipt_entry的ipt_ip结构体中

3、现在我们有了上述2条规则,规则1和规则2

3、当有一个外出分组发出时,则netfilter统一将上述两条规则一一和此外出分组进行比对,而不是仅和规则2进行比较,是这样吗?

jiufei19 发表于 2010-06-21 15:57

回复 7# platinum


    非常感谢白金前辈的指教,看来我还不是很熟悉iptables的各个命令,导致对一些数据成员的不理解

Godbach 发表于 2010-06-21 15:57

一个外出的分组走那些hook点,你要首先搞清楚。
页: [1] 2 3
查看完整版本: 关于netfilter中ip_packet_match函数的问题【已解决】