iptables的手冊也不能盡信啊

2021-08-26 18:21:26 字數 2860 閱讀 7239

我很自豪的找到了一種截獲資料報的秘籍,那就是使用conntrack的ctdir,第一步當然是看iptables的man手冊,發現:

--ctdir

match packets that are flowing in the specified direction. if this flag is not specified at all, matches packets

in both directions.

於是我寫下來以下以下的規則:

iptables -t mangle -a prerouting -d x.x.x.x/a -i eth2 -m conntrack --ctdir original -j mark --set-xmark 100

iptables -t mangle -a prerouting -s y.y.y.y/b -i eth2 -m conntrack --ctdir reply -j mark --set-xmark 100

這只是乙個安慰罷了,其實我知道我沒有錯,按照英文本面理解,reply就是代表返回的意思。我的實際計畫應該是,找到乙個證據證明自己沒有錯。這個證據我在網際網路找了好久,因此我決定看一下**。首先我看的是conntrack的通用match函式,核心版本為2.6.32。通過match函式在/net/netfilter/xt_conntrack.c中:

static bool

conntrack_mt(const struct sk_buff *skb, const struct xt_match_param *par,

u16 state_mask, u16 status_mask)

為了思路更清晰,將幫助函式/巨集也列舉出來:

enum ip_conntrack_dir

;enum ip_conntrack_info

;#define ctinfo2dir(ctinfo) ((ctinfo) >= ip_ct_is_reply ? ip_ct_dir_reply : ip_ct_dir_original)

static inline struct nf_conn *

nf_ct_get(const struct sk_buff *skb, enum ip_conntrack_info *ctinfo)

然後我們看一下skb->nfctinfo到底在**初始化的,實際上不用找也知道是nf_conntrack_in裡面的resolve_normal_ct中:

if (nf_ct_direction(h) == ip_ct_dir_reply)  else  else if (test_bit(ips_expected_bit, &ct->status))  else 

*set_reply = 0;

}skb->nfct = &ct->ct_general;

skb->nfctinfo = *ctinfo;

可見,正方向的資料報的nfctinfo被初始化成了ip_ct_established,ip_ct_related或者ip_ct_new,而這些都比ip_ct_is_reply要小,因此正方向的資料報的ctinfo2dir肯定是ip_ct_dir_original(詳見ctinfo2dir巨集定義)。另乙個證據在init_conntrack函式,它是乙個初始化ct的函式,這種情況下ct肯定被認為是正方向的,該函式在最後返回的是&ct->tuplehash[ip_ct_dir_original],乙個ip_ct_dir_original方向的ct-part。

現在看看conntrack_mt函式,對於正方向的包,(ctinfo2dir(ctinfo) == ip_ct_dir_original)為1,如果iptables的ctdir設定為original的話,(info->invert_flags & xt_conntrack_direction))為0(詳見ip_conntrack_dir列舉),因此二者異或為1,最終返回false,這不是瞪著眼睛說瞎話嗎?對於返回包,也就是反方向的包,反而返回true...起碼從**看來,ip_conntrack將ctdir完全搞反了。因此如果想讓你的配置按照你的想法生效,那就要反過來配置:

iptables -t mangle -a prerouting -d x.x.x.x/a -i eth2 -m conntrack --ctdir reply -j mark --set-xmark 100

iptables -t mangle -a prerouting -s y.y.y.y/b -i eth2 -m conntrack --ctdir original -j mark --set-xmark 100

很奇怪,然而正確!要想修正這個問題,除了配置很奇怪的規則之外,只需要去掉乙個「!」號即可:

(ctinfo2dir(ctinfo) == ip_ct_dir_original) ^

!!(info->invert_flags & xt_conntrack_direction))

改為:

(ctinfo2dir(ctinfo) == ip_ct_dir_original) ^

!(info->invert_flags & xt_conntrack_direction))

從「!!(info->invert_flags & xt_conntrack_direction)」這一行**來看,筆誤的可能性比較大,否則實在想不通為何要用雙重否定句。

令人氣憤的是,如此乙個問題怎麼竟然很少有人提出來啊,難道真的是能用就行嗎?或者說真的是我錯了?唉,反正不管怎麼說,我配反了就能用,配正了就錯誤!搞了一下午,真tm fuxx the conntrack,怎麼就沒人管呢?這麼成熟的iptables竟然都不可信,茫茫塵世,我還能信誰?

軟體不能解除安裝也不能安裝的解決辦法

軟體不能解除安裝也不能安裝的解決辦法 今天誤刪了rad2007的一些檔案,導致rad2007不能刪除,也不能重新安裝。上網搜尋了一下,找到了乙個解決的方法。步驟如下 1 開啟windows xp安裝盤,安裝裡面的support tools軟體 2 進入硬碟的support tools安裝目錄 x p...

SEO優化做的再好也不能丟掉使用者體驗

現在 的seo優化越來越普及了,只要稍微懂建站的站長都基本多多少少都了解一些s程式設計客棧eo優化該如何去做,所以既然普及了tbclwqseo優化知識那麼我們 競爭力度就越來越難了,畢竟對手也多了起來,當然 建站不僅要學會優化這個方面還有很重要的乙個方面也不可以拋棄那麼就是 的使用者體驗度,今天我們...

不能擺脫別人的標準,再大的成就也總有遺憾

我的朋友zara一直是個自律的人,作為成功的都市金領,形象,幾乎很少壞習慣,她一直奉行 自律即自由,這也是keep的格言。似乎有了自律就能得到自由。zara前一段時間非常困惑,母親70大壽她回老家,大受打擊。她過了十年自律的生活,各方面都不錯,可是還是有很多不如意,已經30幾 好幾 了,大齡未嫁。她...