亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
1234下一頁
最近訪問板塊 發(fā)新帖
查看: 39484 | 回復(fù): 35
打印 上一主題 下一主題

[網(wǎng)絡(luò)子系統(tǒng)] linux-2.6.35.6 xtables&iptables&hipac [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-05-30 12:12 |只看該作者 |倒序?yàn)g覽
本帖最后由 pywj777 于 2012-05-30 13:06 編輯

之前總是拜讀“獨(dú)孤九賤”兄的大作,受益匪淺,F(xiàn)也將自己的一些總結(jié)分享給大家,由于語言組織能力較差,所以多上圖,少上字。

Xtables提供的資源



struct  xt_af  xt[]結(jié)構(gòu)數(shù)組
該數(shù)組用于掛載各個(gè)協(xié)議的match和target資源。由于寫者(添加、刪除)和讀者(查找)都是在內(nèi)核空間進(jìn)程上下文執(zhí)行,所以它們只需要用xt[n].mutex信號(hào)量進(jìn)行互斥。讀者(查找)在將規(guī)則關(guān)聯(lián)上一個(gè)match或target時(shí)會(huì)增加它們所在模塊的引用計(jì)數(shù),在它釋放這個(gè)引用計(jì)數(shù)之前該模塊是不會(huì)被卸載的,所以另外一個(gè)讀者(規(guī)則匹配)在軟中斷中可以放心的使用,不需加任何鎖。
  • xt_register_match(struct xt_match *match)與xt_unregister_match(struct xt_match *match)
    用于在xt[]數(shù)組上掛載對(duì)應(yīng)協(xié)議的match,由于它們都是在內(nèi)核空間的進(jìn)程上下文被使用,所以它們使用mutex_lock(&xt[af].mutex)信號(hào)量進(jìn)行加鎖和解鎖。(寫者)
  • xt_register_target(struct xt_target *target)與xt_unregister_target(struct xt_target *target)
    用于在xt[]數(shù)組上掛載對(duì)應(yīng)協(xié)議的target,由于它們都是在內(nèi)核空間的進(jìn)程上下文被使用,所以它們使用mutex_lock(&xt[af].mutex)信號(hào)量進(jìn)行加鎖和解鎖。(寫者)
  • struct xt_match *xt_find_match(u8 af, const char *name, u8 revision)與struct xt_target *xt_find_target(u8 af, const char *name, u8 revision)
    用于在xt[]數(shù)組中查找對(duì)應(yīng)協(xié)議的match或target與對(duì)應(yīng)規(guī)則相關(guān)聯(lián),并增加match和target所在模塊的引用計(jì)數(shù)。由于它們都是在內(nèi)核空間的進(jìn)程上下文被使用,所以它們使用mutex_lock(&xt[af].mutex)信號(hào)量進(jìn)行加鎖和解鎖。同時(shí)內(nèi)核在軟中斷中進(jìn)行規(guī)則匹時(shí)配,它引用規(guī)則關(guān)聯(lián)的match和target是安全的,因?yàn)閙atch和target所在模塊由于引用計(jì)數(shù)是不會(huì)被釋放的。(讀者)
  • 由于有一個(gè)讀者是在軟中斷的中,并且有多個(gè)CPU同時(shí)使用,是否需要其它保護(hù)。答:不需要。因?yàn)槿绻浿袛嘀幸玫囊?guī)則使用了某個(gè)match或target,則擁有該match和target模塊的引用計(jì)數(shù)會(huì)被加1,該模塊將不會(huì)被卸載(這也就要求在調(diào)用xt_unregister_match()或xt_unregister_target()時(shí)必須先判斷它們所在模塊的引用計(jì)數(shù),通常它們被放在模塊注銷函數(shù)中)。如果引用計(jì)數(shù)為0,則說明沒有規(guī)則引用該match或target,則在軟中斷中也不會(huì)使用它。


net.xt.tables[]網(wǎng)絡(luò)命名空間協(xié)議鏈表
該命名空間協(xié)議鏈表用于將不同協(xié)議的table表掛到對(duì)應(yīng)協(xié)議鏈表中。
寫者(添加、刪除)table表都在內(nèi)核空間進(jìn)程上下文執(zhí)行,又由于它需要檢查該表與注冊(cè)的target、match名字不沖突,所以他們只需要用xt[n].mutex信號(hào)。
讀者在軟中斷中通過HOOK引用這些表,所以在寫者(添加、刪除)之前一定要保證沒有讀者在操作。添加表操作一定要先通過xt_register_table()添加一個(gè)表,然后再通過xt_hook_link()使HOOK能夠引用這些表;刪除表操作一定要先通過xt_hook_unlink()去掉HOOK對(duì)表的引用,然后再通過xt_unregister_table()刪除一個(gè)表。
  • struct xt_table *xt_register_table(struct net *net, const struct xt_table *input_table, struct xt_table_info *bootstrap, struct xt_table_info *newinfo)
    主要是復(fù)制input_table到table表,并將newinfo(由調(diào)用該函數(shù)模塊提供的私有數(shù)據(jù)xt_table_info)與該表的table->private指針相關(guān)聯(lián),然后根據(jù)該表指定的協(xié)議掛入對(duì)應(yīng)的net.xt.table[table->af]鏈表中。它使用xt[n].mutex信號(hào)進(jìn)行加鎖(如上所述)。
  • void *xt_unregister_table(struct xt_table *table)
    主要是將table從net.xt.table[table->af]鏈表中取下來,并返回table->private指針指向的xt_table_info數(shù)據(jù)。它使用xt[n].mutex信號(hào)進(jìn)行加鎖(如上所述)。
  • struct nf_hook_ops *xt_hook_link(const struct xt_table *table, nf_hookfn *fn)與void xt_hook_unlink(const struct xt_table *table, struct nf_hook_ops *ops)
    主要是利用xt_table結(jié)構(gòu)和鉤子函數(shù)構(gòu)造出nf_hook_ops鉤子項(xiàng),然后調(diào)用nf_register_hooks()或nf_unregisgter_hooks()函數(shù)來注冊(cè)或注銷ipv4協(xié)議對(duì)應(yīng)點(diǎn)的鉤子函數(shù),這兩個(gè)函數(shù)主要用在內(nèi)核空間的進(jìn)程上下文。由于nf_regisgter_hooks()已提供了保護(hù),所以它們不需要任何形式的鎖保護(hù)。

評(píng)分

參與人數(shù) 2可用積分 +22 收起 理由
embeddedlwp + 10 贊一個(gè)!
send_linux + 12 贊一個(gè)!

查看全部評(píng)分

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-05-30 12:26 |只看該作者
本帖最后由 pywj777 于 2012-05-30 12:36 編輯

Iptables利用Xtable初始化filter表的結(jié)構(gòu)圖



  • struct xt_table *ipt_register_table(struct net *net, const struct xt_table *table, const struct ipt_replace *repl)(注冊(cè)并初始化一個(gè)表,然后調(diào)用xt_hook_link()引用該表)
    該函數(shù)是iptables為filter、nat、mangle模塊提供用于注冊(cè)相應(yīng)表結(jié)構(gòu)的接口。它根據(jù)當(dāng)前表要被掛入的HOOK點(diǎn)來構(gòu)建上圖所示的xt_table_info初始規(guī)則表,并調(diào)用xt_register_table()函數(shù)將filter表的xt_table和xt_table_info結(jié)構(gòu)掛入net.xt.table[IPV4]鏈表中。(上圖是iptables_filter模塊調(diào)用該函數(shù)注冊(cè)的結(jié)構(gòu)圖)
    注冊(cè)完一個(gè)表后,就可以通過xt_hook_link()函數(shù)注冊(cè)一個(gè)HOOK點(diǎn)來使用這個(gè)表中的規(guī)則處理數(shù)據(jù)包。

  • void ipt_unregister_table(struct net *net, struct xt_table *table)(注銷一個(gè)表,要在xt_hook_unlink()之后使用)
    該函數(shù)是iptables為filter、nat、mangle模塊提供用于注銷相應(yīng)表結(jié)構(gòu)的接口。它調(diào)用xt_unregister_table()將xt_table從對(duì)應(yīng)協(xié)議鏈表中取下并釋放,然后將返回的xt_table_info結(jié)構(gòu)中的規(guī)則逐一釋放(同時(shí)也會(huì)釋放規(guī)則引用的match和target模塊的引用計(jì)數(shù)),最后釋放xt_table_info結(jié)構(gòu)。
    為保證釋放table表時(shí)沒有其它讀者,所以在調(diào)用該函數(shù)之前要先調(diào)用xt_hook_unlink()函數(shù)注銷在HOOK點(diǎn)掛入的處理函數(shù),保證沒有其它CPU會(huì)再引用到該表。

  • struct  xt_info_lock  xt_info_locks[CPU](用于保證讀取修改表中規(guī)則的鎖,每個(gè)CPU一個(gè)鎖)

    struct xt_table *xt_find_table_lock(struct net *net, u_int8_t af, const char *name)
    查找name指定的表,使用xt[af].mutex加鎖,保證只有一個(gè)寫者處理該表。并增加表所在模塊的引用計(jì)數(shù),防止該表被錯(cuò)誤釋放。

    void xt_table_unlock(struct xt_table *table)
    與xt_find_table_lock()配對(duì)使用,釋放xt[table->af].mutex鎖。

    static inline void xt_info_rdlock_bh(void) 或 static inline void xt_info_rdunlock_bh(void)
    獲取或釋放本CPU的xt_info_locks[cpu]鎖。這個(gè)鎖主要是用于防止正被使用的規(guī)則表(xt_table_info結(jié)構(gòu))被釋放。(它與get_counters()進(jìn)行互斥)

    static inline void xt_info_wrlock(unsigned int cpu) 或 static inline void xt_info_wrunlock(unsigned int cpu)
    獲取指定CPU的xt_info_locks[cpu]鎖。它主要在get_counters()中被調(diào)用,用于獲取所有CPU的寫鎖,保證所有CPU都已完成了對(duì)規(guī)則表的引用。

    static void get_counters(const struct xt_table_info *t, struct xt_counters counters[])
    它可以保證其它CPU都已完成了一次對(duì)表中所有規(guī)則的引用。因?yàn)樗獙?duì)所有其它CPU調(diào)用xt_info_wrlock(cpu)函數(shù)來獲取其它CPU的xt_info_lock,而其它CPU在讀取表中規(guī)則時(shí),要通過xt_info_rdlock_bh獲取各自的xt_info_lock鎖,所有當(dāng)它獲取完所有其它CPU的xt_info_lock鎖后,就表示其它CPU都已完成了對(duì)表中規(guī)則的引用。這就說明了為什么在do_replace中調(diào)用完get_counters()后能夠安全的釋放舊的xt_table_info結(jié)構(gòu)。

  • static int get_info(struct net *net, void __user *user,  const int *len, int compat) (讀取表中信息)
    該函數(shù)是用戶使用iptables命令操作表中規(guī)則時(shí),用于獲取表中信息的接口。它使用xt_find_table_lock()和xt_table_unlock()保證沒有其它人操作該表。

  • static int get_entries(struct net *net,  struct ipt_get_entries __user *uptr,  const int *len)(讀取表中規(guī)則)
    該函數(shù)是用戶使用iptables命令操作表中規(guī)則時(shí),用于獲取表中規(guī)則的接口。它使用xt_find_table_lock()和xt_table_unlock()保證沒有其它人操作該表。

  • unsigned int ipt_do_table(struct sk_buff *skb, unsigned int hook, const struct net_device *in, const struct net_device *out, struct xt_table *table) (讀取表中規(guī)則)
    該函數(shù)是iptables為filter、nat、mangle模塊提供用于對(duì)數(shù)據(jù)包匹配各表中規(guī)則的接口。它根據(jù)表對(duì)應(yīng)的xt_table_info結(jié)構(gòu)中的信息,找到相應(yīng)的規(guī)則,對(duì)數(shù)據(jù)包進(jìn)行逐一匹配。為保證所引用表中的規(guī)則(xt_table_info)不被其它寫者釋放,同時(shí)又不影響到其它讀者,使用xt_info_rdlock_bh()和xt_info_rdunlock_bh()來加鎖和解鎖。

  • static int do_replace(struct net *net, const void __user *user, unsigned int len) (修改表中規(guī)則)
    該函數(shù)是iptables為filter、nat、mangle模塊提供用于在對(duì)應(yīng)表中下規(guī)則的接口。它根據(jù)用戶傳遞過來的規(guī)則,構(gòu)建一個(gè)新的xt_table_info結(jié)構(gòu)和規(guī)則,并將它們與對(duì)應(yīng)表的xt_table->private相關(guān)聯(lián)。它通過xt_find_table_lock()和xt_table_unlock()保證當(dāng)前只有一個(gè)寫者在操作該表。通過local_bh_disable()和local_bh_enable()保證更換table->private指向新的xt_table_info結(jié)構(gòu)時(shí)不被打斷。通過get_counters()保證所有其它CPU都不再使用舊的xt_table_info結(jié)構(gòu),安全釋放舊的xt_table_info結(jié)構(gòu)。

    static int translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0, const struct ipt_replace *repl)
    根據(jù)ipt_replace結(jié)構(gòu)構(gòu)建一個(gè)xt_table_info結(jié)構(gòu),并做一些必要的檢查(鏈?zhǔn)欠癍h(huán)路等),同時(shí)將表中的規(guī)則與相應(yīng)的match和target相關(guān)聯(lián)。

    struct xt_table_info *xt_replace_table(struct xt_table *table, unsigned int num_counters, struct xt_table_info *newinfo, int *error)
    為newinfo調(diào)用xt_jumpstack_alloc(struct xt_table_info *i)初始化stack相關(guān)數(shù)據(jù),然后使table->private指向newinfo,并返回oldinfo。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-05-30 12:40 |只看該作者
Iptables利用Xtables構(gòu)建的組織形式

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-05-30 12:44 |只看該作者
本帖最后由 pywj777 于 2012-05-30 12:52 編輯

Iptable下發(fā)規(guī)則的執(zhí)行流程圖



iptables內(nèi)核層與應(yīng)用層之間傳輸規(guī)則的組織形式



iptables將內(nèi)核中獲取的規(guī)則轉(zhuǎn)換為如下圖所示可管理的結(jié)構(gòu)

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-05-30 12:56 |只看該作者
Iptables包含以下target
  • IPT_ACCEPT:(struct ipt_standard_target *)target->verdict = -NF_ACCEPT-1        < 0        (ipt_do_table()碰到這個(gè)target直接返回NF_ACCEPT)
  • IPT_DROP:(struct ipt_standard_target *)target->verdict = -NF_DROP-1 < 0                (ipt_do_table()碰到這個(gè)target直接返回NF_DROP)
  • IPT_QUEUE:(struct ipt_standard_target *)target->verdict = -NF_QUEUE-1 < 0        (ipt_do_table()碰到這個(gè)target直接返回NF_QUEUE)
  • IPT_RETURN:(struct ipt_standard_target *)target->verdict = -NF_REPATE-1        < 0        (ipt_do_table()碰到這個(gè)target特殊處理)
  • 跳轉(zhuǎn)到子鏈target:(struct ipt_standard_target *)target->verdict = 要跳轉(zhuǎn)子鏈的偏移量 > 0        (ipt_do_table()碰到這個(gè)target會(huì)跳轉(zhuǎn)到該子鏈處理)
  • IPT_CONTINUE:        IPT_CONTINUE = XT_CONTINUE = 0xFFFFFFFF < 0        (ipt_do_table()碰到這個(gè)target會(huì)處理下一條規(guī)則,這個(gè)target被擴(kuò)展target使用)(它不是一個(gè)標(biāo)準(zhǔn)target,但可被其它擴(kuò)展TARGET用作返回值)
  • 擴(kuò)展target:它是struct xt_entry_target + date[]                                (ipt_do_table()碰到這個(gè)target會(huì)調(diào)用target->target()處理,并根據(jù)返回值做處理。擴(kuò)展target可返回IPT_CONTINUE,或下面netfilter定義的值)


Netfilter處理的返回值
NF_DROP
NF_ACCEPT
NF_STOLEN
NF_QUEUE
NF_REPEAT
NF_STOP

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-05-30 13:03 |只看該作者
眾所周知,iptables的一大缺點(diǎn)是線性匹配,這樣當(dāng)>1000條規(guī)則時(shí),匹配效率會(huì)明顯下降,為此,我借鑒NF-hipac的算法,將iptables轉(zhuǎn)換為樹形匹配,來加快其匹配效率,轉(zhuǎn)換后的結(jié)構(gòu)圖如下圖所示:

評(píng)分

參與人數(shù) 1可用積分 +6 收起 理由
Godbach + 6 贊一個(gè)!

查看全部評(píng)分

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-06-01 22:46 |只看該作者
本帖最后由 MoWaters 于 2012-06-01 22:59 編輯

圖畫得真不錯(cuò),收藏了。



   

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
8 [報(bào)告]
發(fā)表于 2012-06-05 12:44 |只看該作者
回復(fù) 1# pywj777
感謝 LZ 分享,看到 hipac 的匯總了。
   

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
9 [報(bào)告]
發(fā)表于 2012-06-05 12:51 |只看該作者
回復(fù) 1# pywj777

LZ 能夠簡(jiǎn)單介紹一下 xtable 和原先版本的 iptables 中主要的變化有哪些?


   

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2012-06-05 16:19 |只看該作者
本帖最后由 pywj777 于 2012-06-05 16:20 編輯

回復(fù) 9# Godbach

主要的變化就在于一個(gè)是'x'tables,一個(gè)是'ip'tables,即iptables只針對(duì)IP協(xié)議棧,而xtables是針對(duì)各種不同的協(xié)議棧,例如第一幅圖中的IPV4、IPV6、ARP、BRIDGE、DECENT等


   
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP