彭求明
摘? ?要:HGU用戶側(cè)接口(LAN、WLAN)可以連接很多用戶終端,并在同一時(shí)間接入公網(wǎng),出于安全管理和上網(wǎng)質(zhì)量的考慮,在國(guó)內(nèi)三大運(yùn)營(yíng)商電信、移動(dòng)、聯(lián)通技術(shù)規(guī)范中,均有對(duì)接入公網(wǎng)用戶數(shù)量限制功能的需求,本文分析了現(xiàn)有的實(shí)現(xiàn)方法,研究了Linux內(nèi)核Netfilter網(wǎng)絡(luò)層的實(shí)現(xiàn)機(jī)制,通過(guò)在Netfilter的NF_IP_FORWARD Hook點(diǎn)注冊(cè)鉤子處理函數(shù),在內(nèi)核態(tài)實(shí)現(xiàn)了一種接入公網(wǎng)用戶數(shù)量限制的新方法。
關(guān)鍵詞:HGU/家庭網(wǎng)關(guān)? Netfilter? Hook點(diǎn)? 接入公網(wǎng)用戶數(shù)量限制? Linux內(nèi)核
中圖分類號(hào):TP31? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A? ? ? ? ? ? ? ? ? ? ? ? 文章編號(hào):1674-098X(2019)10(a)-0147-02
1? HGU應(yīng)用場(chǎng)景
HGU(Home Gateway Unit家庭網(wǎng)關(guān)單元)是連接家庭網(wǎng)絡(luò)和Internet的網(wǎng)關(guān)單元,可通過(guò)各種網(wǎng)絡(luò)側(cè)接口(PON接入、xDSL接入、以太網(wǎng)接入等)與接入網(wǎng)/接入點(diǎn)相連最終連到Internet,并通過(guò)用戶側(cè)接口(LAN、WLAN)與各種用戶終端相連,用戶終端通常有個(gè)人計(jì)算機(jī)PC、筆記本、手機(jī)、平板電腦、機(jī)頂盒等,基本都是通過(guò)路由模式接入Internet,機(jī)頂盒會(huì)用到橋接模式,固定配置一個(gè)LAN口為橋接模式,其他LAN口和WLAN連接的各種用戶終端都是通過(guò)路由模式訪問(wèn)Internet上網(wǎng)。出于安全管理和上網(wǎng)質(zhì)量的考慮,在國(guó)內(nèi)三大運(yùn)營(yíng)商電信、移動(dòng)、聯(lián)通規(guī)范中,均有對(duì)用戶上網(wǎng)數(shù)量限制的功能:路由模式下,HGU/家庭網(wǎng)關(guān)應(yīng)支持對(duì)同一時(shí)間接入公網(wǎng)用戶數(shù)量進(jìn)行限制,配置接入公網(wǎng)最大用戶數(shù)為N時(shí),第N+1個(gè)用戶開(kāi)始無(wú)法正常上網(wǎng)。
2? 接入公網(wǎng)用戶數(shù)量限制的現(xiàn)有實(shí)現(xiàn)方法
接入公網(wǎng)用戶數(shù)量限制,目前的實(shí)現(xiàn)方法是:在HGU上開(kāi)啟DHCP Server功能,用戶側(cè)終端通過(guò)DHCP自動(dòng)獲取IP地址,配置DHCP Server對(duì)分配IP地址數(shù)量限制,來(lái)實(shí)現(xiàn)用戶上網(wǎng)數(shù)量限制功能,但如果對(duì)用戶終端配置了靜態(tài)IP地址,就無(wú)法限制。
本文研究了Linux內(nèi)核Netfilter網(wǎng)絡(luò)層的實(shí)現(xiàn)機(jī)制,通過(guò)在Netfilter的NF_IP_FORWARD Hook點(diǎn)注冊(cè)鉤子處理函數(shù),在內(nèi)核態(tài)實(shí)現(xiàn)了一種接入公網(wǎng)用戶數(shù)量限制的新方法,用戶側(cè)終端不管是通過(guò)DHCP自動(dòng)獲取IP地址,還是配置靜態(tài)IP地址,都能進(jìn)行接入公網(wǎng)用戶數(shù)量的限制。
3? 在內(nèi)核態(tài)實(shí)現(xiàn)接入公網(wǎng)用戶數(shù)量限制
3.1 用戶數(shù)量限制在Netfilter中Hook點(diǎn)選擇
Netfilter是Linux 2.4.x引入的一個(gè)子系統(tǒng),它作為一個(gè)通用的、抽象的框架,提供一整套的hook函數(shù)的管理機(jī)制,使得諸如數(shù)據(jù)包過(guò)濾、網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)和基于協(xié)議類型的連接跟蹤成為了可能。Netfilter架構(gòu)就是在整個(gè)網(wǎng)絡(luò)流程的若干位置放置了一些檢測(cè)點(diǎn)(Hook),而在每個(gè)檢測(cè)點(diǎn)上登記了一些處理函數(shù)進(jìn)行處理。網(wǎng)絡(luò)層(IP)五個(gè)Hook點(diǎn)的位置如圖1所示。
NP_IP_PRE_ROUTING:剛剛進(jìn)入網(wǎng)絡(luò)層的數(shù)據(jù)包通過(guò)此點(diǎn)(剛剛進(jìn)行完版本號(hào),校驗(yàn)和等檢測(cè)),目的地址轉(zhuǎn)換在此點(diǎn)進(jìn)行;
NF_IP_LOCAL_IN:經(jīng)路由查找后,送往本機(jī)的通過(guò)此檢查點(diǎn),INPUT包過(guò)濾在此點(diǎn)進(jìn)行;NF_IP_FORWARD:要轉(zhuǎn)發(fā)的包通過(guò)此檢測(cè)點(diǎn),F(xiàn)ORWARD包過(guò)濾在此點(diǎn)進(jìn)行;
NF_IP_LOCAL_OUT:本機(jī)進(jìn)程發(fā)出的包通過(guò)此檢測(cè)點(diǎn),OUTPUT包過(guò)濾在此點(diǎn)進(jìn)行;
NF_IP_POST_ROUTING:所有馬上便要通過(guò)網(wǎng)絡(luò)設(shè)備出去的包通過(guò)此檢測(cè)點(diǎn),內(nèi)置的源地址轉(zhuǎn)換功能(包括地址偽裝)在此點(diǎn)進(jìn)行。
HGU下掛的各種用戶終端上網(wǎng)時(shí),HGU收到的每個(gè)數(shù)據(jù)包,首先都是進(jìn)入第一個(gè)Hook點(diǎn)NP_IP_PRE_ROUTING進(jìn)行處理;然后經(jīng)過(guò)路由判決,決定該數(shù)據(jù)包是需要轉(zhuǎn)發(fā)還是發(fā)給本機(jī),用戶終端上網(wǎng)的數(shù)據(jù)包的目的地不是本機(jī),需要轉(zhuǎn)發(fā),進(jìn)入Hook點(diǎn)NF_IP_FORWARD處理,經(jīng)過(guò)轉(zhuǎn)發(fā)的數(shù)據(jù)包經(jīng)過(guò)最后一個(gè)Hook點(diǎn)NF_IP_POST_ROUTING處理以后,再傳輸?shù)骄W(wǎng)絡(luò)上,之后進(jìn)入Internet。因此用戶終端上網(wǎng)的數(shù)據(jù)包肯定會(huì)進(jìn)入Hook點(diǎn)NF_IP_FORWARD處理,所以選擇在此Hook點(diǎn)注冊(cè)用戶數(shù)量限制鉤子處理函數(shù)。
3.2 接入公網(wǎng)用戶數(shù)量限制的內(nèi)核實(shí)現(xiàn)
接入公網(wǎng)用戶數(shù)量限制內(nèi)核實(shí)現(xiàn)是以u(píng)ser_num_limit.ko形式提供,分為兩個(gè)子模塊:初始化模塊、用戶數(shù)量限制實(shí)現(xiàn)模塊。
(1)初始化模塊:用戶數(shù)量限制內(nèi)核組件user_num_limit.ko初始化,是向Netfilter在網(wǎng)絡(luò)層的NF_IP_FORWARD點(diǎn)注冊(cè)用戶數(shù)量限制的鉤子處理函數(shù),分兩步,首先定義一個(gè)struct nf_hook_ops結(jié)構(gòu)體變量user_num_limit,并且對(duì)每個(gè)成員進(jìn)行賦值:
首先判斷輸入?yún)?shù),如果skb或skb->mac_header或輸入設(shè)備指針或輸出設(shè)備指針任一為NULL,就接受此報(bào)文,不做用戶數(shù)限制,繼續(xù)向下處理;判斷輸入網(wǎng)絡(luò)設(shè)備和輸出網(wǎng)絡(luò)設(shè)備名的首字母,輸入設(shè)備名的首字母必須為'b',表示輸入設(shè)備名是brxxx,輸出設(shè)備名的首字母可以為'p'或'w',表示輸出設(shè)備名是pon.xxx或wan.xxxx,這些都要進(jìn)行用戶數(shù)限制處理,其他情況都接受允許繼續(xù)向下處理,不做用戶數(shù)限制。
然后是用戶數(shù)限制處理,整個(gè)處理過(guò)程要加軟中斷自旋鎖保護(hù),因?yàn)椴僮髁巳肿兞坑脩翩湵?、最大用戶?shù)、當(dāng)前用戶數(shù)、用戶超時(shí)時(shí)間。遍歷用戶鏈表中每一個(gè)用戶節(jié)點(diǎn),分三種情況:用戶鏈表中的用戶mac地址與此報(bào)文中mac地址一樣、用戶鏈表中的mac地址與此報(bào)文中的mac地址不一樣、用戶鏈表遍歷完后還找不到此報(bào)文的mac地址。如果用戶鏈表中的用戶mac地址與此報(bào)文中mac地址一樣,就更新此用戶的接入時(shí)間為當(dāng)前jiffies,break跳出遍歷,接受此報(bào)文,該用戶就能上網(wǎng);如果用戶鏈表中的mac地址與此報(bào)文中的mac地址不一樣,就判斷超時(shí)時(shí)間是否已到,如果已經(jīng)超時(shí)了,就從用戶鏈表中把此用戶刪掉,并把當(dāng)前用戶數(shù)減1,如果還沒(méi)超時(shí),就不做處理,都是繼續(xù)遍歷;如果用戶鏈表遍歷完后還找不到此報(bào)文的mac地址,先判斷當(dāng)前用戶數(shù)是否小于最大用戶數(shù),如果是,就把此新用戶節(jié)點(diǎn)添加到用戶鏈表中,并把當(dāng)前用戶數(shù)加1,用戶節(jié)點(diǎn)信息包括mac地址和接入時(shí)間,并接受此報(bào)文,該用戶就能上網(wǎng),此情況也包括了最開(kāi)始用戶鏈表為空;如果當(dāng)前用戶數(shù)大于或等于最大用戶數(shù)就丟棄此報(bào)文,該用戶就不能上網(wǎng)。
4? 結(jié)語(yǔ)
本文提出的接入公網(wǎng)用戶數(shù)量限制實(shí)現(xiàn)的新方法,與現(xiàn)有方法相比,用戶側(cè)終端不管是通過(guò)DHCP自動(dòng)獲取IP地址,還是配置靜態(tài)IP地址,都能進(jìn)行用戶上網(wǎng)數(shù)量的限制,而且本方法都是在Linux內(nèi)核態(tài)運(yùn)行,所以執(zhí)行效率高。
參考文獻(xiàn)
[1] 楊曉勇,于曉翠.IP家庭網(wǎng)關(guān)作為智能家居服務(wù)的通用多用途啟動(dòng)器[J]. 機(jī)電工程技術(shù),2019(4):33-36.
[2] 陳偉豪,代康.基于家庭網(wǎng)關(guān)構(gòu)建物聯(lián)網(wǎng)家庭應(yīng)用系統(tǒng)的研究[J].產(chǎn)業(yè)與科技論壇,2019(5):73-74.
[3] 余飛,楊波.Linux下基于Netfilter/Iptables防火墻的研究與應(yīng)用[J]. 齊齊哈爾大學(xué)學(xué)報(bào):自然科學(xué)版,2015(3):53-58.
[4] 王繼魁. 基于Linux的netfilter/iptables防火墻的實(shí)現(xiàn)[J].通化師范學(xué)院學(xué)報(bào),2010(2):55-56.