彭求明


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