在 struct sk_buff 中定义的 mark 如下
__u32 mark;
复制代码
在 struct nf_conn 中定义的 connmark 如下
#if defined(CONFIG_NF_CONNTRACK_MARK)
u_int32_t mark;
#endif
复制代码
而在 xt_MARK.h 中的定义如下(我的内核是 2.6.23)
/* 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;
};
复制代码
在 xt_CONNMARK.h 中的定义如下
struct xt_connmark_target_info {
unsigned long mark;
unsigned long mask;
u_int8_t mode;
};
复制代码
从理论上分析,无论是 mark 还是 connmark,都是用了 32bit 变量存储数据,最大值是 0xffffffff,不存在你说的问题
实际测试一下
iptables -t mangle -vnL PREROUTING
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
复制代码
iptables -vnL FORWARD
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
复制代码
实际测试也不存在你所述的问题(kernel 2.6.23, iptables 1.4.0)
还有,你的表述有误,256 即使回环,也不等价与 1,而是 0