iptables的mark和connmark的最大值?

zhoutao0712
iptables的mark和connmark的最大值?

如题,我发现,iptables的mark是有最大值限制的,这个值是0xFF,
也就是255,说明mark是一个2位的16进制数。

但是,当mark超过255的时候,mark会发生“回饶”的现象。

比如--set-mark 510 等价于--set-mark 254
--set-mark 256  等价于 --set-mark 1

但connmark是否也有类似限制呢还未实验。

注:我是在BCM芯片的DD-WRT路由器上做流量控制发现这个问题的。iptables版本是1.3.8

platinum
在 struct sk_buff 中定义的 mark 如下
[code]
        __u32                   mark;
[/code]
在 struct nf_conn 中定义的 connmark 如下
[code]
#if defined(CONFIG_NF_CONNTRACK_MARK)
        u_int32_t mark;
#endif
[/code]
而在 xt_MARK.h 中的定义如下(我的内核是 2.6.23)
[code]
/* Version 0 */
struct xt_mark_target_info {
        unsigned long mark;
};

/* Version 1 */
enum {
        XT_MARK_SET=0,
        XT_MARK_AND,
        XT_MARK_OR,
};

struct xt_mark_target_info_v1 {
        unsigned long mark;
        u_int8_t mode;
};
[/code]
在 xt_CONNMARK.h 中的定义如下
[code]
struct xt_connmark_target_info {
        unsigned long mark;
        unsigned long mask;
        u_int8_t mode;
};
[/code]
从理论上分析,无论是 mark 还是 connmark,都是用了 32bit 变量存储数据,最大值是 0xffffffff,不存在你说的问题

实际测试一下
iptables -t mangle -vnL PREROUTING
[code]
Chain PREROUTING (policy ACCEPT 119K packets, 60M bytes)
pkts bytes target     prot opt in     out     source               destination
   26  2028 MARK       all  --  *      *       192.168.1.173        0.0.0.0/0           MARK set 0x101
[/code]
iptables -vnL FORWARD
[code]
Chain FORWARD (policy ACCEPT 848M packets, 423G bytes)
pkts bytes target     prot opt in     out     source               destination
    0     0            all  --  *      *       0.0.0.0/0            0.0.0.0/0           MARK match 0x1
  26  2028            all  --  *      *       0.0.0.0/0            0.0.0.0/0           MARK match 0x101
[/code]
实际测试也不存在你所述的问题(kernel 2.6.23, iptables 1.4.0)

还有,你的表述有误,256 即使回环,也不等价与 1,而是 0

zhoutao0712
但我的是bcm5354芯片路由器上
iptables 1.3.8,
确实在mark 510的时候
如果filter的handle 510的时候流控没效果(tc -s -d class 观察对应类没流量)
改成handle 254就OK了。

linux 核心版本 2.4.37

[[i] 本帖最后由 zhoutao0712 于 2010-1-19 11:54 编辑 [/i]]

zhoutao0712
不知道是否和平台以及iptables版本有关系啊。

zhoutao0712
经过反复实验,已经确定原因出在handle上,不是iptables,是TC问题,和linux版本有关系