- 论坛徽章:
- 0
|
- 50 ct = nf_ct_get(*pskb, &ctinfo);
- 51 if (ct) {
- 52 switch(markinfo->mode) {
- 53 case XT_CONNMARK_SET:
- 54 newmark = (ct->mark & ~markinfo->mask) | markinfo->mark;
- 55 if (newmark != ct->mark) {
- 56 ct->mark = newmark;
- 57 nf_conntrack_event_cache(IPCT_MARK, *pskb);
- 58 }
- 59 break;
- 60 case XT_CONNMARK_SAVE:
- 61 newmark = (ct->mark & ~markinfo->mask) |
- 62 ((*pskb)->mark & markinfo->mask);
- 63 if (ct->mark != newmark) {
- 64 ct->mark = newmark;
- 65 nf_conntrack_event_cache(IPCT_MARK, *pskb);
- 66 }
- 67 break;
- 68 case XT_CONNMARK_RESTORE:
- 69 mark = (*pskb)->mark;
- 70 diff = (ct->mark ^ mark) & markinfo->mask;
- 71 (*pskb)->mark = mark ^ diff;
- 72 break;
- 73 }
- 74 }
- 75
- 76 return XT_CONTINUE;
复制代码
从代码看,restore 是把连接的标记写到包的标记里面,save 则正相反
另外你没看懂我上面讲的,即使你匹配到了,转向了,但你转向过去的东西也不能被认可
nat 表只处理连接最开始的包,而你匹配到的绝对不是连接最开始,所以你永远匹配不到,这是其一
其二,前面说过了,TCP 连接是有三次握手的,即使 nat 是处理所有包,但你只把从匹配到开始以后的包转换过去,连接也不会被认可,因为 TCP 没有建立
[ 本帖最后由 platinum 于 2008-7-3 22:49 编辑 ] |
|