小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

IP包的處理模式

 mrjbydd 2010-09-17
 2.1 LVS對(duì) IP包的處理模式

  IP包處理用Linux 2.4內(nèi)核的Netfilter框架完成。一個(gè)數(shù)據(jù)包通過Netfilter框架的過程如圖所示:

  通俗的說,netfilter的架構(gòu)就是在整個(gè)網(wǎng)絡(luò)流程的若干位置放置了一些檢測點(diǎn)(HOOK),而在每個(gè)檢測點(diǎn)上上登記了一些處理函數(shù)進(jìn)行處理(如包過濾,NAT等,甚至可以是用戶自定義的功能)。

  1. NF_IP_PRE_ROUTING:剛剛進(jìn)入網(wǎng)絡(luò)層的數(shù)據(jù)包通過此點(diǎn)(剛剛進(jìn)行完版本號(hào),校驗(yàn)和等檢測),源地址轉(zhuǎn)換在此點(diǎn)進(jìn)行;
  2. NF_IP_LOCAL_IN:經(jīng)路由查找后,送往本機(jī)的通過此檢查點(diǎn),INPUT包過濾在此點(diǎn)進(jìn)行;
  3. NF_IP_FORWARD:要轉(zhuǎn)發(fā)的包通過此檢測點(diǎn),FORWORD包過濾在此點(diǎn)進(jìn)行;
  4. NF_IP_LOCAL_OUT:本機(jī)進(jìn)程發(fā)出的包通過此檢測點(diǎn),OUTPUT包過濾在此點(diǎn)進(jìn)行;
  5. NF_IP_POST_ROUTING:所有馬上便要通過網(wǎng)絡(luò)設(shè)備出去的包通過此檢測點(diǎn),內(nèi)置的目的地址轉(zhuǎn)換功能(包括地址偽裝)在此點(diǎn)進(jìn)行。

 

  在IP層代碼中,有一些帶有NF_HOOK宏的語句,如IP的轉(zhuǎn)發(fā)函數(shù)中有:

<-ipforward.c ip_forward()->
            NF_HOOK(PF_INET, NF_IP_FORWARD, skb, skb->dev, dev2,ip_forward_finish);
            //其中NF_HOOK宏的定義基本如下:
            <-/include/linux/netfilter.h->
            #ifdef CONFIG_NETFILTER
            #define NF_HOOK(pf, hook, skb, indev, outdev, okfn)
            (list_empty(&nf_hooks[(pf)][(hook)])
            ? (okfn)(skb)
            : nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn)))
            #else /* !CONFIG_NETFILTER */
            #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb)
            #endif /*CONFIG_NETFILTER*/ 

  如果在編譯內(nèi)核時(shí)沒有配置netfilter時(shí),就相當(dāng)于調(diào)用最后一個(gè)參數(shù),此例中即執(zhí)行ip_forward_finish函數(shù);否則進(jìn)入HOOK點(diǎn),執(zhí)行通過nf_register_hook()登記的功能(這句話表達(dá)的可能比較含糊,實(shí)際是進(jìn)入nf_hook_slow()函數(shù),再由它執(zhí)行登記的函數(shù))。

  NF_HOOK宏的參數(shù)分別為:

  1. pf:協(xié)議族名,netfilter架構(gòu)同樣可以用于IP層之外,因此這個(gè)變量還可以有諸如PF_INET6,PF_DECnet等名字。
  2. hook:HOOK點(diǎn)的名字,對(duì)于IP層,就是取上面的五個(gè)值;
  3. skb:顧名思義
  4. indev:進(jìn)來的設(shè)備,以struct net_device結(jié)構(gòu)表示;
  5. outdev:出去的設(shè)備,以struct net_device結(jié)構(gòu)表示;
  6. okfn:是個(gè)函數(shù)指針,當(dāng)所有的該HOOK點(diǎn)的所有登記函數(shù)調(diào)用完后,轉(zhuǎn)而走此流程。

 

  這些點(diǎn)是已經(jīng)在內(nèi)核中定義好的,除非你是這部分內(nèi)核代碼的維護(hù)者,否則無權(quán)增加或修改,而在此檢測點(diǎn)進(jìn)行的處理,則可由用戶指定。像packet filter,NAT,connection track這些功能,也是以這種方式提供的。正如netfilter的當(dāng)初的設(shè)計(jì)目標(biāo)--提供一個(gè)完善靈活的框架,為擴(kuò)展功能提供方便。

  如果我們想加入自己的代碼,便要用nf_register_hook函數(shù),其函數(shù)原型為:

int nf_register_hook(struct nf_hook_ops *reg)
            struct nf_hook_ops://結(jié)構(gòu)
            struct nf_hook_ops
            {
            struct list_head list;
            /* User fills in from here down. */
            nf_hookfn *hook;
            int pf;
            int hooknum;
            /* Hooks are ordered in ascending priority. */
            int priority;
            };

  其實(shí),類似LVS的做法就是生成一個(gè)struct nf_hook_ops結(jié)構(gòu)的實(shí)例,并用nf_register_hook將其HOOK上。其中l(wèi)ist項(xiàng)要初始化為{NULL,NULL};由于一般在IP層工作,pf總是PF_INET;hooknum就是HOOK點(diǎn);一個(gè)HOOK點(diǎn)可能掛多個(gè)處理函數(shù),誰先誰后,便要看優(yōu)先級(jí),即priority的指定了。netfilter_ipv4.h中用一個(gè)枚舉類型指定了內(nèi)置的處理函數(shù)的優(yōu)先級(jí):

enum nf_ip_hook_priorities {
            NF_IP_PRI_FIRST = INT_MIN,
            NF_IP_PRI_CONNTRACK = -200,
            NF_IP_PRI_MANGLE = -150,
            NF_IP_PRI_NAT_DST = -100,
            NF_IP_PRI_FILTER = 0,
            NF_IP_PRI_NAT_SRC = 100,
            NF_IP_PRI_LAST = INT_MAX,
            };

  hook是提供的處理函數(shù),也就是我們的主要工作,其原型為:

unsigned int nf_hookfn(unsigned int hooknum,
            struct sk_buff **skb,
            const struct net_device *in,
            const struct net_device *out,
            int (*okfn)(struct sk_buff *));

  它的五個(gè)參數(shù)將由NFHOOK宏傳進(jìn)去。

  以上是NetFillter編寫自己模塊時(shí)的一些基本用法,接下來,我們來看一下LVS中是如何實(shí)現(xiàn)的。
 
 
3、LVS中Netfiler的實(shí)現(xiàn)

 

  利用Netfilter,LVS處理數(shù)據(jù)報(bào)從左邊進(jìn)入系統(tǒng),進(jìn)行IP校驗(yàn)以后,數(shù)據(jù)報(bào)經(jīng)過第一個(gè)鉤子函數(shù)NF_IP_PRE_ROUTING[HOOK1]進(jìn)行處理;然后進(jìn)行路由選擇,決定該數(shù)據(jù)報(bào)是需要轉(zhuǎn)發(fā)還是發(fā)給本機(jī);若該數(shù)據(jù)報(bào)是發(fā)被本機(jī)的,則該數(shù)據(jù)經(jīng)過鉤子函數(shù)NF_IP_LOCAL_IN[HOOK2]處理后傳遞給上層協(xié)議;若該數(shù)據(jù)報(bào)應(yīng)該被轉(zhuǎn)發(fā),則它被NF_IP_FORWARD[HOOK3]處理;經(jīng)過轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)經(jīng)過最后一個(gè)鉤子函數(shù)NF_IP_POST_ROUTING[HOOK4]處理以后,再傳輸?shù)骄W(wǎng)絡(luò)上。本地產(chǎn)生的數(shù)據(jù)經(jīng)過鉤子函數(shù)NF_IP_LOCAL_OUT[HOOK5]處理后,進(jìn)行路由選擇處理,然后經(jīng)過NF_IP_POST_ROUTING[HOOK4]處理后發(fā)送到網(wǎng)絡(luò)上。

  當(dāng)啟動(dòng)IPVS加載ip_vs模塊時(shí),模塊的初始化函數(shù)ip_vs_init( )注冊(cè)了NF_IP_LOCAL_IN[HOOK2]、NF_IP_FORWARD[HOOK3]、NF_IP_POST_ROUTING[HOOK4] 鉤子函數(shù)用于處理進(jìn)出的數(shù)據(jù)報(bào)。

  3.1 NF_IP_LOCAL_IN處理過程

  用戶向虛擬服務(wù)器發(fā)起請(qǐng)求,數(shù)據(jù)報(bào)經(jīng)過NF_IP_LOCAL_IN[HOOK2],進(jìn)入ip_vs_in( )進(jìn)行處理。如果傳入的是icmp數(shù)據(jù)報(bào),則調(diào)用ip_vs_in_icmp( );否則繼續(xù)判斷是否為tcp/udp數(shù)據(jù)報(bào),如果不是tcp/udp數(shù)據(jù)報(bào),則函數(shù)返回NF_ACCEPT(讓內(nèi)核繼續(xù)處理該數(shù)據(jù)報(bào));余下情況便是處理tcp/udp數(shù)據(jù)報(bào)。首先,調(diào)用ip_vs_header_check( )檢查報(bào)頭,如果異常,則函數(shù)返回NF_DROP(丟棄該數(shù)據(jù)報(bào))。接著,調(diào)用ip_vs_conn_in_get( )去ip_vs_conn_tab表中查找是否存在這樣的連接:它的客戶機(jī)和虛擬服務(wù)器的ip地址和端口號(hào)以及協(xié)議類型均與數(shù)據(jù)報(bào)中的相應(yīng)信息一致。如果不存在相應(yīng)連接,則意味著連接尚未建立,此時(shí)如果數(shù)據(jù)報(bào)為tcp的sync報(bào)文或udp數(shù)據(jù)報(bào)則查找相應(yīng)的虛擬服務(wù)器;如果相應(yīng)虛擬服務(wù)器存在但是已經(jīng)滿負(fù)荷,則返回NF_DROP;如果相應(yīng)虛擬服務(wù)器存在并且未滿負(fù)荷,那么調(diào)用ip_vs_schedule( )調(diào)度一個(gè)RS并創(chuàng)建一個(gè)新的連接,如果調(diào)度失敗則調(diào)用ip_vs_leave( )繼續(xù)傳遞或者丟棄數(shù)據(jù)報(bào)。如果存在相應(yīng)連接,首先判斷連接上的RS是否可用,如果不可用則處理相關(guān)信息后返回NF_DROP。找到已存在的連接或建立新的連接后,修改系統(tǒng)記錄的相關(guān)信息如傳入的數(shù)據(jù)報(bào)的個(gè)數(shù)等。如果這個(gè)連接在創(chuàng)建時(shí)綁定了特定的數(shù)據(jù)報(bào)傳輸函數(shù),調(diào)用這個(gè)函數(shù)傳輸數(shù)據(jù)報(bào),否則返回NF_ACCEPT。

  ip_vs_in()調(diào)用的ip_vs_in_icmp( )處理icmp報(bào)文。函數(shù)開始時(shí)檢查數(shù)據(jù)報(bào)的長度,如果異常則返回NF_DROP。函數(shù)只處理由tcp/udp報(bào)文傳送錯(cuò)誤引起的目的不可達(dá)、源端被關(guān)閉或超時(shí)的icmp報(bào)文,其他情況則讓內(nèi)核處理。針對(duì)上述三類報(bào)文,首先檢查檢驗(yàn)和。如果檢驗(yàn)和錯(cuò)誤,直接返回NF_DROP;否則,分析返回的icmp差錯(cuò)信息,查找相應(yīng)的連接是否存在。如果連接不存在,返回NF_ACCEPT;如果連接存在,根據(jù)連接信息,依次修改差錯(cuò)信息包頭的ip地址與端口號(hào)及ICMP數(shù)據(jù)報(bào)包頭的ip地址,并重新計(jì)算和修改各個(gè)包頭中的檢驗(yàn)和,之后查找路由調(diào)用ip_send( )發(fā)送修改過的數(shù)據(jù)報(bào),并返回NF_STOLEN(退出數(shù)據(jù)報(bào)的處理過程)。

  ip_vs_in()調(diào)用的函數(shù)ip_vs_schedule( )為虛擬服務(wù)器調(diào)度可用的RS并建立相應(yīng)連接。它將根據(jù)虛擬服務(wù)器綁定的調(diào)度算法分配一個(gè)RS,如果成功,則調(diào)用ip_vs_conn_new( )建立連接。ip_vs_conn_new( )將進(jìn)行一系列初始化操作:設(shè)置連接的協(xié)議、ip地址、端口號(hào)、協(xié)議超時(shí)信息,綁定application helper、RS和數(shù)據(jù)報(bào)傳輸函數(shù),最后調(diào)用ip_vs_conn_hash( )將這個(gè)連接插入哈希表ip_vs_conn_tab中。一個(gè)連接綁定的數(shù)據(jù)報(bào)傳輸函數(shù),依據(jù)IPVS工作方式可分為ip_vs_nat_xmit( )、ip_vs_tunnel_xmit( )、ip_vs_dr_xmit( )。例如ip_vs_nat_xmit( )的主要操作是:修改報(bào)文的目的地址和目的端口為RS信息,重新計(jì)算并設(shè)置檢驗(yàn)和,調(diào)用ip_send( )發(fā)送修改后的數(shù)據(jù)報(bào)。

  3.2 NF_IP_FORWARD處理過程

  數(shù)據(jù)報(bào)進(jìn)入NF_IP_FORWARD后,將進(jìn)入ip_vs_out( )進(jìn)行處理。這個(gè)函數(shù)只在NAT方式下被調(diào)用。它首先判斷數(shù)據(jù)報(bào)類型,如果為icmp數(shù)據(jù)報(bào)則直接調(diào)用ip_vs_out_icmp( );其次判斷是否為tcp/udp數(shù)據(jù)報(bào),如果不是這二者則返回NF_ACCEPT。余下就是tcp/udp數(shù)據(jù)報(bào)的處理。首先,調(diào)用ip_vs_header_check( )檢查報(bào)頭,如果異常則返回NF_DROP。其次,調(diào)用ip_vs_conn_out_get( )判斷是否存在相應(yīng)的連接。若不存在相應(yīng)連接:調(diào)用ip_vs_lookup_real_service( )去哈希表中查找發(fā)送數(shù)據(jù)報(bào)的RS是否仍然存在,如果RS存在且報(bào)文是tcp非復(fù)位報(bào)文或udp 報(bào)文,則調(diào)用icmp_send( )給RS發(fā)送目的不可達(dá)icmp報(bào)文并返回NF_STOLEN;其余情況下均返回NF_ACCEPT。若存在相應(yīng)連接:檢查數(shù)據(jù)報(bào)的檢驗(yàn)和,如果錯(cuò)誤則返回NF_DROP,如果正確,修改數(shù)據(jù)報(bào),將源地址修改為虛擬服務(wù)器ip地址,源端口修改為虛擬服務(wù)器端口號(hào),重新計(jì)算并設(shè)置檢驗(yàn)和,并返回NF_ACCEPT。

  ip_vs_out_icmp( )的流程與ip_vs_in_icmp( )類似,只是修改數(shù)據(jù)報(bào)時(shí)有所區(qū)別:ip報(bào)頭的源地址和差錯(cuò)信息中udp或tcp報(bào)頭的目的地址均修改為虛擬服務(wù)器地址,差錯(cuò)信息中udp或tcp報(bào)頭的目的端口號(hào)修改為虛擬服務(wù)器的端口號(hào)。

  3.3 NF_IP_POST_ROUTING處理過程

  NF_IP_POST_ROUTING鉤子函數(shù)只在NAT方式下使用。數(shù)據(jù)報(bào)進(jìn)入NF_IP_POST_ROUTING后,由ip_vs_post_routing( )進(jìn)行處理。它首先判斷數(shù)據(jù)報(bào)是否經(jīng)過IPVS,如果未經(jīng)過則返回NF_ACCEPT;否則立刻傳輸數(shù)據(jù)報(bào),函數(shù)返回NF_STOLEN,防止數(shù)據(jù)報(bào)被iptable的規(guī)則修改。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多