天天看點

iptables配置conntrack的NOTRACK和TRACK

iptables本身沒有TRACK target,以至于你不能指定需要被conntrack子產品處理的資料包白名單,比如我想實作:除了來源IP是192.168.10.0/16網段的需要被track之外,其它的都不要track。

       當然,你可以通過下面的配置實作我的需求:

iptables -t raw -A PREROUTING ! -s 192.168.10.0/16 -j NOTRACK

...反向NOTRACK類似,-s換-d

如果更複雜一點呢?比如除了來源IP限制之外,還有協定,端口等。

       熟悉通路控制清單設計的都知道,ACL的“與”操作可以在單條規則中實作,而“或”操作則由多條規則實作,是以應用于上述随便複雜的需求,都是可以完成 的,甚至抛開“單條與/多條或”原則,僅僅是擴充ipset也可以很好配置出來任意複雜的規則滿足任意複雜的需求。

       但是有沒有一個更簡單的辦法?當然有,實作一個和NOTRACK對立的target,即TRACK target即可。它的實作就是清除已經附着在skb上的untracked conn。這樣當我需要添加track白名單時,我可以這麼做:

iptables -t raw -A PREROUTING -j NOTRACK

iptables -t raw -A PREROUTING $mt1 $mt2 ... -j TRACK # 單條的matches AND操作

...# 多條的 matches OR操作

iptables -t raw -A PREROUTING $mt''1 $mt''2 ... -j TRACK

OK,就這樣,很簡單。  

       不過iptables沒有内置OR操作是完全符合ACL理念的,該理念中,如果想實作或,就配置多條規則,事實上大多數的鑒權系統都是如此的理念。看看C 語言的邏輯判斷會發現同樣的理念,如果是AND操作,逐條語句便和順序無關,因為最終必須将每個語句全部計算一遍,如果是OR操作,計算效率就和順序有關 了,隻要到達“真”值,計算就可以結束了,當然内部細節還是和實作相關的。是以,對于AND操作,由于它是閉合的,一條語句就可以囊括進去,但是OR卻是 不閉合的,你不知道計算将在哪裡結束。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1605096

繼續閱讀