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