專(zhuān)利名稱(chēng):一種在Linux協(xié)議棧上實(shí)現(xiàn)端口觸發(fā)功能的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種通訊網(wǎng)絡(luò)NAT穿越技術(shù),尤其涉及一種端口觸發(fā)功能的實(shí)現(xiàn)方法。
背景技術(shù):
IT行業(yè)的激烈競(jìng)爭(zhēng),產(chǎn)品價(jià)格的不斷下跌,都對(duì)IT廠家?guī)?lái)了嚴(yán)峻的挑戰(zhàn)。大家都紛紛將目光投到了低價(jià)的Linux操作系統(tǒng)上,Linux的普及以及發(fā)展就此展開(kāi)。對(duì)終端類(lèi)的網(wǎng)絡(luò)產(chǎn)品來(lái)說(shuō),Linux無(wú)疑是操作系統(tǒng)一個(gè)很好的選擇。
但問(wèn)題也隨之而來(lái),在通過(guò)NAT(網(wǎng)絡(luò)地址翻譯,又叫端口映射或端口轉(zhuǎn)發(fā))的內(nèi)網(wǎng)環(huán)境中,內(nèi)網(wǎng)計(jì)算機(jī)用戶(hù)的網(wǎng)絡(luò)應(yīng)用總是受到各種各樣的限制,一些網(wǎng)絡(luò)游戲不能正常工作,聊天工具也不能正常使用。這是因?yàn)閳?bào)文穿越NAT網(wǎng)關(guān)存在局限而造成的,通過(guò)在網(wǎng)關(guān)上配置端口映射可以解決該問(wèn)題,但實(shí)際操作時(shí),又因?yàn)槎丝谟成湫枰槍?duì)具體的內(nèi)網(wǎng)計(jì)算機(jī),在靈活性上有很多問(wèn)題;另外由于開(kāi)放了多個(gè)端口,使得設(shè)備的安全問(wèn)題變得嚴(yán)重。在這種情況下,PortTrigger(端口觸發(fā))功能可以解決這些問(wèn)題,它能根據(jù)內(nèi)網(wǎng)計(jì)算機(jī)的使用情況動(dòng)態(tài)開(kāi)放端口映射,解決了靈活性和安全的雙重問(wèn)題。
有的協(xié)議需要控制連接和轉(zhuǎn)發(fā)連接,而轉(zhuǎn)發(fā)連接是預(yù)先定義好,安排在一個(gè)端口范圍內(nèi),如QuickTime,特別是很多網(wǎng)絡(luò)游戲等,轉(zhuǎn)發(fā)連接會(huì)在這個(gè)端口范圍選擇幾個(gè)端口進(jìn)行數(shù)據(jù)報(bào)文的傳送,這時(shí)就需要端口觸發(fā)功能?,F(xiàn)有的Linux協(xié)議棧雖然提供了端口映射、應(yīng)用層網(wǎng)關(guān)(ALG)等方法來(lái)解決外網(wǎng)到內(nèi)網(wǎng)的地址端口轉(zhuǎn)換問(wèn)題,卻沒(méi)有提供端口觸發(fā)的功能,針對(duì)目前的現(xiàn)狀,急需在Linux協(xié)議棧上提供該功能的實(shí)現(xiàn)方法。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問(wèn)題是提出一種在Linux協(xié)議棧上實(shí)現(xiàn)端口觸發(fā)功能的方法。
為了實(shí)現(xiàn)上述技術(shù)問(wèn)題,本發(fā)明提供了一種在Linux協(xié)議棧上實(shí)現(xiàn)端口觸發(fā)功能的方法,包括以下步驟(a)在網(wǎng)關(guān)設(shè)備上配置端口觸發(fā)的參數(shù),包括觸發(fā)端口和端口組范圍,并保存到IP連接跟蹤助理ip_conntrack_helper和IP地址轉(zhuǎn)換助理Ip_nat_helper結(jié)構(gòu)內(nèi);(b)內(nèi)網(wǎng)設(shè)備發(fā)送的報(bào)文到達(dá)網(wǎng)關(guān)設(shè)備時(shí),自動(dòng)進(jìn)入連接跟蹤conntrack模塊,創(chuàng)建觸發(fā)連接的IP連接跟蹤ip_conntrack結(jié)構(gòu),并在該結(jié)構(gòu)中保存內(nèi)網(wǎng)IP地址和端口;(c)如果該報(bào)文符合觸發(fā)條件,即其目的端口為所述觸發(fā)端口,在ip_conntrack_helper為所述端口組中端口建立的與ip_conntrack結(jié)構(gòu)關(guān)聯(lián)的IP軌跡期望表ip_conntrack_expect結(jié)構(gòu)中存放為該報(bào)文分配的端口,該報(bào)文再通過(guò)地址轉(zhuǎn)換nat模塊,從分配的端口發(fā)送到外網(wǎng)設(shè)備;(d)所述外網(wǎng)設(shè)備向所述網(wǎng)關(guān)設(shè)備返回報(bào)文,報(bào)文自動(dòng)進(jìn)入conntrack模塊,創(chuàng)建轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu);(e)如果該返回的報(bào)文符合轉(zhuǎn)發(fā)條件,即其目的端口為所述端口組中的端口,則建立該轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu)與保存有相同端口的ip_conntrack_expect結(jié)構(gòu)的關(guān)聯(lián)關(guān)系,并在轉(zhuǎn)發(fā)連接的IP-conntrack結(jié)構(gòu)中保存所述外網(wǎng)設(shè)備的IP地址和遠(yuǎn)端端口;(f)該返回的報(bào)文進(jìn)入網(wǎng)絡(luò)地址修改輔助模塊nat expect部分,通過(guò)關(guān)聯(lián)的ip_conntrack_expect結(jié)構(gòu)再找到其關(guān)聯(lián)的觸發(fā)連接的ip_conntrack結(jié)構(gòu),獲得內(nèi)網(wǎng)設(shè)備的IP地址和端口,完成數(shù)據(jù)報(bào)文的轉(zhuǎn)發(fā)工作;(g)內(nèi)網(wǎng)設(shè)備和外網(wǎng)設(shè)備通過(guò)建立的轉(zhuǎn)接進(jìn)行數(shù)據(jù)通訊,完成數(shù)據(jù)傳輸后,釋放建立的ip_conntrack結(jié)構(gòu)和ip_conntrack_expect結(jié)構(gòu),結(jié)束。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)所述步驟(a)配置的端口參數(shù)還包括觸發(fā)報(bào)文使用的協(xié)議,所述步驟(c)中,如果內(nèi)網(wǎng)設(shè)備發(fā)送報(bào)文的目的端口和使用的協(xié)議與配置的觸發(fā)端口和觸發(fā)報(bào)文使用的協(xié)議都相同,才認(rèn)為其符合觸發(fā)條件。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)所述步驟(a)配置的端口參數(shù)還包括轉(zhuǎn)發(fā)報(bào)文使用的協(xié)議,所述步驟(d)中,如果外網(wǎng)設(shè)備返回報(bào)文的目的端口為所述端口組中的端口,且其使用的協(xié)議與配置的轉(zhuǎn)發(fā)報(bào)文使用的協(xié)議相同時(shí),才認(rèn)為其符合轉(zhuǎn)發(fā)條件。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)所述步驟(a)是通過(guò)一個(gè)配置端口進(jìn)行所述參數(shù)的配置,然后將配置好的參數(shù)傳遞至Linux協(xié)議棧模塊,設(shè)置為連接跟蹤conntrack部分和地址轉(zhuǎn)換nat部分的初始條件的。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)所述步驟(b)中,所述報(bào)文通過(guò)地址轉(zhuǎn)換nat模塊時(shí),由地址轉(zhuǎn)換助理nat_helper結(jié)構(gòu),對(duì)觸發(fā)連接進(jìn)行檢查,并為ip_conntrack_expect結(jié)構(gòu)賦值。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)所述步驟(e)中,還將所述外網(wǎng)設(shè)備的IP地址和遠(yuǎn)端端口保存到所述ip_conntrack_expect結(jié)構(gòu)中。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)所述步驟(f)中,在獲得內(nèi)網(wǎng)設(shè)備的IP地址和端口后,還將其寫(xiě)入轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu)。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)所述步驟(e)中,在建立該轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu)與保存有相同端口的ip_conntrack_expect結(jié)構(gòu)的關(guān)聯(lián)關(guān)系后,還將獲取的IP地址和遠(yuǎn)端端口信息寫(xiě)入到該關(guān)聯(lián)的Ip_conntrack_expect結(jié)構(gòu)中。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)所述步驟(g)中,內(nèi)網(wǎng)設(shè)備和外網(wǎng)設(shè)備通信時(shí),當(dāng)所述內(nèi)網(wǎng)設(shè)備發(fā)到所述外網(wǎng)設(shè)備的報(bào)文達(dá)到所述網(wǎng)關(guān)設(shè)備時(shí),進(jìn)入所述conntrack模塊,找到該連接對(duì)應(yīng)的ip_conntrack結(jié)構(gòu),在該結(jié)構(gòu)中獲取保存的源、目的設(shè)備的地址信息,然后對(duì)報(bào)文進(jìn)行源端口地址轉(zhuǎn)換并發(fā)送出去。
進(jìn)一步地,上述方法還可具有以下特點(diǎn)所述步驟(g)中,內(nèi)網(wǎng)設(shè)備和外網(wǎng)設(shè)備通信時(shí),當(dāng)所述外網(wǎng)設(shè)備返回到所述內(nèi)網(wǎng)設(shè)備的報(bào)文到達(dá)所述網(wǎng)關(guān)設(shè)備時(shí),進(jìn)入所述conntrack模塊,找到該連接對(duì)應(yīng)的ip_conntrack結(jié)構(gòu),在該結(jié)構(gòu)中獲取保存的源、目的設(shè)備的地址信息,對(duì)報(bào)文進(jìn)行目的端口地址轉(zhuǎn)換并發(fā)送出去。
由上可知,采用本發(fā)明所述的方法,實(shí)現(xiàn)Linux協(xié)議棧中的端口觸發(fā)功能。該功能彌補(bǔ)了現(xiàn)有Linux NAT穿越技術(shù)的缺陷,并與端口映射,應(yīng)用層網(wǎng)關(guān)ALG互為補(bǔ)充,通過(guò)本發(fā)明,避免了以往穿越技術(shù)需要根據(jù)不同的應(yīng)用,不斷修改協(xié)議棧的問(wèn)題,類(lèi)似的ALG模塊通過(guò)一個(gè)PortTrigger模塊就得以實(shí)現(xiàn)。提高了不同網(wǎng)絡(luò)應(yīng)用與網(wǎng)關(guān)設(shè)備間的兼容性,降低了升級(jí)網(wǎng)關(guān)的技術(shù)成本,為網(wǎng)絡(luò)應(yīng)用穿越Linux NAT設(shè)備提供了一個(gè)更好的選擇。
圖1是本發(fā)明實(shí)施例PortTrigger數(shù)據(jù)包處理流程的示意圖。
圖2是本發(fā)明實(shí)施例PortTrigger的主要數(shù)據(jù)結(jié)構(gòu)的關(guān)聯(lián)圖。
具體實(shí)施例方式
本發(fā)明采用端口配置和端口轉(zhuǎn)發(fā)相分離以及端口動(dòng)態(tài)開(kāi)放的設(shè)計(jì)思想,在NAT網(wǎng)關(guān)設(shè)備的Linux協(xié)議棧實(shí)現(xiàn)PortTrigger功能。當(dāng)NAT網(wǎng)關(guān)設(shè)備收到內(nèi)網(wǎng)終端發(fā)出的數(shù)據(jù)包時(shí),通過(guò)判斷,發(fā)覺(jué)這些數(shù)據(jù)包滿(mǎn)足預(yù)先配置的觸發(fā)條件,就會(huì)根據(jù)配置的開(kāi)放端口建立NAT網(wǎng)關(guān)端口到內(nèi)網(wǎng)終端的映射關(guān)系,動(dòng)態(tài)實(shí)現(xiàn)外網(wǎng)服務(wù)器通過(guò)這些端口與內(nèi)網(wǎng)終端的數(shù)據(jù)交互,當(dāng)連接活動(dòng)結(jié)束,該P(yáng)ortTrigger又自動(dòng)關(guān)閉該端口映射,提高系統(tǒng)安全性。
Linux協(xié)議棧中具有連接跟蹤(conntrack)模塊和地址轉(zhuǎn)換(nat)模塊。地址轉(zhuǎn)換功能是在連接跟蹤的基礎(chǔ)上實(shí)現(xiàn)的。連接跟蹤,顧名思義,就是跟蹤并且記錄連接狀態(tài)。連接跟蹤是實(shí)現(xiàn)地址轉(zhuǎn)換的基礎(chǔ),在使用地址轉(zhuǎn)換功能時(shí)必須加載這個(gè)模塊。
為了處理應(yīng)用協(xié)議里面的動(dòng)態(tài)地址和端口,每個(gè)使用動(dòng)態(tài)地址和端口的協(xié)議一般都定義了數(shù)據(jù)結(jié)構(gòu)ip_conntrack_helper,并把它放到一個(gè)全局的鏈表中。這類(lèi)協(xié)議一般都會(huì)有觸發(fā)連接(也稱(chēng)控制連接)和轉(zhuǎn)發(fā)連接(主要指數(shù)據(jù)連接)兩個(gè)不同的連接。而在這個(gè)結(jié)構(gòu)中定義了匹配其協(xié)議控制連接的參數(shù)。當(dāng)創(chuàng)建或更新結(jié)構(gòu)ip_conntrack時(shí)都會(huì)查找鏈表中有沒(méi)有相應(yīng)的ip_conntrack_helper結(jié)構(gòu)(端口觸發(fā)的Conntrack部分在協(xié)議棧內(nèi)的接口),如果存在,ip_conntrack_helper里面的函數(shù)會(huì)根據(jù)協(xié)議里的地址和端口創(chuàng)建與觸發(fā)連接相關(guān)聯(lián)的結(jié)構(gòu)ip_conntrack_expect,并把它放到了一個(gè)全局的鏈表中,接著,當(dāng)建立轉(zhuǎn)發(fā)連接時(shí),再找到這個(gè)ip_conntrack_expect結(jié)構(gòu),并把它與新建的ip_conntrack結(jié)構(gòu)連接起來(lái)。觸發(fā)連接ip_conntrack結(jié)構(gòu)、ip_conntrack_expect結(jié)構(gòu)以及轉(zhuǎn)發(fā)連接ip_conntrack結(jié)構(gòu)之間的關(guān)聯(lián)關(guān)系如圖2所示。各個(gè)結(jié)構(gòu)之間通過(guò)指針相關(guān)聯(lián)。如轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu)(圖中的轉(zhuǎn)發(fā)連接)通過(guò)master指針指向ip_conntrack_expect結(jié)構(gòu),依次類(lèi)推。
原來(lái)的協(xié)議雖然有用于連接跟蹤、管理所有的連接的ip_conntrack結(jié)構(gòu)和用于實(shí)現(xiàn)ALG功能的ip_conntrack_expect結(jié)構(gòu)。但如何將二者加以利用,以實(shí)現(xiàn)端口觸發(fā)功能是原有協(xié)議沒(méi)有的,本發(fā)明充分利用了原有的框架,通過(guò)設(shè)計(jì)新的機(jī)制來(lái)實(shí)現(xiàn)端口觸發(fā)功能。
為了實(shí)現(xiàn)PortTrigger功能,本發(fā)明在原有協(xié)議的基礎(chǔ)上增加了以下功能單元參數(shù)配置接口,用于配置所需的PortTrigger的應(yīng)用參數(shù)。觸發(fā)條件判斷單元,用于判斷內(nèi)網(wǎng)發(fā)來(lái)的報(bào)文是否符合用戶(hù)配置的觸發(fā)條件。轉(zhuǎn)發(fā)條件判斷單元,判斷外網(wǎng)發(fā)來(lái)的報(bào)文是否符合用戶(hù)配置的轉(zhuǎn)發(fā)條件。同時(shí),還提供了ip_conntrack_helper和Nat_helper、Ip_nat_helper的工作方式,讓其根據(jù)用戶(hù)配置的觸發(fā)、轉(zhuǎn)發(fā)條件及時(shí)生效和失效,從而實(shí)現(xiàn)端口觸發(fā)功能。
現(xiàn)以一具體的網(wǎng)絡(luò)應(yīng)用為例來(lái)描述觸發(fā)連接、轉(zhuǎn)發(fā)連接的整個(gè)流程,說(shuō)明port_trigger的實(shí)現(xiàn)過(guò)程。假定該網(wǎng)絡(luò)應(yīng)用的觸發(fā)端口為UDP,PORT 4000,端口組為T(mén)CP PORT 20000~20059,處理流程如圖1所示,包括以下步驟步驟1,用戶(hù)根據(jù)應(yīng)用程序的要求,在網(wǎng)關(guān)設(shè)備上配置所需的PortTrigger應(yīng)用參數(shù),包含了相應(yīng)的觸發(fā)端口、端口組范圍及觸發(fā)報(bào)文和轉(zhuǎn)發(fā)報(bào)文使用的協(xié)議,假定配置的觸發(fā)端口為UDP,PORT 4000,對(duì)應(yīng)的端口組為T(mén)CPPORT 20000~20059;步驟2,將配置好的端口參數(shù)傳遞至Linux協(xié)議棧模塊,設(shè)置為conntrack部分和nat部分的初始條件,即作為ip_conntrack_helper和Ip_nat_helper結(jié)構(gòu)內(nèi)的協(xié)議和端口信息,完成初始化工作;步驟3,內(nèi)網(wǎng)PC開(kāi)始運(yùn)行網(wǎng)絡(luò)應(yīng)用程序時(shí),程序向外發(fā)送觸發(fā)報(bào)文,假設(shè)該報(bào)文采用UDP協(xié)議,端口號(hào)為4000,當(dāng)報(bào)文到達(dá)網(wǎng)關(guān)的位置時(shí),自動(dòng)進(jìn)入conntrack模塊,創(chuàng)建觸發(fā)連接的ip_conntrack結(jié)構(gòu),并在該結(jié)構(gòu)中保存內(nèi)網(wǎng)IP和內(nèi)網(wǎng)源端口;步驟4,觸發(fā)條件判斷單元將該報(bào)文中的目的端口和協(xié)議與用戶(hù)配置的觸發(fā)端口、觸發(fā)報(bào)文使用的協(xié)議相比較,如果兩者都相同則符合觸發(fā)條件,由ip_conntrack_helper(連接跟蹤助理)為設(shè)定的端口組(TCP PORT 2000020059)中的每一個(gè)端口建立ip_conntrack_expect(軌跡期望表)結(jié)構(gòu),在該結(jié)構(gòu)中存放為該報(bào)文分配的端口和協(xié)議,即用于判斷報(bào)文是否需要轉(zhuǎn)發(fā)的條件轉(zhuǎn)發(fā)報(bào)文的目的端口和使用的協(xié)議(指TCP PORT 2000020059),并與觸發(fā)連接的ip_conntrack結(jié)構(gòu)相關(guān)聯(lián);如果該報(bào)文中的協(xié)議和目的地址的端口不是用戶(hù)配置的觸發(fā)連接的協(xié)議和端口,則不處理。
步驟5,隨著觸發(fā)連接的繼續(xù),該報(bào)文通過(guò)nat模塊的nat_helper結(jié)構(gòu),該部分開(kāi)始對(duì)觸發(fā)連接進(jìn)行檢查和對(duì)端口信息賦值,并作用到該連接對(duì)應(yīng)的ip_conntrack_expect結(jié)構(gòu),即為該ip_conntrack_expect結(jié)構(gòu)賦值,即修改該結(jié)構(gòu)內(nèi)部的tuple參數(shù)、ip_conntrack_tuple結(jié)構(gòu),賦上內(nèi)網(wǎng)PC的源IP地址和端口信息;在與服務(wù)器端協(xié)商后,網(wǎng)關(guān)設(shè)備將該報(bào)文從分配的端口(TCPPORT 20000~20059之一)發(fā)送到服務(wù)器;步驟6,內(nèi)網(wǎng)PC與服務(wù)器觸發(fā)連接完成后,服務(wù)器收到后,向網(wǎng)關(guān)發(fā)送數(shù)據(jù)報(bào)文,其目的端口范圍在TCP PORT 20000~20059之內(nèi);步驟7,當(dāng)數(shù)據(jù)報(bào)文到達(dá)網(wǎng)關(guān)設(shè)備,自動(dòng)進(jìn)入conntrack模塊,創(chuàng)建轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu),轉(zhuǎn)發(fā)條件判斷單元判斷該報(bào)文是否符合轉(zhuǎn)發(fā)條件,即其使用的協(xié)議是配置的轉(zhuǎn)發(fā)報(bào)文使用的協(xié)議且其目的端口是配置的端組中的端口,如果符合轉(zhuǎn)發(fā)條件,根據(jù)其目的端口搜尋ip_conntrack_expect鏈表,找到觸發(fā)連接創(chuàng)建的具有相同端口(TCP PORT)的ip_conntrack_expect結(jié)構(gòu),并與之建立關(guān)聯(lián)關(guān)系;正常的過(guò)程,觸發(fā)連接引起觸發(fā),設(shè)置好端口映射關(guān)系,由于此時(shí)轉(zhuǎn)發(fā)連接還沒(méi)有建立,不清楚遠(yuǎn)端(一般是服務(wù)器)的IP地址和源端口,所以這部分字段(指Ip_conntrack_expect結(jié)構(gòu)的tuple字段)是不填寫(xiě)的,直到轉(zhuǎn)發(fā)連接建立的時(shí)候,獲取到了IP地址、遠(yuǎn)端端口等信息以后對(duì)創(chuàng)建的轉(zhuǎn)發(fā)連接的IP-conntrack中的ip_conntrack_tuple結(jié)構(gòu)和Ip_conntrack_expect結(jié)構(gòu)的tuple字段進(jìn)行設(shè)置,以使Ip_conntrack_expect結(jié)構(gòu)(存儲(chǔ)在tuplehash[IP_CT_DIR_ORIGINAL]中)和轉(zhuǎn)發(fā)連接的IP-conntrack結(jié)構(gòu)(存儲(chǔ)在tuplehash[IP_CT_DIR_REPLY]中)的信息完整;步驟8,報(bào)文進(jìn)入port_trigger的nat expect部分,通過(guò)讀取的相關(guān)聯(lián)的ip_conntrack_expect結(jié)構(gòu)判斷該報(bào)文是否需要轉(zhuǎn)發(fā),如需要,再通過(guò)內(nèi)部指針找到關(guān)聯(lián)的觸發(fā)連接的ip_conntrack結(jié)構(gòu),獲得相應(yīng)內(nèi)網(wǎng)PC的IP地址和端口號(hào),寫(xiě)入到轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu),并將其作為數(shù)據(jù)報(bào)文的目的IP地址和端口,然后完成數(shù)據(jù)報(bào)文的轉(zhuǎn)發(fā)工作;步驟9,轉(zhuǎn)發(fā)連接也建立成功后,當(dāng)內(nèi)網(wǎng)PC發(fā)到外網(wǎng)的報(bào)文達(dá)到網(wǎng)關(guān)時(shí),首先被進(jìn)入Linux協(xié)議棧的連接跟蹤(conntrack)模塊,在該模塊中找到該連接對(duì)應(yīng)的ip_conntrack結(jié)構(gòu),在該結(jié)構(gòu)中獲取以前配置的源、目的設(shè)備的地址信息,然后對(duì)報(bào)文進(jìn)行SNAT(源端口地址轉(zhuǎn)換),并發(fā)送出去;步驟10,而以后從服務(wù)器返回的報(bào)文(屬于本轉(zhuǎn)發(fā)連接)到達(dá)網(wǎng)關(guān)時(shí),進(jìn)入Linux協(xié)議棧的連接跟蹤(conntrack)模塊,也在該模塊中找到該連接對(duì)應(yīng)的ip_conntrack結(jié)構(gòu),在該結(jié)構(gòu)中獲取以前配置的源、目的設(shè)備地址信息,做DNAT(目的端口地址轉(zhuǎn)換),發(fā)送出去;步驟11,內(nèi)網(wǎng)PC和服務(wù)器通過(guò)打開(kāi)的端口組進(jìn)行數(shù)據(jù)通訊,完成數(shù)據(jù)傳輸后,觸發(fā)連接ip_conntrack結(jié)構(gòu)、ip_conntrack_expect結(jié)構(gòu)和轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu)進(jìn)入空閑狀態(tài),隨著該結(jié)構(gòu)內(nèi)部的計(jì)時(shí)器進(jìn)入超時(shí)階段,自動(dòng)被協(xié)議棧注銷(xiāo),該服務(wù)器與內(nèi)網(wǎng)PC的端口映射被取消,協(xié)議?;謴?fù)到觸發(fā)前的狀態(tài)。
本部分描述了整個(gè)觸發(fā)連接的過(guò)程,使我們認(rèn)識(shí)了這種先配置,再觸發(fā),最后動(dòng)態(tài)轉(zhuǎn)發(fā)的NAT穿越機(jī)制。用Port Trigger這種方式,解決了以往NAT穿越需要不斷升級(jí)協(xié)議棧的問(wèn)題,提高系統(tǒng)的兼容性,配置的方便性,具有很強(qiáng)的市場(chǎng)應(yīng)用前景。
權(quán)利要求
1.一種在Linux協(xié)議棧上實(shí)現(xiàn)端口觸發(fā)功能的方法,包括以下步驟(a)在網(wǎng)關(guān)設(shè)備上配置端口觸發(fā)的參數(shù),包括觸發(fā)端口和端口組范圍,并保存到IP連接跟蹤助理ip_conntrack_helper和IP地址轉(zhuǎn)換助理Ip_nat_helper結(jié)構(gòu)內(nèi);(b)內(nèi)網(wǎng)設(shè)備發(fā)送的報(bào)文到達(dá)網(wǎng)關(guān)設(shè)備時(shí),自動(dòng)進(jìn)入連接跟蹤conntrack模塊,創(chuàng)建觸發(fā)連接的IP連接跟蹤ip_conntrack結(jié)構(gòu),并在該結(jié)構(gòu)中保存內(nèi)網(wǎng)IP地址和端口;(c)如果該報(bào)文符合觸發(fā)條件,即其目的端口為所述觸發(fā)端口,在ip_conntrack_helper為所述端口組中端口建立的與ip_conntrack結(jié)構(gòu)關(guān)聯(lián)的IP軌跡期望表ip_conntrack_expect結(jié)構(gòu)中存放為該報(bào)文分配的端口,該報(bào)文再通過(guò)地址轉(zhuǎn)換nat模塊,從分配的端口發(fā)送到外網(wǎng)設(shè)備;(d)所述外網(wǎng)設(shè)備向所述網(wǎng)關(guān)設(shè)備返回報(bào)文,報(bào)文自動(dòng)進(jìn)入conntrack模塊,創(chuàng)建轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu);(e)如果該返回的報(bào)文符合轉(zhuǎn)發(fā)條件,即其目的端口為所述端口組中的端口,則建立該轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu)與保存有相同端口的ip_conntrack_expect結(jié)構(gòu)的關(guān)聯(lián)關(guān)系,并在轉(zhuǎn)發(fā)連接的IP-conntrack結(jié)構(gòu)中保存所述外網(wǎng)設(shè)備的IP地址和遠(yuǎn)端端口;(f)該返回的報(bào)文進(jìn)入網(wǎng)絡(luò)地址修改輔助模塊nat expect部分,通過(guò)關(guān)聯(lián)的ip_conntrack_expect結(jié)構(gòu)再找到其關(guān)聯(lián)的觸發(fā)連接的ip_conntrack結(jié)構(gòu),獲得內(nèi)網(wǎng)設(shè)備的IP地址和端口,完成數(shù)據(jù)報(bào)文的轉(zhuǎn)發(fā)工作;(g)內(nèi)網(wǎng)設(shè)備和外網(wǎng)設(shè)備通過(guò)建立的轉(zhuǎn)接進(jìn)行數(shù)據(jù)通訊,完成數(shù)據(jù)傳輸后,釋放建立的ip_conntrack結(jié)構(gòu)和ip_conntrack_expect結(jié)構(gòu),結(jié)束。
2.如權(quán)利要求1所述的方法,其特征在于,所述步驟(a)配置的端口參數(shù)還包括觸發(fā)報(bào)文使用的協(xié)議,所述步驟(c)中,如果內(nèi)網(wǎng)設(shè)備發(fā)送報(bào)文的目的端口和使用的協(xié)議與配置的觸發(fā)端口和觸發(fā)報(bào)文使用的協(xié)議都相同,才認(rèn)為其符合觸發(fā)條件。
3.如權(quán)利要求1所述的方法,其特征在于,所述步驟(a)配置的端口參數(shù)還包括轉(zhuǎn)發(fā)報(bào)文使用的協(xié)議,所述步驟(d)中,如果外網(wǎng)設(shè)備返回報(bào)文的目的端口為所述端口組中的端口,且其使用的協(xié)議與配置的轉(zhuǎn)發(fā)報(bào)文使用的協(xié)議相同時(shí),才認(rèn)為其符合轉(zhuǎn)發(fā)條件。
4.如權(quán)利要求1所述的方法,其特征在于,所述步驟(a)是通過(guò)一個(gè)配置端口進(jìn)行所述參數(shù)的配置,然后將配置好的參數(shù)傳遞至Linux協(xié)議棧模塊,設(shè)置為連接跟蹤conntrack部分和地址轉(zhuǎn)換nat部分的初始條件的。
5.如權(quán)利要求1所述的方法,其特征在于,所述步驟(c)中,所述報(bào)文通過(guò)地址轉(zhuǎn)換nat模塊時(shí),由地址轉(zhuǎn)換助理nat_helper結(jié)構(gòu),對(duì)觸發(fā)連接進(jìn)行檢查,并為ip_conntrack_expect結(jié)構(gòu)賦上內(nèi)網(wǎng)PC的源IP地址和端口信息。
6.如權(quán)利要求5所述的方法,其特征在于,所述步驟(e)中,還將所述外網(wǎng)設(shè)備的IP地址和遠(yuǎn)端端口保存到所述ip_conntrack_expect結(jié)構(gòu)中。
7.如權(quán)利要求1所述的方法,其特征在于,所述步驟(f)中,在獲得內(nèi)網(wǎng)設(shè)備的IP地址和端口后,還將其寫(xiě)入轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu)。
8.如權(quán)利要求1所述的方法,其特征在于,所述步驟(e)中,在建立該轉(zhuǎn)發(fā)連接的ip_conntrack結(jié)構(gòu)與保存有相同端口的ip_conntrack_expect結(jié)構(gòu)的關(guān)聯(lián)關(guān)系后,還將獲取的IP地址和遠(yuǎn)端端口信息寫(xiě)入到該關(guān)聯(lián)的Ip_conntrack_expect結(jié)構(gòu)中。
9.如權(quán)利要求1所述的方法,其特征在于,所述步驟(g)中,內(nèi)網(wǎng)設(shè)備和外網(wǎng)設(shè)備通信時(shí),當(dāng)所述內(nèi)網(wǎng)設(shè)備發(fā)到所述外網(wǎng)設(shè)備的報(bào)文達(dá)到所述網(wǎng)關(guān)設(shè)備時(shí),進(jìn)入所述conntrack模塊,找到該連接對(duì)應(yīng)的ip_conntrack結(jié)構(gòu),在該結(jié)構(gòu)中獲取保存的源、目的設(shè)備的地址信息,然后對(duì)報(bào)文進(jìn)行源端口地址轉(zhuǎn)換并發(fā)送出去。
10.如權(quán)利要求7所述的方法,其特征在于,所述步驟(g)中,內(nèi)網(wǎng)設(shè)備和外網(wǎng)設(shè)備通信時(shí),當(dāng)所述外網(wǎng)設(shè)備返回到所述內(nèi)網(wǎng)設(shè)備的報(bào)文到達(dá)所述網(wǎng)關(guān)設(shè)備時(shí),進(jìn)入所述conntrack模塊,找到該連接對(duì)應(yīng)的ip_conntrack結(jié)構(gòu),在該結(jié)構(gòu)中獲取保存的源、目的設(shè)備的地址信息,對(duì)報(bào)文進(jìn)行目的端口地址轉(zhuǎn)換并發(fā)送出去。
全文摘要
一種在Linux協(xié)議棧上實(shí)現(xiàn)端口觸發(fā)功能的方法,先在網(wǎng)關(guān)設(shè)備上配置端口觸發(fā)的參數(shù),包括觸發(fā)端口和端口組范圍;內(nèi)網(wǎng)報(bào)文到達(dá)網(wǎng)關(guān)設(shè)備時(shí),創(chuàng)建觸發(fā)連接的ip_conntrack,保存內(nèi)網(wǎng)IP地址和端口;如該報(bào)文符合觸發(fā)條件,在與ip_conntrack關(guān)聯(lián)的ip_conntrack_expect中存放為該報(bào)文分配的端口,再通過(guò)nat模塊發(fā)送到外網(wǎng)設(shè)備;外網(wǎng)報(bào)文進(jìn)入conntrack模塊后,創(chuàng)建轉(zhuǎn)發(fā)連接的ip_conntrack;如符合轉(zhuǎn)發(fā)條件,建立該ip_conntrack與相應(yīng)ip_conntrack_expect的關(guān)聯(lián)關(guān)系,并保存外網(wǎng)設(shè)備的IP地址和遠(yuǎn)端端口;返回報(bào)文進(jìn)入nat expect,找到關(guān)聯(lián)的觸發(fā)連接的ip_conntrack,獲得內(nèi)網(wǎng)設(shè)備IP地址和端口,完成數(shù)據(jù)報(bào)文的轉(zhuǎn)發(fā)工作;數(shù)據(jù)傳輸后,釋放建立的ip_conntrack和ip_conntrack_expect,結(jié)束。
文檔編號(hào)H04L12/56GK1992716SQ20051013566
公開(kāi)日2007年7月4日 申請(qǐng)日期2005年12月31日 優(yōu)先權(quán)日2005年12月31日
發(fā)明者周衍堅(jiān), 繆偉, 楊旭 申請(qǐng)人:中興通訊股份有限公司