- 論壇徽章:
- 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 則正相反
另外你沒看懂我上面講的,即使你匹配到了,轉(zhuǎn)向了,但你轉(zhuǎn)向過去的東西也不能被認可
nat 表只處理連接最開始的包,而你匹配到的絕對不是連接最開始,所以你永遠匹配不到,這是其一
其二,前面說過了,TCP 連接是有三次握手的,即使 nat 是處理所有包,但你只把從匹配到開始以后的包轉(zhuǎn)換過去,連接也不會被認可,因為 TCP 沒有建立
[ 本帖最后由 platinum 于 2008-7-3 22:49 編輯 ] |
|