关于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,那么连续两次!!的结果就是自身呀?(此问题已经由斑竹帮助解决了,仍留在这里) 2、连续两个!!求反的意思是什么,闹不明白呢?比如ipinfo->invflags & invflg的结果为0011,那么连续两次!!的结果就是自身呀?
为什么两次就是自身了,你怎么算出来的。 回复 2# Godbach
谢谢!不好意思,看昏头了,的确我搞错了哈,“!!”的结果要么是0(false),要么是非0(true),那么其他问题呢,还望斑竹解惑 其实这里有 独孤九贱的分析 好像提到这了吧 本帖最后由 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: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,然后去挑选某个规则进行检测,而是很简单地直接一一比对。 反转标记可能是 iptables 命令中 ! 的状态
假如 iptables -A FORWARD -p ! icmp -j DROP
则表示只有 ICMP 协议才能通过
那么可能就是这里这个 ! 反转标记 回复 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进行比较,是这样吗? 回复 7# platinum
非常感谢白金前辈的指教,看来我还不是很熟悉iptables的各个命令,导致对一些数据成员的不理解 一个外出的分组走那些hook点,你要首先搞清楚。