基于Linux的HGU设备接入公网用户数量限制的内核实现新方法
2019-04-01彭求明
彭求明
摘 要: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.