歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 大量存在於iptables模塊中的BUG

大量存在於iptables模塊中的BUG

日期:2017/2/28 14:37:18   编辑:Linux教程

iptables的maual的BUG一節:
BUGS
Bugs? What's this? ;-) Well, you might want to have a look at http://bugzilla.netfilter.org/
OK,我去netfilter的bug站點...唉,這幫人啊!
我相信很多人都遇到過iptables規則無法刪除的問題,比如我使用了xtables-addons中的condition這個match模塊,當我成功設置了一個規則後:
iptables -t mangle -A PREROUTING -m condition --condition xtt -j ACCEPT
然後嘗試用上述規則的D命令刪除之:
iptables -t mangle -D PREROUTING -m condition --condition xtt -j ACCEPT
我得到了一個報錯:
iptables: Bad rule (does a matching rule exist in that chain?).
然而如果我用rulenum的方式則可以成功刪除!即先查找上述規則的rulenum,然後刪除該num標示的規則就可以成功,但是這樣就多了一個步驟,我將不能僅僅通過簡單的A或者D控制一條規則的增加和刪除,於是,我必須找出來到底是哪裡出了問題。

iptables規則的布局
iptables規則保存在哪裡呢?答案是保存在內核裡面,並且一條規則處在一個連續的地址空間,布局大致如下:
元數據|match1|match2|...|target
注意,用戶態是不保存規則的,每當你要刪除一條規則的時候,你必須提供足夠的你要刪除的規則的詳細信息,然後和內核中的規則群做比對,只有在精確匹配成功,即沒有任何二義性的匹配成功後,該規則直接從內核中刪除,具體的通信機制(Netlink,ioctl等)不重要,重要的是,iptables有多種刪除規則的方式。

iptables規則的刪除
1.按照rulenum刪除
內核會為每一條保存進內核的iptables規則進行編號索引,該索引在特定的HOOK點/TABLE上是唯一的,因此使用rulenum進行刪除不會有任何二義性。

2.精確匹配刪除
精確匹配刪除比較復雜,你必須給出規則的每一個細節,正如你當初添加該規則時一樣,和添加動作唯一不同的是,你要把-A改成-D。這種精確匹配刪除的成功依賴的就是用戶提供的所有match字段,target字段必須和內核中保存的一模一樣,精確到字節級別的匹配。如果哪怕有一個字節不匹配,就會有二義性,刪除失敗。

3.整表整鏈刪除
當你調用iptables -t $table -F的時候,該表下面的所有規則就不復存在了,由於規則隸屬於表,因此不會有二義性。整鏈刪除含義類似,主要是由於,不管表也好,鏈也罷,都是具體規則的上級組織,正所謂皮之不存,毛將焉附!
問題之所在
以我實際碰到的問題為例,xt_condition的info結構體如下:

enum {
CONDITION_NAME_LEN = 31,
};

struct xt_condition_mtinfo {
char name[CONDITION_NAME_LEN];
__u8 invert;

/* Used internally by the kernel */
void *condvar __attribute__((aligned(8)));
};

注意那個注釋!condvar字段只用在內核。如果你用過condition模塊,你會知道,它除了一個名稱參數之外,不會攜帶任何參數,也就是說僅僅iptables的命令不會對condvar進行任何設置,默認可能是NULL,然而整個結構體,當然也包括condvar,在添加規則的時候,全都會被注入內核並被內核保存起來,condvar的賦值是在內核中進行的,它表示一個內核結構體的地址。

如果說現在使用精確匹配法則刪除一條使用condition的規則,會怎樣?內核中的該規則中的xt_condition_mtinfo結構體的condvar字段已經被賦值為一個內核態地址空間的地址,它會被用來和用戶態的相同結構體進行字節級的比對,第一個字段name顯然是精確匹配的,第二個字段也沒有問題,condition_parse會處理得很好,然而第三個condvar字段就不匹配了,用戶給出的規則中該字段為0,而內核態中該字段是一個地址!因此就會導致刪除失敗!

推薦閱讀:

iptables—包過濾(網絡層)防火牆 http://www.linuxidc.com/Linux/2013-08/88423.htm

Linux防火牆iptables詳細教程 http://www.linuxidc.com/Linux/2013-07/87045.htm

iptables+L7+Squid實現完善的軟件防火牆 http://www.linuxidc.com/Linux/2013-05/84802.htm

iptables的備份、恢復及防火牆腳本的基本使用 http://www.linuxidc.com/Linux/2013-08/88535.htm

Linux下防火牆iptables用法規則詳解 http://www.linuxidc.com/Linux/2012-08/67952.htm

Copyright © Linux教程網 All Rights Reserved